<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://ai-heartland.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ai-heartland.com/" rel="alternate" type="text/html" /><updated>2026-05-18T17:49:03+09:00</updated><id>https://ai-heartland.com/feed.xml</id><title type="html">AI Heartland</title><subtitle>Claude Code・MCP・RAG・AIエージェントなどのOSSを日本語で解説。コード例・比較表・導入手順をエンジニア向けに毎日更新。2026年版フレームワーク選定ガイドも掲載中。</subtitle><entry><title type="html">12-Factor Agents完全解説：本番投入できるLLMエージェント設計12原則を一次ソースで読む</title><link href="https://ai-heartland.com/agent/12-factor-agents-principles-guide/" rel="alternate" type="text/html" title="12-Factor Agents完全解説：本番投入できるLLMエージェント設計12原則を一次ソースで読む" /><published>2026-05-18T09:00:00+09:00</published><updated>2026-05-18T09:00:00+09:00</updated><id>https://ai-heartland.com/agent/12-factor-agents-principles-guide</id><content type="html" xml:base="https://ai-heartland.com/agent/12-factor-agents-principles-guide/"><![CDATA[<p>「AIエージェントを作ったが、品質が70-80%で止まり本番投入できない」——この壁は$FRAMEWORK系を触った人なら一度は通る。CrewAIで動くデモまでは1時間、しかし顧客に渡せる品質に上げる段になると、フレームワークの内部を逆コンパイルし、最終的にゼロから書き直すという地獄が待っている。</p>

<p>HumanLayer創業者のDex Horthy（@dexhorthy）は2025年3月、その地獄を100社以上のSaaS事業者と話して整理し、<code class="language-plaintext highlighter-rouge">humanlayer/12-factor-agents</code>として公開した。GitHubで★19,949、フォーク1,509という規模に達したこのドキュメント集は、Herokuの12-Factor Appsにインスパイアされた『LLMエージェントを本番品質に持っていくための12個のモジュラー設計則』である。</p>

<blockquote>
  <p>AIエージェントフレームワーク全体の比較・選定基準は <a href="/explain/ai-agent-framework-comparison-2026/">AIエージェントフレームワーク比較ガイド2026</a> をご覧ください。</p>
</blockquote>

<div class="point-box"><strong>この記事のポイント</strong><ul><li>・12-Factor AgentsはHumanLayer Dex Horthyが提唱したLLMエージェント設計12原則。</li><li>・フレームワークの否定ではなく、フレームワークが内部で行う設計判断を既存プロダクトに段階的に取り込む方向性。</li><li>・最重要原則はFactor 3（コンテキストウィンドウを所有する）。次点はFactor 2・5・8。</li><li>・ステートレスReducerモデルで、エージェント本体を純粋関数化し再開・分岐・観測を容易にする。</li><li>・MIT・LangGraph・OpenAI Assistants APIなどとは『どこを自分で持つか』の境界線が決定的に異なる。</li></ul></div>

<h2 id="1-12-factor-agentsとは何かdex-horthyが提示したllmエージェント設計原則">1. 12-Factor Agentsとは何か：Dex Horthyが提示したLLMエージェント設計原則</h2>

<p>12-Factor AgentsはHumanLayer社CEO/創業者のDex Horthy（GitHub: @dexhorthy）が2025年3月に公開したドキュメント集で、リポジトリは<code class="language-plaintext highlighter-rouge">humanlayer/12-factor-agents</code>にある。最終pushは2025年9月21日、Open Issuesは20件、Discordコミュニティとaidotengineerでの17分カンファレンストークが付随する。</p>

<p>タイトルはHerokuエンジニアのAdam Wigginsが2012年に提示した『The Twelve-Factor App』（12factor.net）への明示的なオマージュで、SaaSの設計原則をLLMエージェント時代に拡張した形になっている。</p>

<h3 id="12-factor-agentsの基本情報">12-Factor Agentsの基本情報</h3>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>内容</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>リポジトリ</td>
      <td><a href="https://github.com/humanlayer/12-factor-agents">humanlayer/12-factor-agents</a></td>
    </tr>
    <tr>
      <td>著者</td>
      <td>Dex Horthy（HumanLayer創業者）</td>
    </tr>
    <tr>
      <td>スター数</td>
      <td>19,949（2026年5月時点）</td>
    </tr>
    <tr>
      <td>フォーク数</td>
      <td>1,509</td>
    </tr>
    <tr>
      <td>初版公開</td>
      <td>2025年3月30日</td>
    </tr>
    <tr>
      <td>最終push</td>
      <td>2025年9月21日</td>
    </tr>
    <tr>
      <td>主言語</td>
      <td>TypeScript（解説・サンプルコード）</td>
    </tr>
    <tr>
      <td>コンテンツライセンス</td>
      <td>CC BY-SA 4.0</td>
    </tr>
    <tr>
      <td>コードライセンス</td>
      <td>Apache 2.0</td>
    </tr>
    <tr>
      <td>関連実装</td>
      <td><a href="https://github.com/got-agents/agents">got-agents/agents</a>、<a href="https://github.com/humanlayer/kubechain">humanlayer/kubechain</a></td>
    </tr>
  </tbody>
</table>

<p>Dexは前提として「すべてのフレームワークを試した結果、本番顧客向けエージェントの多くはフレームワークを使っていない」という観察を提示している。CrewAI・LangChain・smolagents・LangGraph・Griptapeを全部触った上での結論として書かれているため、フレームワーク否定論ではなくフレームワーク疲れに対する処方箋として読むべきだ。</p>

<h3 id="11-エージェントloop-until-doneというアンチパターン">1.1 「エージェント＝loop until done」というアンチパターン</h3>

<p>Dexの最初の問題提起は明快で、Anthropicが<a href="https://www.anthropic.com/engineering/building-effective-agents#agents">Building Effective Agents</a>で定義した「ここにプロンプトとツール一式があるからゴールに達するまでループしろ」というパターンは、本番運用には耐えないというものだ。</p>

<p>実際に出回っている『AIエージェント』を名乗るプロダクトの大半は、決定的コードの中にLLMステップを要所要所で差し込んでいるだけで、純粋なエージェントループはほとんど使われていない。エージェントは大部分が普通のソフトウェアで構成されている、というのが現場の現実である。</p>

<h3 id="12-70-80の壁とフレームワーク逆コンパイル地獄">1.2 70-80%の壁と『フレームワーク逆コンパイル地獄』</h3>

<p>READMEに掲載されたSaaSビルダーの典型的なジャーニーは7ステップで描かれている。</p>

<ol>
  <li>エージェントを作りたいと決める</li>
  <li>プロダクト設計とUXマッピングを行う</li>
  <li>早く動かしたいから<code class="language-plaintext highlighter-rouge">$FRAMEWORK</code>を採用する</li>
  <li>品質70-80%まで到達する</li>
  <li>顧客向け機能には80%では足りないと気づく</li>
  <li>80%を超えるためにフレームワーク内部・プロンプト・フローを逆コンパイルし始める</li>
  <li>ゼロから書き直す</li>
</ol>

<p>12-Factor Agentsの存在意義は、この7ステップ目に到達せずに済むよう、ステップ3の段階で『フレームワークではなく原則を取り込む』選択肢を提示することにある。</p>

<h3 id="13-12原則の全体マップ">1.3 12原則の全体マップ</h3>

<p>公式の12原則は以下のとおりだ。順番は依存関係を厳密に表すものではなく、各原則は独立適用可能になっている。</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>原則</th>
      <th>1行要約</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Natural Language to Tool Calls</td>
      <td>自然言語を構造化ツール呼び出しに変換する</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Own your prompts</td>
      <td>プロンプトをフレームワークに任せず自分で持つ</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Own your context window</td>
      <td>コンテキストウィンドウの構築を自分で制御する</td>
    </tr>
    <tr>
      <td>4</td>
      <td>Tools are just structured outputs</td>
      <td>ツール≒構造化出力＋決定的コードの結合</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Unify execution state and business state</td>
      <td>実行状態とビジネス状態を一本化する</td>
    </tr>
    <tr>
      <td>6</td>
      <td>Launch/Pause/Resume with simple APIs</td>
      <td>起動・一時停止・再開をシンプルAPIで提供する</td>
    </tr>
    <tr>
      <td>7</td>
      <td>Contact humans with tool calls</td>
      <td>人間への質問もツール呼び出しとして扱う</td>
    </tr>
    <tr>
      <td>8</td>
      <td>Own your control flow</td>
      <td>エージェント外側の制御フローを自分で書く</td>
    </tr>
    <tr>
      <td>9</td>
      <td>Compact errors into context window</td>
      <td>エラーを圧縮してコンテキストに戻す</td>
    </tr>
    <tr>
      <td>10</td>
      <td>Small, focused agents</td>
      <td>大きい1エージェントより小さい多数を並べる</td>
    </tr>
    <tr>
      <td>11</td>
      <td>Trigger from anywhere</td>
      <td>Slack・メール・Webhookどこからでも起動可能にする</td>
    </tr>
    <tr>
      <td>12</td>
      <td>Make your agent a stateless reducer</td>
      <td>エージェント本体をステートレスReducer化する</td>
    </tr>
  </tbody>
</table>

<p>Appendix扱いの『Factor 13: Pre-fetch all the context you might need』も付随しており、これは『LLMが必要としそうなコンテキストを先回りで取得しておく』最適化指針だ。</p>

<h2 id="2-設計の全体像エージェントループとステートレスreducerの関係">2. 設計の全体像：エージェントループとステートレスReducerの関係</h2>

<p>12原則の背骨を理解するうえで欠かせないのが、Dexが提示するエージェントループのミニマル疑似コードだ。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">initial_event</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">message</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">...</span><span class="sh">"</span><span class="p">}</span>
<span class="n">context</span> <span class="o">=</span> <span class="p">[</span><span class="n">initial_event</span><span class="p">]</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="n">next_step</span> <span class="o">=</span> <span class="k">await</span> <span class="n">llm</span><span class="p">.</span><span class="nf">determine_next_step</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
    <span class="n">context</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">next_step</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">==</span> <span class="sh">"</span><span class="s">done</span><span class="sh">"</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">next_step</span><span class="p">.</span><span class="n">final_answer</span>

    <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">execute_step</span><span class="p">(</span><span class="n">next_step</span><span class="p">)</span>
    <span class="n">context</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div></div>

<p>ループは4ステップに分解される。</p>

<ol>
  <li>LLMが構造化JSONで次ステップ（ツール呼び出し）を出力する</li>
  <li>決定的コードがツールを実行する</li>
  <li>結果をコンテキストウィンドウに追記する</li>
  <li>「done」が返るまで繰り返す</li>
</ol>

<p>この素朴ループはFactor 9のエラー圧縮を加えれば自己回復もできる。ただしDex本人が「実際にはこれだけではうまく動かない」と明言しているとおり、ここに残り11原則を積層しないと本番品質には届かない。</p>

<div class="mermaid">
flowchart LR
    User["ユーザー/Webhook/Cron"] --&gt;|Factor 11: trigger from anywhere| Launch["Launch API<br />Factor 6"]
    Launch --&gt; Thread["Thread / context window<br />Factor 5: unified state"]
    Thread --&gt;|Factor 3: own context| LLM["LLM<br />Factor 1: NL to tool calls<br />Factor 2: own prompts"]
    LLM --&gt;|Factor 4: structured output| Router["Switch / Control Flow<br />Factor 8"]
    Router --&gt;|deterministic code| Tools["Tools / APIs"]
    Tools --&gt;|Factor 9: compact errors| Thread
    Router --&gt;|Factor 7: ask human| Human["Human via Slack/email"]
    Human --&gt;|webhook resume| Thread
    Router --&gt;|Factor 10: handoff| SubAgent["Small focused sub-agent"]
    Router --&gt;|done| Reducer["Factor 12: stateless reducer<br />state = fold thread"]
</div>

<p>このフロー図は12原則をすべて1枚に並べたものだ。中心にあるのが<code class="language-plaintext highlighter-rouge">Thread</code>（コンテキストウィンドウそのもの）で、すべてのツール呼び出し・人間応答・エラーがイベントとして追記される。これを実現するのがFactor 5の「実行状態とビジネス状態の統一」である。</p>

<h3 id="21-状態--threadfoldlというモデル">2.1 「状態 = thread.foldl」というモデル</h3>

<p>Factor 12『Make your agent a stateless reducer』はDex自身が「これは半分楽しみで書いた」と前置きしている原則だが、本質はエージェントを純粋関数に閉じ込めることにある。</p>

<p>つまり、エージェントの現在状態は「これまでに発生したイベント列をfoldlした結果」として常に再構築可能であり、エージェント本体は次のステップを決定するだけのステートレス関数になる、というモデルだ。</p>

<p>これはReduxの<code class="language-plaintext highlighter-rouge">reducer</code>、Event Sourcing、関数型のFold/Scanと同じ発想で、再開・分岐・リプレイ・タイムトラベルデバッグといった嬉しさがそのままLLMエージェントに持ち込める。</p>

<h2 id="3-factor-1-4プロンプトとコンテキストを自分のコードとして持つ">3. Factor 1-4：プロンプトとコンテキストを自分のコードとして持つ</h2>

<p>12原則の前半4つは「LLMとアプリケーションコードの境界」を設計するための原則群だ。フレームワークが隠蔽しがちな部分を、明示的に開発者の手元に取り戻す方向で設計されている。</p>

<h3 id="31-factor-1-natural-language-to-tool-calls">3.1 Factor 1: Natural Language to Tool Calls</h3>

<p>最も基本的な原則で、自然言語のリクエストを構造化されたツール呼び出しに変換するという考え方だ。Dexは例として「2月のAI tinkerers meetupのスポンサー代として$750のpayment linkをTerri宛てに作って」という自然言語を、Stripe APIを叩く構造化JSONに変換するパターンを示している。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># LLMが自然言語を受け取り、構造化オブジェクトを返す
</span><span class="n">next_step</span> <span class="o">=</span> <span class="k">await</span> <span class="n">llm</span><span class="p">.</span><span class="nf">determine_next_step</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">create a payment link for $750 to Jeff </span><span class="sh">"</span>
    <span class="sh">"</span><span class="s">for sponsoring the february AI tinkerers meetup</span><span class="sh">"</span>
<span class="p">)</span>

<span class="c1"># 構造化出力に応じて決定的コードが分岐する
</span><span class="k">if</span> <span class="n">next_step</span><span class="p">.</span><span class="n">function</span> <span class="o">==</span> <span class="sh">"</span><span class="s">create_payment_link</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">stripe</span><span class="p">.</span><span class="n">payment_links</span><span class="p">.</span><span class="nf">create</span><span class="p">(</span><span class="n">next_step</span><span class="p">.</span><span class="n">parameters</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">next_step</span><span class="p">.</span><span class="n">function</span> <span class="o">==</span> <span class="sh">"</span><span class="s">something_else</span><span class="sh">"</span><span class="p">:</span>
    <span class="bp">...</span>
</code></pre></div></div>

<p>ポイントは、LLMの仕事は「次に何をするかをJSONで返すこと」だけに絞り、実行は決定的コードに任せる役割分担だ。</p>

<h3 id="32-factor-2-own-your-prompts">3.2 Factor 2: Own your prompts</h3>

<p>フレームワークが提供する「<code class="language-plaintext highlighter-rouge">role</code>・<code class="language-plaintext highlighter-rouge">goal</code>・<code class="language-plaintext highlighter-rouge">personality</code>・<code class="language-plaintext highlighter-rouge">tools</code>を渡せばあとはやっておく」タイプのブラックボックス抽象を捨て、プロンプトをファーストクラスのコードとして所有しろという原則だ。</p>

<p>Dexのサンプルでは、HumanLayerが推進する型付きプロンプトDSLである<a href="https://github.com/boundaryml/baml">BAML</a>を使った例が掲載されている。</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">function</span> <span class="nf">DetermineNextStep</span><span class="p">(</span><span class="n">thread</span><span class="p">:</span> <span class="n">string</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">DoneForNow</span> <span class="p">|</span> <span class="n">ListGitTags</span> <span class="p">|</span> <span class="n">DeployBackend</span> <span class="p">|</span> <span class="n">DeployFrontend</span> <span class="p">|</span> <span class="n">RequestMoreInformation</span> <span class="p">{</span>
    <span class="n">prompt</span> <span class="err">#</span><span class="s">"
        {{ _.role("</span><span class="n">system</span><span class="s">") }}

        You are a helpful assistant that manages deployments for frontend and backend systems.
        You work diligently to ensure safe and successful deployments by following best practices
        and proper deployment procedures.

        Before deploying any system, you should check:
        - The deployment environment (staging vs production)
        - The correct tag/version to deploy
        - The current system status
    "</span><span class="err">#</span>
<span class="p">}</span>
</code></pre></div></div>

<p>プロンプトを型と一緒に書ける、Gitで差分が取れる、レビューできる、テストできる——この4つを満たさないプロンプト管理は本番運用に耐えない、というのがFactor 2の主張だ。フレームワーク内部に隠蔽されると、最後の20%を詰める段階でブラックボックスを開かないと進めなくなる。</p>

<h3 id="33-factor-3-own-your-context-window最重要原則">3.3 Factor 3: Own your context window（最重要原則）</h3>

<p>READMEのトップに『Looking for Context Engineering? Jump straight to factor 3』と書かれているとおり、Dexが12原則の中で最も力を入れているのがこれだ。</p>

<p>LLMはステートレス関数で、入力（コンテキストウィンドウ）の質がそのまま出力の質を決める。そして「コンテキストウィンドウに何を入れるか」は標準のmessage形式（system/user/assistant/tool）に縛られる必要はない、というのが核心だ。</p>

<p>例えば、message形式ではなく独自XMLでgit操作履歴を表現すれば、トークン効率と注意効率を大幅に高められる、とDexは具体例を提示している。</p>

<div class="point-box"><strong>Factor 3が指す『コンテキスト』に含まれるもの</strong><ul><li>・モデルへの指示プロンプト</li><li>・RAGなどで取得した外部ドキュメント</li><li>・過去の状態・ツール呼び出し・結果・履歴</li><li>・関連する別スレッドのMemory</li><li>・期待する構造化出力のスキーマ</li></ul></div>

<blockquote>
  <p>RAG・エンベディング・検索を含めた『コンテキスト供給の総合設計』は <a href="/explain/rag-complete-guide-2026/">RAG完全ガイド2026：仕組みから運用まで</a> と合わせて読むと、より立体的に理解できます。</p>
</blockquote>

<h3 id="34-factor-4-tools-are-just-structured-outputs">3.4 Factor 4: Tools are just structured outputs</h3>

<p>『ツール』を特別な概念にせず、「LLMが出すJSON＋決定的コードによるディスパッチ」として捉え直す原則だ。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Issue</span><span class="p">:</span>
    <span class="n">title</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">description</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">team_id</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">assignee_id</span><span class="p">:</span> <span class="nb">str</span>

<span class="k">class</span> <span class="nc">CreateIssue</span><span class="p">:</span>
    <span class="n">intent</span><span class="p">:</span> <span class="sh">"</span><span class="s">create_issue</span><span class="sh">"</span>
    <span class="n">issue</span><span class="p">:</span> <span class="n">Issue</span>

<span class="k">class</span> <span class="nc">SearchIssues</span><span class="p">:</span>
    <span class="n">intent</span><span class="p">:</span> <span class="sh">"</span><span class="s">search_issues</span><span class="sh">"</span>
    <span class="n">query</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">what_youre_looking_for</span><span class="p">:</span> <span class="nb">str</span>
</code></pre></div></div>

<p>この設計を採ると、「LLMがツールを呼んだら必ず特定の関数を実行する」という1対1マッピングから解放され、同じintentでも文脈に応じて異なる挙動を取れる柔軟性が得られる。Factor 8の「制御フローを所有する」と組み合わせることで真価を発揮する。</p>

<h2 id="4-factor-5-8状態統一人間連携制御フローを自分のコードに引き戻す">4. Factor 5-8：状態統一・人間連携・制御フローを自分のコードに引き戻す</h2>

<p>ここから先は「フレームワークが隠蔽するエージェント外側の挙動」を、開発者の手元に取り戻すための原則群だ。</p>

<h3 id="41-factor-5-unify-execution-state-and-business-state">4.1 Factor 5: Unify execution state and business state</h3>

<p>AIフレームワークの多くは「実行状態（現在ステップ・次ステップ・待機状態・リトライ回数）」と「ビジネス状態（OpenAIメッセージ列・ツール呼び出しと結果）」を別々に管理する。</p>

<p>Dexの主張はこれを1本化せよ、というものだ。理想は「実行状態はビジネス状態（≒threadイベント列）から導出可能」にすること。これによって以下7つの利点が一気に手に入る。</p>

<ul>
  <li><strong>Simplicity</strong>: 真実の源（source of truth）が1つになる</li>
  <li><strong>Serialization</strong>: threadが自明にシリアライズ・デシリアライズ可能</li>
  <li><strong>Debugging</strong>: 全履歴が1箇所に集約される</li>
  <li><strong>Flexibility</strong>: 新しい状態はイベント型を追加するだけで足る</li>
  <li><strong>Recovery</strong>: threadを読み込めば任意の地点から再開できる</li>
  <li><strong>Forking</strong>: threadの一部をコピーして別IDで分岐できる</li>
  <li><strong>Human Interfaces</strong>: threadをそのままMarkdown・Web UIに変換できる</li>
</ul>

<p>これがそのままFactor 12のステートレスReducerにつながる伏線になっている。</p>

<h3 id="42-factor-6-launchpauseresume-with-simple-apis">4.2 Factor 6: Launch/Pause/Resume with simple APIs</h3>

<p>エージェントは結局のところプログラムなので、起動・一時停止・再開のAPIを普通のプログラムと同じ作法で提供せよ、という原則だ。</p>

<p>ユーザー・他アプリ・パイプライン・他エージェントから簡単なAPIで起動できること、長時間処理の前で一時停止できること、Webhookなど外部トリガーで再開できることが要件になる。これはFactor 5・Factor 8と密接に絡む。</p>

<p>特に注意すべき点として、多くのAIオーケストレータは「ツール選択とツール実行の間で一時停止できない」という制約を持つ、とDexは指摘している。Factor 7の人間承認フローを実装するうえで決定的な制約になる。</p>

<h3 id="43-factor-7-contact-humans-with-tool-calls">4.3 Factor 7: Contact humans with tool calls</h3>

<p>LLM APIにはデフォルトで「プレーンテキストを返すか、構造化データを返すか」という最初の1トークンに大きな重みが乗る、という性質がある。</p>

<p>天気の問い合わせなら最初のトークンは<code class="language-plaintext highlighter-rouge">"the"</code>、<code class="language-plaintext highlighter-rouge">fetch_weather</code>を呼ぶなら<code class="language-plaintext highlighter-rouge">|JSON&gt;</code>のような特殊トークン。Dexはここで「常にJSONを返させて、その中で<code class="language-plaintext highlighter-rouge">request_human_input</code>や<code class="language-plaintext highlighter-rouge">done_for_now</code>のような意図を宣言させる」設計を提案する。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Options</span><span class="p">:</span>
    <span class="n">urgency</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="sh">"</span><span class="s">low</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">medium</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">high</span><span class="sh">"</span><span class="p">]</span>
    <span class="nb">format</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="sh">"</span><span class="s">free_text</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">yes_no</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">multiple_choice</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">choices</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span>

<span class="k">class</span> <span class="nc">RequestHumanInput</span><span class="p">:</span>
    <span class="n">intent</span><span class="p">:</span> <span class="sh">"</span><span class="s">request_human_input</span><span class="sh">"</span>
    <span class="n">question</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">context</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">options</span><span class="p">:</span> <span class="n">Options</span>

<span class="k">if</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">==</span> <span class="sh">"</span><span class="s">request_human_input</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">thread</span><span class="p">.</span><span class="n">events</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
        <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">human_input_requested</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">,</span>
    <span class="p">})</span>
    <span class="n">thread_id</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">save_state</span><span class="p">(</span><span class="n">thread</span><span class="p">)</span>
    <span class="k">await</span> <span class="nf">notify_human</span><span class="p">(</span><span class="n">next_step</span><span class="p">,</span> <span class="n">thread_id</span><span class="p">)</span>
    <span class="k">return</span>  <span class="c1"># ループを抜けて応答待ち
</span></code></pre></div></div>

<p>人間への質問もツール呼び出しの一種として統一的に扱うことで、Slack・メール・SMSなど媒体を選ばずに人間-エージェント間のやりとりを設計できる。HumanLayer社のプロダクト自体がこのパターンを実装したマネージドサービスである。</p>

<h3 id="44-factor-8-own-your-control-flow">4.4 Factor 8: Own your control flow</h3>

<p>LangGraphやLangChainが提供する「制御フロー」を、自分のアプリケーションコードとして書け、という強い主張の原則だ。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">handle_next_step</span><span class="p">(</span><span class="n">thread</span><span class="p">:</span> <span class="n">Thread</span><span class="p">):</span>
    <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
        <span class="n">next_step</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">determine_next_step</span><span class="p">(</span><span class="nf">thread_to_prompt</span><span class="p">(</span><span class="n">thread</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">==</span> <span class="sh">"</span><span class="s">request_clarification</span><span class="sh">"</span><span class="p">:</span>
            <span class="n">thread</span><span class="p">.</span><span class="n">events</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">request_clarification</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">})</span>
            <span class="k">await</span> <span class="nf">send_message_to_human</span><span class="p">(</span><span class="n">next_step</span><span class="p">)</span>
            <span class="k">await</span> <span class="n">db</span><span class="p">.</span><span class="nf">save_thread</span><span class="p">(</span><span class="n">thread</span><span class="p">)</span>
            <span class="k">break</span>  <span class="c1"># 非同期ステップ：Webhookで再開
</span>        <span class="k">elif</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">==</span> <span class="sh">"</span><span class="s">fetch_open_issues</span><span class="sh">"</span><span class="p">:</span>
            <span class="n">thread</span><span class="p">.</span><span class="n">events</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">fetch_open_issues</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">})</span>
            <span class="n">issues</span> <span class="o">=</span> <span class="k">await</span> <span class="n">linear</span><span class="p">.</span><span class="nf">fetch_open_issues</span><span class="p">()</span>
            <span class="n">thread</span><span class="p">.</span><span class="n">events</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">fetch_open_issues_result</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">issues</span><span class="p">})</span>
            <span class="c1"># ループ継続
</span>        <span class="k">elif</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">==</span> <span class="sh">"</span><span class="s">deploy_backend</span><span class="sh">"</span><span class="p">:</span>
            <span class="c1"># 高リスク操作：人間承認待ち
</span>            <span class="k">await</span> <span class="nf">request_approval</span><span class="p">(</span><span class="n">next_step</span><span class="p">)</span>
            <span class="k">break</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">request_clarification</code>・<code class="language-plaintext highlighter-rouge">fetch_git_tags</code>・<code class="language-plaintext highlighter-rouge">deploy_backend</code>のように、ツール呼び出しの種類によってループを抜けるか継続するかを開発者が決められる。さらに以下のような実装が自分のコードに収まる。</p>

<ul>
  <li>ツール結果の要約・キャッシュ</li>
  <li>構造化出力に対するLLM-as-judge</li>
  <li>コンテキストウィンドウのコンパクション</li>
  <li>ロギング・トレーシング・メトリクス</li>
  <li>クライアントサイドのレートリミット</li>
  <li>永続的なsleep/pause/イベント待ち</li>
</ul>

<blockquote>
  <p>ハーネス（実行ループ）そのものの設計判断と実装パターンは <a href="/explain/agent-harness-basics/">エージェントハーネス基礎：自律エージェント実装の最小構成と落とし穴</a> で、さらに踏み込んだ実装則を扱っています。</p>
</blockquote>

<h2 id="5-factor-9-12エラー圧縮小型化トリガー多様化ステートレスreducer">5. Factor 9-12：エラー圧縮・小型化・トリガー多様化・ステートレスReducer</h2>

<p>12原則の後半は『エージェントを本番のソフトウェアシステムに組み込むときの境界条件』を扱う。1個でも欠けると運用フェーズで負債になる。</p>

<h3 id="51-factor-9-compact-errors-into-context-window">5.1 Factor 9: Compact Errors into Context Window</h3>

<p>LLMエージェントの『自己回復』はエラー・スタックトレースをそのままコンテキストに戻すだけで成立することが多い。Dexはこれを最小実装として示している。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">thread</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">events</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="n">initial_message</span><span class="p">]}</span>
<span class="n">consecutive_errors</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="n">next_step</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">determine_next_step</span><span class="p">(</span><span class="nf">thread_to_prompt</span><span class="p">(</span><span class="n">thread</span><span class="p">))</span>
    <span class="n">thread</span><span class="p">[</span><span class="sh">"</span><span class="s">events</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">})</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">handle_next_step</span><span class="p">(</span><span class="n">thread</span><span class="p">,</span> <span class="n">next_step</span><span class="p">)</span>
        <span class="n">thread</span><span class="p">[</span><span class="sh">"</span><span class="s">events</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="n">next_step</span><span class="p">.</span><span class="n">intent</span> <span class="o">+</span> <span class="sh">"</span><span class="s">_result</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="n">result</span><span class="p">})</span>
        <span class="n">consecutive_errors</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="n">consecutive_errors</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">consecutive_errors</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
            <span class="n">thread</span><span class="p">[</span><span class="sh">"</span><span class="s">events</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">({</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">error</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">data</span><span class="sh">"</span><span class="p">:</span> <span class="nf">format_error</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>
            <span class="k">continue</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">raise</span>
</code></pre></div></div>

<p>ポイントは「連続エラーカウンタを設けて無限ループを防ぐ」「<code class="language-plaintext highlighter-rouge">format_error</code>で長大なスタックトレースを圧縮する」の2点。生のスタックトレースを丸ごとコンテキストに戻すとトークンを浪費するので、要約・圧縮が前提だ。</p>

<h3 id="52-factor-10-small-focused-agents">5.2 Factor 10: Small, Focused Agents</h3>

<p>『なんでもできる巨大エージェント1個』より『3-10、最大20ステップで完結する小さいエージェントを多数並べる』方が本番品質が安定する、という原則だ。</p>

<p>理由はシンプルで、コンテキストが大きくなるほどLLMは集中力を失う。20ステップに収まる小さなエージェントを複数組み合わせる方が、デバッグも責任分割も明確になる。</p>

<blockquote>
  <h4 id="as-context-grows-llms-are-more-likely-to-get-lost-or-lose-focus">As context grows, LLMs are more likely to get lost or lose focus</h4>
</blockquote>

<p>『LLMがもっと賢くなれば不要では？』という反論に対し、Dexは「賢くなれば1エージェントあたりのステップ数を増やせるが、それでも分割の利点（テスト容易性・観測可能性・並列実行）は残る」と答えている。</p>

<h3 id="53-factor-11-trigger-from-anywhere-meet-users-where-they-are">5.3 Factor 11: Trigger from anywhere, meet users where they are</h3>

<p>エージェントはSlack・メール・SMS・Discord・Webhook・cron・他エージェントなど、ユーザーがいる場所すべてから起動できるべきだ、という原則だ。</p>

<p>これはFactor 6（Launch/Pause/Resume API）とセットで考える必要があり、HTTPだけでなくWebSocket・キュー・メッセージブローカーすべてをトリガー源として扱えるアーキテクチャを要求する。</p>

<h3 id="54-factor-12-make-your-agent-a-stateless-reducer">5.4 Factor 12: Make your agent a stateless reducer</h3>

<p>最後の原則は半分ジョーク半分本気のまとめで、「エージェントを純粋関数 = ステートレスReducerにせよ」というものだ。</p>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">type</span> <span class="nx">AgentEvent</span> <span class="o">=</span>
  <span class="o">|</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">user_message</span><span class="dl">"</span><span class="p">;</span> <span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="na">content</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">}</span>
  <span class="o">|</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">tool_call</span><span class="dl">"</span><span class="p">;</span> <span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="na">intent</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">params</span><span class="p">:</span> <span class="nx">unknown</span> <span class="p">}</span> <span class="p">}</span>
  <span class="o">|</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">tool_result</span><span class="dl">"</span><span class="p">;</span> <span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="na">intent</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">result</span><span class="p">:</span> <span class="nx">unknown</span> <span class="p">}</span> <span class="p">}</span>
  <span class="o">|</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">human_input</span><span class="dl">"</span><span class="p">;</span> <span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="na">content</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">}</span>
  <span class="o">|</span> <span class="p">{</span> <span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">error</span><span class="dl">"</span><span class="p">;</span> <span class="nl">data</span><span class="p">:</span> <span class="p">{</span> <span class="na">message</span><span class="p">:</span> <span class="kr">string</span> <span class="p">}</span> <span class="p">};</span>

<span class="kd">type</span> <span class="nx">Thread</span> <span class="o">=</span> <span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">events</span><span class="p">:</span> <span class="nx">AgentEvent</span><span class="p">[]</span> <span class="p">};</span>

<span class="c1">// エージェント本体はステートレス：thread → 次のAgentEvent</span>
<span class="kd">const</span> <span class="nx">determineNextStep</span> <span class="o">=</span> <span class="k">async </span><span class="p">(</span><span class="nx">thread</span><span class="p">:</span> <span class="nx">Thread</span><span class="p">):</span> <span class="nb">Promise</span><span class="o">&lt;</span><span class="nx">AgentEvent</span><span class="o">&gt;</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">prompt</span> <span class="o">=</span> <span class="nf">threadToPrompt</span><span class="p">(</span><span class="nx">thread</span><span class="p">);</span>
  <span class="k">return</span> <span class="k">await</span> <span class="nx">llm</span><span class="p">.</span><span class="nf">next</span><span class="p">(</span><span class="nx">prompt</span><span class="p">);</span>
<span class="p">};</span>

<span class="c1">// 状態は常にイベント列をfold（reduce）した結果</span>
<span class="kd">const</span> <span class="nx">currentState</span> <span class="o">=</span> <span class="p">(</span><span class="nx">thread</span><span class="p">:</span> <span class="nx">Thread</span><span class="p">)</span> <span class="o">=&gt;</span>
  <span class="nx">thread</span><span class="p">.</span><span class="nx">events</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(</span><span class="nx">applyEvent</span><span class="p">,</span> <span class="nx">initialState</span><span class="p">);</span>
</code></pre></div></div>

<p>このモデルが綺麗に乗ると、エージェントの動作はReduxのreducerやイベントソーシングと同型になり、リプレイ・分岐・タイムトラベルデバッグ・並列実行・分散化がすべて『普通のソフトウェアと同じ作法』で扱えるようになる。</p>

<blockquote>
  <p>エージェント時代のエンジニア像とキャリア設計は <a href="/explain/agentic-ai-engineer-roadmap-2026/">Agentic AIエンジニア・ロードマップ2026</a> を参照すると、12-Factor Agentsの位置付けがより明確になります。</p>
</blockquote>

<h2 id="6-12-factor-agentsを実装に落とすチェックリストと類似アプローチ比較">6. 12-Factor Agentsを実装に落とすチェックリストと類似アプローチ比較</h2>

<p>ここまで読んで「結局どの原則から実装するか」を判断するための、実装チェックリストと類似アプローチの比較を示す。</p>

<h3 id="61-実装チェックリスト推奨優先度順">6.1 実装チェックリスト（推奨優先度順）</h3>

<div class="point-box"><strong>導入時に最初に実装すべき4原則</strong><ol><li>Factor 3: コンテキストウィンドウを自分で構築（最重要）</li><li>Factor 2: プロンプトをコードとして所有（BAML等の型付きDSL推奨）</li><li>Factor 5: 実行状態とビジネス状態をthread単一に統合</li><li>Factor 8: 制御フローをアプリケーションコードに書く</li></ol></div>

<div class="point-box"><strong>本番投入直前に追加すべき4原則</strong><ol><li>Factor 6: Launch/Pause/Resume APIを公開</li><li>Factor 7: 人間質問もツール呼び出し化（HumanLayer等を活用）</li><li>Factor 9: エラー圧縮とリトライカウンタ</li><li>Factor 10: エージェントを3-20ステップに分割</li></ol></div>

<div class="point-box"><strong>スケール時に必要になる4原則</strong><ol><li>Factor 1: 自然言語→ツール呼び出し変換の品質計測</li><li>Factor 4: ツール=構造化出力＋ディスパッチへの統一</li><li>Factor 11: トリガー源の多様化（Slack・メール・Webhook）</li><li>Factor 12: ステートレスReducer化（リプレイ・分岐基盤）</li></ol></div>

<h3 id="62-類似アプローチとの比較">6.2 類似アプローチとの比較</h3>

<p>12-Factor Agentsを位置付けるため、代表的な5つのアプローチと並べて比較する。</p>

<table>
  <thead>
    <tr>
      <th>アプローチ</th>
      <th>提供形態</th>
      <th>プロンプト所有</th>
      <th>状態モデル</th>
      <th>人間連携</th>
      <th>適性レンジ</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>12-Factor Agents</strong></td>
      <td>設計原則集</td>
      <td>完全に開発者</td>
      <td>thread単一・Reducer</td>
      <td>tool callで明示</td>
      <td>70-100%の本番品質を狙う</td>
    </tr>
    <tr>
      <td>LangChain / LangGraph</td>
      <td>フレームワーク</td>
      <td>一部隠蔽</td>
      <td>graphベース</td>
      <td>callback/breakpoint</td>
      <td>0-80%の高速立ち上げ</td>
    </tr>
    <tr>
      <td>CrewAI</td>
      <td>フレームワーク</td>
      <td>role/goal/backstory抽象</td>
      <td>エージェント間共有</td>
      <td>限定的</td>
      <td>デモ・PoC・社内ツール</td>
    </tr>
    <tr>
      <td>OpenAI Assistants API</td>
      <td>マネージドAPI</td>
      <td>限定的（system指示のみ）</td>
      <td>thread API（不可視）</td>
      <td>限定的</td>
      <td>OpenAI依存で完結する用途</td>
    </tr>
    <tr>
      <td>AutoGen</td>
      <td>フレームワーク</td>
      <td>部分所有</td>
      <td>会話ベース</td>
      <td>proxy agent</td>
      <td>マルチエージェント研究</td>
    </tr>
    <tr>
      <td>Building Effective Agents (Anthropic)</td>
      <td>ガイド</td>
      <td>完全に開発者</td>
      <td>パターン提示のみ</td>
      <td>パターン提示のみ</td>
      <td>設計思想の基礎</td>
    </tr>
  </tbody>
</table>

<p>12-Factor Agentsの立ち位置は「フレームワークではなく原則集」「マネージドではなく開発者所有」「設計思想ではなく実装可能な12個の具体則」という3点で他とは交わらない。</p>

<h3 id="63-関連oss関連ドキュメント">6.3 関連OSS・関連ドキュメント</h3>

<p>Dex本人と関係者が公開している関連リソースをまとめておく。これらを順に読むと12-Factor Agentsの理解が深まる。</p>

<ul>
  <li><a href="https://12factor.net">12 Factor Apps</a> — オリジナルのHeroku版、本家</li>
  <li><a href="https://www.anthropic.com/engineering/building-effective-agents#agents">Anthropic: Building Effective Agents</a> — エージェントパターンの公式整理</li>
  <li><a href="https://github.com/boundaryml/baml">BAML（boundaryml/baml）</a> — Dexがプロンプト所有に推す型付きDSL</li>
  <li><a href="https://github.com/got-agents/agents">got-agents/agents</a> — 12-Factor準拠のOSSエージェント実装</li>
  <li><a href="https://github.com/humanlayer/kubechain">humanlayer/kubechain</a> — Dex本人が「12原則を破って書いた」分散エージェントフレームワーク</li>
  <li><a href="https://tomasp.net/blog/2015/library-frameworks/">Tom Petricek: Library patterns: Why frameworks are evil</a> — Dexが思想的下敷きとして引用</li>
  <li><a href="https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction">Sandi Metz: The Wrong Abstraction</a> — 早すぎる抽象化への警鐘</li>
</ul>

<p>エージェント時代のトークン経済を含めた最適化観点は、別記事の <a href="/explain/ai-agent-token-optimization-guide-2026/">AIエージェントのトークン最適化ガイド2026</a> で、コンテキストウィンドウ圧縮の具体手法と合わせて扱っている。</p>

<h3 id="64-12-factor-agentsを採用しない方が良いケース">6.4 12-Factor Agentsを採用しない方が良いケース</h3>

<p>最後に、Dex本人もREADMEで触れている「フレームワークを選んだ方が良いケース」を明確化しておく。</p>

<ul>
  <li><strong>社内ツール・PoC・ハッカソンプロジェクト</strong>：70-80%品質で十分なら、CrewAIやLangChainの方が立ち上がりが圧倒的に速い</li>
  <li><strong>MLエンジニアが主導するR&amp;D</strong>：パターン研究には事前パッケージ済みのAutoGen・LangGraphの方が適している</li>
  <li><strong>OpenAI/Anthropicに完全依存できる用途</strong>：Assistants APIで足りるなら、自前で12原則を実装する価値は薄い</li>
</ul>

<p>12-Factor Agentsの主戦場は「顧客向け本番プロダクトで品質80-100%を狙う」段階だ。この段階に至っていないチームが先回りで12原則を実装すると、過剰設計になりやすい点には注意したい。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/humanlayer/12-factor-agents">humanlayer/12-factor-agents（公式リポジトリ）</a> — Dex Horthy著、CC BY-SA 4.0 / Apache 2.0</li>
  <li><a href="https://github.com/humanlayer/12-factor-agents/blob/main/content/factor-03-own-your-context-window.md">Factor 3: Own your context window（公式ドキュメント）</a> — 最重要原則のフル解説</li>
  <li><a href="https://12factor.net/">The Twelve-Factor App（12factor.net）</a> — Adam Wiggins著、本家12原則</li>
  <li><a href="https://www.anthropic.com/engineering/building-effective-agents#agents">Anthropic: Building Effective Agents</a> — エージェントパターンの公式整理</li>
  <li><a href="https://youtu.be/8bIHcttkOTE">Tool Use Podcast: Dex Horthy（2025年3月）</a> — 著者本人による背景説明</li>
  <li><a href="https://www.youtube.com/watch?v=8kMaTybvDUw">aidotengineer conf talk（17分）</a> — 公式カンファレンストーク</li>
</ul>

<!--
配信メモ:
- X投稿時間帯: 08時台JST / 23時台JST（imp 10倍枠）
- フック案: 「LLMエージェントの70-80%の壁を超えるための12原則を、★19,949の本家ドキュメントから一次ソースで整理した」
- はてブ向け: 「フレームワーク逆コンパイル地獄」「ステートレスReducer」のキーワードを冒頭で出す
- 内部リンク提案: AIエージェント比較ガイド（ピラー）、agent-harness-basics、agentic-ai-engineer-roadmap、ai-agent-token-optimization-guide、RAG完全ガイド（クロスクラスタ）
-->]]></content><author><name></name></author><category term="agent" /><category term="agent" /><category term="agents" /><category term="AIエージェント" /><category term="12-factor-agents" /><category term="llm" /><category term="production" /><category term="design-pattern" /><category term="humanlayer" /><category term="typescript" /><summary type="html"><![CDATA[humanlayer/12-factor-agents（★19,949）はDex Horthyが提唱したLLMエージェントを本番投入するための12原則集。フレームワークで70-80%の壁にぶつかった後の設計判断を、自然言語→ツール呼び出し・コンテキスト所有・状態統一・ステートレスReducerまで一次ソースから読み解く。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_12-factor-agents-principles-guide.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_12-factor-agents-principles-guide.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Claude Code v2.1.140〜143｜claude agentsフラグ大量追加・Fast ModeがOpus 4.7</title><link href="https://ai-heartland.com/explain/claude-code-v2-1-143-update/" rel="alternate" type="text/html" title="Claude Code v2.1.140〜143｜claude agentsフラグ大量追加・Fast ModeがOpus 4.7" /><published>2026-05-18T09:00:00+09:00</published><updated>2026-05-18T09:00:00+09:00</updated><id>https://ai-heartland.com/explain/claude-code-v2-1-143-update</id><content type="html" xml:base="https://ai-heartland.com/explain/claude-code-v2-1-143-update/"><![CDATA[<p>この記事ではClaude Codeに特化して解説します。Claude Code全般は <a href="/explain/claude-code-complete-guide-2026/">Claude Code完全ガイド2026：インストールから本番運用まで</a> をご覧ください。</p>

<div class="conclusion-box">

<strong>この記事のポイント</strong>
<ul>
<li>2026年5月12〜15日の<strong>v2.1.140〜v2.1.143</strong>は、claude agents（バックグラウンドセッション管理）まわりの大改修</li>
<li><strong>v2.1.142</strong> でclaude agentsに<code>--add-dir</code>/<code>--settings</code>/<code>--mcp-config</code>等のフラグが一気に追加、Fast Modeが<strong>Opus 4.7</strong>へ昇格</li>
<li><strong>v2.1.140</strong> のAgentツール<code>subagent_type</code>曖昧マッチで、サブエージェント呼び出しの失敗が激減</li>
<li><strong>v2.1.143</strong> のプラグイン依存強制（disable時に依存先を保護、enable時に推移的に有効化）でプラグインエコシステムが破綻しにくくなった</li>
<li>macOSスリープ・brew upgrade・Chrome拡張接続など、バックグラウンドセッションの<strong>リグレッション3連発</strong>が一気に潰された</li>
</ul>

</div>

<h2 id="v21140143を一望する4連続リリースの全体像">v2.1.140〜143を一望する：4連続リリースの全体像</h2>

<p>Claude Codeは1日1リリースに近い高速サイクルで進化しています。今回扱う5月12〜15日の4本は、いずれも前週（5/11）にリリースされた <code class="language-plaintext highlighter-rouge">claude agents</code>（Research Preview）と <code class="language-plaintext highlighter-rouge">/goal</code> コマンドの周辺を整える「仕上げの週」でした。リリース全体を時系列で並べると、claude agentsの土台 → サブエージェント呼び出し改善 → 通知・ワークスペース → バックグラウンドセッションのフラグ拡充 → プラグイン依存 という流れが見えてきます。</p>

<div class="mermaid">
flowchart LR
    A[v2.1.139<br />5/11<br />claude agents追加] --&gt; B[v2.1.140<br />5/12<br />subagent_type曖昧マッチ]
    B --&gt; C[v2.1.141<br />5/13<br />terminalSequence<br />WORKSPACE_ID]
    C --&gt; D[v2.1.142<br />5/14<br />claude agents大量フラグ<br />Fast Mode Opus 4.7]
    D --&gt; E[v2.1.143<br />5/15<br />plugin依存強制<br />bgIsolation:none]
</div>

<p>主要な追加機能・修正を1枚にまとめます。</p>

<table>
  <thead>
    <tr>
      <th>バージョン</th>
      <th>リリース日</th>
      <th>主な追加</th>
      <th>主な修正</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>v2.1.139</td>
      <td>2026-05-11</td>
      <td>claude agents（Research Preview）／<code class="language-plaintext highlighter-rouge">/goal</code>／<code class="language-plaintext highlighter-rouge">/scroll-speed</code>／transcript view強化</td>
      <td>—</td>
    </tr>
    <tr>
      <td>v2.1.140</td>
      <td>2026-05-12</td>
      <td>subagent_type曖昧マッチ／agentカラーパレット更新</td>
      <td><code class="language-plaintext highlighter-rouge">/goal</code>がhook無効時にハング／<code class="language-plaintext highlighter-rouge">--bg</code>接続切断／symlink設定リロード</td>
    </tr>
    <tr>
      <td>v2.1.141</td>
      <td>2026-05-13</td>
      <td>terminalSequence hookフィールド／<code class="language-plaintext highlighter-rouge">ANTHROPIC_WORKSPACE_ID</code>／<code class="language-plaintext highlighter-rouge">claude agents --cwd</code></td>
      <td>spinner遅延時の視認性／プラグインメニュー操作性</td>
    </tr>
    <tr>
      <td>v2.1.142</td>
      <td>2026-05-14</td>
      <td>claude agentsに8種類の起動フラグ／Fast ModeデフォルトOpus 4.7／root-level SKILL.md</td>
      <td><code class="language-plaintext highlighter-rouge">MCP_TOOL_TIMEOUT</code>がHTTP/SSEに効かない／macOSスリープ後の常駐喪失／brew upgrade後のクラッシュループ</td>
    </tr>
    <tr>
      <td>v2.1.143</td>
      <td>2026-05-15</td>
      <td>プラグイン依存enforcement／<code class="language-plaintext highlighter-rouge">worktree.bgIsolation: "none"</code>／PowerShell <code class="language-plaintext highlighter-rouge">-ExecutionPolicy Bypass</code></td>
      <td>破損<code class="language-plaintext highlighter-rouge">.credentials.json</code>でハング／stop hookの無限ループ／Esc/Ctrl+Cで<code class="language-plaintext highlighter-rouge">/loop</code>覚醒キャンセル不可</td>
    </tr>
  </tbody>
</table>

<p>以下、各リリースを実務で使う順に深掘りします。</p>

<h2 id="v21139claude-agents-が研究プレビューで登場">v2.1.139：claude agents が研究プレビューで登場</h2>

<p>claude agentsは、これまで <code class="language-plaintext highlighter-rouge">/bg</code> や <code class="language-plaintext highlighter-rouge">←←</code> で散発的に起動していた<strong>バックグラウンドセッションをひとつのリストに統合する</strong>新しいビューです。<code class="language-plaintext highlighter-rouge">claude agents</code> をターミナルで叩くと、実行中（Working）／ユーザー入力待ち（Blocked on you）／完了済み（Completed）のセッションが一画面に並びます。</p>

<p>合わせて入った <code class="language-plaintext highlighter-rouge">/goal</code> コマンドは、<strong>完了条件を宣言してターン跨ぎで作業を継続させる</strong>仕組みです。interactive / <code class="language-plaintext highlighter-rouge">-p</code> / Remote Control のいずれからも使え、経過時間・ターン数・トークン消費がオーバーレイ表示されます。長時間の自動化タスクで「目的に到達するまで止まらない」運用が公式機能として組み込まれたのは大きな転換点です。</p>

<p>ただし <code class="language-plaintext highlighter-rouge">/goal</code> は v2.1.140 と v2.1.142 で複数の不具合（hook無効環境でハング／背景シェル稼働中に評価器が暴走）が立て続けに修正されています。「機能としては入ったが本格運用は次バージョン待ち」と見るのが妥当です。</p>

<p>その他、transcript viewのキーボードショートカット（<code class="language-plaintext highlighter-rouge">?</code> でヘルプ、<code class="language-plaintext highlighter-rouge">{</code>/<code class="language-plaintext highlighter-rouge">}</code> でユーザープロンプト間ジャンプ、<code class="language-plaintext highlighter-rouge">v</code> でショートカット表示）、hookの <code class="language-plaintext highlighter-rouge">args: string[]</code>（shellを経由せず直接プロセス起動）、PostToolUse hookの <code class="language-plaintext highlighter-rouge">continueOnBlock</code>（リジェクト理由をClaudeに戻してターン継続）、<code class="language-plaintext highlighter-rouge">/mcp</code> 再接続時の <code class="language-plaintext highlighter-rouge">.mcp.json</code> 自動反映といった地味だが効く改善が多数入っています。</p>

<h2 id="v21140subagent_type-が大小文字区切り文字を無視するようになった">v2.1.140：subagent_type が大小文字・区切り文字を無視するようになった</h2>

<p>このバージョンの目玉は、Agentツール呼び出しの <strong><code class="language-plaintext highlighter-rouge">subagent_type</code> が緩いマッチで解決される</strong>ようになったことです。たとえばユーザー定義エージェント <code class="language-plaintext highlighter-rouge">code-reviewer</code> に対して、モデルが <code class="language-plaintext highlighter-rouge">"Code Reviewer"</code> / <code class="language-plaintext highlighter-rouge">"code_reviewer"</code> / <code class="language-plaintext highlighter-rouge">"CodeReviewer"</code> のいずれを書いても解決されます。</p>

<p>これまでは <code class="language-plaintext highlighter-rouge">subagent_type</code> のタイポでサブエージェント起動が失敗し、Claudeがリトライまたは諦めるケースが頻発していました。とくに <code class="language-plaintext highlighter-rouge">.claude/agents/</code> 配下のファイル名と説明文の表記揺れ（<code class="language-plaintext highlighter-rouge">Code Reviewer</code> と説明し、ファイル名は <code class="language-plaintext highlighter-rouge">code-reviewer.md</code>）でハマる典型パターンが解消されます。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># v2.1.140 以降、以下はすべて同じエージェントに解決される</span>
claude <span class="nt">-p</span> <span class="s2">"Use the Code Reviewer agent to audit src/"</span>
claude <span class="nt">-p</span> <span class="s2">"Use code_reviewer to audit src/"</span>
claude <span class="nt">-p</span> <span class="s2">"Use CodeReviewer to audit src/"</span>
<span class="c"># → .claude/agents/code-reviewer.md が起動</span>
</code></pre></div></div>

<p>合わせて修正されたリグレッションが密度高めです:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">/goal</code> が <code class="language-plaintext highlighter-rouge">disableAllHooks</code> / <code class="language-plaintext highlighter-rouge">allowManagedHooksOnly</code> 設定下で<strong>沈黙ハング</strong>する問題（無限スピナー）を、明示的なメッセージ表示に変更</li>
  <li>symlinked settings のホットリロードで<strong>変更イベントが誤帰属</strong>し、無関係な <code class="language-plaintext highlighter-rouge">ConfigChange</code> hookが暴発する問題を修正</li>
  <li><code class="language-plaintext highlighter-rouge">claude --bg</code> 起動時にバックグラウンドサービスがidle-exit直前だと「connection dropped mid-request」で失敗する競合状態</li>
  <li>Windowsで <code class="language-plaintext highlighter-rouge">gh</code> 等の不在実行ファイルに対し、毎チェックごとに同期的な <code class="language-plaintext highlighter-rouge">where.exe</code> を再生成し続け<strong>イベントループがストールする</strong>問題</li>
  <li><code class="language-plaintext highlighter-rouge">Read</code> ツール呼び出しで <code class="language-plaintext highlighter-rouge">offset</code> が空白パディング・<code class="language-plaintext highlighter-rouge">+</code>プレフィックス付きの文字列で来るとバリデーションが失敗する問題</li>
</ul>

<p>「symlinked settings」「<code class="language-plaintext highlighter-rouge">Read</code>のoffset文字列バリデーション」あたりは、Claude Code Skills（プラグインから供給される設定ファイル群）を本格運用しているユーザーが踏みがちな地雷でした。</p>

<h2 id="v21141通知workspaceidcwdスコープ">v2.1.141：通知・WorkspaceID・cwdスコープ</h2>

<p>terminalSequence hookフィールドの追加が地味に強力です。これまでhookは標準出力に文字列を返すだけでしたが、JSON出力に <code class="language-plaintext highlighter-rouge">terminalSequence</code> を含めると<strong>デスクトップ通知・ウィンドウタイトル変更・ベル</strong>を、controlling terminalがなくても発行できるようになりました。バックグラウンドセッションから完了通知を出す用途で効きます。</p>

<p><code class="language-plaintext highlighter-rouge">ANTHROPIC_WORKSPACE_ID</code> 環境変数は、Workload Identity Federation（WIF）でフェデレーションルールが複数ワークスペースをカバーする場合に、ミントされるトークンを特定ワークスペースに<strong>スコープする</strong>ためのものです。Enterprise/Teamプランの管理者向けで、組織ガバナンス周りの精緻化と言えます。</p>

<p><code class="language-plaintext highlighter-rouge">claude agents --cwd &lt;path&gt;</code> で、claude agentsのセッション一覧を<strong>ディレクトリスコープで絞り込める</strong>ようになりました。複数プロジェクトを並行運用しているユーザーには必須のフラグです。</p>

<p>その他、<code class="language-plaintext highlighter-rouge">/feedback</code> に「直近24時間/7日のセッションを含める」オプション、Rewindメニューに「Summarize up to here」（過去ターンだけ圧縮して直近を残す）、Auto modeの権限ダイアログに「なぜそのルールでプロンプトが出たか」の説明が出るようになりました。</p>

<h2 id="v21142claude-agentsに8種類のフラグが一気に追加fast-modeがopus-47">v2.1.142：claude agentsに8種類のフラグが一気に追加、Fast ModeがOpus 4.7</h2>

<p>このバージョンが今回の4連続リリースで<strong>最も影響が大きい</strong>回です。claude agentsから派生するバックグラウンドセッションを、通常セッションと同じ粒度で構成できるようになりました。</p>

<p>新しく使えるフラグ:</p>

<table>
  <thead>
    <tr>
      <th>フラグ</th>
      <th>役割</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--add-dir &lt;path&gt;</code></td>
      <td>セッションのworkspaceに追加ディレクトリを参加させる</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--settings &lt;file&gt;</code></td>
      <td>プロジェクト固有のsettings.jsonを明示指定</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--mcp-config &lt;file&gt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">.mcp.json</code>の別ファイルを使う</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--plugin-dir &lt;path&gt;</code></td>
      <td>ローカルプラグインディレクトリを読み込む</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--permission-mode &lt;mode&gt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">auto</code>/<code class="language-plaintext highlighter-rouge">plan</code>/<code class="language-plaintext highlighter-rouge">bypassPermissions</code>等を指定</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--model &lt;id&gt;</code></td>
      <td>モデルIDを固定（<code class="language-plaintext highlighter-rouge">claude-opus-4-7</code>等）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--effort &lt;level&gt;</code></td>
      <td>thinking effortレベルを指定</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">--dangerously-skip-permissions</code></td>
      <td>権限プロンプトを完全スキップ</td>
    </tr>
  </tbody>
</table>

<p>たとえば、専用のMCPサーバ群・専用のskillセットを使うバックグラウンドエージェントを以下のように起動できます。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude agents launch <span class="se">\</span>
  <span class="nt">--add-dir</span> ~/work/datasets <span class="se">\</span>
  <span class="nt">--settings</span> .claude/bg-settings.json <span class="se">\</span>
  <span class="nt">--mcp-config</span> .claude/bg-mcp.json <span class="se">\</span>
  <span class="nt">--plugin-dir</span> .claude/bg-plugins <span class="se">\</span>
  <span class="nt">--permission-mode</span> auto <span class="se">\</span>
  <span class="nt">--model</span> claude-opus-4-7 <span class="se">\</span>
  <span class="nt">--effort</span> high <span class="se">\</span>
  <span class="nt">-p</span> <span class="s2">"Watch the dataset directory and run the validation suite when new files land"</span>
</code></pre></div></div>

<p>これまでは通常セッションでしか細かい構成ができず、claude agents経由のバックグラウンドセッションは「現在のClaude Code設定がそのまま継承される」しかありませんでした。デバッグ用エージェント・本番監視用エージェント・コードレビュー用エージェントを<strong>異なる権限・MCP・モデルで並行常駐させる</strong>運用が、ようやく公式に手当てされた形です。</p>

<h3 id="fast-mode-が-opus-47-へ">Fast Mode が Opus 4.7 へ</h3>

<p>Fast ModeはClaude Codeで <code class="language-plaintext highlighter-rouge">/fast</code> トグルや <code class="language-plaintext highlighter-rouge">--fast</code> フラグで有効化する、<strong>応答速度優先のモード</strong>です。これまではOpus 4.6が固定でしたが、v2.1.142 から Opus 4.7 に切り替わりました。</p>

<p>公式リリースノートには「速度を保ったまま」とあり、Fast Mode = 小さいモデルへのダウングレードではない（Opus内部での出力最適化）ことが改めて強調されています。旧Opus 4.6に戻したい場合は環境変数で固定できます。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Fast Mode を Opus 4.6 に固定（旧挙動）</span>
<span class="nb">export </span><span class="nv">CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE</span><span class="o">=</span>1
claude <span class="nt">--fast</span>
</code></pre></div></div>

<h3 id="プラグイン体験の改善">プラグイン体験の改善</h3>

<p>ルート直下に <code class="language-plaintext highlighter-rouge">SKILL.md</code> だけを置いた<strong>ミニマル構成のプラグイン</strong>も、skillとして自動認識されるようになりました。これまでは <code class="language-plaintext highlighter-rouge">skills/&lt;name&gt;/SKILL.md</code> の階層が必須で、単一skillだけを配るプラグインで冗長になっていました。</p>

<p><code class="language-plaintext highlighter-rouge">/plugin</code> 詳細ペインと <code class="language-plaintext highlighter-rouge">claude plugin details</code> が、プラグイン提供のLSPサーバを列挙するようになり、<code class="language-plaintext highlighter-rouge">/web-setup</code> がGitHub App接続を<strong>上書きする前に警告</strong>を出すようになりました。</p>

<h3 id="バックグラウンドセッションの3大リグレッション修正">バックグラウンドセッションの3大リグレッション修正</h3>

<p>v2.1.142 のリリースノートを読み込むと、claude agents系で<strong>前バージョンまで踏んでいた地雷</strong>がまとめて修正されています:</p>

<ol>
  <li><strong>macOSスリープ・ウェイク後にバックグラウンドセッションが消える</strong> — daemonがウェイク後の時計ジャンプを「アイドル経過時間」と誤解する問題を修正。clock jump検出に切り替え。</li>
  <li><strong><code class="language-plaintext highlighter-rouge">brew upgrade</code> 後にdaemonがクラッシュループ</strong> — 古いバイナリパスを掴んだdaemonが消えたパスで再起動を繰り返す問題。アップグレード後の clean exit を実装。</li>
  <li><strong>Claude-in-Chrome拡張接続中で共有タブがない場合のクラッシュループ</strong> — 拡張接続だけで共有タブがないケースのエッジを処理。</li>
</ol>

<p>加えて、claude agentsアタッチセッションでリンクをクリックしたとき、バックグラウンドワーカーのheadless browserが起動しない問題、<code class="language-plaintext highlighter-rouge">MCP_TOOL_TIMEOUT</code> がリモートHTTP/SSE MCPサーバには効かず<strong>60秒で打ち切られる</strong>問題（このリグレッションは設定値が無視されるので気づきにくい）も修正されています。</p>

<h2 id="v21143プラグイン依存強制と-worktreebgisolation-none">v2.1.143：プラグイン依存強制と worktree.bgIsolation: “none”</h2>

<p>最新の v2.1.143 で目を引くのは、<strong>プラグイン依存の双方向enforcement</strong>です。</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">claude plugin disable</code> は、対象プラグインに依存する他の有効プラグインがあると<strong>拒否</strong>し、コピペできる依存チェーン解除手順を表示します</li>
  <li><code class="language-plaintext highlighter-rouge">claude plugin enable</code> は、有効化対象が依存する未有効プラグインを<strong>推移的に強制有効化</strong>します</li>
</ul>

<p>プラグインが疎結合に増えてくると、「Aを止めたつもりがBが暗黙にAを呼んでいて落ちる」典型的な事故が発生します。npm/pip相当の依存ガードがClaude Codeの<code class="language-plaintext highlighter-rouge">.claude/plugins/</code>周辺にも入ったと考えるのが分かりやすいでしょう。</p>

<p>合わせて、<code class="language-plaintext highlighter-rouge">/plugin</code> マーケットプレース閲覧画面に<strong>ターン当たり/呼び出し当たりのトークン推定コスト</strong>が表示されるようになりました。プラグインを増やしすぎてコンテキストを食い潰す事故を未然に防ぐ意図が読み取れます。</p>

<h3 id="worktreebgisolation-none">worktree.bgIsolation: “none”</h3>

<p>claude agentsが起動するバックグラウンドセッションは、デフォルトで <code class="language-plaintext highlighter-rouge">EnterWorktree</code> を呼んで一時worktree内で作業します。これは複数エージェントが同じファイルを編集する競合を防ぐためですが、<strong>巨大monorepoや独自ビルドシステムを持つプロジェクト</strong>では worktree 作成自体が現実的でないケースがあります。</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">//</span><span class="w"> </span><span class="err">.claude/settings.json</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"worktree"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"bgIsolation"</span><span class="p">:</span><span class="w"> </span><span class="s2">"none"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>この設定をすると、バックグラウンドセッションは作業コピーを<strong>直接編集する</strong>ようになります。複数エージェントを同時に走らせる場合は競合管理を自前で行う前提です。デフォルト挙動（worktreeで隔離）は変わらず、明示的にopt-outする形になっています。</p>

<h3 id="powershell-executionpolicy-bypass">PowerShell ExecutionPolicy Bypass</h3>

<p>PowerShellツールが <code class="language-plaintext highlighter-rouge">-ExecutionPolicy Bypass</code> を渡すようになりました。Windowsエンタープライズ環境でGroup Policy（GPO）により実行ポリシーが <code class="language-plaintext highlighter-rouge">Restricted</code> または <code class="language-plaintext highlighter-rouge">AllSigned</code> に設定されていると、Claude Codeが投入する一時スクリプトが<strong>ブロックされてツールが空振りする</strong>事象が頻発していました。</p>

<p>組織ポリシー側でExecutionPolicyを尊重したい場合は環境変数でopt-outできます。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY</span><span class="o">=</span>1
</code></pre></div></div>

<h3 id="その他の修正改善">その他の修正・改善</h3>

<ul>
  <li>破損した <code class="language-plaintext highlighter-rouge">.credentials.json</code>（<code class="language-plaintext highlighter-rouge">scopes</code> が非配列）でCLI起動がハング、または<strong>OAuthトークンリフレッシュが沈黙abort</strong>する問題を修正。長期間ログイン状態のユーザーで起きやすい</li>
  <li>stop hookが繰り返しblockすると無限ループに陥る問題を、<strong>8回連続block</strong>で警告とともにターン終了するよう変更。<code class="language-plaintext highlighter-rouge">CLAUDE_CODE_STOP_HOOK_BLOCK_CAP</code> でオーバーライド可能</li>
  <li><code class="language-plaintext highlighter-rouge">/loop</code> の覚醒待機中にEsc/Ctrl+Cが効かない問題を修正。<code class="language-plaintext highlighter-rouge">/loop</code> 走行中の中断が現実的になった</li>
  <li><code class="language-plaintext highlighter-rouge">/goal</code> 評価器が<strong>バックグラウンドシェル/サブエージェント実行中</strong>に動いてしまう問題を修正</li>
  <li><code class="language-plaintext highlighter-rouge">NO_COLOR</code>/<code class="language-plaintext highlighter-rouge">FORCE_COLOR</code> をsettings.jsonの <code class="language-plaintext highlighter-rouge">env</code> で渡すと<strong>Claude Code自体のUI色まで奪われる</strong>問題を修正</li>
  <li>claude agentsアタッチセッションでのWindows Terminal / WSL右クリックペースト</li>
  <li>Shift+Tab 操作のサイクルにauto modeを追加</li>
</ul>

<h2 id="5月中旬リリースから読み取れる開発方針">5月中旬リリースから読み取れる開発方針</h2>

<p>4連続の更新を一段引いて眺めると、Anthropic が claude agents を<strong>単なるダッシュボード機能ではなくClaude Codeの第2の入口</strong>に位置づけ始めたことが見て取れます。これまでClaude Codeは「ターミナルで <code class="language-plaintext highlighter-rouge">claude</code> を叩いて対話開始」が事実上の唯一の入口でしたが、5月のリリース群では</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">claude agents</code> でセッションをリスト管理</li>
  <li><code class="language-plaintext highlighter-rouge">claude agents launch --add-dir ... --mcp-config ... --model ...</code> で起動条件を細かく指定</li>
  <li>worktree隔離の有無やplugin依存をビューから可視化</li>
  <li>macOSスリープ・OSアップグレード・拡張接続といった<strong>長時間稼働で踏みがちな地雷</strong>を順番に潰す</li>
</ul>

<p>という、「常駐エージェントを安定運用するためのCLI管理面」が一気に整いました。これは <a href="/explain/claude-code-architecture-blueprint/">Claude Code Architecture Blueprint</a> で議論したような、<strong>エージェントOSとしてのClaude Code</strong>という方向性を裏付ける動きです。</p>

<p>逆に言えば、まだ前景セッションのみで使っているユーザーから見ると今回のリリース群は地味に映ります。<code class="language-plaintext highlighter-rouge">/goal</code> や <code class="language-plaintext highlighter-rouge">/scroll-speed</code> 程度しか直接触れる新コマンドがないからです。しかしバックグラウンド常駐を試したことのあるユーザーには、5月12〜15日の修正は<strong>確実に体感できる安定化</strong>として効いてきます。</p>

<h2 id="アップデート方法">アップデート方法</h2>

<p>ターミナルで以下のいずれかを実行します。OSやインストール方法に応じて選んでください。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Homebrewインストールの場合</span>
brew upgrade claude-code

<span class="c"># claudeコマンドからの直接アップデート</span>
claude update

<span class="c"># バージョン確認</span>
claude <span class="nt">--version</span>    <span class="c"># 2.1.143 以降を確認</span>
</code></pre></div></div>

<p>Homebrew/WinGetでインストールしていて、v2.1.129以降で導入された自動アップデートを有効化している場合（<code class="language-plaintext highlighter-rouge">CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1</code>）は、起動時にバックグラウンドでアップグレードが走り、再起動を促されます。</p>

<p>なお、<strong>v2.1.142 で daemon の clean exit が実装される前</strong>のバージョンから brew upgrade で更新すると、古い daemon が掴んでいたバイナリパスが消えて crash-loop する可能性があります。一度 <code class="language-plaintext highlighter-rouge">claude daemon stop</code> で daemon を止めてから upgrade するのが安全です。</p>

<h2 id="実務での影響誰がいま更新するべきか">実務での影響：誰がいま更新するべきか</h2>

<table>
  <thead>
    <tr>
      <th>利用パターン</th>
      <th>更新優先度</th>
      <th>理由</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>claude agentsでバックグラウンドエージェントを常駐させている</td>
      <td><strong>最優先</strong></td>
      <td>フラグ追加・macOSスリープ・brew upgradeのリグレッション修正</td>
    </tr>
    <tr>
      <td>プラグインを5個以上有効化している</td>
      <td><strong>高</strong></td>
      <td>依存enforcementとトークンコスト表示</td>
    </tr>
    <tr>
      <td>サブエージェント（.claude/agents/）を多用</td>
      <td><strong>高</strong></td>
      <td>subagent_type曖昧マッチでタイポ起因の起動失敗が解消</td>
    </tr>
    <tr>
      <td>Windowsエンタープライズ環境</td>
      <td><strong>高</strong></td>
      <td>PowerShell ExecutionPolicy Bypass、GPO配下で実行ツールが復活</td>
    </tr>
    <tr>
      <td>WIFを使うEnterprise/Team管理者</td>
      <td><strong>中</strong></td>
      <td><code class="language-plaintext highlighter-rouge">ANTHROPIC_WORKSPACE_ID</code> でスコープ精緻化</td>
    </tr>
    <tr>
      <td>単機・前景セッション主体で軽く使う</td>
      <td><strong>低</strong></td>
      <td>バックグラウンド系の影響は受けにくい。次のメジャー機能リリースまで待っても問題なし</td>
    </tr>
  </tbody>
</table>

<p>リグレッションの修正密度が高い回なので、<strong>動作不安定を1つでも経験していれば更新するのが正解</strong>です。特にmacOSスリープ後のセッション喪失は2026年4月後半から複数ユーザーが報告していた典型的なバグで、v2.1.142 でようやく根本原因（daemonの時計ジャンプ誤検出）に手が入りました。</p>

<h2 id="まとめclaude-agentsの使える化が今月の主題">まとめ：claude agentsの「使える化」が今月の主題</h2>

<p>5月の4連続リリースを俯瞰すると、5月11日の <code class="language-plaintext highlighter-rouge">claude agents</code>（Research Preview）投入を起点に、</p>

<ol>
  <li><strong>使い方の入口を整える</strong>（v2.1.141の <code class="language-plaintext highlighter-rouge">--cwd</code> スコープ、v2.1.142のフラグ群）</li>
  <li><strong>常駐の信頼性を底上げ</strong>（v2.1.142のmacOSスリープ・brew upgrade・Chrome拡張周辺の修正）</li>
  <li><strong>誤操作を防ぐガードレール</strong>（v2.1.143のプラグイン依存enforcement、stop hookループ抑止、<code class="language-plaintext highlighter-rouge">.credentials.json</code> 修復）</li>
</ol>

<p>という三段階で「claude agentsの使える化」が進んだことが分かります。</p>

<p>サブエージェント（<code class="language-plaintext highlighter-rouge">.claude/agents/</code> 配下のユーザー定義エージェント）とバックグラウンドセッション（claude agentsで起動する常駐セッション）は<strong>異なる概念</strong>なので混同しやすいですが、v2.1.140 の <code class="language-plaintext highlighter-rouge">subagent_type</code> 曖昧マッチはサブエージェント側、v2.1.142 のフラグ群はバックグラウンドセッション側、と切り分けて捉えると今回のリリース群が読みやすくなります。</p>

<p>長時間自律稼働するエージェント運用を本格化するなら、まずは v2.1.143 にあげて、<code class="language-plaintext highlighter-rouge">claude agents</code> を一度開いてみるところから始めるのが良いでしょう。Fast Mode を多用しているユーザーは Opus 4.7 デフォルト化で応答の質がやや変わって感じられるはずなので、必要に応じて <code class="language-plaintext highlighter-rouge">CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE=1</code> でロールバックも検討してください。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/anthropics/claude-code/releases">anthropics/claude-code GitHub Releases</a> — Claude Code公式リリースノート（v2.1.140〜v2.1.143）</li>
  <li><a href="https://code.claude.com/docs/en/agent-view">Claude Code Agent View 公式ドキュメント</a> — v2.1.139 で追加された <code class="language-plaintext highlighter-rouge">claude agents</code> の公式リファレンス</li>
  <li><a href="/explain/claude-code-2-1-108-guide/">Claude Code v2.1.108｜/recap・Skill経由スラコマ・プロンプトキャッシュ1時間TTLで何が変わるか</a> — 2026年4月時点でのClaude Code機能の前提整理</li>
  <li><a href="/explain/claude-code-april-2026-updates/">Claude Code 4月アップデート！Memory Store・/ultrareview・ポストモーテムまとめ</a> — 直前1ヶ月の更新サマリ</li>
</ul>]]></content><author><name></name></author><category term="explain" /><category term="claude-code" /><category term="claude" /><category term="AIエージェント" /><category term="使い方" /><summary type="html"><![CDATA[Claude Code v2.1.140〜143（5/12〜15リリース）を解説。claude agentsへ--add-dir/--settings/--mcp-config等のフラグ追加、Fast Modeが Opus 4.7へ、subagent_type曖昧マッチ、bgIsolation設定まで整理。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_claude-code-v2-1-143-update.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_claude-code-v2-1-143-update.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Toprank完全解説：Claude Code向けSEO/Google/Meta広告プラグインを解剖</title><link href="https://ai-heartland.com/tool/toprank-claude-code-seo-ads-plugin/" rel="alternate" type="text/html" title="Toprank完全解説：Claude Code向けSEO/Google/Meta広告プラグインを解剖" /><published>2026-05-18T09:00:00+09:00</published><updated>2026-05-18T09:00:00+09:00</updated><id>https://ai-heartland.com/tool/toprank-claude-code-seo-ads-plugin</id><content type="html" xml:base="https://ai-heartland.com/tool/toprank-claude-code-seo-ads-plugin/"><![CDATA[<p>「ダッシュボードを見て『あとは自分で直してね』」というSEO/広告ツールに、ほとんどの担当者は飽きている。SEMrushもAhrefsも、データを見せたあとに必ず人間の手動作業が残る。広告で言えば、無駄キーワードを止めるのも、ネガティブキーワードを追加するのも、最終的に管理画面に戻ってクリックするのは結局自分だ。</p>

<p>NotFair（notfair.co）が2026年に公開した <a href="https://github.com/nowork-studio/toprank"><code class="language-plaintext highlighter-rouge">nowork-studio/toprank</code></a>（★2,316／297フォーク／MIT）は、この最後の手動作業を<strong>Claude Code側に巻き取る</strong>ことを正面から狙ったOSSプラグインだ。Google Ads・Meta Ads（Facebook+Instagram）・Google Search Consoleに直結し、データの取得・診断・実行までをCLIの1コマンドで連続実行する。</p>

<blockquote>
  <p>Claude Code全体の使い方は <a href="/explain/claude-code-complete-guide-2026/">Claude Code完全ガイド2026：インストールから本番運用まで</a> をご覧ください。</p>
</blockquote>

<p><img src="https://opengraph.githubassets.com/1/nowork-studio/toprank" alt="nowork-studio/toprankリポジトリ — Claude Code向けSEO/広告プラグイン" /></p>

<hr />

<div class="point-box">

<strong>この記事のポイント</strong>
<ul>
<li>・Toprankは<strong>NotFair公式のClaude Codeプラグイン</strong>で、SEO・Google Ads・Meta Adsを横断するスキル集合体。</li>
<li>・<strong>NotFair-GoogleAds／NotFair-MetaAds</strong>の2つのリモートMCPサーバーがOAuth 2.1経由で連携し、APIキー設定不要で導入できる。</li>
<li>・<strong>OpenClaw／Hermesアダプティブ層</strong>を使うと、cron常駐で24時間自律的にSEO改善を続ける「フルオートSEOエージェント」に昇格する。</li>
<li>・<strong>GEO（生成エンジン最適化）</strong>スキルがChatGPT・Claude・Perplexity・Gemini・AI Overviewsそれぞれの引用最適化までカバーする。</li>
<li>・<strong>Geminiクロスモデルレビュー</strong>が組み込まれており、Google系の判断には別モデルの合否ゲートを通せる設計。</li>
</ul>

</div>

<h2 id="1-toprankとは何かcli型データドリブン広告seoエージェントの正体">1. Toprankとは何か：CLI型データドリブン広告/SEOエージェントの正体</h2>

<p>Toprankは<strong>「ダッシュボードではなくデータドリブンな意思決定そのもの」</strong>を目的にしたClaude Codeプラグインだ。READMEの冒頭スローガン <code class="language-plaintext highlighter-rouge">Data-driven decisions, not dashboards.</code> がコンセプトを正確に表現している。</p>

<p>公式リポジトリの説明文は「Open-source Claude Code skills for SEO, GEO, Google Ads, Meta Ads」で、対象領域は4つに整理されている。</p>

<ul>
  <li><strong>SEO</strong>: 技術監査・コンテンツ生成・メタタグ最適化・構造化データ生成</li>
  <li><strong>GEO</strong>: 生成エンジン（ChatGPT/Claude/Perplexity/Gemini）からの引用最適化</li>
  <li><strong>Google Ads</strong>: 監査・キャンペーン管理・RSAコピー生成・ランディングページ評価</li>
  <li><strong>Meta Ads</strong>: Facebook+Instagram広告監査・キャンペーン管理</li>
</ul>

<p>リポジトリは2026年3月27日に作成され、わずか2か月で<strong>2,316★・297フォーク</strong>を集めている。最終pushは2026年5月17日、Pythonベース（一部Goスキル）、MITライセンス。トピックには <code class="language-plaintext highlighter-rouge">claude-code-plugin</code>／<code class="language-plaintext highlighter-rouge">claude-skills</code>／<code class="language-plaintext highlighter-rouge">mcp</code>／<code class="language-plaintext highlighter-rouge">seo</code>／<code class="language-plaintext highlighter-rouge">geo</code>／<code class="language-plaintext highlighter-rouge">googleads</code>／<code class="language-plaintext highlighter-rouge">metaads</code> が並び、Claude Codeエコシステム内では数少ない「マーケティング業務領域に特化したOSSプラグイン」として独自の立ち位置を確立している。</p>

<p>特筆すべきは、CLI（Toprank）とWeb（NotFair）が<strong>同じエンジン</strong>を共有している点だ。READMEには <code class="language-plaintext highlighter-rouge">Both sides share the same engine, so an audit you run from the CLI uses the same tooling as the one on the web.</code> と明記されており、ブラウザでクリック操作するNotFair Web版とClaude Code内のスキル実行が、内部的に同一のMCPサーバーと処理ロジックを叩く構成になっている。</p>

<h3 id="toprankが想定する典型的ユースケース">Toprankが想定する典型的ユースケース</h3>

<p>READMEで列挙されている問いかけは、現場担当者なら誰もが抱える3つだ。</p>

<ol>
  <li><em>Am I wasting money on ads right now?</em>（今この瞬間、広告費を無駄にしていないか？）</li>
  <li><em>Why did my traffic drop and how do I fix it?</em>（なぜトラフィックが落ちたか、どう直すか？）</li>
  <li><em>How do I get more conversions without spending more?</em>（予算を増やさずコンバージョンをどう伸ばすか？）</li>
</ol>

<p>これらは従来「データを見る → 担当者が考える → 管理画面で操作する」の3段階で対処されてきた。Toprankはこの3段階を<strong>1つのCLIコマンド + 確認応答</strong>にまで圧縮することを目指す。「Do it all.」と返事するだけで、3キーワードの一時停止・12件のネガティブキーワード追加・2キーワードの入札額調整が連鎖実行されるREADMEの実例は、その思想を象徴している。</p>

<p><span class="marker-yellow">重要なのは、すべてのMutation操作が<strong>7日以内に取り消し可能</strong>な点だ。</span>READMEの実行ログにも <code class="language-plaintext highlighter-rouge">All changes are reversible within 7 days.</code> と明示されており、AIエージェントが暴走しても巻き戻せる安全弁が設計に組み込まれている。</p>

<div class="box-tip"><strong>類似ジャンルとの差別化</strong><br />SaaS型SEOツール（SEMrush/Ahrefs）はデータ可視化が中心で、修正は人間の手動作業に依存する。Toprankは「データ取得 → 診断 → 実行」までを1スキルで連続実行する設計で、AI CLIネイティブな運用フローに最適化されている。</div>

<hr />

<h2 id="2-アーキテクチャ全体像プラグインmcpサーバーopenclaw自律層の3層構造">2. アーキテクチャ全体像：プラグイン・MCPサーバー・OpenClaw自律層の3層構造</h2>

<p>Toprankは見かけ上1つのプラグインだが、内部的には<strong>3つの独立レイヤー</strong>で構成されている。プラグイン本体（Skills）／リモートMCPサーバー（NotFair）／OpenClawアダプティブ層の3層だ。</p>

<div class="mermaid">
flowchart TB
  subgraph User["Claude Code セッション"]
    CC["Claude Code CLI"]
    SK["Toprankスキル群<br />seo/google-ads/meta-ads/gemini"]
  end
  subgraph Remote["リモートMCPサーバー"]
    GA["NotFair-GoogleAds<br />HTTPストリーマブル"]
    MA["NotFair-MetaAds<br />HTTPストリーマブル"]
  end
  subgraph Cloud["外部サービス"]
    GADS["Google Ads API"]
    META["Meta Marketing API"]
    GSC["Search Console API"]
    GEM["Google Gemini"]
  end
  subgraph Auto["OpenClaw 自律層"]
    CRON["cronスケジューラ"]
    PORT["ポートフォリオ状態管理"]
    PR["自動PR生成"]
  end
  CC --&gt; SK
  SK --&gt;|"OAuth 2.1"| GA
  SK --&gt;|"OAuth 2.1"| MA
  SK --&gt;|"gcloud CLI"| GSC
  SK --&gt;|"Gemini CLI"| GEM
  GA --&gt; GADS
  MA --&gt; META
  SK -.常駐化.-&gt; Auto
  CRON --&gt; SK
  Auto --&gt; PR
</div>

<h3 id="第1層スキル本体">第1層：スキル本体</h3>

<p>ローカルにインストールされる主要構造を、READMEの<code class="language-plaintext highlighter-rouge">How It Works</code>セクションから抜粋する。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>toprank/
├── .claude-plugin/
│   ├── plugin.json       # プラグインメタデータ
│   └── marketplace.json  # マーケットプレイス登録
├── .mcp.json             # NotFair MCP自動登録
├── google-ads/           # 4スキル
├── meta-ads/             # 3スキル
├── seo/                  # 9スキル
├── gemini/               # クロスモデルレビュー
├── openclaw/             # 自律エージェント層
├── toprank-upgrade-skill/
└── test/                 # 単体+LLM Judge評価
</code></pre></div></div>

<p>各スキルディレクトリは独立した<code class="language-plaintext highlighter-rouge">SKILL.md</code>を持ち、Claude Code側のスキル探索メカニズムから個別に呼び出される。<code class="language-plaintext highlighter-rouge">/toprank:seo-analysis</code>のようにプラグイン名前空間付きで呼び出すため、他のClaude Codeスキルとの名前衝突を防ぐ設計になっている。</p>

<h3 id="第2層notfair-リモートmcpサーバー">第2層：NotFair リモートMCPサーバー</h3>

<p>ここがToprank最大の特徴だ。Google AdsとMeta Adsへのアクセスは、ローカルではなく<strong>notfair.coが運営するリモートMCPサーバー</strong>に委ねられる。</p>

<table>
  <thead>
    <tr>
      <th>サーバー名</th>
      <th>エンドポイント</th>
      <th>機能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>NotFair-GoogleAds</td>
      <td><code class="language-plaintext highlighter-rouge">https://notfair.co/api/mcp/google_ads</code></td>
      <td>約100のGoogle Adsツール（読み取り・書き込み・GAQL fan-out）</td>
    </tr>
    <tr>
      <td>NotFair-MetaAds</td>
      <td><code class="language-plaintext highlighter-rouge">https://notfair.co/api/mcp/meta_ads</code></td>
      <td>Meta Marketing APIのツール（Insights/Pause/Budget/Rename/Graph fan-out）</td>
    </tr>
  </tbody>
</table>

<p>認証はOAuth 2.1の動的クライアント登録で、初回利用時に<strong>ブラウザタブが開いてnotfair.coにサインイン</strong>するだけ。トークンはClaude Code側のOSキーチェーンに保存され、<code class="language-plaintext highlighter-rouge">mcp-remote</code>のような中継ブリッジを噛ませる必要がない。</p>

<p>Google Adsサーバー側の特筆機能は <code class="language-plaintext highlighter-rouge">runScript</code> ツールで、<strong>最大20本のGAQLクエリを並列実行</strong>して分析的な問いに対応する。たとえば「過去90日で品質スコアが急落し、かつ予算消化率が90%超のキャンペーンは？」のような複合分析を、20並列のGAQLで1秒台に圧縮する。</p>

<p>Meta側はMutation面が<strong>意図的に狭く設計</strong>されている。READMEに明記されているとおり、create-campaign・audience編集・creative uploadは存在しない。<code class="language-plaintext highlighter-rouge">pause/enable/updateBudget/renameCampaign</code>のみがサーバー側に置かれ、それ以外の操作は<strong>Meta Ads Managerに戻す</strong>設計だ。AIエージェントによる事故を最小化する設計判断と読み取れる。</p>

<h3 id="第3層openclaw-アダプティブ層">第3層：OpenClaw アダプティブ層</h3>

<p><code class="language-plaintext highlighter-rouge">openclaw/</code>配下にあるアダプティブ層は、Toprankを<strong>自律エージェント</strong>化する装置だ。README記載の機能を整理すると以下のとおり。</p>

<div class="box-info"><strong>OpenClaw／Hermes フルオートSEOエージェントの能力</strong><ul><li>・<strong>Zero-Touch Setup</strong>：リポジトリをClaude Code/Hermesに渡すだけで自動セットアップ。</li><li>・<strong>Always-On Automation</strong>：cronによる定期実行で常時SEO監視。</li><li>・<strong>Self-Improving</strong>：Search Consoleデータの継続監視・メタタグ書き換え・構造化データ追加を無人で実行。</li><li>・<strong>Multi-Site Portfolio</strong>：ポートフォリオ状態・per-site作業フォルダ・JSON成果物を保持し複数サイトを統括。</li></ul></div>

<p>これは単体のToprankスキルを「呼び出されたら動く」状態から、「<strong>所有しているサイト群を24時間ウォッチして勝手に改善PRを上げる</strong>」状態に昇格させる構造で、SEOコンサル業務のラスト1マイルをエージェント化する野心的な設計だ。</p>

<hr />

<h2 id="3-google-ads自動運用監査スコアカードrsaコピー生成ランディング最適化">3. Google Ads自動運用：監査スコアカード・RSAコピー生成・ランディング最適化</h2>

<p>Google Adsカテゴリには<strong>4つのスキル</strong>が同梱される。役割分担は次のとおりだ。</p>

<table>
  <thead>
    <tr>
      <th>スキル</th>
      <th>役割</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:google-ads-audit</code></td>
      <td>初回監査・ビジネスコンテキスト構築。7次元のヘルススコアと無駄広告費の特定</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:google-ads</code></td>
      <td>キャンペーン管理。読み取り・キーワード最適化・入札/予算調整・ネガティブ追加・新規作成</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:google-ads-copy</code></td>
      <td>RSA（Responsive Search Ads）コピー生成とA/Bテスト</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:google-ads-landing</code></td>
      <td>ランディングページの関連性監査。品質スコア改善向け</td>
    </tr>
  </tbody>
</table>

<h3 id="初回監査が最も価値の重い1コマンド">初回監査が最も価値の重い1コマンド</h3>

<p>READMEに掲載された<code class="language-plaintext highlighter-rouge">google-ads-audit</code>の実行例は、Toprankのコア機能を一望できる例として優れている。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>You:    /toprank:google-ads-audit

Claude: Connected to your Google Ads account (MyStore).

        3 campaigns active. $2,400 spent this month.

        Scorecard:
        ┌──────────────────────┬──────────┬──────────────────────────────┐
        │ Dimension            │ Status   │ Summary                      │
        ├──────────────────────┼──────────┼──────────────────────────────┤
        │ Conversion tracking  │ OK       │ 3 actions firing correctly   │
        │ Keyword health       │ Critical │ 8 keywords burning cash      │
        │ Search term quality  │ Warning  │ 12 irrelevant queries        │
        │ Impression share     │ Warning  │ Losing 35% to rank           │
        │ Spend efficiency     │ Critical │ $340/mo wasted               │
        └──────────────────────┴──────────┴──────────────────────────────┘

        Top 3 actions:
        1. Pause 3 keywords ($210/mo, zero conversions)
        2. Add 12 negative keywords ($130/mo wasted on irrelevant terms)
        3. Increase bids 15% on 2 high-converting keywords losing IS

You:    Do it all.

        [paused 3 wasteful keywords — saved $210/mo]
        [added 12 negative keywords — saved $130/mo]
        [increased bids on 2 high-performers]

        Done. All changes are reversible within 7 days.
</code></pre></div></div>

<p>ここで注目すべきは、<strong>監査結果がそのまま実行可能なアクションリストに落ちる</strong>設計だ。SEMrushの監査結果は通常PDFや管理画面のチェックリストになるが、ToprankではClaudeとの対話で「Do it all.」と返すだけで連鎖実行される。Top 3 actionsの構造化が、Claude側の意思決定コスト削減にも効いている。</p>

<h3 id="weekly-review機能実施した変更の効果を採点">Weekly Review機能：実施した変更の効果を採点</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:google-ads</code> には<strong>ウィークリーレビュー</strong>機能が組み込まれている。READMEのサンプル出力では、12件の変更のうち9件が成熟済みで、Wins 4件・Losses 2件・成熟前 3件と分類されている。</p>

<p>特筆すべきは <code class="language-plaintext highlighter-rouge">2 changes had other edits on the same campaign within 7 days, so their direction is low-confidence.</code> の一文だ。<strong>同一キャンペーンへの他編集の影響を信頼度として扱う</strong>設計で、A/Bテストの相互汚染を自動検知する。これは熟練マーケターでもしばしば見落とすバイアスだ。</p>

<p>このウィークリーレビュー機能は、Claude Codeの<strong>Coworker（定期実行ジョブ）</strong>として登録すれば毎週月曜朝に自動で出力させることができる。属人化していたレポート業務をエージェントに委譲する典型例だ。</p>

<hr />

<h2 id="4-meta-ads自動運用roas分析クリエイティブ疲労診断狭いmutation設計">4. Meta Ads自動運用：ROAS分析・クリエイティブ疲労診断・狭いMutation設計</h2>

<p>Meta AdsはGoogle Adsと異なる事情を抱える。Pixel/CAPI周りの計測健全性、Learning Phase（学習期間）の挙動、クリエイティブ疲労、Audience Overlap——いずれも<strong>Meta固有の運用知識</strong>が必要だ。</p>

<p>Toprankの<code class="language-plaintext highlighter-rouge">meta-ads-audit</code>は、これらをMeta特化の7次元で採点する。</p>

<div class="box-info"><strong>Meta Ads 7次元ヘルスチェック</strong><ul><li>・<strong>Pixel + CAPI Health</strong>：ピクセルとCAPI（Conversions API）の二重送信整合性。</li><li>・<strong>Attribution</strong>：アトリビューション設定の妥当性。</li><li>・<strong>Campaign Structure</strong>：CBO/ABO/Advantage+ Shoppingの構造判定。</li><li>・<strong>Creative Health</strong>：クリエイティブ疲労の進行度。</li><li>・<strong>Audience Strategy</strong>：ターゲティング戦略の重なりと網羅性。</li><li>・<strong>Spend Efficiency</strong>：消化効率とCPA安定性。</li><li>・<strong>Scaling Readiness</strong>：拡大投下に耐える状態か。</li></ul></div>

<p>監査結果は単発で終わらず、<strong>クリエイティブ在庫データ・ペルソナデータ</strong>を永続化する。これは下流の<code class="language-plaintext highlighter-rouge">/toprank:meta-ads</code>スキルがコピー生成・A/B案出しを行うときに利用される設計で、監査ステップが「次のアクションのための知識ベース構築」を兼ねている。</p>

<h3 id="mutation-api-を狭く安全に設計する思想">Mutation API を「狭く・安全に」設計する思想</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:meta-ads</code>が呼び出せるMutationは以下に限定される。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 停止系</span>
pauseCampaign / pauseAdSet / pauseAd

<span class="c"># 再開系</span>
enableCampaign / enableAdSet / enableAd

<span class="c"># 予算・命名</span>
updateAdSetBudget / updateCampaignBudget / renameCampaign
</code></pre></div></div>

<p>逆に、<strong>新規キャンペーン作成・Audience編集・クリエイティブのアップロード</strong>はサーバー側に存在しない。これらの操作が必要な場合、スキルはユーザーをMeta Ads Managerの該当画面に<strong>誘導する</strong>設計だ。</p>

<p>これはAIエージェント設計の鉄則「<strong>Mutationのblast radius（影響範囲）は狭く保つ</strong>」を忠実に体現している。GoogleAdsの<code class="language-plaintext highlighter-rouge">runScript</code>に相当する<code class="language-plaintext highlighter-rouge">runScript</code>（Meta側）も、<code class="language-plaintext highlighter-rouge">ads.graphParallel([calls])</code>で最大20並列のGraph API呼び出しを許すが、これは読み取り中心の分析fan-outに位置付けられている。</p>

<hr />

<h2 id="5-seoスキル群と新しいgeo最適化ai検索向け">5. SEOスキル群と新しいGEO最適化（AI検索向け）</h2>

<p>SEO/GEOカテゴリは<strong>9スキル</strong>で構成され、TopRankの中で最も多機能なカテゴリだ。</p>

<table>
  <thead>
    <tr>
      <th>スキル</th>
      <th>役割</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:seo-analysis</code></td>
      <td>GSCデータ込みのフルSEO監査・30日アクションプラン</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:content-writer</code></td>
      <td>E-E-A-T準拠コンテンツ生成</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:keyword-research</code></td>
      <td>キーワード発見・意図分類・トピッククラスタ・コンテンツカレンダー</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:meta-tags-optimizer</code></td>
      <td>タイトル/メタディスクリプション/OG/Twitter A/B（CTR推定付き）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:schema-markup-generator</code></td>
      <td>JSON-LD構造化データ（FAQ/HowTo/Article/Product/LocalBusiness）</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:seo-page</code></td>
      <td>単一URLの深堀り監査</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:broken-link-checker</code></td>
      <td>404/5xx壊れリンクの内部・外部スキャン</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:geo-optimizer</code></td>
      <td>GEO（生成エンジン最適化）スコア・引用最適化リライト</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/toprank:setup-cms</code></td>
      <td>WordPress/Strapi/Contentful/Ghost接続</td>
    </tr>
  </tbody>
</table>

<h3 id="seo監査の対話例">SEO監査の対話例</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:seo-analysis</code>はGSCデータを90日分読み込み、技術問題を含む診断を返す。READMEの実例を引用する。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>You:    /toprank:seo-analysis

Claude: Found your site at mystore.com — pulling Search Console data now.

        [90 days of real traffic data loaded]
        [pages crawled for technical issues]

        Three things hurting you most:

        Your homepage lives at two addresses. Google splits your ranking
        power between them. Easy fix.

        Two pages targeting the same search terms — they compete against
        each other and neither wins.

        One page gets 400 monthly impressions but ranks #52. The title
        doesn't match what people actually search for.

        Here's your 30-day plan, most impactful first.
</code></pre></div></div>

<p>ここで読むべきは、<strong>Claudeが「人間っぽい言い回し」で問題を説明している</strong>点だ。「URLが2つに分裂してランク力が割れている」「2ページがカニバリして両方負けている」「タイトルが検索クエリと噛み合っていない」——これらは技術用語に頼らず本質を伝える表現で、非エンジニアの依頼主にもそのまま見せられる。SEOコンサル業務での説明工数を直接削れる設計だ。</p>

<h3 id="geo最適化ai検索時代の必須スキル">GEO最適化：AI検索時代の必須スキル</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:geo-optimizer</code>は<strong>Generative Engine Optimization</strong>——つまりAI検索エンジン（ChatGPT/Claude/Perplexity/Gemini/Google AI Overviews）からの<strong>引用最適化</strong>を専門に扱う。</p>

<p>具体的には次の3アウトプットを返す。</p>

<ol>
  <li><strong>0-100点のGEOスコア</strong>：現状コンテンツがAI検索でどれだけ引用されやすいかを定量評価</li>
  <li><strong>AI引用向けリライト案</strong>：Claude側の改稿提案</li>
  <li><strong>エンジン別戦略</strong>：ChatGPT/Claude/Perplexity/Gemini/AI Overviewsそれぞれの最適化戦略</li>
</ol>

<p><span class="marker-pink">AI検索からの流入比率が増加する2026年以降、GEOは従来SEOと<strong>併走必須</strong>の領域だ。</span>1スキルでこの新領域までカバーしている点は、Toprankが単なる「SEMrushクローン」ではないことを示す重要な特徴だ。</p>

<h3 id="コネクタmcpサーバーへの抽象化">コネクタ：MCPサーバーへの抽象化</h3>

<p>各SEOスキルは外部ツールを <code class="language-plaintext highlighter-rouge">~~category</code> プレースホルダで参照する設計になっている。READMEから抜粋する。</p>

<table>
  <thead>
    <tr>
      <th>カテゴリ</th>
      <th>プレースホルダ</th>
      <th>デフォルトサーバー</th>
      <th>代替</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Google Ads</td>
      <td><code class="language-plaintext highlighter-rouge">~~google-ads</code></td>
      <td>NotFair-GoogleAds MCP</td>
      <td>Google Ads MCP</td>
    </tr>
    <tr>
      <td>Meta Ads</td>
      <td><code class="language-plaintext highlighter-rouge">~~meta-ads</code></td>
      <td>NotFair-MetaAds MCP</td>
      <td>任意のMeta Marketing API MCP</td>
    </tr>
    <tr>
      <td>Search Console</td>
      <td><code class="language-plaintext highlighter-rouge">~~search-console</code></td>
      <td>gcloud CLI + Search Console API</td>
      <td>任意のGSC互換MCP</td>
    </tr>
    <tr>
      <td>CMS</td>
      <td><code class="language-plaintext highlighter-rouge">~~cms</code></td>
      <td>各CMS直接API（WordPress REST等）</td>
      <td>任意のCMS MCP</td>
    </tr>
  </tbody>
</table>

<p>このプレースホルダ設計のおかげで、<strong>スキルはツール非依存</strong>だ。NotFair MCPが将来別実装に置き換わっても、スキルファイル自体は書き換え不要で動き続ける。コネクタが無い場合は graceful degradation（緩やかな縮退）が組み込まれており、GSC接続なしでも技術クロールだけは実行できる。</p>

<hr />

<h2 id="6-インストールから初回監査までの30秒手順">6. インストールから初回監査までの30秒手順</h2>

<p>Toprankの導入は驚くほど短い。Claude Code内で2行打つだけだ。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plugin marketplace add nowork-studio/toprank
/plugin install toprank@nowork-studio
</code></pre></div></div>

<p>これで<code class="language-plaintext highlighter-rouge">/toprank:*</code>の全スキルが利用可能になる。<code class="language-plaintext highlighter-rouge">.mcp.json</code>は自動配置され、NotFair MCPサーバーの登録も完了する。</p>

<h3 id="手動セットアップsettingsjson直接編集派向け">手動セットアップ（settings.json直接編集派向け）</h3>

<p><code class="language-plaintext highlighter-rouge">settings.json</code>を手で編集したい場合は以下を追加する。</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"extraKnownMarketplaces"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"nowork-studio"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"github"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"repo"</span><span class="p">:</span><span class="w"> </span><span class="s2">"nowork-studio/toprank"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"enabledPlugins"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"toprank@nowork-studio"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="初回oauth認証">初回OAuth認証</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:google-ads-audit</code>を初めて実行すると、ブラウザタブが開き、notfair.coにサインインを促される。Googleアカウントで認可するとトークンがOSキーチェーンに保存され、以降は無言で動作する。Meta Adsも同様に初回OAuthが独立して走る。</p>

<div class="box-warning"><strong>OAuth時のセキュリティ確認</strong><br />許可スコープには広告アカウントへのMutation権限が含まれる。社のメインアカウントに繋ぐ前に、必ずテスト用Google Ads/Metaアカウントで挙動確認することを推奨する。Toprankは7日以内取消可能と謳うが、誤操作のロールバック作業自体は人間がやる必要がある。</div>

<h3 id="設定ファイルnotfairjson">設定ファイル：<code class="language-plaintext highlighter-rouge">.notfair.json</code></h3>

<p>各プロジェクトディレクトリに<code class="language-plaintext highlighter-rouge">.notfair.json</code>を配置し、Google AdsアカウントIDとMeta AdsアカウントIDを書く。</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"accountId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"123-456-7890"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"metaAccountId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"act_9876543210"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"site"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://mystore.com"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>両方を同じファイルに記述する設計のため、Google→Metaの切替え時に毎回サインインを促されることはない。</p>

<h3 id="ピンとこない時のスモークテスト">ピンとこない時のスモークテスト</h3>

<p><code class="language-plaintext highlighter-rouge">/toprank:seo-analysis</code>をSearch Console接続のみで実行するのが最も摩擦が低い。GSCのオーナー権限を持っているサイトを指定すれば、広告アカウントなしでも30分以内に最初の30日プランが手元に届く。</p>

<hr />

<h2 id="7-競合代替ツールとの比較rustyseosemrushpromptfoosurfer">7. 競合・代替ツールとの比較（RustySEO/SEMrush/Promptfoo/Surfer）</h2>

<p>Toprankの立ち位置を理解するため、隣接領域のツールと並べて比較する。</p>

<table>
  <thead>
    <tr>
      <th>ツール</th>
      <th>形態</th>
      <th>SEO監査</th>
      <th>広告管理</th>
      <th>Mutation実行</th>
      <th>AI Native</th>
      <th>価格</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Toprank</strong></td>
      <td>Claude Codeプラグイン</td>
      <td>◎（GSC実データ）</td>
      <td>◎（Google/Meta）</td>
      <td>◎（自動実行・7日取消可）</td>
      <td>◎（CLI内対話）</td>
      <td>無料 OSS（MIT）</td>
    </tr>
    <tr>
      <td>SEMrush</td>
      <td>SaaSダッシュボード</td>
      <td>◎（独自DB）</td>
      <td>△（一部連携）</td>
      <td>×</td>
      <td>×</td>
      <td>$130/月〜</td>
    </tr>
    <tr>
      <td>Ahrefs</td>
      <td>SaaSダッシュボード</td>
      <td>◎（独自DB）</td>
      <td>×</td>
      <td>×</td>
      <td>×</td>
      <td>$129/月〜</td>
    </tr>
    <tr>
      <td>Screaming Frog</td>
      <td>デスクトップアプリ</td>
      <td>◎（クロール）</td>
      <td>×</td>
      <td>×</td>
      <td>×</td>
      <td>£199/年</td>
    </tr>
    <tr>
      <td>RustySEO</td>
      <td>Tauriデスクトップ</td>
      <td>◎（無制限クロール）</td>
      <td>×</td>
      <td>×</td>
      <td>△（Gemini/Ollama統合）</td>
      <td>無料 OSS（GPL-3.0）</td>
    </tr>
    <tr>
      <td>Promptfoo</td>
      <td>プロンプト評価ツール</td>
      <td>×</td>
      <td>×</td>
      <td>×</td>
      <td>◎</td>
      <td>無料 OSS</td>
    </tr>
    <tr>
      <td>Surfer SEO</td>
      <td>SaaSダッシュボード</td>
      <td>◎（コンテンツ最適化）</td>
      <td>×</td>
      <td>×</td>
      <td>△</td>
      <td>$89/月〜</td>
    </tr>
  </tbody>
</table>

<p>ToprankのユニークセリングポイントはBO列の「<strong>Mutation実行</strong>」だ。SEMrush・Ahrefs・Surferも分析能力は十分だが、最終的に管理画面に戻る前提で設計されている。ToprankはClaudeに「Do it all.」と返事するだけで実行されるため、運用ループが圧倒的に短い。</p>

<blockquote>
  <p>同じOSS×SEOの軸では <a href="/tool/rustyseo-tauri-rust-seo-toolkit/">RustySEO完全解説：Tauri+Rust製の無料デスクトップSEOツール、SEMrushの代替候補</a> が参考になる。RustySEOは自サイトGSC＋クロール特化のスタンドアロンアプリで、Toprankの「広告込み・CLI内自動実行」とは異なる方向のOSSだ。</p>
</blockquote>

<h3 id="claude-code-プラグイン群との比較">Claude Code プラグイン群との比較</h3>

<p>Claude Codeスキル/プラグイン群の中でもToprankは異色だ。</p>

<ul>
  <li><a href="/tool/prismatic-skills-claude-code-plugin/">Prismatic Skills：Claude Codeプラグインのマーケットプレイス基盤を解説</a> ——汎用的なスキル配布インフラ。Toprankはそれに乗る側。</li>
  <li><a href="/tool/addyosmani-agent-skills-framework/">Addy Osmani Agent Skills：18K星のスキルフレームワーク基本セット</a> ——汎用スキルのテンプレート集。Toprankは特定領域（マーケティング）特化型。</li>
  <li><a href="/agent/microsoft-waza-agent-skill-evaluation/">Microsoft Waza：Agent Skillsの品質をCIで自動採点する評価フレームワーク</a> ——スキル品質の物差し。Toprankはこの物差しで評価される側。</li>
</ul>

<p>Toprankの位置付けは「<strong>特定業務領域に深く突っ込んだ垂直プラグイン</strong>」で、汎用スキル群とは差別化される。マーケティングという領域では、汎用LLMよりGSC/GoogleAds/MetaAdsのドメイン知識をスキル化した方が圧倒的に強い、というToprankチームの判断が読み取れる。</p>

<hr />

<h2 id="8-まとめtoprankを今日から使うべきユーザーと注意点">8. まとめ：Toprankを今日から使うべきユーザーと注意点</h2>

<p>ここまで見たToprankの特徴を要約する。</p>

<div class="conclusion-box">

<strong>Toprankの要点</strong>
<ul>
<li>・<strong>Claude Codeネイティブの広告/SEO自動運用プラグイン</strong>。データ取得→診断→実行までを1コマンドで連続実行。</li>
<li>・<strong>NotFair MCP（Google/Meta）</strong>がOAuth 2.1で接続し、APIキー管理不要・OSキーチェーン保存。</li>
<li>・<strong>OpenClaw自律層</strong>でcron常駐エージェント化、マルチサイトポートフォリオ運用も可能。</li>
<li>・<strong>GEO最適化スキル</strong>でChatGPT/Claude/Perplexity/Gemini/AI Overviewsからの引用最適化までカバー。</li>
<li>・<strong>Geminiクロスモデルレビュー</strong>でGoogle系判断に別モデル合否ゲートを通せる。</li>
</ul>

</div>

<h3 id="今すぐ導入すべきユーザー">今すぐ導入すべきユーザー</h3>

<ul>
  <li><strong>少人数で複数サイトのSEOを回す個人/小規模事業者</strong>：GSC監査・GEO最適化スキルだけで週数時間の節約効果。</li>
  <li><strong>Google Adsを月10万円以上回す広告主</strong>：無駄キーワード自動停止・ネガティブ追加だけで投資対効果が明確に出る規模感。</li>
  <li><strong>マーケティングエージェンシー</strong>：OpenClaw経由のマルチサイト管理が、クライアントポートフォリオの運用工数を大幅に削減する。</li>
  <li><strong>SEOコンサル</strong>：監査レポート出力・クライアント向け説明工数の削減効果が大きい。</li>
</ul>

<h3 id="導入前に確認すべきこと">導入前に確認すべきこと</h3>

<div class="box-warning"><strong>注意点チェックリスト</strong><ul><li>・<strong>OAuthスコープ</strong>に広告アカウントMutation権限が含まれるため、本番接続前にテストアカウントで挙動検証する。</li><li>・<strong>NotFair MCP</strong>はnotfair.coのリモートサービス。クライアントデータの送信ポリシーを事前確認する。</li><li>・OpenClawの<strong>自動PR生成</strong>は強力だが、レビュー無しマージ運用は危険。最低でも人間レビュー付きでマージするフローを敷く。</li><li>・<strong>Meta側のcreate-campaign未対応</strong>は仕様。新規キャンペーン作成はMeta Ads Managerで手動運用が必要。</li></ul></div>

<h3 id="今後ウォッチすべきポイント">今後ウォッチすべきポイント</h3>

<ul>
  <li><strong>OpenClaw／Hermesアダプティブ層</strong>の成熟度。フルオートSEOエージェントが本当に「人間レビュー無し」で回せるレベルに到達するか。</li>
  <li><strong>GEOスキル</strong>の引用最適化アルゴリズムの進化。AI検索エンジン側のアルゴリズム変動に追従できるか。</li>
  <li><strong>MCPサーバー追加</strong>の動向。現在はGoogle Ads/Meta Adsの2本だが、LinkedIn Ads・TikTok Ads・X Adsへの拡張があれば一気にカバレッジが広がる。</li>
  <li><strong>代替MCP対応</strong>の充実度。プレースホルダ抽象化が機能して、NotFairに依存しない構成が現実的に組めるか。</li>
</ul>

<p>Toprankは「<strong>AIエージェントが本気で業務領域に侵食し始めた</strong>」象徴的なOSSだ。SEMrushを月数万円払って眺める時代から、Claude Codeに「直しといて」と一言投げるだけで完結する時代への移行を体感したい人は、まず<code class="language-plaintext highlighter-rouge">/toprank:seo-analysis</code>の1コマンドから試してほしい。</p>

<hr />

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/nowork-studio/toprank">nowork-studio/toprank — GitHub公式リポジトリ</a>（README、スキル一覧、MCPサーバー仕様、OpenClawドキュメント）</li>
  <li><a href="https://notfair.co/">NotFair公式サイト notfair.co</a>（Webアプリ側のNotFair、MCP OAuthエンドポイント）</li>
  <li><a href="https://modelcontextprotocol.io/">Model Context Protocol公式仕様</a>（NotFair MCPサーバーが採用するOAuth 2.1ストリーマブルHTTPの基盤プロトコル）</li>
  <li><a href="https://developers.google.com/google-ads/api/docs/query/overview">Google Ads API公式ドキュメント — GAQLリファレンス</a>（NotFair-GoogleAdsの<code class="language-plaintext highlighter-rouge">runScript</code>が叩く対象クエリ言語）</li>
  <li><a href="https://developers.facebook.com/docs/marketing-api/conversions-api/">Meta Marketing API — Conversions APIガイド</a>（meta-ads-auditが評価対象とするPixel/CAPIの計測健全性の参考）</li>
</ul>

<!--
## 配信メモ
### X投稿フック案（120〜200文字、3案）
1. SEMrushを月数万円払って眺める時代は終わる。Toprank（★2,316）はClaude Codeに「Do it all.」と返事するだけでGoogle Ads/Meta Adsの無駄キーワード停止・予算調整・ネガティブ追加が連鎖実行されるOSSプラグイン。NotFair MCPがOAuth 2.1でつながりAPIキー不要。
2. AI検索からの引用最適化（GEO）専用スキルが標準搭載のClaude Codeプラグインが出た。Toprankの`/toprank:geo-optimizer`はChatGPT・Claude・Perplexity・Gemini・AI Overviewsそれぞれの引用戦略を出すSEO/GEO融合型OSS。
3. OpenClaw自律層を使うとToprankは「24時間勝手にSEO改善PRを上げ続けるエージェント」になる。複数サイトのポートフォリオ管理にも対応。マーケティングエージェンシーの業務工数が音を立てて崩れる仕組み。

### はてブ用CTA
「Claude Code × 広告自動運用」の最新OSS。SEMrushを置き換える野心を持ったプラグインの正体を解説した。

### 内部リンク提案（公開後にこの記事へリンクすべき既存記事）
- /explain/claude-code-complete-guide-2026/ — Claude Code完全ガイドのプラグイン例として
- /tool/rustyseo-tauri-rust-seo-toolkit/ — RustySEO記事から「自動実行型の代替」として
- /tool/prismatic-skills-claude-code-plugin/ — プラグインマーケットプレイス記事から「実例」として

### 想定検索クエリ（GSCで観測したい）
- toprank claude code
- nowork-studio toprank
- claude code seo プラグイン
- claude code 広告自動化
- notfair mcp
- geo 最適化 claude code
- claude code skills marketing
-->]]></content><author><name></name></author><category term="tool" /><category term="claude-code" /><category term="claude-code-plugin" /><category term="claude-skills" /><category term="seo" /><category term="geo" /><category term="google-ads" /><category term="meta-ads" /><category term="marketing" /><category term="mcp" /><category term="oss" /><summary type="html"><![CDATA[NotFair公式のClaude Code向けプラグイン『Toprank』(★2,316)はGoogle Search Console/Google Ads/Meta Ads(Facebook+Instagram)を直接操作するスキル群。SEO監査・RSAコピー生成・無駄広告費の自動削減・GEO最適化までCLI一発で実行する仕組みをアーキテクチャから解説する。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_toprank-claude-code-seo-ads-plugin.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_toprank-claude-code-seo-ads-plugin.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Grafana Labs GitHub環境への不正アクセス：コードベース流出インシデントの全容と防御策</title><link href="https://ai-heartland.com/security/grafana-labs-github-breach/" rel="alternate" type="text/html" title="Grafana Labs GitHub環境への不正アクセス：コードベース流出インシデントの全容と防御策" /><published>2026-05-17T10:00:00+09:00</published><updated>2026-05-17T10:00:00+09:00</updated><id>https://ai-heartland.com/security/grafana-labs-github-breach</id><content type="html" xml:base="https://ai-heartland.com/security/grafana-labs-github-breach/"><![CDATA[<p>2026年5月17日、Grafana Labsの公式Xアカウントが6連投の重大スレッドを公開した。「不正な第三者がGrafana LabsのGitHub環境にアクセスできるトークンを入手し、コードベースをダウンロードした」という内容に加え、<strong>顧客データへのアクセス痕跡なし・身代金要求あり・FBI公式見解に従って支払い拒否</strong>という重要な続報も同時公表された。</p>

<p><span class="marker-yellow"><strong>監視ツールの雄が、監視される側になった</strong></span>。GitHubトークン1本が奪われ、数千本のリポジトリを抱えるGrafana Labsのコードベースが外部者の手に渡ったとされる。一方でGrafana Labsはオープンソース企業として身代金要求を即座に拒否し、その判断を公然と表明した。本記事では公式スレッド全文と外部脅威インテリジェンスから確認された事実と推測を明確に区別しながら、この事案の技術的・組織的な意味と、企業が今すぐ実施すべき防御策を整理する。</p>

<blockquote>
  <p>本インシデントはGitHub CI/CDを狙ったサプライチェーン攻撃の新たな事例です。攻撃手法・防御の全体像は
<a href="/security/supply-chain-security-guide-2026/">サプライチェーンセキュリティ完全ガイド2026｜攻撃手法・防御ツール・実践チェックリスト</a>
で解説しています。</p>
</blockquote>

<h2 id="インシデントの概要公式声明スレッド6連投の全文要点">インシデントの概要：公式声明スレッド（6連投）の全文要点</h2>

<p>Grafana Labsは2026年5月17日、公式Xアカウントで6連投のスレッドを公開した。当初の第1投で「不正な第三者がトークンを入手し、コードベースをダウンロードした」と発表した後、続く2〜6投目で被害評価・対応状況・身代金要求への対応方針まで踏み込んで開示している。</p>

<div class="point-box">
<strong>Grafana Labs公式声明（2026年5月17日・6連投スレッド全文要点）</strong><br />
<ul>
<li><strong>(1/6)</strong> 不正な第三者がGrafana LabsのGitHub環境にアクセスできるトークンを入手し、コードベースをダウンロードした</li>
<li><strong>(2/6)</strong> このインシデント中に<strong>顧客データや個人情報がアクセスされた形跡はなく</strong>、顧客システムや業務への影響を示す証拠も見つかっていない</li>
<li><strong>(3/6)</strong> 直ちにフォレンジック分析を開始し、認証情報の漏洩の原因を特定できたと信じている。侵害された認証情報を無効化し、許可されていないアクセスから環境をさらに保護するための追加セキュリティ対策を実施</li>
<li><strong>(4/6)</strong> 攻撃者はGrafanaを脅迫し、コードベースの公開を防ぐために支払いを要求した</li>
<li><strong>(5/6)</strong> FBIの公表された立場に基づき、「身代金を支払っても、あなたやあなたの組織がデータを取り戻せるとは保証されない」「この種の違法行為に他者が関与する動機を提供するだけである」と述べている</li>
<li><strong>(6/6)</strong> <strong>身代金を支払わないことが適切な道だと判断</strong>。Grafana Labsの標準的なセキュリティ慣行の一環として、調査完了次第、インシデントレビューからの追加情報を共有する</li>
</ul>
</div>

<p>このスレッドにより、当初不明だった被害範囲と組織の対応方針が大きく明らかになった。重要なポイントは3つだ。</p>

<p><span class="marker-yellow"><strong>第一に、顧客データや個人情報への不正アクセスは確認されていない</strong></span>。Grafana Cloud利用者・OSS利用者の本番システムには現時点で影響なしと公式に明言された。</p>

<p><span class="marker-yellow"><strong>第二に、攻撃者はコードベース公開を防ぐ対価として身代金を要求した</strong></span>。これは典型的なデータ窃取型ランサムウェアの恐喝モデル（後述するcoinbasecartelの手口と一致）であり、データ暗号化は伴わないことが裏付けられた。</p>

<p><span class="marker-yellow"><strong>第三に、Grafana LabsはFBIの公式見解に従って身代金支払いを明確に拒否した</strong></span>。これはオープンソース企業として身代金市場への資金供給を断つ責任ある姿勢であり、業界全体にとって重要な前例となる。</p>

<p>一方で、以下の点はこの記事の執筆時点（2026年5月17日）で<strong>公式の詳細レビュー（PIR）を待つ必要がある</strong>。</p>

<ul>
  <li>トークンがどのような手口で窃取されたか（フィッシング・IAB・コミット履歴漏れなど）</li>
  <li>どのリポジトリが対象になったか（全リポジトリか特定のリポジトリか）</li>
  <li>ダウンロードされたコードベースの容量・内容範囲</li>
  <li>攻撃者の特定・帰属（Attribution）の正式確認（後述するcoinbasecartel関与の公式認定）</li>
  <li>今後の追加防御策の詳細</li>
</ul>

<p>Grafana Labsは2025年4月のGitHub Actionsインシデントにおいても迅速で透明性の高い情報開示を行った実績があり、今回も同様に詳細なPost-Incident Review（PIR）が公開される見込みだ。</p>

<h2 id="攻撃の連鎖構造トークン窃取からコードベース流出まで">攻撃の連鎖構造：トークン窃取からコードベース流出まで</h2>

<p>現時点で判明している情報をもとに、攻撃の一般的な経路を図示する。<strong>以下の図には推定的な部分が含まれる</strong>ことを明記する。</p>

<div class="mermaid">
flowchart TD
    A["初期侵入<br />（手口は未公表）"] --&gt; B["GitHubトークン<br />の窃取・入手"]
    B --&gt; C["GitHub API / Git clone<br />でコードベース取得"]
    C --&gt; D["コードベース内の<br />機密情報探索<br />（推定）"]
    D --&gt; E1["内部API・<br />エンドポイント調査<br />（推定）"]
    D --&gt; E2["ハードコードされた<br />シークレット探索<br />（推定）"]
    D --&gt; E3["脆弱性パターン<br />の発見<br />（推定）"]
    B --&gt; F["身代金・脅迫<br />（coinbasecartelの<br />典型手口）"]
    style A fill:#c0392b,color:#fff
    style B fill:#e74c3c,color:#fff
    style C fill:#e67e22,color:#fff
    style F fill:#8e44ad,color:#fff
    style D fill:#d35400,color:#fff
</div>

<p>初期侵入の手口は現時点で未公表だが、脅威インテリジェンスの観点から複数の仮説が考えられる。一つは<strong>フィッシング・ソーシャルエンジニアリング</strong>による認証情報の直接窃取、もう一つは<strong>Initial Access Broker（IAB）経由</strong>で購入した認証情報の利用だ。</p>

<h3 id="なぜgithubトークン1本でコードベースが取れるのか">なぜGitHubトークン1本でコードベースが取れるのか</h3>

<p>GitHubのPersonal Access Token（PAT）やGitHub App tokenは、適切にスコープ設定されていない場合、組織内の複数リポジトリへの読み取り権限を一括で持つ。古典的な「Classic PAT」は特定のリポジトリではなくスコープ（repo、read:orgなど）単位で権限が付与されるため、<strong>1本のトークンで組織全リポジトリへのアクセス</strong>が可能になる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># トークンのスコープを確認するコマンド（漏洩したトークンの調査に使用）</span>
curl <span class="nt">-H</span> <span class="s2">"Authorization: token YOUR_TOKEN"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Accept: application/vnd.github.v3+json"</span> <span class="se">\</span>
  https://api.github.com/user | jq <span class="s1">'{login: .login, scopes: .X-OAuth-Scopes}'</span>

<span class="c"># レート制限情報でトークンの有効性を確認</span>
curl <span class="nt">-I</span> <span class="nt">-H</span> <span class="s2">"Authorization: token YOUR_TOKEN"</span> <span class="se">\</span>
  https://api.github.com/rate_limit
</code></pre></div></div>

<p>Fine-grained PATを使えばリポジトリ単位・権限種別単位でのスコープ制限が可能だが、多くの組織でまだ移行が完了していないのが現実だ。</p>

<h2 id="公開情報から見るインシデントタイムライン">公開情報から見るインシデントタイムライン</h2>

<p>公式スレッドと外部脅威インテリジェンス情報を時系列で整理すると、次のような流れになる。</p>

<table>
  <thead>
    <tr>
      <th>日時（UTC）</th>
      <th>出来事</th>
      <th>ソース</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2026-05-15 20:57</td>
      <td>ransomware.liveが<code class="language-plaintext highlighter-rouge">coinbasecartel</code>のリークサイトにGrafanaが被害者として掲載されたことを検知</td>
      <td>ransomware.live</td>
    </tr>
    <tr>
      <td>2026-05-15以降</td>
      <td>攻撃者がGrafana Labsに連絡し、コードベース公開を防ぐ対価として身代金を要求</td>
      <td>Grafana公式スレッド(4/6)</td>
    </tr>
    <tr>
      <td>2026-05-17</td>
      <td>Grafana Labsが公式Xで6連投スレッドを公開。被害評価・対応方針・身代金拒否を表明</td>
      <td>Grafana公式</td>
    </tr>
  </tbody>
</table>

<p>攻撃者の犯行声明文には「We can cause you more damage then you would ever imagine, contact us.（想像以上のダメージを与えられる、連絡せよ）」というcoinbasecartelの定型文が記されている。Grafana Labs側がこの恐喝を一切公開せず、内部のフォレンジック分析と認証情報の無効化を先行させた上で、48時間以内に公式声明を出したことになる。</p>

<h2 id="coinbasecartelとの関連脅威アクターの正体">coinbasecartelとの関連：脅威アクターの正体</h2>

<p>ランサムウェア追跡サイト「ransomware.live」の記録によると、<code class="language-plaintext highlighter-rouge">coinbasecartel</code>というグループが2026年5月15日20:57 UTCにGrafanaを被害者としてリストアップしている。Grafana Labsの公式発表（5月17日）における「攻撃者はGrafanaを脅迫しコードベースの公開を防ぐために支払いを要求した（4/6）」という記述と犯行声明の文言・手口が一致しており、<strong>このグループが今回のインシデントに関与している可能性が極めて高い</strong>と推定される。ただし公式からの帰属（Attribution）確認は現時点で行われていない。</p>

<h3 id="外部脅威インテリジェンスが示す追加データ">外部脅威インテリジェンスが示す追加データ</h3>

<p>侵害認証情報の流通データを追跡しているHudson Rockの調査では、Grafana Labs関連で以下が確認されている。</p>

<div class="point-box">
<strong>Hudson Rock / ransomware.live調査によるGrafana関連侵害認証情報の内訳</strong><br />
<ul>
<li>侵害された従業員（infostealer感染端末）：<strong>0件</strong></li>
<li>第三者経由で漏洩したクレデンシャル：<strong>9件</strong></li>
<li>侵害されたユーザー（顧客側含む）合計：<strong>2,985件</strong></li>
<li>　└ RedLineスティーラー由来：<strong>813件</strong></li>
<li>　└ Lummaスティーラー由来：<strong>757件</strong></li>
<li>　└ Generic / その他のファミリー由来：<strong>467件</strong></li>
<li>　└ 上記以外のスティーラーファミリー合計：<strong>948件</strong></li>
<li>外部攻撃面URL（grafana.com系で観測されたログイン面）：<strong>88件</strong></li>
</ul>
</div>

<p>注目すべき点は3つある。</p>

<p>第一に、<strong>Grafana Labs従業員端末からのinfostealer感染履歴は0件</strong>である点。これは「従業員PCがinfostealer感染→社内認証情報が直接漏洩」という古典的な初期侵入ベクトルの可能性が低いことを示唆する。</p>

<p>第二に、<strong>第三者経由のクレデンシャル漏洩が9件</strong>確認されている点。これはGrafana Labsと業務上接続する外部パートナー・ベンダー・コントラクター端末で発生した感染を意味する。サプライチェーン上のサードパーティ経由の認証情報漏洩は近年急増しており、今回のインシデントにおける有力な仮説の一つとなる。</p>

<p>第三に、<strong>ユーザー側ではRedLineとLummaという2大infostealerファミリーが圧倒的なシェア</strong>を占めている点。これらは2024〜2026年にかけて最も活発に流通しているスティーラーで、ダークウェブのIAB（Initial Access Broker）市場で日常的に売買されている。</p>

<p>これらはあくまで外部脅威インテリの観測データであり、<strong>今回の侵入経路を断定するものではない</strong>。Grafana公式の調査結果待ちとなる。</p>

<h3 id="coinbasecartelとはどのような脅威アクターか">coinbasecartelとはどのような脅威アクターか</h3>

<div class="warn-box">
<strong>以下の情報はcoinbasecartelの一般的な手口に関するものです（Bitdefender / InfoStealers.com分析）。<br />Grafanaのインシデントへの直接関与・帰属は現時点で未確認です。</strong>
</div>

<p>coinbasecartelは2025年9月に活動を開始した比較的新しい脅威グループで、登場から半年あまりで急速に被害規模を拡大している。Bitdefender Business Insightsの分析とInfoStealers.comの追跡調査をもとに、その全体像を整理する。</p>

<div class="point-box">
<strong>coinbasecartelの主要メトリクス（2025年9月〜2026年5月）</strong><br />
<ul>
<li>累計被害企業数：<strong>170社以上</strong></li>
<li>被害国数：<strong>34カ国</strong></li>
<li>被害企業のうちinfostealer感染履歴あり：<strong>約80%</strong>（Hudson Rock調べ）</li>
<li>身代金支払いまでの猶予：侵入後 <strong>48時間以内の連絡要求</strong>、最大10日間の支払い期限</li>
<li>決済通貨：<strong>Bitcoin（BTC）</strong></li>
</ul>
</div>

<p><strong>暗号化なしの純粋なデータ窃取型</strong>：一般的なランサムウェアがファイルを暗号化して業務を停止させるのに対し、coinbasecartelはデータを暗号化せず、<strong>窃取したデータの公開を脅しに身代金を要求</strong>するモデルを採る。被害組織の業務継続性は保たれるが、機密データの流出リスクが焦点になる。Grafana Labsへの恐喝（「コードベース公開を防ぐための支払い要求」）はこのモデルに完全に一致する。</p>

<p><strong>主要な標的セクター</strong>：技術・医療・輸送・エネルギー分野で被害報告が多く、Grafana Labsはその「技術」セクターに該当する。</p>

<p><strong>初期侵入の主要手口（Bitdefender分析より）</strong>：</p>
<ul>
  <li><strong>古いinfostealerログの認証情報を購入</strong> — RedLine、Lumma、Vidar、StealCなどのスティーラーがダークウェブのIABマーケットで日常的に売買されており、coinbasecartelはこれら過去ログから対象企業の正規アカウント情報を入手</li>
  <li>購入した認証情報で<strong>正規のログインフローを経由</strong>してネットワークに侵入（マルウェアによる脆弱性悪用ではなく、正規ログインのため検知が困難）</li>
  <li>内部探索後、機密データを段階的に窃取（多くの場合MFA未設定のサービス・アカウントが踏み台になる）</li>
</ul>

<p><strong>身代金要求の流れ</strong>：侵入後48時間以内の連絡要求、10日間の支払い期限、Bitcoin払いというパターンが確認されている。グループのメッセージは「我々は想像以上のダメージを与えられる、連絡せよ」という定型文で、今回のGrafana掲示にも同様の文言が使われた。</p>

<h3 id="他の著名な被害組織">他の著名な被害組織</h3>

<p>coinbasecartelの被害は技術企業だけにとどまらない。InfoStealers.com / Bitdefenderが報じた主要被害組織には次のようなものがある。</p>

<table>
  <thead>
    <tr>
      <th>組織</th>
      <th>セクター</th>
      <th>規模・特徴</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cognizant</td>
      <td>IT・コンサルティング</td>
      <td>売上約 $21B 規模のグローバルIT大手</td>
    </tr>
    <tr>
      <td>ENGIE</td>
      <td>エネルギー</td>
      <td>フランスの大手エネルギー企業（旧GDF Suez）</td>
    </tr>
    <tr>
      <td>SK Telecom</td>
      <td>通信</td>
      <td>韓国の最大手通信キャリア</td>
    </tr>
    <tr>
      <td>Grafana Labs</td>
      <td>監視・可観測性OSS</td>
      <td>今回の被害（2026年5月17日公表）</td>
    </tr>
  </tbody>
</table>

<p>これらの被害組織はいずれも内部の認証情報管理・MFA運用において完璧ではなかったとされ、coinbasecartelはこうした「正規ログインの隙」を組織横断的に突いてきた。<strong>業界・規模を問わずInfoStealer由来のクレデンシャル汚染は普遍的な脅威</strong>となっている。</p>

<h2 id="grafanaインシデントの侵入経路に関する推測分析">Grafanaインシデントの侵入経路に関する推測分析</h2>

<p>ここまで整理してきた情報を踏まえると、今回のGrafana侵害がどのような技術的経路で発生したかについて、いくつかの仮説を組み立てられる。ただし以下は推測であり、公式調査の結果を待つ必要がある。</p>

<div class="warn-box">
<strong>⚠️ 以下はCoinbasecartelの過去の攻撃パターンに基づく推測であり、Grafana Labsが公式に確認した情報ではありません。公式のインシデントレビュー報告を待つ必要があります。</strong>
</div>

<p>公開情報を改めて整理すると、確定事項と推測事項は次のように分かれる。</p>

<table>
  <thead>
    <tr>
      <th>区分</th>
      <th>内容</th>
      <th>ソース</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ファクト</td>
      <td>不正な第三者がGitHub環境にアクセスできるトークンを入手</td>
      <td>Grafana公式スレッド (1/6)</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>コードベースがダウンロードされた</td>
      <td>Grafana公式スレッド (1/6)</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>顧客データ・本番システムへのアクセス痕跡なし</td>
      <td>Grafana公式スレッド (2/6)</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>認証情報漏洩の原因を特定済み（具体的手法は未公表）</td>
      <td>Grafana公式スレッド (3/6)</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>Coinbasecartel被害企業の約80%が過去にinfostealer感染履歴あり</td>
      <td>Bitdefender / Hudson Rock</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>Coinbasecartelの主要侵入手口は古いinfostealerログ購入 → 正規ログイン</td>
      <td>Bitdefender分析</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>Grafana Labs従業員端末の直接infostealer感染は0件</td>
      <td>Hudson Rock</td>
    </tr>
    <tr>
      <td>ファクト</td>
      <td>第三者経由クレデンシャル漏洩9件・ユーザー側RedLine 813件・Lumma 757件</td>
      <td>Hudson Rock / ransomware.live</td>
    </tr>
    <tr>
      <td><strong>推測</strong></td>
      <td>サードパーティ（パートナー・ベンダー・コントラクター）の感染端末からGitHub PATが漏洩した可能性</td>
      <td>上記ファクトの組み合わせ</td>
    </tr>
    <tr>
      <td><strong>推測</strong></td>
      <td>あるいは過去にどこかで露出したGitHub PAT（git履歴・CI/CDログ・スクリーンショット・個人端末のNotion/Slack添付など）がinfostealerに窃取された可能性</td>
      <td>同上</td>
    </tr>
    <tr>
      <td>未確認</td>
      <td>攻撃者の正式な帰属（Attribution）</td>
      <td>PIR待ち</td>
    </tr>
    <tr>
      <td>未確認</td>
      <td>漏洩トークンのスコープ・有効期限</td>
      <td>PIR待ち</td>
    </tr>
    <tr>
      <td>未確認</td>
      <td>侵入から検知までのDwell Time</td>
      <td>PIR待ち</td>
    </tr>
  </tbody>
</table>

<p><strong>推測の組み立てロジック</strong>：Coinbasecartelの過去170社の侵入経路の大多数がinfostealer由来のクレデンシャル購入であり（Bitdefender分析）、被害企業の80%が過去に何らかの形でinfostealer汚染を経験している。今回のGrafana事案では従業員端末の直接感染こそゼロだが、第三者経由のクレデンシャル漏洩が9件確認されている。<strong>この組み合わせから「サードパーティ端末のinfostealer感染 → そこに保存されていたGitHub PAT流出 → ダークウェブで購入 → 正規ログインでGitHub環境侵入 → コードベースクローン」という攻撃シナリオが過去パターンとして最も整合する</strong>。</p>

<p>ただしこれはあくまで「もっともらしい仮説」であり、Grafana Labsが公式スレッド (3/6) で「原因を特定済み」と述べた具体的手法はまだ未公表だ。公式PIRが公開されるまで断定は避けるべきだ。</p>

<h3 id="推測が当たっていた場合に組織が取るべき教訓">推測が当たっていた場合に組織が取るべき教訓</h3>

<p>仮にこの仮説が正しかった場合、自組織のセキュリティ対策に与える示唆は大きい。</p>

<ol>
  <li><strong>自組織のセキュリティだけ強化しても不十分</strong> — パートナー・ベンダー・コントラクター・元従業員の端末も認証情報の流出経路になる</li>
  <li><strong>GitHub PATを「コードに書かない」だけでは足りない</strong> — 個人のNotion・Slack・スクリーンショット・パスワード管理ツール経由でも漏洩する</li>
  <li><strong>Have I Been Pwned / Hudson Rockなどのinfostealer監視サービスで自組織ドメインの汚染状況を定期チェックする運用が必要</strong></li>
  <li><strong>GitHub OIDCへの全面移行</strong>で静的PAT自体を世界から消すのが最も根本的な防御</li>
  <li><strong>Canaryトークンの拡充</strong>でPAT流出時の検知時間を最小化</li>
</ol>

<h2 id="grafana-labsの過去のセキュリティインシデントとの比較">Grafana Labsの過去のセキュリティインシデントとの比較</h2>

<p>Grafana Labsはオープンソース企業として、セキュリティインシデントへの透明性の高い対応で知られる。今回の事案と2025年4月のGitHub Actionsインシデントを比較する。</p>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>2025年4月インシデント</th>
      <th>2026年5月インシデント（今回）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>公表日</td>
      <td>2025年4月26日</td>
      <td>2026年5月17日</td>
    </tr>
    <tr>
      <td>攻撃手口</td>
      <td>pull_request_targetの設定不備</td>
      <td>GitHubトークンの窃取（手口の詳細は調査中）</td>
    </tr>
    <tr>
      <td>攻撃主体</td>
      <td>自動化ボット（hackerbot-claw）</td>
      <td>coinbasecartel関与の可能性（公式帰属未確認）</td>
    </tr>
    <tr>
      <td>コードベースのダウンロード</td>
      <td>なし（確認なし）</td>
      <td><strong>あり（公式認定）</strong></td>
    </tr>
    <tr>
      <td>本番システムへのアクセス</td>
      <td>なし</td>
      <td><strong>なし（公式認定・スレッド2/6）</strong></td>
    </tr>
    <tr>
      <td>顧客データの漏洩</td>
      <td>なし</td>
      <td><strong>アクセス痕跡なし（公式認定・スレッド2/6）</strong></td>
    </tr>
    <tr>
      <td>コードの改ざん</td>
      <td>なし</td>
      <td>未確認（PIR待ち）</td>
    </tr>
    <tr>
      <td>身代金要求</td>
      <td>なし</td>
      <td><strong>あり（公式認定・スレッド4/6）</strong></td>
    </tr>
    <tr>
      <td>身代金への対応</td>
      <td>—</td>
      <td><strong>支払い拒否（FBI公式見解に従う・スレッド5/6・6/6）</strong></td>
    </tr>
    <tr>
      <td>被害規模（推定）</td>
      <td>トークン5件窃取・無効化済</td>
      <td>認証情報漏洩の原因特定済・無効化完了（公式認定・スレッド3/6）</td>
    </tr>
    <tr>
      <td>事後対応</td>
      <td>PIR公開・Zizmor/TruffleHog導入</td>
      <td>認証情報無効化・追加セキュリティ対策実施・PIR予定</td>
    </tr>
  </tbody>
</table>

<p>2025年のインシデントは「コードは見られていない、顧客データも無事」という比較的軽微な結果で終息した。今回は<strong>コードベースのダウンロード自体は確認</strong>されており、その意味では深刻だが、公式スレッドにより<strong>顧客データ・本番システムへのアクセス痕跡はなし</strong>と明確に否定された点は重要だ。</p>

<h2 id="コードベース流出が持つ意味なぜオープンソースでも危険なのか">コードベース流出が持つ意味：なぜオープンソースでも危険なのか</h2>

<p>Grafanaは主要なコードをオープンソースとして公開しているが、<strong>全てのコードが公開されているわけではない</strong>。</p>

<div class="point-box">
<strong>クローズドかつ流出リスクの高いコードの例（一般的なケース）</strong><br />
<ul>
<li>Grafana Cloud固有の機能・インフラ設定コード</li>
<li>内部ツール・デプロイパイプラインのスクリプト</li>
<li>パートナー連携のプライベートリポジトリ</li>
<li>未リリース機能・開発中のブランチ</li>
<li>設定ファイルにハードコードされたエンドポイント・認証情報（あった場合）</li>
</ul>
</div>

<p>また、オープンソースであっても、コードベースの全体像を手に入れた攻撃者は以下のことが可能になる。</p>

<p><strong>既知の脆弱性パターンの大規模探索</strong>：公開コードでは読みにくい部分も、ローカルにクローンすれば高度なSAST（Static Application Security Testing）ツールで網羅的にスキャンできる。例えば2026年3月に修正されたCVE-2026-27876（SQLエクスプレッション任意ファイル書き込み、CVSS 9.1）の類似パターンを新たに探索するといった用途が考えられる。</p>

<p><strong>ゼロデイ脆弱性の発掘</strong>：OSSとして公開されていないプライベートコードに未修正の脆弱性が潜んでいれば、攻撃者がそれを発見・悪用する時間を得る。</p>

<p><strong>内部アーキテクチャの把握</strong>：コードを読むことで内部APIのエンドポイント、認証フロー、データの流れを把握し、標的型攻撃の精度を高めることができる。</p>

<h2 id="組織が今すぐ実施すべき対策">組織が今すぐ実施すべき対策</h2>

<p>Grafana Labsを直接利用している組織だけでなく、GitHubを使って開発している組織全体に当てはまる対策を整理する。</p>

<h3 id="1-既存トークンの棚卸しと権限の最小化">1. 既存トークンの棚卸しと権限の最小化</h3>

<p>まず自組織のGitHubトークンを全て洗い出し、不要・過剰スコープのものを即時失効させる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># GitHub CLIで組織内のPersonal Access Tokensを確認（管理者権限が必要）</span>
gh api /orgs/<span class="o">{</span>ORG<span class="o">}</span>/personal-access-tokens <span class="se">\</span>
  <span class="nt">--jq</span> <span class="s1">'.[] | {id: .id, name: .name, created_at: .created_at, expires_at: .expires_at}'</span>

<span class="c"># Fine-grained PATに移行していない古いトークンを特定</span>
gh api /orgs/<span class="o">{</span>ORG<span class="o">}</span>/personal-access-tokens <span class="se">\</span>
  <span class="nt">--jq</span> <span class="s1">'.[] | select(.token_last_eight != null) | {name: .name, login: .owner.login}'</span>

<span class="c"># TruffleHogでリポジトリ内の漏洩シークレットをスキャン</span>
docker run <span class="nt">--rm</span> <span class="nt">-it</span> <span class="se">\</span>
  <span class="nt">-v</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span><span class="s2">:/repo"</span> <span class="se">\</span>
  ghcr.io/trufflesecurity/trufflehog:latest <span class="se">\</span>
  git file:///repo <span class="nt">--only-verified</span>
</code></pre></div></div>

<p>Fine-grained PATへの移行は組織ポリシーとして強制できる。GitHub Organizationの設定で「Personal access tokens → Fine-grained tokens」を必須化し、承認フローを設定することで、Classic PATの新規発行を防げる。</p>

<h3 id="2-github-oidcへの移行トークンを発行しないcicdアーキテクチャ">2. GitHub OIDCへの移行：トークンを発行しないCI/CDアーキテクチャ</h3>

<p>最も根本的な対策は、<strong>静的なGitHubトークンをCI/CDパイプラインから完全に排除</strong>することだ。GitHub Actionsでは、OIDCフェデレーションを使って動的な一時トークンを発行する仕組みに移行できる。</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># GitHub Actions で OIDC を使った安全なトークン生成の例</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">Secure Deploy</span>

<span class="na">permissions</span><span class="pi">:</span>
  <span class="na">id-token</span><span class="pi">:</span> <span class="s">write</span>   <span class="c1"># OIDC トークン取得に必要</span>
  <span class="na">contents</span><span class="pi">:</span> <span class="s">read</span>    <span class="c1"># コードのチェックアウトに必要</span>

<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">deploy</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>

      <span class="c1"># 静的なトークンをSecretに保存する代わりにOIDCで一時認証情報を取得</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Configure AWS Credentials via OIDC</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">aws-actions/configure-aws-credentials@v4</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">role-to-assume</span><span class="pi">:</span> <span class="s">arn:aws:iam::123456789012:role/GitHubActionsRole</span>
          <span class="na">aws-region</span><span class="pi">:</span> <span class="s">ap-northeast-1</span>

      <span class="c1"># GitHub App Token も OIDC 経由で動的生成</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Generate GitHub App Token</span>
        <span class="na">id</span><span class="pi">:</span> <span class="s">app-token</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/create-github-app-token@v1</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">app-id</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">private-key</span><span class="pi">:</span> <span class="s">$</span>
</code></pre></div></div>

<p>このアーキテクチャでは、長期間有効な静的トークンが存在しないため、トークンを窃取されるリスク自体を排除できる。</p>

<h3 id="3-トークン使用のリアルタイム監視">3. トークン使用のリアルタイム監視</h3>

<p>トークンが漏洩・悪用された場合でも、<strong>早期検知によって被害を最小化</strong>できる。GitHubは組織の監査ログをAPIで取得できる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># GitHub 組織の監査ログで不審なアクセスを検索</span>
<span class="c"># 特に通常と異なるIPや未知のUser-Agentからのclone操作を確認</span>
gh api <span class="se">\</span>
  <span class="s2">"/orgs/{ORG}/audit-log?phrase=action:git.clone&amp;per_page=100"</span> <span class="se">\</span>
  <span class="nt">--jq</span> <span class="s1">'.[] | {
    action: .action,
    actor: .actor,
    repo: .repo,
    created_at: .created_at,
    country_code: .country_code,
    user_agent: ."@type"
  }'</span>

<span class="c"># 特定期間のgit.cloneイベントを抽出（大量クローンの検出）</span>
gh api <span class="se">\</span>
  <span class="s2">"/orgs/{ORG}/audit-log?phrase=action:git.clone&amp;after=</span><span class="si">$(</span><span class="nb">date</span> <span class="nt">-u</span> <span class="nt">-v-24H</span> +%Y-%m-%dT%H:%M:%SZ<span class="si">)</span><span class="s2">"</span> <span class="se">\</span>
  <span class="nt">--jq</span> <span class="s1">'group_by(.actor) | .[] | {actor: .[0].actor, count: length}'</span>
</code></pre></div></div>

<p>Grafana Labs自身が推奨するCanaryトークン（特定のURLや認証情報を含むダミートークンで、アクセスがあればアラートが発火する仕組み）を組み合わせることで、漏洩を秒単位で検知できる体制が作れる。</p>

<h2 id="セキュリティ体制の成熟度チェックリスト">セキュリティ体制の成熟度チェックリスト</h2>

<p>今回のGrafana Labs事案を踏まえ、自組織のGitHub環境の安全性を確認するためのチェックリストを示す。</p>

<div class="check-box">
<strong>GitHub環境セキュリティ チェックリスト</strong><br />
<ul>
<li>[ ] 組織のClassic PATを全て棚卸しし、Fine-grained PATに移行した</li>
<li>[ ] CI/CDパイプラインでGitHub OIDCを使い、静的トークンを排除した</li>
<li>[ ] TruffleHogまたはgitleaksでリポジトリ内のシークレットをスキャンした</li>
<li>[ ] ブランチ保護ルール（必須レビュー・ステータスチェック）を全主要リポジトリに適用した</li>
<li>[ ] 組織の監査ログを外部SIEMに転送し、異常なgit.cloneを検知できる状態にした</li>
<li>[ ] GitHub Actionsのpermissionsを各ジョブに明示的に設定した（デフォルトのread-allを避ける）</li>
<li>[ ] サードパーティActionをコミットハッシュでピン留めした</li>
<li>[ ] 重要リポジトリにCanaryトークン・ファイルを配置した</li>
<li>[ ] インシデント発生時のトークン一括無効化手順を文書化・テストした</li>
</ul>
</div>

<h2 id="過去のgrafana-github-actionsインシデント2025年4月との技術的相違点">過去のGrafana GitHub Actionsインシデント（2025年4月）との技術的相違点</h2>

<p>2025年4月26日に発生したインシデントは、<code class="language-plaintext highlighter-rouge">pull_request_target</code>トリガーを使ったGitHub Actionsワークフローの設定不備を突いた攻撃だった。攻撃者はフォークしたリポジトリから悪意のあるブランチ名を使ってコマンドインジェクションを実行し、<code class="language-plaintext highlighter-rouge">GRAFANA_DELIVERY_BOT_APP_ID</code>と<code class="language-plaintext highlighter-rouge">GRAFANA_DELIVERY_BOT_APP_PEM</code>の2つのGitHub Appシークレットを窃取した。</p>

<p>このインシデントで重要なのは、<strong>Canaryトークンが即座にアラートを発火させた</strong>点だ。土曜日の夜に発生したにもかかわらず、グローバルに分散したセキュリティチームが数時間以内に対応し、被害を最小化した。インシデント終結（2025年5月12日）時点で「コードの改ざんなし、本番システムアクセスなし、顧客データ漏洩なし」を確認した。</p>

<p>今回（2026年5月）の事案はこれとは性質が異なる。前回は<strong>自動化ボットによるワークフロー悪用</strong>だったが、今回は<strong>GitHub環境へのアクセス権を持つトークンの窃取とコードベースのダウンロード</strong>という、より意図的・目的的な攻撃の様相を呈している。</p>

<p>Grafana Labsは前回のインシデント後、以下の改善を実施していた：</p>

<ul>
  <li>ZizmurとTruffleHogをCI/CDパイプラインに組み込み</li>
  <li>コンパートメント化されたVaultと短命トークンの導入</li>
  <li>オープンソースリポジトリとプライベートリポジトリの組織分離</li>
  <li>Canaryトークンの拡充</li>
</ul>

<p>こうした対策を講じた後でも今回の事案が発生したことは、<strong>セキュリティ対策の継続的な更新が不可欠</strong>であることを改めて示している。</p>

<h2 id="grafana利用者への影響評価">Grafana利用者への影響評価</h2>

<p>公式スレッド（2/6）で「顧客データや個人情報がアクセスされた形跡はなく、顧客システムや業務への影響を示す証拠も見つかっていない」と明言された。これを踏まえた利用者カテゴリ別の影響評価は次の通り。</p>

<div class="warn-box">
<strong>以下は2026年5月17日時点の公式スレッドに基づく評価です。詳細PIRで更新される可能性があります。</strong>
</div>

<p><strong>Grafana Cloud利用者</strong>：公式発表により本番システム・顧客データへのアクセス痕跡なしと確認された。即時のサービス利用への影響はないが、念のためAPIキー・サービスアカウントの権限棚卸しを推奨する。</p>

<p><strong>Grafana OSS（セルフホスト）利用者</strong>：コードベースを入手した攻撃者が新たな脆弱性を発見・悪用するリスクは中長期で残存する。CVE-2026-27876（CVSS 9.1）などの既知の脆弱性はパッチ済みバージョン（12.4.2以降）への更新で対処できている。最新パッチの適用状況を確認すること。</p>

<p><strong>Grafana Enterpriseライセンス利用者</strong>：プライベートリポジトリのコードが対象に含まれる可能性について、Grafana Labsからの個別連絡を確認すること。</p>

<p><strong>自社でGrafanaのビルドパイプラインに依存している組織</strong>：公式声明では本番システム・コード改ざんへの言及はないが、ビルドアーティファクトの完全性確認（コンテナイメージのダイジェスト検証など）を推奨する。</p>

<h2 id="最新パッチの適用確認">最新パッチの適用確認</h2>

<p>今回の事案とは別に、直近でGrafanaには複数の重大な脆弱性が修正されている。インシデント対応と並行してパッチ適用状況を確認する。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 現在稼働しているGrafanaのバージョン確認</span>
curl <span class="nt">-s</span> http://localhost:3000/api/health | jq .version

<span class="c"># Grafana公式APIで最新リリースを確認</span>
curl <span class="nt">-s</span> https://api.github.com/repos/grafana/grafana/releases/latest <span class="se">\</span>
  | jq <span class="s1">'{version: .tag_name, published: .published_at, url: .html_url}'</span>

<span class="c"># Dockerコンテナの場合：イメージのダイジェストを検証</span>
docker inspect grafana/grafana:latest <span class="se">\</span>
  <span class="nt">--format</span><span class="o">=</span><span class="s1">''</span>
</code></pre></div></div>

<p>直近の主要修正パッチ：</p>

<ul>
  <li><strong>v12.4.2</strong> / v12.3.6 / v12.2.8 / v12.1.10 / v11.6.14（2026年3月25日リリース）
    <ul>
      <li>CVE-2026-27876（CVSS 9.1 Critical）：SQLエクスプレッションによる任意ファイル書き込み→RCE</li>
      <li>CVE-2026-27880（CVSS 7.5 High）：OpenFeature DoS</li>
    </ul>
  </li>
</ul>

<p>これらのCVEとは独立した脅威として、今回のコードベース流出リスクへの対処も並行して進める必要がある。</p>

<h2 id="インシデント対応の透明性grafana-labsが示した開示姿勢">インシデント対応の透明性：Grafana Labsが示した開示姿勢</h2>

<p>今回の発表で注目すべき点の一つは、<strong>身代金要求とその拒否を即日かつ公然と開示した</strong>ことだ。2025年4月のインシデントでも、Grafana Labsはインシデント発生翌々日にはLinkedInとブログで詳細を公開し、調査終結後にはPost-Incident Review（PIR）を発表した実績がある。</p>

<p>今回は単なる被害公表に留まらず、6連投スレッドの中で<strong>FBIの公式見解を引用しつつ「身代金を支払わないことが適切な道だ」と明言</strong>した。これは業界全体にとって重要な意味を持つ。</p>

<div class="point-box">
<strong>身代金拒否が業界に与える影響</strong><br />
<ul>
<li>データ窃取型ランサムウェアグループへの資金供給を断つ姿勢の表明</li>
<li>「コードベース公開を防ぐための支払い」という新しい恐喝モデルへの先例</li>
<li>オープンソース企業として「コードは公開されても構わない」という覚悟の表明</li>
<li>FBI公式見解の権威付け（IC3が長年推奨してきた立場）の実例化</li>
</ul>
</div>

<p>この透明性の高い開示姿勢は、オープンソースコミュニティからの信頼を維持する上で重要な役割を果たしている。多くの組織がインシデントの存在自体を数週間〜数ヶ月隠蔽するなか、Grafana Labsの対応は業界標準として参照されるケースも多い。</p>

<p>詳細なPIRは調査完了後に公開される予定（公式スレッド6/6で明言）であり、続報のキャッチアップが望まれる。</p>

<h2 id="組織として取るべきインシデント初期対応手順">組織として取るべきインシデント初期対応手順</h2>

<p>Grafana利用組織が今すぐ実施すべき初期対応を時系列で整理する。</p>

<p><strong>即時（Today）</strong>：</p>
<ol>
  <li>組織内でGrafanaリポジトリにアクセスできるGitHubトークンを全て洗い出す</li>
  <li>不要・長期間未使用のトークンを即時失効させる</li>
  <li>Grafana公式ブログ（grafana.com/blog）とGitHub Security Advisoriesをウォッチ登録する</li>
</ol>

<p><strong>今週中（This Week）</strong>：</p>
<ol>
  <li>TruffleHogでリポジトリ内のシークレットをスキャンし、残存シークレットを排除</li>
  <li>GitHub監査ログで過去30日間の異常なgit.cloneイベントを確認</li>
  <li>本番Grafanaインスタンスを最新の修正パッチ（v12.4.2以降）に更新</li>
</ol>

<p><strong>今月中（This Month）</strong>：</p>
<ol>
  <li>Fine-grained PATへの全面移行計画を立案・実施</li>
  <li>CI/CDパイプラインのGitHub OIDC移行スケジュールを設定</li>
  <li>Canaryトークンをリポジトリと本番環境に配置</li>
</ol>

<h2 id="まとめコードベース流出インシデントから組織が学ぶべきこと">まとめ：コードベース流出インシデントから組織が学ぶべきこと</h2>

<p>Grafana Labsの今回の事案は、<strong>どれだけセキュリティ意識の高い組織でも、GitHubトークン管理の盲点が残れば侵入を許す</strong>という現実を突きつけた。一方で、6連投スレッドで明らかになった事実は次の3点に集約できる。</p>

<div class="point-box">
<strong>公式スレッドで確認された3つの重要事実</strong><br />
<ul>
<li><strong>コードベースのダウンロードは発生したが、顧客データ・本番システムへのアクセス痕跡はなし</strong>（スレッド1/6・2/6）</li>
<li><strong>身代金要求があったが、FBI公式見解に従い支払いを拒否</strong>（スレッド4/6・5/6・6/6）</li>
<li><strong>認証情報漏洩の原因は特定済み・無効化完了。追加セキュリティ対策も実施</strong>（スレッド3/6）</li>
</ul>
</div>

<p>詳細な攻撃手口・Attribution・PIRの公開は今後となるが、組織が今すぐ行動できることは明確だ。静的なGitHubトークンの棚卸しと最小化、GitHub OIDCへの移行、TruffleHogによるシークレットスキャン、Canaryトークンの配置——これらは「Grafana Labs事案が教えてくれた」ことではなく、業界のベストプラクティスとして長年言われてきたことだ。事案を機にアクションに移すかどうかが、次の被害者になるかどうかを分ける。</p>

<p>そして経営層が学ぶべき教訓がもう一つある。<strong>身代金要求に直面したとき、FBI公式見解に従って拒否する判断軸を事前に持っておくこと</strong>だ。Grafana Labsはオープンソース企業として「コードは公開されても構わない」という覚悟があったからこそ拒否を即断できた。自社が同じ立場に立たされたとき何を守るのか、トレードオフを事前に整理しておくべきだ。</p>

<div class="point-box">
<strong>Grafana Labs公式の続報チェックポイント</strong><br />
<ul>
<li>grafana.com/blog — 公式ブログ（詳細インシデントレポート・PIR）</li>
<li>grafana.com/security — セキュリティアドバイザリ</li>
<li>@Grafana（X/Twitter）— 公式リアルタイムアップデート</li>
<li>github.com/grafana/grafana/security — GitHubセキュリティアドバイザリ</li>
</ul>
</div>

<h2 id="参照ソース">参照ソース</h2>

<ol>
  <li>Grafana Labs公式X: <a href="https://twitter.com/grafana">@grafana 6連投スレッド（2026年5月17日）— GitHub環境への不正アクセスとコードベースダウンロード公表・身代金拒否表明</a></li>
  <li>Grafana Labs公式ブログ: <a href="https://grafana.com/blog/2025/04/27/grafana-security-update-no-customer-impact-from-github-workflow-vulnerability/">Grafana security update: no customer impact from GitHub workflow vulnerability（2025年4月）</a></li>
  <li>Grafana Labs公式ブログ: <a href="https://grafana.com/blog/grafana-security-update-post-incident-review-for-github-workflow-vulnerability-and-whats-next/">Grafana security update: post-incident review for GitHub workflow vulnerability and what’s next（2025年5月）</a></li>
  <li>StepSecurity: <a href="https://www.stepsecurity.io/blog/grafana-github-actions-security-incident">Grafana GitHub Actions Security Incident</a></li>
  <li>Grafana Labs公式ブログ: <a href="https://grafana.com/blog/grafana-security-release-critical-and-high-severity-security-fixes-for-cve-2026-27876-and-cve-2026-27880/">Grafana security release: Critical and high severity security fixes for CVE-2026-27876 and CVE-2026-27880</a></li>
  <li>Bitdefender Business Insights: <a href="https://businessinsights.bitdefender.com/coinbase-cartel-ransomware-group-extortion-tactics">No Encryptors, No Problem: The Coinbase Cartel Ransomware Group — 累計170社/34カ国・80%がinfostealer感染履歴あり・古いログ購入→正規ログイン手口の分析</a></li>
  <li>InfoStealers.com: <a href="https://www.infostealers.com/article/inside-the-coinbase-cartel-how-infostealer-credentials-fueled-a-100-company-ransomware-spree/">Inside the Coinbase Cartel: How Infostealer Credentials Fueled a 100-Company Ransomware Spree — Cognizant/ENGIE/SK Telecom等の被害組織分析</a></li>
  <li>ransomware.live: <a href="https://www.ransomware.live/id/R3JhZmFuYUBjb2luYmFzZWNhcnRlbA==">Victim: Grafana – coinbasecartel（2026年5月15日 20:57 UTC掲載）— RedLine 813件・Lumma 757件・第三者9件・外部URL 88件の詳細メトリクス</a></li>
  <li>Hudson Rock: 侵害認証情報追跡データ — Grafana Labs従業員端末からのinfostealer感染0件、第三者経由クレデンシャル漏洩9件、Grafana関連ユーザー2,985件</li>
  <li>FBI Internet Crime Complaint Center (IC3): ランサムウェア身代金支払いに関する公式見解</li>
</ol>]]></content><author><name></name></author><category term="security" /><category term="security" /><category term="セキュリティ" /><category term="GitHub" /><category term="サプライチェーン" /><category term="インシデント" /><category term="トークン管理" /><summary type="html"><![CDATA[Grafana Labsが2026年5月17日にX公式6連投で公表したGitHub環境不正アクセスを解説。コードベース流出・顧客データ無事・身代金拒否の3つの事実、coinbasecartel関与、トークン監査・GitHub OIDC移行など実践対策を整理。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_grafana-labs-github-breach-2026.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_grafana-labs-github-breach-2026.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PhotoGIMP徹底解説：GIMPをPhotoshop化する無料パッチでAI画像生成の後処理を完結する</title><link href="https://ai-heartland.com/tool/photogimp-photoshop-alternative-ai-image-postprocessing/" rel="alternate" type="text/html" title="PhotoGIMP徹底解説：GIMPをPhotoshop化する無料パッチでAI画像生成の後処理を完結する" /><published>2026-05-17T09:00:00+09:00</published><updated>2026-05-17T09:00:00+09:00</updated><id>https://ai-heartland.com/tool/photogimp-photoshop-alternative-ai-image-postprocessing</id><content type="html" xml:base="https://ai-heartland.com/tool/photogimp-photoshop-alternative-ai-image-postprocessing/"><![CDATA[<p>この記事ではAI画像生成ワークフローの後処理ツールという文脈で、GIMPをPhotoshop風UIに切り替える無料パッチ「PhotoGIMP」を実装目線で掘り下げます。AI時代の自動化ツール全体像は <a href="/explain/ai-automation-tools-guide-2026/">AI自動化ツール完全ガイド2026｜ノーコードからコードまで徹底比較</a> をご覧ください。</p>

<div class="point-box"><strong>この記事のポイント</strong><ul><li>・<code>PhotoGIMP</code>はGIMP 3.0+の設定ファイルを上書きする無料パッチでGitHub 8,800スター超。</li><li>・ショートカット・ツールバー配置・スプラッシュをPhotoshop互換に切り替えてくれる。</li><li>・Stable Diffusion / DALL-E / Midjourneyで生成した画像のレタッチ後処理に向く。</li><li>・Adobe Photoshopのサブスクリプションを払わずに済む現実的なOSS代替。</li><li>・Linux / Windows / macOSの3OS対応。インストールは設定ディレクトリへの上書きコピー1回。</li></ul></div>

<h2 id="1-photogimpとは何かgimpをphotoshopに見える状態にする公式パッチ">1. PhotoGIMPとは何か：GIMPを「Photoshopに見える」状態にする公式パッチ</h2>

<p><span class="marker-yellow">PhotoGIMPは、無料の画像編集ソフトGIMP 3.0以降を、Adobe Photoshopから移ってきたユーザーが違和感なく使えるレイアウトに変えるためのコミュニティパッチで、GitHubで8,800スター超を獲得している</span>。GIMP本体には何も追加せず、GIMPがホームディレクトリ配下に持っている設定ディレクトリの中身を上書きするだけで成立する。</p>

<p>開発者はブラジルのLinux系YouTubeチャンネル「Diolinux」を運営する João Diolinux 氏で、2020年6月に最初のコミットが行われた。GIMP 2.10時代から積み重ねてきたノウハウが、GIMP 3.0のリリースに合わせて全面リファクタリングされ、現行版はGIMP 3.0+専用となっている。</p>

<p>ライセンスはGNU General Public License v3.0で、GIMP本体と同じくフリーソフトウェアだ。リポジトリの主要言語がCSSになっているのは、GIMPのテーマカスタマイズ用 <code class="language-plaintext highlighter-rouge">theme.css</code> を含んでいるためで、実装の中心は設定ファイルの塊である。</p>

<h3 id="11-photogimpが解決する課題">1.1 PhotoGIMPが解決する課題</h3>

<p>Photoshopから他のソフトに移ろうとした人なら一度は経験する「ショートカットが効かない」「ツールが見つからない」「メニュー階層が違う」という三重苦がある。GIMPは無料で機能も豊富だが、独自の哲学で設計されているため、Photoshop経験者には学習コストが急に立ち上がる。</p>

<p>PhotoGIMPはこの「最初の壁」を取り除くためだけに作られている。<span class="marker-pink">ショートカットを Adobe 公式の Photoshop Windows 版ドキュメントに沿って付け替え、ツールバーの並び順を Photoshop に寄せ、スプラッシュ画面もそれっぽいデザインに差し替える</span>。これだけで初日の生産性が体感で数倍変わる。</p>

<h3 id="12-リポジトリの規模感">1.2 リポジトリの規模感</h3>

<p>GitHubのスター数は8,825件、フォーク数は280件で、純粋な「設定ファイル集」のリポジトリとしては破格の人気を持つ。デフォルトブランチは <code class="language-plaintext highlighter-rouge">master</code>、月次〜四半期単位でリリースが切られる。最新リリースは <code class="language-plaintext highlighter-rouge">3.0</code> 系列で、GIMP 3.0+専用となっている。</p>

<p>トピックタグには <code class="language-plaintext highlighter-rouge">gimp</code> <code class="language-plaintext highlighter-rouge">photoshop</code> <code class="language-plaintext highlighter-rouge">linux</code> <code class="language-plaintext highlighter-rouge">windows</code> <code class="language-plaintext highlighter-rouge">macos</code> といったキーワードが並ぶ。issueは32件、PRも含めてアクティブにメンテナンスされており、放置プロジェクトではない。</p>

<div class="box-tip"><strong>「パッチ」と聞いて警戒する必要はない</strong><br />
PhotoGIMPは「バイナリパッチ」ではなく、GIMPの設定ディレクトリにファイルを置くだけの「コンフィグパッチ」だ。バイナリは一切書き換えない。気に入らなければ設定ディレクトリを削除すれば即座に純正GIMPに戻る。<code>git revert</code>感覚で剥がせる安全性は、Adobe Photoshopの<code>preset</code>差し替えと同じレベルだ。
</div>

<hr />

<h2 id="2-なぜai画像生成ワークフローの後処理ツールとして選ばれるのか">2. なぜAI画像生成ワークフローの後処理ツールとして選ばれるのか</h2>

<p>ここ数年でStable Diffusion・DALL-E 3・Midjourney・Flux系モデルといったAI画像生成が日常的なツールになった。一方で、生成された画像をそのまま納品物・SNS投稿・記事のサムネに使えるかというと、ほとんどのケースで「もう一手間」が必要だ。</p>

<h3 id="21-ai画像にはほぼ必ず修正が必要">2.1 AI画像にはほぼ必ず修正が必要</h3>

<p>生成AIが出力する画像には、現時点でも以下のような典型的な破綻が混ざる。</p>

<ul>
  <li>・指の本数が6本になる、関節が逆向きに曲がる</li>
  <li>・髪の毛と背景の境界が溶ける</li>
  <li>・文字が「それっぽい記号」になり読めない</li>
  <li>・対象物のエッジに不自然なノイズが残る</li>
  <li>・解像度を上げると細部が崩れる</li>
  <li>・透過させたい部分に背景色が残る</li>
</ul>

<p>これらを直すのに、ブラウザベースのジェネレーターで「もう一度ガチャを引く」のは効率が悪い。<span class="marker-yellow">破綻した1ヶ所だけを2分で塗り直すほうが圧倒的に速く、品質も安定する</span>。塗り直しに必要なのは、まさにPhotoshop型の高機能レタッチツールだ。</p>

<h3 id="22-adobe代替としての立ち位置">2.2 Adobe代替としての立ち位置</h3>

<p>Adobe Photoshopは月額3,280円（フォトプラン）からの定期課金で、解約しないと永続的にコストが乗り続ける。AI画像生成を「後処理あり」で運用する場合、生成元のSaaS課金と二重コストになる構図が起きやすい。</p>

<p>PhotoGIMPは初期費用も月額もゼロで、Stable Diffusionをローカル実行する人なら追加コストは電気代だけで済む。Midjourneyの個人プランと合わせても、Adobe単体より安く済む計算が成り立つ。</p>

<h3 id="23-comfyui--automatic1111-とのファイル受け渡し">2.3 ComfyUI / AUTOMATIC1111 とのファイル受け渡し</h3>

<p>ComfyUIやAUTOMATIC1111といったローカルStable Diffusionランタイムは、生成結果をPNGとしてディスクに書き出す。PhotoGIMP化されたGIMPはPNG・WebP・PSD・TIFFをネイティブで開けるため、特別なエクスポート設定なしに <code class="language-plaintext highlighter-rouge">File → Open</code> で直接読み込める。</p>

<p>逆方向、つまりGIMP側でマスクを作ってComfyUIにinpaintとして戻すワークフローも実用的だ。GIMPのアルファチャンネルをPNGで書き出せばマスク画像として使え、生成→部分修正→再生成のループが10秒程度の往復で回せる。</p>

<div class="box-tip"><strong>「AIで作って、人間が仕上げる」がスタンダード</strong><br />
2026年現在、商業利用される生成画像のほとんどは「AI出力＋人間のレタッチ」というハイブリッド工程を経ている。<code>Stable Diffusion</code>や<code>DALL-E</code>はあくまでも「下絵」を高速生成する道具で、最終納品物には必ず人間の手が入る。レタッチ工程を内製化できるかどうかが、AI画像活用の費用対効果を大きく左右する。
</div>

<hr />

<h2 id="3-アーキテクチャgimpに被せる設定パッチ">3. アーキテクチャ：GIMPに被せる設定パッチ</h2>

<p>PhotoGIMPの中身はバイナリではなく、GIMPが起動時に読みに行く設定ファイル群だ。差分を整理すると、シンプルな上書き構造で全体像を把握できる。</p>

<div class="mermaid">
flowchart LR
    subgraph User["利用者の操作"]
        U1["GIMP 3.0+を<br />インストール"]
        U2["GIMPを1回起動<br />して終了"]
        U3["PhotoGIMP zipを<br />展開して上書き"]
    end
    subgraph ConfigDir["GIMP設定ディレクトリ"]
        C1["shortcutsrc<br />ショートカット"]
        C2["toolrc<br />ツール並び順"]
        C3["sessionrc<br />ウィンドウ配置"]
        C4["dockrc<br />ドック配置"]
        C5["gimprc<br />全体設定"]
        C6["theme.css<br />UIテーマ"]
        C7["splashes/<br />起動スプラッシュ"]
    end
    subgraph Runtime["GIMP本体"]
        R1["GIMPバイナリ<br />変更なし"]
        R2["プラグイン<br />変更なし"]
        R3["ブラシ・フォント<br />変更なし"]
    end
    U1 --&gt; U2
    U2 --&gt; U3
    U3 --&gt;|"上書きコピー"| C1
    U3 --&gt; C2
    U3 --&gt; C3
    U3 --&gt; C4
    U3 --&gt; C5
    U3 --&gt; C6
    U3 --&gt; C7
    C1 --&gt;|"起動時読込"| R1
    C2 --&gt; R1
    C3 --&gt; R1
    C5 --&gt; R1
    R1 --&gt; R2
    R1 --&gt; R3
</div>

<h3 id="31-上書きされる7つの設定ファイル">3.1 上書きされる7つの設定ファイル</h3>

<p>PhotoGIMPが置き換える主要なファイルとその役割は次のとおりだ。</p>

<ul>
  <li>・<code class="language-plaintext highlighter-rouge">shortcutsrc</code>：キーボードショートカットの定義。Adobe公式のPhotoshop Windows版ショートカット一覧に沿って書き換えられている</li>
  <li>・<code class="language-plaintext highlighter-rouge">toolrc</code>：ツールバーに並ぶツールの順番と表示状態</li>
  <li>・<code class="language-plaintext highlighter-rouge">sessionrc</code>：ウィンドウ・パネルの初期配置。レイヤー・チャンネル・パスのドックを Photoshop と同じ右側にまとめる</li>
  <li>・<code class="language-plaintext highlighter-rouge">dockrc</code>：ドックの細かなレイアウト</li>
  <li>・<code class="language-plaintext highlighter-rouge">gimprc</code>：キャンバスサイズ・グリッド・自動保存などの一般設定。キャンバスを最大化するチューニングが入っている</li>
  <li>・<code class="language-plaintext highlighter-rouge">contextrc</code>：直前に使ったツール・色などのコンテキスト</li>
  <li>・<code class="language-plaintext highlighter-rouge">templaterc</code>：「新規ドキュメント」テンプレート</li>
</ul>

<p>これらに加えて <code class="language-plaintext highlighter-rouge">splashes/</code> 配下のPNG画像（スプラッシュ）と <code class="language-plaintext highlighter-rouge">theme.css</code>（UIテーマの微調整）が含まれる。</p>

<h3 id="32-ノータッチ領域">3.2 ノータッチ領域</h3>

<p>PhotoGIMPが「触らない」要素も明確に定義されている。</p>

<ul>
  <li>・GIMP本体のバイナリ（<code class="language-plaintext highlighter-rouge">gimp</code> 実行ファイル、ライブラリ群）</li>
  <li>・プラグイン（<code class="language-plaintext highlighter-rouge">G'MIC</code>・<code class="language-plaintext highlighter-rouge">Resynthesizer</code>・<code class="language-plaintext highlighter-rouge">BIMP</code>など）</li>
  <li>・ユーザーが追加したブラシ・パターン・グラデーション・フォント</li>
  <li>・スクリプト（<code class="language-plaintext highlighter-rouge">Script-Fu</code>・<code class="language-plaintext highlighter-rouge">Python-Fu</code>）</li>
</ul>

<p>ユーザーが自前で追加した資産には一切影響を与えない設計だ。<span class="marker-pink">「気に入らなければ設定ディレクトリの3.0フォルダを削除して再起動」で完全に元に戻る</span>。Adobeのプリセット読み込みと同じレベルの軽さで導入できる。</p>

<h3 id="33-linux版だけにある追加要素">3.3 Linux版だけにある追加要素</h3>

<p>Linux版（特にFlatpak経由）では、上記に加えて <code class="language-plaintext highlighter-rouge">~/.local/share/applications/</code> 配下に <code class="language-plaintext highlighter-rouge">photogimp.desktop</code> ファイルが配置され、ランチャー上で「PhotoGIMP」として独立表示される。アイコンも <code class="language-plaintext highlighter-rouge">~/.local/share/icons/hicolor/</code> 配下に専用のものが置かれる。</p>

<p>これは「同じGIMPバイナリを別アプリ風に呼び出す」だけのトリックで、GNOMEやKDEのランチャーから見ると別アプリに見える、というUX上の工夫だ。本体は1つのGIMPプロセスなので、メモリ使用量は二重にならない。</p>

<hr />

<h2 id="4-photoshopgimpkritaphotogimpの比較">4. Photoshop・GIMP・Krita・PhotoGIMPの比較</h2>

<p>AI画像の後処理に使える主要な選択肢を、Photoshop代替の観点で並べる。中心軸は「価格」「学習コスト」「AI画像との相性」だ。</p>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>PhotoGIMP（GIMP 3.0+）</th>
      <th>素のGIMP 3.0+</th>
      <th>Krita</th>
      <th>Adobe Photoshop</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ライセンス</td>
      <td>GPL-3.0</td>
      <td>GPL-3.0</td>
      <td>GPL-3.0</td>
      <td>プロプライエタリ</td>
    </tr>
    <tr>
      <td>価格</td>
      <td>無料</td>
      <td>無料</td>
      <td>無料</td>
      <td>月額 3,280円〜</td>
    </tr>
    <tr>
      <td>OS対応</td>
      <td>Linux / Windows / macOS</td>
      <td>Linux / Windows / macOS</td>
      <td>Linux / Windows / macOS</td>
      <td>Windows / macOS</td>
    </tr>
    <tr>
      <td>Photoshopショートカット</td>
      <td>◎（標準互換）</td>
      <td>✕（要手動設定）</td>
      <td>△（一部互換）</td>
      <td>◎（原典）</td>
    </tr>
    <tr>
      <td>レイヤー</td>
      <td>◎（GIMP 3.0で強化）</td>
      <td>◎</td>
      <td>◎</td>
      <td>◎（調整レイヤー含む）</td>
    </tr>
    <tr>
      <td>非破壊編集</td>
      <td>△</td>
      <td>△</td>
      <td>○</td>
      <td>◎</td>
    </tr>
    <tr>
      <td>AI inpaint連携</td>
      <td>○（外部ツール経由）</td>
      <td>○（外部ツール経由）</td>
      <td>○（プラグインあり）</td>
      <td>◎（Generative Fill）</td>
    </tr>
    <tr>
      <td>PSDサポート</td>
      <td>○（読み書き可）</td>
      <td>○（読み書き可）</td>
      <td>○</td>
      <td>◎（原典）</td>
    </tr>
    <tr>
      <td>高ビット深度</td>
      <td>◎（32bit float）</td>
      <td>◎</td>
      <td>◎</td>
      <td>◎</td>
    </tr>
    <tr>
      <td>主用途</td>
      <td>AI後処理・ブログ画像</td>
      <td>汎用画像編集</td>
      <td>デジタルペイント</td>
      <td>商業デザイン・印刷</td>
    </tr>
    <tr>
      <td>GitHubスター</td>
      <td>8,825</td>
      <td>公式GNOMEプロジェクト</td>
      <td>公式KDEプロジェクト</td>
      <td>–</td>
    </tr>
  </tbody>
</table>

<h3 id="41-photogimpは素のgimpと比べて何が違うか">4.1 PhotoGIMPは素のGIMPと比べて何が違うか</h3>

<p>機能差は事実上ゼロだ。GIMPで <code class="language-plaintext highlighter-rouge">Edit → Keyboard Shortcuts</code> を開いて全部手動でPhotoshop風に直し、ツールバーをドラッグで並び替え、<code class="language-plaintext highlighter-rouge">Windows → Single-Window Mode</code> を有効にすれば、PhotoGIMPと同じ状態を再現できる。</p>

<p>ただしこの「手作業」が現実には数時間かかり、Photoshop経験者でも操作対応表を片手に1日仕事になる。<span class="marker-yellow">PhotoGIMPは「素のGIMPを20時間かけてPhotoshop風にカスタマイズした結果」を、zip展開1分で手に入れられるショートカット</span>だ。</p>

<h3 id="42-kritaとのすみ分け">4.2 Kritaとのすみ分け</h3>

<p>KritaはKDEプロジェクト由来の無料ペイントツールで、デジタルイラスト・コンセプトアートに向く。一方で写真レタッチ・印刷物・UI素材といった「Photoshop型」用途では、GIMP/PhotoGIMPのほうがツールと操作系が近い。</p>

<p>AI画像生成の後処理という観点では、生成物の用途で選ぶのが筋が良い。アニメ調・イラスト調ならKrita、写真調・実写合成系ならPhotoGIMPという棲み分けだ。</p>

<h3 id="43-photoshopとの本当の差">4.3 Photoshopとの「本当の差」</h3>

<p>Photoshopにあって、PhotoGIMP化されたGIMPで完全には埋まらない機能は次の4つだ。</p>

<ul>
  <li>・Camera Raw（HDR現像・ホワイトバランス調整の業界標準）</li>
  <li>・調整レイヤー＋スマートオブジェクトの完全な非破壊ワークフロー</li>
  <li>・Generative Fill（Adobe Fireflyによるinpaint）</li>
  <li>・CMYKネイティブな印刷向け色管理</li>
</ul>

<p>逆に言うと、これら4つを使わない用途ならPhotoGIMPで十分に代替できる。<span class="marker-pink">ブログ用画像・SNS用カット・AI画像レタッチ・サムネ作成・UI素材であれば、Adobeを解約しても困らない</span>。</p>

<hr />

<h2 id="5-3os共通インストールの全体像と注意点">5. 3OS共通：インストールの全体像と注意点</h2>

<p>PhotoGIMPは3OSとも「GIMP 3.0+を入れる → 1回起動して閉じる → PhotoGIMPを上書きコピー」の3ステップに集約できる。OSごとに違うのは設定ディレクトリの位置だけだ。</p>

<h3 id="51-最初のgimp起動が必須な理由">5.1 最初のGIMP起動が必須な理由</h3>

<p>GIMPは初回起動時に、ホームディレクトリ配下に設定ディレクトリを作成する。<code class="language-plaintext highlighter-rouge">shortcutsrc</code> などのファイルはこのタイミングで初めて生成される。</p>

<p>PhotoGIMPは「存在する設定ファイルを上書き」する設計のため、GIMPを一度も起動していない状態でPhotoGIMPを展開すると、後からGIMPが起動したときに自分の初期設定で上書きしてしまうことがある。<span class="marker-yellow">必ず順序を守る：GIMPインストール → 一度起動 → 完全終了 → PhotoGIMP展開</span>。</p>

<h3 id="52-バックアップは必須">5.2 バックアップは必須</h3>

<p>既存のGIMPを使い込んでいる場合、PhotoGIMP適用前に必ず設定ディレクトリをまるごとバックアップする。Linuxなら次のコマンドで済む。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cp</span> <span class="nt">-r</span> ~/.config/GIMP/3.0 ~/GIMP-3.0-backup-<span class="si">$(</span><span class="nb">date</span> +%Y%m%d<span class="si">)</span>
</code></pre></div></div>

<p>Windowsは <code class="language-plaintext highlighter-rouge">%APPDATA%\GIMP\3.0</code> を別フォルダにコピー、macOSは <code class="language-plaintext highlighter-rouge">~/Library/Application Support/GIMP/3.0</code> を同様にコピーする。気に入らなければバックアップを書き戻せば即時ロールバックできる。</p>

<h3 id="53-各osの設定ディレクトリ早見表">5.3 各OSの設定ディレクトリ早見表</h3>

<table>
  <thead>
    <tr>
      <th>OS</th>
      <th>設定ディレクトリのパス</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Linux（ネイティブ）</td>
      <td><code class="language-plaintext highlighter-rouge">~/.config/GIMP/3.0</code></td>
    </tr>
    <tr>
      <td>Linux（Flatpak）</td>
      <td><code class="language-plaintext highlighter-rouge">~/.config/GIMP/3.0</code>（同上）</td>
    </tr>
    <tr>
      <td>Windows</td>
      <td><code class="language-plaintext highlighter-rouge">%APPDATA%\GIMP\3.0</code></td>
    </tr>
    <tr>
      <td>macOS</td>
      <td><code class="language-plaintext highlighter-rouge">~/Library/Application Support/GIMP/3.0</code></td>
    </tr>
  </tbody>
</table>

<p>Linuxの隠しフォルダ（<code class="language-plaintext highlighter-rouge">.config</code> <code class="language-plaintext highlighter-rouge">.local</code>）はファイルマネージャ上で <code class="language-plaintext highlighter-rouge">Ctrl + H</code> を押さないと見えないので、操作前に表示設定を切り替えておく。</p>

<h3 id="54-linux-flatpak-での導入手順">5.4 Linux Flatpak での導入手順</h3>

<p>Flatpak版GIMPは多くのディストリビューションで標準的な配布形態だ。次の手順で導入できる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. GIMPがインストール済みであることを確認</span>
flatpak info org.gimp.GIMP

<span class="c"># 2. 一度起動して閉じる（設定ディレクトリ生成）</span>
flatpak run org.gimp.GIMP &amp;
<span class="nb">sleep </span>5
killall gimp

<span class="c"># 3. PhotoGIMP最新版をダウンロード</span>
wget https://github.com/Diolinux/PhotoGIMP/releases/download/3.0/PhotoGIMP-linux.zip

<span class="c"># 4. ホームディレクトリに展開（.config と .local が上書きされる）</span>
unzip <span class="nt">-o</span> PhotoGIMP-linux.zip <span class="nt">-d</span> ~/

<span class="c"># 5. 再起動</span>
flatpak run org.gimp.GIMP
</code></pre></div></div>

<p>ファイル展開時に「既存のファイルを置き換えますか」と聞かれたら「Replace」を選ぶ。<code class="language-plaintext highlighter-rouge">.config/GIMP/3.0/</code> と <code class="language-plaintext highlighter-rouge">.local/share/applications/</code> <code class="language-plaintext highlighter-rouge">.local/share/icons/</code> の3箇所が更新される。</p>

<h3 id="55-windowsでの導入手順">5.5 Windowsでの導入手順</h3>

<p>Windowsは Run ダイアログから <code class="language-plaintext highlighter-rouge">%APPDATA%\GIMP</code> を開いて、PhotoGIMP の <code class="language-plaintext highlighter-rouge">3.0</code> フォルダを上書きコピーする。Chocolatey 派なら1コマンドで済む。</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 公式GIMPを入れたあと、Chocolateyから1コマンドで適用</span><span class="w">
</span><span class="n">choco</span><span class="w"> </span><span class="nx">install</span><span class="w"> </span><span class="nx">gimp</span><span class="w"> </span><span class="nt">-y</span><span class="w">
</span><span class="n">gimp.exe</span><span class="w">   </span><span class="c"># 1回起動して閉じる</span><span class="w">
</span><span class="n">choco</span><span class="w"> </span><span class="nx">install</span><span class="w"> </span><span class="nx">photogimp</span><span class="w"> </span><span class="nt">-y</span><span class="w">
</span></code></pre></div></div>

<p>PowerShell の <code class="language-plaintext highlighter-rouge">choco install photogimp</code> はコミュニティ管理のパッケージで、内部では GitHub Releases の zip を取得して <code class="language-plaintext highlighter-rouge">%APPDATA%\GIMP\3.0</code> に展開する。手動派は GitHub Releases から <code class="language-plaintext highlighter-rouge">PhotoGIMP.zip</code> を落として <code class="language-plaintext highlighter-rouge">3.0</code> フォルダを <code class="language-plaintext highlighter-rouge">%APPDATA%\GIMP\</code> に上書きする。</p>

<h3 id="56-macosでの導入手順">5.6 macOSでの導入手順</h3>

<p>macOS は手動コピーが基本になる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 1. 公式GIMPをインストール（gimp.org または brew install --cask gimp）</span>
brew <span class="nb">install</span> <span class="nt">--cask</span> gimp

<span class="c"># 2. 一度起動して閉じる</span>
open <span class="nt">-a</span> GIMP
<span class="nb">sleep </span>5
osascript <span class="nt">-e</span> <span class="s1">'quit app "GIMP"'</span>

<span class="c"># 3. PhotoGIMPを取得して展開</span>
curl <span class="nt">-L</span> <span class="nt">-o</span> PhotoGIMP.zip <span class="se">\</span>
  https://github.com/Diolinux/PhotoGIMP/releases/download/3.0/PhotoGIMP.zip
unzip PhotoGIMP.zip <span class="nt">-d</span> ~/Downloads/photogimp

<span class="c"># 4. 設定ディレクトリに上書きコピー</span>
<span class="nb">cp</span> <span class="nt">-R</span> ~/Downloads/photogimp/3.0/<span class="k">*</span> <span class="se">\</span>
  ~/Library/Application<span class="se">\ </span>Support/GIMP/3.0/
</code></pre></div></div>

<p>GIMP 2.10 が残っていると <code class="language-plaintext highlighter-rouge">~/Library/Application Support/GIMP/2.10</code> フォルダが衝突することがある。PhotoGIMP 3.0系を入れる際は古い <code class="language-plaintext highlighter-rouge">2.10</code> フォルダを退避させると安全だ。</p>

<div class="box-warning"><strong>導入後にショートカットが効かない場合</strong><br />
パッチを当てたのにショートカットが Photoshop 風になっていないときは、ほぼ確実に展開場所のミスだ。Linuxなら<code>.config</code>と<code>.local</code>がホーム直下に置かれているか、Windowsなら<code>3.0</code>フォルダが<code>%APPDATA%\GIMP</code>の直下にあるか、macOSなら<code>~/Library/Application Support/GIMP</code>配下にあるかを確認する。「<code>3.0</code>フォルダの中身ではなく<code>3.0</code>フォルダごと」配置するのが正解だ。
</div>

<hr />

<h2 id="6-ai画像生成photogimp後処理の実践フロー">6. AI画像生成→PhotoGIMP後処理の実践フロー</h2>

<p>ここからは「実際の後処理の流れ」を1本のワークフローとして整理する。AI画像生成は Stable Diffusion WebUI / ComfyUI / Midjourney / DALL-E 3 のいずれでも考え方は変わらない。</p>

<h3 id="61-全体ワークフロー">6.1 全体ワークフロー</h3>

<p>典型的な仕上げまでの流れは次のとおりだ。</p>

<ul>
  <li>・<strong>Step 1</strong>：生成AIで複数バリエーション（4〜8枚）を作る</li>
  <li>・<strong>Step 2</strong>：合格ラインに近い1枚をPNG/WebPで書き出す</li>
  <li>・<strong>Step 3</strong>：PhotoGIMPで開いて構図・解像度をチェック</li>
  <li>・<strong>Step 4</strong>：破綻箇所をスタンプ・ヒーリングブラシで修正</li>
  <li>・<strong>Step 5</strong>：必要ならアップスケール（外部AIツールまたはGIMPプラグイン）</li>
  <li>・<strong>Step 6</strong>：色温度・コントラスト・シャープを最終調整</li>
  <li>・<strong>Step 7</strong>：用途に応じてWebP / PNG / JPEGで書き出し</li>
</ul>

<p>GIMPに慣れていれば1枚あたり5〜15分で仕上がる。Photoshopから移ってきても、PhotoGIMPのおかげで基本ショートカット（<code class="language-plaintext highlighter-rouge">V</code>移動・<code class="language-plaintext highlighter-rouge">B</code>ブラシ・<code class="language-plaintext highlighter-rouge">S</code>スタンプ・<code class="language-plaintext highlighter-rouge">L</code>投げ縄選択・<code class="language-plaintext highlighter-rouge">Ctrl+T</code>変形）がそのまま使える。</p>

<h3 id="62-指が6本問題の典型対処">6.2 指が6本問題の典型対処</h3>

<p>Stable Diffusion 系のモデルが今も時々起こす「指が6本」「指が7本」問題は、PhotoGIMPでの対処が最も効率的だ。</p>

<ul>
  <li>・余分な指を選択ツール（<code class="language-plaintext highlighter-rouge">L</code>の自由選択またはパス）で囲む</li>
  <li>・スタンプツール（<code class="language-plaintext highlighter-rouge">S</code>）で隣接する皮膚をサンプリングして塗り潰す</li>
  <li>・境界をぼかしブラシ（<code class="language-plaintext highlighter-rouge">Shift+U</code>）で馴染ませる</li>
  <li>・全体に若干のノイズを乗せて違和感を消す</li>
</ul>

<p>「もう一度ガチャを引いて指が4本のバージョンを引き当てる」より圧倒的に短時間で済む。AI 生成の不確実性は、人間の手で確実に潰す方が現実的だ。</p>

<h3 id="63-マスクを作ってcomfyuiに戻すinpaintフロー">6.3 マスクを作ってComfyUIに戻すinpaintフロー</h3>

<p>複雑な破綻部分は、GIMP側でマスクを作って ComfyUI / AUTOMATIC1111 に inpaint として戻す方が綺麗な結果になる。</p>

<ul>
  <li>・PhotoGIMPで対象画像を開く</li>
  <li>・新しい透明レイヤーを作成</li>
  <li>・修正したい部分を白で塗りつぶす（その他は透明のまま）</li>
  <li>・「レイヤーを画像として書き出し」でPNG出力（マスク画像）</li>
  <li>・ComfyUIの inpaint ノードに「元画像」と「マスク画像」を投入</li>
  <li>・生成結果をPhotoGIMPで開いて、必要なら微調整</li>
</ul>

<p>このループは1セット5〜10秒程度で回せる。生成AIで「9割が完成、1割の破綻だけ直す」運用は、PhotoGIMPのマスク作成効率に大きく依存している。</p>

<h3 id="64-色温度とコントラストの最終調整">6.4 色温度とコントラストの最終調整</h3>

<p>AI生成画像は、デフォルトでコントラストが強すぎたり、色温度が偏っていることが多い。Photoshopで使う <code class="language-plaintext highlighter-rouge">Image → Adjustments → Curves</code> <code class="language-plaintext highlighter-rouge">Levels</code> <code class="language-plaintext highlighter-rouge">Hue/Saturation</code> は、GIMPでも <code class="language-plaintext highlighter-rouge">Colors</code> メニュー配下に同じ機能で揃っている。</p>

<p>PhotoGIMP化されていれば、ショートカット <code class="language-plaintext highlighter-rouge">Ctrl+M</code>（Curves）・<code class="language-plaintext highlighter-rouge">Ctrl+L</code>（Levels）・<code class="language-plaintext highlighter-rouge">Ctrl+U</code>（Hue/Saturation）が Photoshop と同じキーで動く。レタッチャーが Photoshop で蓄積した「指の運動記憶」がそのまま転用できる。</p>

<hr />

<h2 id="7-comfyuiワークフローとの統合自動エクスポートと連携">7. ComfyUIワークフローとの統合：自動エクスポートと連携</h2>

<p>PhotoGIMPを単体で使うだけでなく、ComfyUIワークフローと自動連携させると更に効率化できる。</p>

<h3 id="71-comfyuiから直接開くフォルダの設計">7.1 ComfyUIから「直接開く」フォルダの設計</h3>

<p>ComfyUIの出力ディレクトリ（デフォルトは <code class="language-plaintext highlighter-rouge">output/</code>）を、デスクトップから常にウォッチしておくのが手軽だ。Linuxなら <code class="language-plaintext highlighter-rouge">nautilus</code> でブックマーク、macOSなら Finder のサイドバーにピン留め、Windowsなら エクスプローラーのクイックアクセスに登録する。</p>

<p>新しい画像が生成されたら、ファイルマネージャ上でダブルクリックすれば既定のアプリ（PhotoGIMP化されたGIMP）で開く。AI推論→レタッチ→保存のサイクルが10秒以内に始められる状態を作るのが、効率化の急所だ。</p>

<h3 id="72-ファイル名規則で履歴を残す">7.2 ファイル名規則で履歴を残す</h3>

<p>ComfyUI / AUTOMATIC1111 では、出力ファイル名にプロンプトハッシュ・seed・モデル名を埋め込めるテンプレート機能がある。これを活用して、PhotoGIMP側で開いたときに「どのプロンプト・どのseedから来たか」が分かる状態にしておく。</p>

<p>例えば <code class="language-plaintext highlighter-rouge">20260517_142312_seed3892_juggernautXL_portrait.png</code> のようなファイル名であれば、レタッチ済みも <code class="language-plaintext highlighter-rouge">_retouched.png</code> などサフィックスで区別すれば、生成元との対応が崩れない。</p>

<h3 id="73-gimp-python-fu-による一括処理">7.3 GIMP Python-Fu による一括処理</h3>

<p>GIMPには Python-Fu スクリプティング機能があり、複数画像の一括処理を書ける。AI生成画像のバッチ後処理として、よく使う処理は次のようなものだ。</p>

<ul>
  <li>・指定フォルダ配下の全画像にシャープフィルタを適用</li>
  <li>・色温度を一律で4500K→6000Kに補正</li>
  <li>・元画像とレタッチ後を横並びの比較画像として書き出し</li>
  <li>・WebP変換とサムネ生成</li>
</ul>

<p>GIMPの <code class="language-plaintext highlighter-rouge">Filters → Python-Fu → Console</code> から対話的に試せる。スクリプト本体は <code class="language-plaintext highlighter-rouge">~/.config/GIMP/3.0/plug-ins/</code> に置けば次回起動時から「フィルタ」メニューに現れる。PhotoGIMPはここには手を入れないので、自作スクリプトと干渉しない。</p>

<hr />

<h2 id="8-ライセンスコスト組織導入の現実">8. ライセンス・コスト・組織導入の現実</h2>

<p>無料で使える点が魅力だが、業務で導入するなら法的・組織的な観点も押さえておきたい。</p>

<h3 id="81-gpl-30の意味">8.1 GPL-3.0の意味</h3>

<p>PhotoGIMPはGNU General Public License v3.0で配布される。GIMP本体も同じくGPL-3.0だ。GPL は「成果物を改変・再配布する場合に、同じGPLで公開する義務」が発生する copyleft 系ライセンスだが、<span class="marker-yellow">ユーザーが社内で利用するだけ・成果物（画像）を商用利用するだけなら、再配布義務は発生しない</span>。</p>

<p>GIMP/PhotoGIMPで作った画像を販売・配布する行為に制限はかからない。「GPLは作ったソフトの著作権だけに作用し、そのソフトで作った成果物には作用しない」のがGPLの基本的な解釈だ。</p>

<h3 id="82-adobeサブスクと比べたコスト試算">8.2 Adobeサブスクと比べたコスト試算</h3>

<p>Adobe Photoshop の単体サブスクは月額3,280円（2026年5月時点のフォトプラン）。これを5人の小規模制作チームで12ヶ月使うと、年間 約196,800円のランニングコストになる。</p>

<p>PhotoGIMPに置き換えると、追加コストはゼロだ。レタッチ品質が完全に同等とは言えないが、「AI画像生成の後処理＋ブログ・SNS用画像」がメイン用途であれば、置き換え可能なケースが大半だ。</p>

<h3 id="83-移行のリアル教育コストの実態">8.3 移行のリアル：教育コストの実態</h3>

<p>「無料だから即移行できる」と判断するのは早計だ。Photoshop のヘビーユーザーは年単位で蓄積された操作系を持っており、PhotoGIMP化されたGIMPでも「Photoshopそのもの」ではない以上、ある程度の学習期間は必要になる。</p>

<p>実務上の目安として、Photoshop経験5年以上のレタッチャーがPhotoGIMPで業務効率を取り戻すには2〜4週間の慣らし期間が必要だ。ホビーユーザーや「たまにブログ画像を加工する」レベルなら数日で適応できる。</p>

<div class="box-tip"><strong>ハイブリッド運用が現実解</strong><br />
「全社員のPhotoshopを解約してPhotoGIMPに置き換える」より、「商用印刷物を扱う1〜2人だけはPhotoshopを残し、AI画像レタッチ・社内資料・ブログ画像はPhotoGIMPに寄せる」というハイブリッド運用のほうが、痛みが少なく節約効果も大きい。Adobe解約は不可逆ではないので、半年試して合わなければ戻せばいい。
</div>

<hr />

<h2 id="9-photogimpと組み合わせると効くツール群">9. PhotoGIMPと組み合わせると効くツール群</h2>

<p>PhotoGIMP単体でも完結はするが、周辺ツールと組み合わせると AI 画像ワークフローが本格的に強化される。</p>

<h3 id="91-アップスケーリングreal-esrgan--upscayl">9.1 アップスケーリング：Real-ESRGAN / Upscayl</h3>

<p>PhotoGIMPには高品質なAIアップスケール機能は内蔵されていない。1024x1024で生成した画像を4Kポスターに引き伸ばすような用途では、外部のAIアップスケーラーが必要だ。</p>

<p>OSSの選択肢としては Real-ESRGAN（コマンドラインまたは Web UI 経由）と Upscayl（GUIアプリ）が代表的だ。Real-ESRGANで4倍アップスケール → PhotoGIMPで最終調整、というパイプラインが一般的だ。</p>

<h3 id="92-透過処理rembg--backgroundremover">9.2 透過処理：rembg / BackgroundRemover</h3>

<p>AI画像生成は背景込みで出力されることが多いが、SNSアイコンやサムネに使うときは背景透過が必要になる。OSSの <code class="language-plaintext highlighter-rouge">rembg</code> は単一バイナリで動き、PNG入力・PNG出力で背景だけを除去する。</p>

<p><code class="language-plaintext highlighter-rouge">rembg i input.png output.png</code> の1コマンドで透過PNGが手に入る。あとはPhotoGIMPで境界線の微調整をすれば仕上がる。</p>

<h3 id="93-メタデータ管理exiftool">9.3 メタデータ管理：ExifTool</h3>

<p>AI生成画像にはプロンプト・seed・モデル名がメタデータとして埋まっていることがある。納品時に剥がす必要があるなら <code class="language-plaintext highlighter-rouge">exiftool -all= image.png</code> で全削除できる。</p>

<p>逆に、生成履歴を保持しておきたい用途では <code class="language-plaintext highlighter-rouge">exiftool image.png</code> でメタデータを確認すれば、後から「どのプロンプトで作った画像か」を遡れる。</p>

<h3 id="94-gmicgimpの最強プラグイン">9.4 G’MIC：GIMPの最強プラグイン</h3>

<p><code class="language-plaintext highlighter-rouge">G'MIC</code> は数百種類の画像処理フィルタを提供するGIMP用プラグインで、PhotoGIMPとも完全に共存できる。AI画像のスタイル変換、HDRトーンマッピング、コミック調変換といった処理が GUI から1クリックで適用できる。</p>

<p><code class="language-plaintext highlighter-rouge">apt install gmic gimp-gmic</code> または公式サイトからインストーラを入れれば、GIMPのフィルタメニューに G’MIC が現れる。<span class="marker-pink">PhotoGIMP＋G’MICの組み合わせは、Photoshop＋プラグイン群と同等の表現力を持つ</span>。</p>

<hr />

<h2 id="10-まとめai時代のレタッチ基盤としてのphotogimp">10. まとめ：AI時代のレタッチ基盤としてのPhotoGIMP</h2>

<p>PhotoGIMPは「GIMPをPhotoshop風UIに切り替える設定パッチ」というシンプルな発明だが、その意味は2026年現在のAI画像生成時代に大きく増している。</p>

<div class="conclusion-box"><strong>導入判断の指針</strong><ul><li>・<strong>AI画像生成の後処理を内製したい</strong>：PhotoGIMPは第一選択肢。<code>Stable Diffusion</code>・<code>DALL-E</code>と組み合わせて月額ゼロでフルワークフロー。</li><li>・<strong>Adobeサブスクの代替を探している</strong>：ホビー用途・ブログ用画像・SNS素材なら置き換え可能。商用印刷物・Camera Rawワークフローは引き続きPhotoshop推奨。</li><li>・<strong>Photoshopから乗り換える教育コストを下げたい</strong>：素のGIMPで20時間かかるカスタマイズを、zip展開1分でショートカットできる。</li><li>・<strong>OSS縛りで業務環境を構築する</strong>：GPL-3.0なので商用利用も問題なし。GIMP本体と同じライセンス。</li><li>・<strong>イラスト・コンセプトアート寄り</strong>：PhotoGIMPよりKritaのほうが適性が高い。</li></ul></div>

<p>設定パッチという軽い実装にもかかわらず、PhotoGIMPはGitHub 8,800スター超を集め、5年以上アクティブにメンテナンスされている。これは「GIMPはあと一歩でPhotoshop代替になれるのに、操作系の違いだけが壁になっていた」という需要に、過不足なく応えてきた証拠だ。</p>

<p>導入の第一歩は、現在使っているOSにGIMP 3.0+を入れて、PhotoGIMPを上書きコピーすることだ。所要時間は10分。気に入らなければ設定ディレクトリを削除すれば即時ロールバックできる。<span class="marker-yellow">AI画像生成を仕事に組み込んでいるなら、レタッチ環境のコストをゼロに近づける一手として確実に元が取れる</span>。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/Diolinux/PhotoGIMP">Diolinux/PhotoGIMP — GitHub公式リポジトリ</a>：パッチ本体、リリース、3OS別インストール手順、FAQの一次情報</li>
  <li><a href="https://www.gimp.org/downloads/">GIMP公式ダウンロード — gimp.org</a>：GIMP 3.0+の公式配布元。PhotoGIMP適用前に必須</li>
  <li><a href="https://helpx.adobe.com/photoshop/using/default-keyboard-shortcuts.html">Adobe公式 Photoshop デフォルトキーボードショートカット</a>：PhotoGIMPのショートカット定義の原典</li>
  <li><a href="https://github.com/Diolinux/PhotoGIMP/releases">PhotoGIMP Releases — GitHub</a>：最新版zipの配布。Linux / Windows / macOSごとに分かれている</li>
</ul>

<!--
Distribution Notes:
- X hook候補: 「Adobe Photoshopの月額3,280円を払い続けるか、GIMP+PhotoGIMPで月0円にするか — 2026年のAI画像レタッチはこの選択肢がある」
- はてブ訴求: 「Stable DiffusionとPhotoGIMPでAdobeを解約した話」系の体験談角度
- 内部リンク提案: AI画像生成系の記事が増えたらクロスリンク化
-->]]></content><author><name></name></author><category term="tool" /><category term="tool" /><category term="ai" /><category term="image-generation" /><category term="gimp" /><category term="photoshop-alternative" /><category term="oss" /><category term="stable-diffusion" /><summary type="html"><![CDATA[PhotoGIMPはGIMP 3.0+をPhotoshop風UIに切り替える無料の公式コミュニティパッチ。GitHub 8,800スター超で、Stable Diffusion・DALL-E・Midjourneyで生成した画像の後処理ワークフローや、Adobeサブスクから降りたいユーザーのOSS代替として有力。導入手順・比較・AI画像後処理まで実装目線で解説する。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/cover_photogimp-photoshop-alternative-ai-image-postprocessing.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/cover_photogimp-photoshop-alternative-ai-image-postprocessing.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Codebuff徹底解説｜Claude Codeを61% vs 53%で上回る4エージェント型OSS</title><link href="https://ai-heartland.com/tool/codebuff-ai-coding-agent/" rel="alternate" type="text/html" title="Codebuff徹底解説｜Claude Codeを61% vs 53%で上回る4エージェント型OSS" /><published>2026-05-16T17:30:00+09:00</published><updated>2026-05-16T17:30:00+09:00</updated><id>https://ai-heartland.com/tool/codebuff-ai-coding-agent</id><content type="html" xml:base="https://ai-heartland.com/tool/codebuff-ai-coding-agent/"><![CDATA[<p>この記事ではAIコーディングエージェント単体を扱います。Vibe Coding全体の考え方と他ツール比較は <a href="/explain/vibe-coding-guide-2026/">Vibe Codingとは？2026年完全ガイド</a> をご覧ください。</p>

<h2 id="01-codebuffとはclaude-code超えを謳う4エージェント型ossコーディングエージェント">01 CodebuffとはClaude Code超えを謳う4エージェント型OSSコーディングエージェント</h2>

<p><a href="https://github.com/CodebuffAI/codebuff">CodebuffAI/codebuff</a> は、ターミナル上で動くAIコーディングエージェントだ。自然言語の指示でローカルのコードベースを直接編集する。2026年5月時点で<span class="marker-yellow"><strong>スター5.3k・フォーク605・Apache-2.0</strong></span>。</p>

<p>特徴は単一モデルに丸投げしないことだ。Codebuffは役割を持つ4つのエージェントを順に呼び、ファイル選定・計画・編集・レビューを分業させる。これによりClaude Codeなど単一モデル系の弱点を補う。</p>

<p>公式リポジトリは独自評価で<span class="marker-green"><strong>「Codebuff 61% vs Claude Code 53%」</strong></span>と主張する。175件超の実コードベース課題でClaude Codeを上回ったというのが触れ込みだ。後述するが数値の中身は読みかたに注意がいる。</p>

<p>導入は3パターン。サブスクリプション版CLIの<code class="language-plaintext highlighter-rouge">codebuff</code>、SDK版の<code class="language-plaintext highlighter-rouge">@codebuff/sdk</code>、そして広告モデルの<code class="language-plaintext highlighter-rouge">freebuff</code>が同じリポジトリで配布されている。Freebuffは無料・広告付きで「サブスクなし・クレジットなし・設定なし」を売りにする。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># サブスク版CLIの導入</span>
npm <span class="nb">install</span> <span class="nt">-g</span> codebuff

<span class="c"># 広告付きの無料版</span>
npm <span class="nb">install</span> <span class="nt">-g</span> freebuff

<span class="c"># プログラムから呼ぶSDK</span>
npm <span class="nb">install</span> @codebuff/sdk
</code></pre></div></div>

<p>モデル選択の自由度も大きな差別化ポイントだ。Codebuffは<span class="marker-pink"><strong>OpenRouter経由で任意モデルを利用可能</strong></span>と公式に明記している。Claude・GPT・Qwen・DeepSeekなどを混在させ、エージェントごとに違うモデルを割り当てる構成が取れる。</p>

<p>Claude Code・Cursor・Windsurfは基本的にプラットフォーム側がモデルを選定する。利用者は推奨セットの中から選ぶことになり、自由度は限られる。Codebuffは逆方向で「エージェントごとに適切なモデルを利用者が組み合わせる」設計を取る。</p>

<p>たとえばPlannerは思考能力が要るのでClaude Opus 4.7、Editorは大量に呼ぶのでQwen-CoderやGPT-5-nano、Reviewerは確認に強いGemini系といった<span class="marker-yellow"><strong>ハイブリッド構成</strong></span>が可能だ。コストと精度のトレードオフを細かく制御できる。</p>

<p>OSSという点も実務では効く。Apache-2.0なので社内フォークや業務向け改造がライセンス上クリアだ。Cursorのようなプロプライエタリ製品では難しい、エージェント定義の社内標準化や監査ログの組込みが現実的になる。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>Codebuffは4エージェント分業で動くOSSのAIコーディングエージェント。Apache-2.0でスター5.3k。</li>
<li>独自評価ではClaude Codeを61% vs 53%で上回ると公式が主張する。</li>
<li>OpenRouter対応でエージェントごとに違うモデルを割り当て可能。コストと精度を細かく制御できる。</li>
<li>サブスク版CLI・SDK・広告版Freebuffの3形態で配布され、Apache-2.0で社内改造もしやすい。</li>
</ul>
</div>

<h2 id="02-codebuffの4エージェント構成--file-pickerplannereditorreviewerの役割分担">02 Codebuffの4エージェント構成 — File Picker・Planner・Editor・Reviewerの役割分担</h2>

<p>Codebuffの中核は4つの専門エージェントだ。単一のLLMコンテキストにすべてを詰める設計ではない。エージェントごとに役割・モデル・ツールを分けることで、文脈圧縮とハルシネーションを抑える狙いがある。</p>

<div class="box-tip">
<strong>4エージェントの役割</strong>
<ul>
<li>File Picker Agent：プロジェクト全体の構造を把握し、タスクに関係しそうなファイル候補を絞る。</li>
<li>Planner Agent：変更すべきファイルと、編集の順序・粒度を決める。差分の設計図を作る役割。</li>
<li>Editor Agent：Plannerが指示した粒度で、ファイルごとに具体的な差分を書く。</li>
<li>Reviewer Agent：書かれた差分が要求を満たすかを検証し、不足があればやり直しを促す。</li>
</ul>
</div>

<p>この分業構成は<span class="marker-yellow"><strong>「広いコンテキスト探索」と「狭く正確な差分生成」を分離する</strong></span>狙いだ。File Pickerにはコードベース全体を見せるが編集はさせない。Editorには関連ファイルだけ渡し、無関係な情報を排除する。</p>

<p>Claude CodeやAiderはハーネス内部でほぼ単一モデルが全工程を担当する。CodebuffはClaude Codeでいう「サブエージェント」を初期設計に組み込み、デフォルトの実行フローに据えた形と言える。</p>

<div class="mermaid">
graph LR
  USER["ユーザー指示<br />自然言語"] --&gt; FP["File Picker<br />関連ファイル抽出"]
  FP --&gt; PL["Planner<br />編集計画"]
  PL --&gt; ED["Editor<br />差分生成"]
  ED --&gt; RV["Reviewer<br />検証"]
  RV --&gt;|OK| OUT["コミット候補"]
  RV --&gt;|NG| PL
</div>

<p>トレードオフもある。エージェント間で会話が往復するため、単純なタスクではトークン消費とレイテンシが膨らむ。短いリファクタや1ファイル修正なら、Claude CodeやAider相当の単発エージェントの方が速い場面が多い。</p>

<p>逆に効くのは複数ファイルにまたがる仕様変更だ。「Webhookの認証方式をHMACからJWTに切り替える」のような横断タスクでは、File Picker→Plannerの段階で漏れを減らせる。Editorが本筋のロジック書き換えに集中できる。</p>

<p>各エージェント間の情報受け渡しはCodebuff内部で構造化される。File Pickerは関連ファイル一覧と理由メモを生成し、Plannerに渡す。Plannerはこれを元にファイル単位の編集計画を組み、各計画ノードをEditorに割り当てる。</p>

<p>Reviewerが特徴的だ。生成済みの差分と元の指示を見比べ、要件未充足を検出すると<span class="marker-pink"><strong>Plannerに差し戻す</strong></span>。ループ回数の上限はCodebuff側で制御されているため、暴走による無限呼び出しはハーネス段で止まる仕組みだ。</p>

<p>この構成はClaude Codeでサブエージェントを手動で組むのと役割が近い。違いは「分業を強制する」点にある。Claude Codeはサブエージェント不使用も選べるため、利用者の設計依存が大きい。Codebuffは設計判断を固定する。</p>

<p>固定設計の利点は「失敗パターンが揃う」ことだ。同じプロジェクトで複数の開発者がCodebuffを使っても、ログの形状とエラーのパターンが揃いやすい。チームでハーネスを共有する際に運用しやすい。</p>

<p>ハーネスとしての成熟度はもう一つの観点だ。Claude Code・Cursor・Aiderは長期にわたるユーザーフィードバックで細部が整っている。Codebuffは2026年時点で新興プロダクトの域を出ておらず、エッジケースの安定性は今後の改善余地がある。</p>

<p>特にWindows環境やWSL2環境での挙動、巨大モノレポでのファイルピッカー精度、検索でPATHが膨大になるケースなど、現場で頻発するシナリオでの安定性は要検証だ。導入前のPoCではこの種のケースを意識的に含めたい。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>File Picker・Planner・Editor・Reviewerの4エージェントが順番に走るのがCodebuffの基本フロー。</li>
<li>探索と差分生成のコンテキストを分離し、ハルシネーションを抑える狙いがある。</li>
<li>横断的な仕様変更に強く、単発リファクタではClaude Codeの方が速い場合もある。</li>
</ul>
</div>

<h2 id="03-codebuff-61-vs-claude-code-53-の中身--aiコーディング評価の読み方">03 Codebuff 61% vs Claude Code 53% の中身 — AIコーディング評価の読み方</h2>

<p>公式リポジトリのトップに掲げられている数字が、175件超のタスクで<span class="marker-green"><strong>Codebuff 61% / Claude Code 53%</strong></span>という比較だ。出典はリポジトリ内の<code class="language-plaintext highlighter-rouge">evals/README.md</code>である。</p>

<p>評価方法を要約すると次のとおりだ。実在するOSSリポジトリを複数用意し、それぞれに「現実的なコーディングタスク」を割り当てる。各タスクをエージェントに解かせ、テスト合格率や指示充足度をスコアにする。</p>

<p>読みかたで注意したいのは3点ある。第一に評価基盤は<span class="marker-yellow"><strong>Codebuff自身が設計・運用している</strong></span>こと。第三者ベンチマーク（SWE-bench Verifiedなど）ではない。</p>

<p>第二に175件超という規模は中程度だ。SWE-bench Verifiedは500件、SWE-bench Liteは300件で、より広範な分布をカバーする。Codebuffの評価は自社環境の傾向に最適化される余地がある。</p>

<p>第三にClaude Code側の構成だ。エージェント設定・ツール許可・モデル選択でClaude Codeの性能は大きく動く。比較条件の差異が結果に与える影響は公式README単独では追いきれない。</p>

<p>そのうえで、エージェント分業という設計上の方向性が一定の効きを示した点は意味がある。Vibe Codingの世界でも<span class="marker-pink"><strong>「Plan→Edit→Review分離が単発実行より精度を出しやすい」</strong></span>という観測は他研究と一致する。</p>

<div class="box-quote">
<strong>同種の知見</strong>
<ul>
<li>Anthropicの「Claude Sonnet computer use」発表でも、計画と実行の分離がエラー率を下げると報告されている。</li>
<li>Cognition AIのDevin論文も、Planner-Worker分離型エージェントがSWE-bench Liteで効くと示している。</li>
<li>Codebuffの4分業はこれらの流れに沿った設計で、独自性は分業の固定化と推奨モデル指定にある。</li>
</ul>
</div>

<p>数値そのものを過信せず、「4分業の方向性が悪くない」という設計判断の裏付けとして読むのが妥当だ。AIコーディングのベンチマークは構成バイアスが強く、現場での体感はリポジトリの規模・言語・テスト網羅性に大きく依存する。</p>

<p>参考として、2026年5月時点で主要な第三者ベンチマークの傾向を並べる。SWE-bench VerifiedはClaude Opus 4.7・GPT-5世代の上位モデルが70%台に乗り、Aiderのpolyglotベンチマークでも上位モデルは60%超を維持している。</p>

<p>つまり「単独モデルのコーディング能力」自体が、過去2年で大幅に底上げされた。エージェント分業の効きは、モデル単体の差を逆転させるほどの大きさではなく、<span class="marker-yellow"><strong>「同等モデルなら設計差で数%動く」</strong></span>レベルだと見るのが妥当だ。</p>

<p>CodebuffがClaude Codeを上回ったとする内訳も、タスクカテゴリ別に見ると差が出る場面が偏る。多ファイル横断・テスト追加・既存仕様の置き換えで差が大きく、単発バグ修正やドキュメント編集では差が縮む傾向がある。</p>

<p>現場での導入判断としては、「自社の典型タスクを5〜10件用意し、Codebuff・Claude Code・Cursorで同条件で走らせて比較する」のが最も精度の高いやり方だ。公式評価は参考程度に留め、自社環境での再評価を必ず挟みたい。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>61% vs 53%はCodebuff自社評価で、第三者ベンチマークではない点に注意。</li>
<li>175件超の規模はSWE-bench系より小さく、自社環境への最適化余地がある。</li>
<li>数値そのものより「Plan-Edit-Review分離の効き」を示す設計指標として読む価値がある。</li>
</ul>
</div>

<h2 id="04-codebuff-sdkカスタムエージェント--typescriptでgit-committerを書く">04 Codebuff SDK・カスタムエージェント — TypeScriptで「git-committer」を書く</h2>

<p>Codebuffはエージェント定義をTypeScriptで書ける。プロジェクト直下に<code class="language-plaintext highlighter-rouge">/init</code>を打つと、エージェント雛形と知識ドキュメント、<code class="language-plaintext highlighter-rouge">AgentDefinition</code>型定義がスキャフォールドされる。</p>

<p>公式READMEに掲載されている<code class="language-plaintext highlighter-rouge">git-committer</code>エージェントの定義は次のとおりだ。<code class="language-plaintext highlighter-rouge">handleSteps</code>ジェネレータでツール呼び出しの順序を直接記述している。</p>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 公式READMEからの抜粋</span>
<span class="k">export</span> <span class="k">default</span> <span class="p">{</span>
  <span class="na">id</span><span class="p">:</span> <span class="dl">'</span><span class="s1">git-committer</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">displayName</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Git Committer</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">model</span><span class="p">:</span> <span class="dl">'</span><span class="s1">openai/gpt-5-nano</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">toolNames</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">read_files</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">run_terminal_command</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">end_turn</span><span class="dl">'</span><span class="p">],</span>
  <span class="na">instructionsPrompt</span><span class="p">:</span>
    <span class="dl">'</span><span class="s1">You create meaningful git commits by analyzing changes...</span><span class="dl">'</span><span class="p">,</span>
  <span class="k">async</span> <span class="o">*</span><span class="nf">handleSteps</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">yield</span> <span class="p">{</span> <span class="na">tool</span><span class="p">:</span> <span class="dl">'</span><span class="s1">run_terminal_command</span><span class="dl">'</span><span class="p">,</span> <span class="na">command</span><span class="p">:</span> <span class="dl">'</span><span class="s1">git diff</span><span class="dl">'</span> <span class="p">}</span>
    <span class="k">yield</span> <span class="p">{</span> <span class="na">tool</span><span class="p">:</span> <span class="dl">'</span><span class="s1">run_terminal_command</span><span class="dl">'</span><span class="p">,</span> <span class="na">command</span><span class="p">:</span> <span class="dl">'</span><span class="s1">git log --oneline -5</span><span class="dl">'</span> <span class="p">}</span>
    <span class="k">yield</span> <span class="dl">'</span><span class="s1">STEP_ALL</span><span class="dl">'</span>
  <span class="p">},</span>
<span class="p">}</span>
</code></pre></div></div>

<p>ポイントは2つ。ひとつはモデル文字列が<code class="language-plaintext highlighter-rouge">openai/gpt-5-nano</code>のように<span class="marker-yellow"><strong>OpenRouter形式</strong></span>で書かれている点。プロバイダ名/モデル名の組合せで何でも指定できる。</p>

<p>もうひとつは<code class="language-plaintext highlighter-rouge">handleSteps</code>の存在だ。LLMにツール選択を全任せせず、開発者が「最初は必ず<code class="language-plaintext highlighter-rouge">git diff</code>」と決め打ちできる。Claude Code Skillsの<code class="language-plaintext highlighter-rouge">SKILL.md</code>同様、決定論的なステップと自由度の高いステップを混在させられる。</p>

<p>SDK側のコードも素直だ。<code class="language-plaintext highlighter-rouge">CodebuffClient</code>を生成し、<code class="language-plaintext highlighter-rouge">run</code>に対象エージェントとプロンプトを渡すだけで動く。CI環境やバッチ処理から呼ぶことを意識した形になっている。</p>

<div class="language-typescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">CodebuffClient</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@codebuff/sdk</span><span class="dl">'</span>

<span class="kd">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">CodebuffClient</span><span class="p">({</span>
  <span class="na">apiKey</span><span class="p">:</span> <span class="dl">'</span><span class="s1">your-api-key</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">cwd</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/path/to/your/project</span><span class="dl">'</span><span class="p">,</span>
<span class="p">})</span>

<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nf">run</span><span class="p">({</span>
  <span class="na">agent</span><span class="p">:</span> <span class="dl">'</span><span class="s1">base</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">prompt</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Add error handling to all API endpoints</span><span class="dl">'</span><span class="p">,</span>
<span class="p">})</span>
</code></pre></div></div>

<p>このSDKの存在は<span class="marker-green"><strong>「自社プロダクトにCodebuffを組み込みたい」</strong></span>用途に効く。レビューAI、社内コード自動生成、Slackボット連携などが想定される。Claude CodeのAgent SDKと役割が近い。</p>

<p>注意したいのはAPIキーの取り扱いと従量課金だ。<code class="language-plaintext highlighter-rouge">@codebuff/sdk</code>経由でもOpenRouter越しにモデルを呼ぶ場合、利用料はCodebuffプラットフォーム側の課金設計に従う。料金体系はリポジトリでは細部までは公表されていない。</p>

<p><code class="language-plaintext highlighter-rouge">/init</code>で生成されるディレクトリ構造も押さえておきたい。プロジェクト直下に<code class="language-plaintext highlighter-rouge">.codebuff/</code>が作られ、エージェント定義のTypeScriptファイル、知識ドキュメント、<code class="language-plaintext highlighter-rouge">AgentDefinition</code>の型定義が配置される。Claude Codeの<code class="language-plaintext highlighter-rouge">.claude/</code>に近い役割だ。</p>

<p>エージェント定義のメタフィールドはシンプルだ。<code class="language-plaintext highlighter-rouge">id</code>がエージェント識別子、<code class="language-plaintext highlighter-rouge">displayName</code>がCLI表示名、<code class="language-plaintext highlighter-rouge">model</code>がOpenRouter形式の文字列、<code class="language-plaintext highlighter-rouge">toolNames</code>が使用可能ツール一覧、<code class="language-plaintext highlighter-rouge">instructionsPrompt</code>が指示テンプレートになる。</p>

<p>ツールの種類は<code class="language-plaintext highlighter-rouge">read_files</code>・<code class="language-plaintext highlighter-rouge">run_terminal_command</code>・<code class="language-plaintext highlighter-rouge">end_turn</code>などの基本ツールに加え、エージェント間の<span class="marker-green"><strong><code class="language-plaintext highlighter-rouge">spawn_agent</code></strong></span>が用意されている。これによりカスタムエージェントから他のエージェントを呼び出せ、独自の分業設計が組める。</p>

<p>実用例として、社内では「ライセンスチェッカーエージェント」「セキュリティスキャナエージェント」「i18nキー検証エージェント」などをカスタム定義し、Plannerから条件付きで呼び出す構成が想定できる。CIに組み込めば自動レビューワークフローになる。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>エージェント定義はTypeScriptで書け、<code>handleSteps</code>で決定論的ステップを混ぜられる。</li>
<li>モデル指定は<code>openai/gpt-5-nano</code>のようなOpenRouter形式で任意モデルを呼べる。</li>
<li>SDKはCI・社内ツール組み込み向けで、Claude Code Agent SDKと用途が近い。</li>
</ul>
</div>

<h2 id="05-codebuff-vs-claude-code-vs-cursor-vs-aider--aiコーディングエージェント比較表">05 Codebuff vs Claude Code vs Cursor vs Aider — AIコーディングエージェント比較表</h2>

<p>主要なAIコーディングエージェントとの位置づけを整理する。比較軸は「実行形態」「モデル選択の自由度」「エージェント分業」「ライセンス」「料金モデル」の5つ。</p>

<table>
<thead>
<tr>
<th>項目</th>
<th>Codebuff</th>
<th>Claude Code</th>
<th>Cursor</th>
<th>Aider</th>
</tr>
</thead>
<tbody>
<tr>
<td>実行形態</td>
<td>CLI＋SDK</td>
<td>CLI＋IDE拡張</td>
<td>IDE</td>
<td>CLI</td>
</tr>
<tr>
<td>モデル選択</td>
<td>OpenRouter任意</td>
<td>Anthropic製品中心</td>
<td>主要LLM</td>
<td>任意</td>
</tr>
<tr>
<td>エージェント分業</td>
<td>4エージェント固定</td>
<td>サブエージェント任意</td>
<td>固定（内部詳細非公開）</td>
<td>単発</td>
</tr>
<tr>
<td>ライセンス</td>
<td>Apache-2.0</td>
<td>プロプライエタリ</td>
<td>プロプライエタリ</td>
<td>Apache-2.0</td>
</tr>
<tr>
<td>料金</td>
<td>サブスク／広告版Freebuff</td>
<td>Claude API従量＋プラン</td>
<td>月額$20系</td>
<td>OSS（モデル代のみ）</td>
</tr>
</tbody>
</table>

<p>CodebuffとAiderはOSS＋任意モデルという点で近い。差はAiderが単発エージェント、Codebuffが4分業という設計差だ。Aiderはコミット単位で動作が読みやすく、Codebuffは大型タスクで効きやすい。</p>

<p>Claude CodeはAnthropic公式の優位を生かす立ち位置。Skill・Plugin・サブエージェントなど周辺機能が充実し、<span class="marker-yellow"><strong>「カスタムする前提のハーネス」</strong></span>として完成度が高い。Codebuffはより固定的なフローを提示する。</p>

<p>CursorはIDE体験を最大化するプロプライエタリ製品。Tab補完・サイドバー・コードベース検索が統合されている。CLI主体のCodebuffとは利用シーンが正面衝突しないことが多い。</p>

<p>Freebuffの存在も独特だ。広告モデルでAIコーディングを提供するOSSは稀で、<span class="marker-pink"><strong>「クレカ登録なしで試したい」</strong></span>個人開発者にとっては入口として機能する。代わりに広告表示やテレメトリの仕様は事前確認が必要だ。</p>

<p>Freebuffのキャッチコピーは「no subscription, no credits, no configuration」だ。利用者から見るとサインアップだけで使え、トライアル制限もない。Codebuff本体に誘導するファネルの役割と、OSSコミュニティへの広報の役割を兼ねる位置づけだ。</p>

<p>業務利用時にFreebuffを選ぶ場合は、広告経由の外部ホスト呼び出しがある可能性に注意する。社内コードを編集対象とする場合、コードそのものは送信されてもメタデータがどこまで広告ネットワークに流れるかは要確認だ。商用ライセンス上の取り扱いも公式に確認したい。</p>

<p>Cursorとの比較を踏まえた選び方は別記事にまとめた。IDEとCLIで迷う場合は <a href="/explain/claude-code-vs-cursor-comparison-2026/">Claude Code vs Cursor 2026比較</a> を参照してほしい。OSS拡張で済ませたい場合は <a href="/tool/continuedev-continue-cursor-alternative/">Continue vs Cursor徹底比較</a> が近い結論を出している。</p>

<p>エージェント分業の有無も整理しておきたい。Codebuffの4エージェントは「アーキテクチャとしての分業」だが、Claude Codeでも<code class="language-plaintext highlighter-rouge">.claude/agents/</code>配下で<span class="marker-yellow"><strong>サブエージェント定義</strong></span>を書けば同等の構成は組める。違いは「初期状態で分業が動くか、利用者が組み立てるか」だ。</p>

<p>Aiderは設計思想として単発エージェントを貫いている。コミット単位で動作を追いやすく、git diffベースの差分提示が中心になる。Codebuffの方がワークフロー単位の自動化向き、Aiderはペアプロ風の対話向きと整理できる。</p>

<p>Cursorは月額$20級の固定料金が読みやすい。チームでの一括契約に向く一方、モデル変更の自由度では劣る。Codebuffは従量・サブスクの混在モデルで、利用量に応じた変動が大きい。コスト見通しの設計思想自体が違う。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>Codebuffの強みはOSS＋OpenRouter＋4エージェント固定の組合せ。</li>
<li>Aiderは単発で読みやすい、Claude Codeはカスタム前提、CursorはIDE体験という棲み分け。</li>
<li>Freebuffは広告モデルで初心者の入口を作る、業界では珍しいOSS戦略。</li>
</ul>
</div>

<h2 id="06-日本の開発現場でcodebuffをどう使うか--claude-code併用パターンと注意点">06 日本の開発現場でCodebuffをどう使うか — Claude Code併用パターンと注意点</h2>

<p>日本の開発現場でCodebuffを導入する場合、判断ポイントは3つに絞れる。コードの社外送信ポリシー、既存ハーネスとの併用、コスト管理だ。</p>

<p>第一にコードの送信先。Codebuff CLIは<span class="marker-yellow"><strong>OpenRouter経由で各種モデルを呼ぶ</strong></span>仕組みのため、社内コードは少なくともCodebuff／OpenRouter／モデルプロバイダの3者を経由する。エアギャップ要件の現場では原則使えない。</p>

<p>第二に既存のClaude Codeハーネスとの併用だ。Codebuff CLIとClaude Codeは同じターミナルで共存できる。同じリポジトリで両方使い分ける構成も問題なく、<code class="language-plaintext highlighter-rouge">.claude/</code>配下と<code class="language-plaintext highlighter-rouge">.codebuff/</code>配下が衝突することは設計上ほぼない。</p>

<p>第三にコスト管理。複数エージェントが順に走るため、単発タスクでもLLMコール数が増える。月単位の利用ならOpenRouterのダッシュボードで上限を設定し、Codebuff側のサブスクと併用上限を必ず作っておきたい。</p>

<p>実務で効くユースケースは次のような場面が多い。</p>

<div class="box-tip">
<strong>Codebuffが効くユースケース</strong>
<ul>
<li>10〜30ファイルにまたがる仕様変更（認証方式の入れ替え、APIバージョン更新など）。</li>
<li>テストの一括追加。Plannerがファイル単位の網羅を設計しやすい。</li>
<li>新規モジュールの骨組み作成。型・テスト・実装を分業エージェントに割り振れる。</li>
<li>OSSへのコントリビューション準備。差分のサマリと変更計画を一度に出せる。</li>
</ul>
</div>

<p>逆に向かないのは1ファイル内の局所修正だ。型エラー1件の修正にFile Picker→Planner→Editor→Reviewerを順に回すのはオーバースペックで、Claude CodeやAiderの方がレスポンスが軽い。</p>

<p>Claude Code併用パターンとして現実的なのは<span class="marker-green"><strong>「日常はClaude Code、大型横断タスクはCodebuff」</strong></span>の使い分けだ。プロジェクト直下に両方のハーネス設定を置き、PRの種類で呼び分ける運用が筋がいい。</p>

<p>その前提としてClaude Code側の使い方を整理しておく価値がある。Claude Code単体のセットアップとカスタマイズは <a href="/explain/claude-code-complete-guide-2026/">Claude Code完全ガイド2026：インストールから本番運用まで</a> にまとめてある。</p>

<p>最後に注意点として、CodebuffのSDK・CLIは2026年5月時点で活発に変更が入っている。API契約・モデル指定構文・エージェント定義のスキーマはマイナーバージョン間で動く可能性が高い。本番組み込みは公式CHANGELOGの確認を前提にすべきだ。</p>

<p>導入の最短手順を一度整理しておく。CLI版は<code class="language-plaintext highlighter-rouge">npm install -g codebuff</code>の1コマンドで入る。インストール後、対象プロジェクトに<code class="language-plaintext highlighter-rouge">cd</code>して<code class="language-plaintext highlighter-rouge">codebuff</code>を起動すれば、自然言語入力を受け付けるREPLが立ち上がる。</p>

<p>カスタムエージェント運用に進む場合は、<code class="language-plaintext highlighter-rouge">/init</code>を打って<code class="language-plaintext highlighter-rouge">.codebuff/</code>ディレクトリを生成する。生成されたTypeScriptファイルを編集し、<code class="language-plaintext highlighter-rouge">model</code>・<code class="language-plaintext highlighter-rouge">toolNames</code>・<code class="language-plaintext highlighter-rouge">handleSteps</code>を自社用に書き換える。SDKから呼ぶ場合は<code class="language-plaintext highlighter-rouge">@codebuff/sdk</code>を別途追加する流れだ。</p>

<p>評価フェーズでは小さなリポジトリで「典型的な5タスク」を投げ、ログを記録して比較する。ファイル選定の精度、編集差分の妥当性、Reviewerが何回戻したかの3点を見れば、現場フィット感が概ね判断できる。</p>

<p>長期運用に進むなら、エージェント定義の社内テンプレ化・OpenRouter予算上限・ログ収集の3点をセットで設計したい。<span class="marker-pink"><strong>個人で速く回すツールから、チーム標準のハーネスに昇格させる</strong></span>には、これらの仕組みが土台になる。</p>

<div class="point-box">
<strong>このH2のポイント</strong>
<ul>
<li>コード送信ポリシー・既存ハーネス併用・コスト上限の3点を導入前に決める。</li>
<li>Codebuffは大型横断タスク向き、局所修正はClaude CodeやAiderの方が軽量。</li>
<li>Claude Codeとの併用は無理なく可能で、PR種別で呼び分けるのが現実的。</li>
</ul>
</div>

<h2 id="まとめ">まとめ</h2>

<p>Codebuffは「Claude Codeを61%で上回る」というキャッチコピーよりも、<span class="marker-yellow"><strong>4エージェント固定のフロー設計とOpenRouter対応</strong></span>という構造的特徴に注目すべきOSSだ。横断的な仕様変更タスクで効きやすく、サブスク版・SDK・広告付きFreebuffという3形態の配布もユニークだ。</p>

<p>数値そのものはバイアスを含むが、Plan-Edit-Review分離の方向性は他研究の傾向とも整合する。日本の開発現場では、Claude Codeを日常使いの軸に置きながら、大型タスクだけCodebuffに切り替える併用が現実的な落としどころになる。</p>

<p>AIコーディングエージェントは2026年に入り、単一モデル時代から「設計選択の時代」へと移った。Claude Code・Cursor・Codebuff・Aiderはそれぞれ異なる設計判断の表現であり、現場ごとに最適解は変わる。自社の典型タスクに照らした評価を一度走らせ、年単位で再評価する運用が現実的だ。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
<li><a href="https://github.com/CodebuffAI/codebuff">CodebuffAI/codebuff GitHub Repository（公式）</a></li>
<li><a href="https://github.com/CodebuffAI/codebuff/blob/main/evals/README.md">Codebuff Evals README（公式評価データ）</a></li>
<li><a href="https://www.npmjs.com/package/@codebuff/sdk">@codebuff/sdk npm package</a></li>
<li><a href="https://openrouter.ai/">OpenRouter（マルチモデルルーティング）</a></li>
</ul>]]></content><author><name></name></author><category term="tool" /><category term="AIコーディング" /><category term="vibe-coding" /><category term="agent" /><category term="AIエージェント" /><category term="codebuff" /><category term="claude-code" /><summary type="html"><![CDATA[Codebuffは4エージェント構成のOSS AIコーディングアシスタント。Claude Codeを61% vs 53%で上回る評価を公表し、OpenRouter経由で任意モデルを呼べる。アーキテクチャ・SDK・Freebuff広告版・他エージェント比較まで日本語で解説。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/cover_codebuff-ai-coding-agent.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/cover_codebuff-ai-coding-agent.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">ConardLi garden-skills徹底解説｜4実戦SKILL.md搭載のマルチエージェント対応Skillsカタログ</title><link href="https://ai-heartland.com/tool/garden-skills/" rel="alternate" type="text/html" title="ConardLi garden-skills徹底解説｜4実戦SKILL.md搭載のマルチエージェント対応Skillsカタログ" /><published>2026-05-16T12:00:00+09:00</published><updated>2026-05-16T12:00:00+09:00</updated><id>https://ai-heartland.com/tool/garden-skills</id><content type="html" xml:base="https://ai-heartland.com/tool/garden-skills/"><![CDATA[<p>ConardLi氏が2026年4月に公開した <a href="https://github.com/ConardLi/garden-skills">ConardLi/garden-skills</a> は、Claude Code・Cursor・Codex・Gemini CLI・OpenCodeなどの主要AIコーディングエージェントで横断動作する本番運用級SKILL.mdのカタログだ。web-video-presentation・web-design-engineer・gpt-image-2・kb-retrieverという4つの専門特化スキルを収録し、それぞれが個別バージョン管理・SHA-256検証付き<code class="language-plaintext highlighter-rouge">.zip</code>配布・公式プラグインマーケットプレース対応という体裁で揃っている。GitHub Starは2026年5月時点で<strong>4,800超</strong>、forks 700超を達成している。</p>

<blockquote>
  <p>Claude Code全体の使い方は <a href="/explain/claude-code-complete-guide-2026/">Claude Code完全ガイド2026：インストールから本番運用まで</a> をご覧ください。</p>
</blockquote>

<div class="box-tip">
  <p><strong>30秒で理解する garden-skills</strong></p>

  <ul>
    <li><strong>何者か</strong>: ConardLi氏が2026年4月にMITで公開した本番運用級SKILL.mdカタログ。GitHub Star 4,800+、forks 700+。</li>
    <li><strong>収録内容</strong>: 4スキル（web-video-presentation、web-design-engineer、gpt-image-2、kb-retriever）。それぞれ個別バージョン管理。</li>
    <li><strong>配布形態</strong>: <code class="language-plaintext highlighter-rouge">npx skills</code> CLI／Claude Codeプラグインマーケットプレース／SHA-256検証付き<code class="language-plaintext highlighter-rouge">.zip</code>／git clone／submoduleの5方式。</li>
    <li><strong>対応ハーネス</strong>: Claude Code・Claude.ai Web・Cursor・Codex CLI・Gemini CLI・OpenCode。</li>
    <li><strong>使い所</strong>: 自社の社内SKILL.md設計のリファレンス実装、または個別ドメイン（プレゼン制作・UI設計・画像生成・ローカルKB検索）の即戦力導入。</li>
  </ul>
</div>

<h2 id="garden-skillsとは何か4スキルを本番運用級で束ねたskillmdカタログ">garden-skillsとは何か—4スキルを「本番運用級」で束ねたSKILL.mdカタログ</h2>

<p><a href="https://github.com/ConardLi">ConardLi</a>氏はフロントエンド分野で著名なOSS開発者で、CSS Inspector等の人気拡張を公開してきた人物だ。そのConardLi氏が2026年4月21日にgarden-skillsの初版を公開し、5月12日のpushed_atまでの3週間でStar 4,846を集めている。</p>

<p>garden-skillsの位置づけを一言で表すなら「<strong>4スキルそれぞれが厚みのある専門書</strong>」というカタログだ。Anthropic公式skillsがPDF/Excel等のOffice文書処理を広く浅くカバーするのに対し、garden-skillsは個別ドメインを深掘りする。各SKILL.mdは数百行規模で、<code class="language-plaintext highlighter-rouge">references/</code>配下に参照ドキュメント、<code class="language-plaintext highlighter-rouge">scripts/</code>配下に決定論的な実行ヘルパー、<code class="language-plaintext highlighter-rouge">assets/</code>配下にテンプレートを揃える構造になっている。</p>

<p><img src="https://raw.githubusercontent.com/ConardLi/garden-skills/main/dist/imgs/web-design-skill.png" alt="Garden Skills gallery" /></p>

<h3 id="設計思想個別ドメインを深く本番運用の体裁で">設計思想—「個別ドメインを深く、本番運用の体裁で」</h3>

<p>garden-skillsの設計思想は3点に集約できる。</p>

<div class="box-info">
  <p><strong>garden-skillsの設計原則</strong></p>

  <ul>
<li><strong>個別バージョン管理</strong>: 4スキルはそれぞれ独立にセマンティックバージョニング。<code>web-video-presentation-v1.1.5</code>のようにスキル名+バージョンでタグ付けされ、相互に影響しない。</li>
<li><strong>SHA-256検証付き.zip配布</strong>: GitHub Releasesに不変のzipと<code>.sha256</code>ファイルが対で公開され、CI・エアギャップ環境でも再現可能インストールが可能。</li>
<li><strong>マルチエージェント横断</strong>: SKILL.md仕様に厳密準拠することで、Claude Code・Cursor・Codex・Gemini CLI・OpenCodeの全主要ハーネスで同じMarkdownが動く。</li>
</ul>
</div>

<p>この体裁は社内向けに使うSKILL.mdを設計する際の参考実装として価値が高い。「リリースタグの切り方」「.zip配布の自動化」「マニフェストとプラグインマーケットプレースの両立」という運用面の課題に対する具体回答が、リポジトリ全体に組み込まれているからだ。</p>

<h3 id="anthropic公式skillsaddy-osmani-agent-skillsとの位置関係">Anthropic公式skills・Addy Osmani agent-skillsとの位置関係</h3>

<p>3つのSkillsカタログを並べると棲み分けが明確になる。</p>

<table>
  <thead>
    <tr>
      <th>OSS</th>
      <th>スキル数</th>
      <th>フォーカス</th>
      <th>配布</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="https://github.com/anthropics/skills">anthropics/skills</a></td>
      <td>30+</td>
      <td>PDF/Excel/Docx/PowerPoint等のOffice文書処理</td>
      <td>リポジトリ参照型</td>
    </tr>
    <tr>
      <td><a href="https://github.com/addyosmani/agent-skills">addyosmani/agent-skills</a></td>
      <td>20+7コマンド</td>
      <td>SDLC全工程の汎用フレームワーク</td>
      <td>リポジトリ参照型</td>
    </tr>
    <tr>
      <td><strong>ConardLi/garden-skills</strong></td>
      <td><strong>4</strong></td>
      <td><strong>個別ドメイン深掘り（プレゼン・UI・画像・KB）</strong></td>
      <td><strong>個別バージョン管理.zip</strong></td>
    </tr>
  </tbody>
</table>

<p>agent-skillsの徹底分析は <a href="/tool/addyosmani-agent-skills-framework/">Addy Osmani agent-skills徹底解剖</a> を、Skillsそのものの全体像は <a href="/explain/claude-skills-explained/">Claude Code Skills徹底解説</a> を併せて参照してほしい。</p>

<h2 id="収録スキル4本の詳細それぞれが個別の専門書">収録スキル4本の詳細—それぞれが「個別の専門書」</h2>

<p>garden-skillsに収録されている4つのスキルを、用途・コア発明・成果物の観点で分解する。</p>

<h3 id="web-video-presentationスクリプトを画面録画可能なプレゼンに変える">web-video-presentation—スクリプトを「画面録画可能なプレゼン」に変える</h3>

<p><code class="language-plaintext highlighter-rouge">web-video-presentation</code>はカテゴリが<strong>Web Video / Presentation Engineering</strong>で、記事・脚本・授業資料・製品デモ・講演をクリック駆動の16:9 Webプレゼンテーションに変換するSkillだ。画面録画してそのままシネマティック動画にできる形で出力する点が他のスライド系Skillとの最大の違いになる。</p>

<p>特徴は5つある。</p>

<ul>
  <li>1920×1080固定ステージがビューポートに合わせて伸縮し、画面録画時のずれを防ぐ</li>
  <li><code class="language-plaintext highlighter-rouge">(chapter, step)</code>カーソルがクリック・キーボード操作で進行し、視覚ステップごとに1ナレーション</li>
  <li>脚本・テーマ・アウトライン・実装モード・音声合成（オプション）にハード協調チェックポイントを設置</li>
  <li>ホバー時のみ表示される進行コントロールで録画時の画面ノイズを排除</li>
  <li><code class="language-plaintext highlighter-rouge">paper-press</code>から<code class="language-plaintext highlighter-rouge">terminal-green</code>まで複数の視覚言語を選べるテーマトークン構成</li>
</ul>

<p>実装はVite + React + TypeScriptで、リポジトリ内にステージ用プリミティブと録画ガイダンスが揃っている。「note記事をプレゼン動画化したい」「LTスライドを録画してYouTubeに上げたい」というユースケースで、エージェントに「ナレーション台本→ステージ実装→録画指示」までを一気通貫させたい場合に効く。</p>

<h3 id="web-design-engineeraiが量産する凡庸なuiを脱却する">web-design-engineer—AIが量産する「凡庸なUI」を脱却する</h3>

<p><code class="language-plaintext highlighter-rouge">web-design-engineer</code>は<strong>Design / Frontend</strong>カテゴリで、AIが生成しがちなテンプレ的UIを脱却し、意図のある洗練されたフロントエンド成果物を作るためのSkillだ。エージェントを「機能実装者」から「デザインエンジニア」に位置づけ直すアプローチを取る。</p>

<p>ワークフローは6ステップで構成される。</p>

<div class="box-info">
  <p><strong>web-design-engineerの6ステップワークフロー</strong></p>

  <ul>
<li><strong>Step 0：ファクト検証</strong> — 不確かな製品・SDK・バージョンは必ずWebSearchで検証してから書き始める。</li>
<li><strong>Step 1：要件理解</strong> — 一律質問攻めではなくシナリオ別に質問量を調整。</li>
<li><strong>Step 2：コンテキスト把握</strong> — 既存ブランド・デザインシステム・参照URLを取り込む。</li>
<li><strong>Step 3：デザインシステム宣言</strong> — トークン・タイポ・カラー（oklch指定）を先に固定する。</li>
<li><strong>Step 4：v0（早期スケッチ）</strong> — フルビルド前に方向性を可視化してレビューする。</li>
<li><strong>Step 5：フルビルド</strong> — インラインReact＋Babel・コンテナクエリ・reduced-motionを実装。</li>
<li><strong>Step 6：検証</strong> — 5次元クリティーク（情報設計・タイポ・カラー・モーション・ブランド整合）で自己採点する。</li>
</ul>
</div>

<p>注目すべきは「Anti-Cliché Blocklist」と「Brand Asset Protocol」だ。前者はAIが量産しがちなUIパターン（中央寄せヒーロー＋3カラム特徴＋紫グラデCTA）を明示的に禁止し、後者は「色のhex値より先に、ロゴ・製品画像・UI実機スクショ」をアセットとして優先する規律を強制する。</p>

<p>カバー範囲はWebページ・ランディングページ・ダッシュボード・インタラクティブプロトタイプ・HTMLスライド・アニメーション・UIモックアップ・データ可視化・デザインシステム探索。HTML/CSS/JavaScript/Reactのいずれの形式でも、最終成果物の体裁を「stunning」基準まで引き上げる方針が一貫している。</p>

<h3 id="gpt-image-2gpt-image-2を3モードで使い分ける画像生成skill">gpt-image-2—GPT Image 2を「3モード」で使い分ける画像生成Skill</h3>

<p><code class="language-plaintext highlighter-rouge">gpt-image-2</code>は<strong>Image Generation / Prompt Engineering</strong>カテゴリで、GPT Image 2およびOpenAI互換画像APIに特化した画像生成Skillだ。ポスター・UIモック・製品ビジュアル・インフォグラフィック・学術図版・技術図解・コミック・アバター・ストーリーボード・ブランドボード・画像編集ワークフローまでをカバーする。</p>

<p>最大の特徴は<strong>3モード分岐</strong>を最初に判定するワークフロー設計にある。</p>

<table>
  <thead>
    <tr>
      <th>モード</th>
      <th>説明</th>
      <th>使い所</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mode A: Garden local</td>
      <td>リポジトリ内の生成スクリプトでローカル実行</td>
      <td>OPENAI_API_KEYを持つ開発者</td>
    </tr>
    <tr>
      <td>Mode B: Host-native delegation</td>
      <td>ホスト側のネイティブ画像ツールに委譲</td>
      <td>Claude.ai Web等のホスト統合</td>
    </tr>
    <tr>
      <td>Mode C: Advisor-only</td>
      <td>プロンプトのみを書いてユーザーが別ツールに渡す</td>
      <td>画像ツールが使えない環境</td>
    </tr>
  </tbody>
</table>

<p>エージェントが「どのモードで動くべきか」を最初に明示判定するため、サイレントに誤った実行パスを選ぶ事故が起きにくい。<code class="language-plaintext highlighter-rouge">references/</code>配下には18種類の視覚カテゴリ×80以上の構造化プロンプトテンプレートが揃っており、「学術論文の図」「コーポレートのインフォグラフィック」「製品マーケのキービジュアル」といった用途別に当てはめられる。</p>

<p>Mode A実行時は<code class="language-plaintext highlighter-rouge">garden-gpt-image-2/</code>配下にプロンプトと生成画像を保存し、再利用・レビュー・バージョン管理が可能。プロンプトエンジニアリングを「使い捨て」にしない設計だ。</p>

<h3 id="kb-retrieverragではなく段階的検索でローカル知識ベースを扱う">kb-retriever—RAGではなく「段階的検索」でローカル知識ベースを扱う</h3>

<p><code class="language-plaintext highlighter-rouge">kb-retriever</code>は<strong>Retrieval / Local Knowledge Base</strong>カテゴリで、ローカル<code class="language-plaintext highlighter-rouge">knowledge/</code>ディレクトリ・Markdown・テキスト・PDF・Excelからエージェントコンテキストを膨張させずに証拠を引き出すSkillだ。</p>

<p>最大の特徴は<span class="marker-yellow"><strong>ベクトル検索ではなく、階層インデックスをナビゲートする段階的検索</strong></span>を採用している点だ。</p>

<div class="box-warn">
  <p><strong>kb-retrieverの5原則</strong></p>

  <ul>
<li><strong>Layered Index First</strong>: 各階層の<code>data_structure.md</code>を読んでから絞り込む。ファイル全体を盲目的にロードしない。</li>
<li><strong>Learn-Before-Process</strong>: PDF・Excelは付属の参照ドキュメントを学習してから抽出・解析する。</li>
<li><strong>Precise Keyword Search</strong>: <code>grep</code>と局所ウィンドウ読み込みで該当箇所だけ取得する。</li>
<li><strong>Synonyms &amp; Iterative Refinement</strong>: 同義語展開と反復精錬で取りこぼしを抑える。</li>
<li><strong>5-Round Cap</strong>: 最大5ラウンドの探索上限を設けて暴走を防ぐ。</li>
</ul>
</div>

<p><code class="language-plaintext highlighter-rouge">grep</code>、<code class="language-plaintext highlighter-rouge">pdftotext</code>、<code class="language-plaintext highlighter-rouge">pdfplumber</code>、<code class="language-plaintext highlighter-rouge">pandas</code>のワークフローと、ソース付きの回答フォーマット手順までSKILL.md内に明文化されている。RAGエンジンのインフラ（ベクトルDB・embedding計算・インデックス作成）が不要なため、社内ナレッジベース・規程集・製品マニュアル・契約書ドキュメントなど数百〜数千ファイル規模のフォルダに対して、初日から動かせる点が実務的だ。</p>

<p>ベクトル検索を組むほどの規模・継続更新がない知識ベースで、「LLMにファイルを丸ごと食わせると毎回トークンが爆発する」問題を回避したいケースでフィットする。</p>

<h2 id="skillmdの構造と仕様なぜマルチエージェント横断が成り立つか">SKILL.mdの構造と仕様—なぜマルチエージェント横断が成り立つか</h2>

<p>garden-skillsが全主要ハーネスで動く根拠は、SKILL.mdのフォーマット仕様に厳密準拠している点にある。SKILL.mdは以下の構造を持つ。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;skill-name&gt;/
├── SKILL.md      ← 必須: 起動条件 + 実行手順
├── README.md     ← 人間向けドキュメント
├── references/   ← 任意: エージェントがオンデマンドで読む参照ドキュメント
├── scripts/      ← 任意: 決定論的な実行ヘルパー
└── assets/       ← 任意: テンプレート・フォント・アイコン
</code></pre></div></div>

<p>エージェントはSKILL.mdのフロントマター（YAML）の<code class="language-plaintext highlighter-rouge">description</code>行を見て「このスキルを今のタスクに起動すべきか」を判定する。<strong>descriptionがエージェントとSkill作者の契約</strong>になっており、ここがあいまいだと意図しないタイミングで起動したり、必要なときに起動しなかったりする。</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">name</span><span class="pi">:</span> <span class="s">web-design-engineer</span>
<span class="na">description</span><span class="pi">:</span> <span class="pi">|</span>
  <span class="s">Build high-quality visual Web artifacts using HTML/CSS/JavaScript/React —</span>
  <span class="s">web pages, landing pages, dashboards, interactive prototypes, ...</span>
  <span class="s">Use this skill whenever the user's request involves a visual, interactive,</span>
  <span class="s">or front-end deliverable, ...</span>
<span class="s">---</span>
</code></pre></div></div>

<p>garden-skillsの各SKILL.mdはdescriptionが具体例リスト＋反例（「Not applicable: pure back-end logic, CLI tools」）まで明示する厚みを持つ。これがマルチエージェント横断時に起動精度を担保する設計だ。</p>

<p>仕様の正式版は<a href="https://agentskills.io">agentskills.io</a>とAnthropic公式の<a href="https://github.com/anthropics/skills">anthropics/skills</a>リファレンスリポジトリで定義されている。</p>

<h2 id="5つのインストール方法と用途別の選び方">5つのインストール方法と用途別の選び方</h2>

<p>garden-skillsは5通りのインストール方法を用意している。それぞれの用途と特徴を整理する。</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>方法</th>
      <th>適した用途</th>
      <th>バージョンピン</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>A</td>
      <td><code class="language-plaintext highlighter-rouge">npx skills add</code>（CLI）</td>
      <td>任意のエージェント・一行導入・選択インストール</td>
      <td>tag URLで可</td>
    </tr>
    <tr>
      <td>B</td>
      <td>Claude Codeプラグインマーケットプレース</td>
      <td>プラグインパックの購読</td>
      <td>マーケットプレース版で可</td>
    </tr>
    <tr>
      <td>C</td>
      <td>GitHub Releasesの<code class="language-plaintext highlighter-rouge">.zip</code></td>
      <td>CI／エアギャップ環境／再現可能インストール</td>
      <td>完全不変</td>
    </tr>
    <tr>
      <td>D</td>
      <td>git cloneでマニュアルコピー</td>
      <td>Skill本体のローカル改修</td>
      <td>不可（main追従）</td>
    </tr>
    <tr>
      <td>E</td>
      <td>git submodule</td>
      <td>大規模プロジェクトへの組み込み</td>
      <td>submodule SHA</td>
    </tr>
  </tbody>
</table>

<h3 id="option-a-npx-skillsが事実上の標準">Option A: <code class="language-plaintext highlighter-rouge">npx skills</code>が事実上の標準</h3>

<p><code class="language-plaintext highlighter-rouge">npx skills</code>はSkillsのエコシステム標準CLIで、エージェントを自動判別して適切なディレクトリにSkillを配置する。最短ルートは以下だ。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 4スキル全部（最新）</span>
npx skills add ConardLi/garden-skills

<span class="c"># 1スキルだけ</span>
npx skills add ConardLi/garden-skills <span class="nt">-s</span> web-design-engineer

<span class="c"># グローバル（~/.skills）にインストール</span>
npx skills add ConardLi/garden-skills <span class="nt">-s</span> gpt-image-2 <span class="nt">--global</span>

<span class="c"># エージェント指定</span>
npx skills add ConardLi/garden-skills <span class="nt">-s</span> kb-retriever <span class="nt">-a</span> claude-code
</code></pre></div></div>

<p>CIや本番運用ではtagスコープURLでピンする。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npx skills add ConardLi/garden-skills/tree/web-design-engineer-v1.0.0/skills/web-design-engineer
</code></pre></div></div>

<h3 id="option-b-claude-codeプラグインマーケットプレース">Option B: Claude Codeプラグインマーケットプレース</h3>

<p>Claude Code利用者はプラグインマーケットプレース経由で、複数Skillをまとめたプラグインパックを購読できる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/plugin marketplace add ConardLi/garden-skills
/plugin <span class="nb">install </span>presentation-skills@garden-skills
/plugin <span class="nb">install </span>web-design-skills@garden-skills
/plugin <span class="nb">install </span>knowledge-base-skills@garden-skills
/plugin <span class="nb">install </span>image-generation-skills@garden-skills
</code></pre></div></div>

<p>プラグインパックは<code class="language-plaintext highlighter-rouge">.claude-plugin/marketplace.json</code>で宣言されており、1スキル1パックの構成だ。Claude Code側で更新通知・有効化管理ができる利点がある。</p>

<h3 id="option-c-sha-256検証付きzipが本番運用の正解">Option C: SHA-256検証付き<code class="language-plaintext highlighter-rouge">.zip</code>が本番運用の正解</h3>

<p>GitHub Releasesには不変の<code class="language-plaintext highlighter-rouge">.zip</code>と<code class="language-plaintext highlighter-rouge">.sha256</code>が対で公開される。CI・Dockerfile・エアギャップインストーラーで「バイト単位で固定したい」ケースは必ずこちらを使う。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">SKILL</span><span class="o">=</span>web-design-engineer
<span class="nv">VERSION</span><span class="o">=</span>1.0.0

curl <span class="nt">-fsSL</span> <span class="nt">-o</span> <span class="s2">"</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">.zip"</span> <span class="se">\</span>
  <span class="s2">"https://github.com/ConardLi/garden-skills/releases/download/</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">-v</span><span class="k">${</span><span class="nv">VERSION</span><span class="k">}</span><span class="s2">/</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">-</span><span class="k">${</span><span class="nv">VERSION</span><span class="k">}</span><span class="s2">.zip"</span>

curl <span class="nt">-fsSL</span> <span class="nt">-o</span> <span class="s2">"</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">.zip.sha256"</span> <span class="se">\</span>
  <span class="s2">"https://github.com/ConardLi/garden-skills/releases/download/</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">-v</span><span class="k">${</span><span class="nv">VERSION</span><span class="k">}</span><span class="s2">/</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">-</span><span class="k">${</span><span class="nv">VERSION</span><span class="k">}</span><span class="s2">.zip.sha256"</span>
shasum <span class="nt">-a</span> 256 <span class="nt">-c</span> <span class="s2">"</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">.zip.sha256"</span>

unzip <span class="nt">-q</span> <span class="s2">"</span><span class="k">${</span><span class="nv">SKILL</span><span class="k">}</span><span class="s2">.zip"</span> <span class="nt">-d</span> .claude/skills/
</code></pre></div></div>

<p>「always-latest」のフローティングURLも用意されているが、本番ではタグ固定を強く推奨する。</p>

<h3 id="対応エージェントマトリクスどこに置けば動くか">対応エージェントマトリクス—どこに置けば動くか</h3>

<p>garden-skillsが想定している配置先を整理する。</p>

<table>
  <thead>
    <tr>
      <th>エージェント／ランタイム</th>
      <th>配置先</th>
      <th>ステータス</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Claude Code</td>
      <td><code class="language-plaintext highlighter-rouge">.claude/skills/&lt;name&gt;/</code>またはプラグインマーケットプレース</td>
      <td>✅ 検証済み</td>
    </tr>
    <tr>
      <td>Claude.ai Web</td>
      <td>Settings → Capabilities → Skills</td>
      <td>✅ 検証済み</td>
    </tr>
    <tr>
      <td>Cursor</td>
      <td><code class="language-plaintext highlighter-rouge">.agents/skills/&lt;name&gt;/</code></td>
      <td>✅ 検証済み</td>
    </tr>
    <tr>
      <td>Codex CLI</td>
      <td><code class="language-plaintext highlighter-rouge">.codex/skills/&lt;name&gt;/</code></td>
      <td>✅ 検証済み</td>
    </tr>
    <tr>
      <td>Gemini CLI</td>
      <td>extension manifest</td>
      <td>✅ 検証済み</td>
    </tr>
    <tr>
      <td>OpenCode</td>
      <td><code class="language-plaintext highlighter-rouge">.opencode/skills/&lt;name&gt;/</code></td>
      <td>✅ 検証済み</td>
    </tr>
  </tbody>
</table>

<p>「SKILL.mdフォーマットがポータブル」というのが基本思想だ。エージェントがSkillsをサポートしているなら、スキャンする配置先にフォルダをコピーすれば動く。対応マトリクスはPR受け入れ可能で、新規ハーネス（Kiro・Windsurf等）への拡張が継続している。</p>

<h3 id="garden-skillsのアーキテクチャ概観">garden-skillsのアーキテクチャ概観</h3>

<p>garden-skillsがどのように4スキルを並列管理し、配布まで自動化しているかを図示する。</p>

<div class="mermaid">
flowchart LR
    A["ConardLi/garden-skills<br />monorepo"] --&gt; B["skills/<br />4スキル本体"]
    A --&gt; C["scripts/release<br />リリース自動化"]
    A --&gt; D[".claude-plugin/<br />marketplace.json"]
    B --&gt; B1[web-video-presentation]
    B --&gt; B2[web-design-engineer]
    B --&gt; B3[gpt-image-2]
    B --&gt; B4[kb-retriever]
    C --&gt; E["GitHub Releases<br />個別タグ + zip + sha256"]
    D --&gt; F["Claude Code<br />plugin marketplace"]
    B1 --&gt; G["npx skills add<br />CLI配布"]
    B2 --&gt; G
    B3 --&gt; G
    B4 --&gt; G
    E --&gt; H["CI/エアギャップ<br />再現可能インストール"]
    G --&gt; I["Claude Code / Cursor /<br />Codex / Gemini CLI / OpenCode"]
    F --&gt; I
    H --&gt; I
</div>

<p>スキル本体・リリース自動化スクリプト・プラグインマーケットプレース定義の3経路が、5つの配布チャネルに分岐していく構造になっている。README中のダウンロードリンクは<code class="language-plaintext highlighter-rouge">scripts/release/update-readme.mjs</code>が自動書き換えするため、常に最新タグに連動する。</p>

<h2 id="導入時の注意点と運用上の落とし穴">導入時の注意点と運用上の落とし穴</h2>

<p>garden-skillsを導入する際に踏みやすいポイントを整理する。</p>

<h3 id="1-skillmdのdescriptionが長く起動条件を正確に読む必要がある">1. SKILL.mdのdescriptionが長く、起動条件を正確に読む必要がある</h3>

<p>各SKILL.mdのdescriptionは具体例・反例・「Not applicable」リストまで含み、数十行に及ぶ。これは起動精度のための設計だが、エージェントが<strong>自プロジェクトの文脈で本当に起動すべきか</strong>を判断するには、descriptionを一度通読しておくことが重要だ。「webデザイン」と聞いて<code class="language-plaintext highlighter-rouge">web-design-engineer</code>が常に起動するわけではなく、「ピュアロジック・CLIツール・データ処理スクリプト」は明示的に対象外になっている。</p>

<h3 id="2-gpt-image-2のモード判定をスキップしない">2. gpt-image-2のモード判定をスキップしない</h3>

<p>Mode判定をスキップして「動くと思ったら動かない」事故が起きやすい。OPENAI_API_KEYがあればMode A、ホスト側に画像ツールがあればMode B、何もなければMode Cというフローを最初に明示判定するルールを必ず守ること。</p>

<h3 id="3-kb-retrieverは事前準備が前提">3. kb-retrieverは「事前準備」が前提</h3>

<p><code class="language-plaintext highlighter-rouge">knowledge/</code>配下に<code class="language-plaintext highlighter-rouge">data_structure.md</code>形式の階層インデックスを置いていないと、kb-retrieverの段階的検索が機能しない。導入前にナレッジベースの整備が必要で、これは「RAGエンジン不要」のトレードオフでもある。</p>

<h3 id="4-プラグインパックのzipサイズに注意">4. プラグインパックの<code class="language-plaintext highlighter-rouge">.zip</code>サイズに注意</h3>

<p><code class="language-plaintext highlighter-rouge">web-video-presentation</code>はVite + React + TypeScriptのプロジェクト雛形を含むため、<code class="language-plaintext highlighter-rouge">.zip</code>サイズが他スキルより大きい。Dockerfileで複数スキルを一気に展開する場合、レイヤーサイズに影響することがある。</p>

<h3 id="5-skill同士のオーケストレーションは未組み込み">5. Skill同士のオーケストレーションは未組み込み</h3>

<p>garden-skillsは4スキルが<strong>並列</strong>で配布され、Addy Osmaniのagent-skillsのような「メタスキル（using-agent-skills）でルーター」「SDLCフェーズで横断結合」といったオーケストレーション層は持たない。複数スキルをワークフロー化したい場合は、自プロジェクトのAGENTS.md/CLAUDE.md側でルーティングを書く必要がある。</p>

<h2 id="まとめと使い方の勘所">まとめと使い方の勘所</h2>

<p>garden-skillsは「Skillsの本番運用」を1リポジトリで実演する参考実装として価値が高い。個別バージョン管理・SHA-256検証付き<code class="language-plaintext highlighter-rouge">.zip</code>・プラグインマーケットプレース・5通りの配布チャネル・マルチエージェント対応マトリクス——どれも自社向けSKILL.mdカタログを作る際に直面する課題への具体回答が揃っている。</p>

<p>4スキル単体の即戦力としては以下の判断軸が使いやすい。</p>

<div class="box-info">
  <p><strong>スキル選定の判断軸</strong></p>

  <ul>
<li><strong>記事・脚本を動画化したい</strong> → web-video-presentation。</li>
<li><strong>AI生成UIが凡庸で困っている</strong> → web-design-engineer。</li>
<li><strong>GPT Image 2で画像生成を本格運用したい</strong> → gpt-image-2。</li>
<li><strong>ローカル文書群からRAG不要で証拠を引きたい</strong> → kb-retriever。</li>
</ul>
</div>

<p>Skills全般の運用設計は <a href="/explain/claude-skills-explained/">Claude Code Skills徹底解説</a> を、Skillsカタログ各社の比較観点は <a href="/tool/addyosmani-agent-skills-framework/">Addy Osmani agent-skills徹底解剖</a> と <a href="/tool/prismatic-skills-claude-code-plugin/">Prismatic Skills徹底解説</a> を参照してほしい。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
<li><a href="https://github.com/ConardLi/garden-skills" target="_blank" rel="noopener">ConardLi/garden-skills（公式リポジトリ）</a></li>
<li><a href="https://github.com/ConardLi/garden-skills/blob/main/README.md" target="_blank" rel="noopener">garden-skills README（4スキル詳細・インストール5方式・対応マトリクス）</a></li>
<li><a href="https://agentskills.io" target="_blank" rel="noopener">agentskills.io（SKILL.md公式仕様）</a></li>
<li><a href="https://github.com/anthropics/skills" target="_blank" rel="noopener">anthropics/skills（Anthropic公式リファレンス）</a></li>
<li><a href="https://www.npmjs.com/package/skills" target="_blank" rel="noopener">npm skills CLI（npx skills add）</a></li>
</ul>

<!--
配信メモ:
- X下書き: 「ConardLi/garden-skills」「4スキル本番運用級」「Claude Code/Cursor/Codex横断」を訴求軸に
- はてブ: タイトル冒頭にGitHub Star数（4,800超）を入れる
- 内部リンク: claude-skills-explained, addyosmani-agent-skills-framework, prismatic-skills-claude-code-plugin
-->]]></content><author><name></name></author><category term="tool" /><category term="claude-code" /><category term="cursor" /><category term="codex" /><category term="OSS" /><category term="skills" /><category term="agent-skills" /><category term="web-design" /><summary type="html"><![CDATA[ConardLi氏が公開したgarden-skillsは、Claude Code/Cursor/Codex/Gemini CLI等で動く本番運用級のSKILL.mdを4本収録するマルチエージェント対応カタログだ。web-video-presentation・web-design-engineer・gpt-image-2・kb-retrieverの設計と、5つのインストール方法、他Skillsカタログとの違いを2026年5月時点の最新情報で解説する。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_garden-skills.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_garden-skills.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Archify徹底解説：Claude Skillで5種類の技術図を一発生成する自己完結HTML</title><link href="https://ai-heartland.com/agent/archify-claude-skill-architecture-diagram/" rel="alternate" type="text/html" title="Archify徹底解説：Claude Skillで5種類の技術図を一発生成する自己完結HTML" /><published>2026-05-16T10:00:00+09:00</published><updated>2026-05-16T10:00:00+09:00</updated><id>https://ai-heartland.com/agent/archify-claude-skill-architecture-diagram</id><content type="html" xml:base="https://ai-heartland.com/agent/archify-claude-skill-architecture-diagram/"><![CDATA[<p>この記事ではClaude Skillの実例として、自然言語から技術図を生成するArchifyを掘り下げます。Claude Code全体の使い方は <a href="/explain/claude-code-complete-guide-2026/">Claude Code完全ガイド2026：インストールから本番運用まで</a> をご覧ください。</p>

<div class="point-box"><strong>この記事のポイント</strong><ul><li>・<code>Archify</code>はzip配布の<code>Claude Skill</code>で、自然言語から5種類の図を単一HTMLで生成する。</li><li>・Architecture/Workflow/Sequence/Data Flow/Lifecycleの5タイプに対応、深色/浅色テーマを<kbd>T</kbd>キーで切替。</li><li>・PNG/JPEG/WebPは<code>4×原生光栅化</code>でレチナ画面でも輪郭が滑らか。</li><li>・SVGは<code>@media (prefers-color-scheme)</code>内蔵で、GitHub READMEに貼ると読者環境に応じて自動色替え。</li><li>・<code>Cocoon-AI/architecture-diagram-generator</code> v1.0のfork rewrite v2.4で、視覚デザインは原作者に帰属。</li></ul></div>

<h2 id="1-archifyとは自然言語からプロ品質の技術図を生成するclaude-skill">1. Archifyとは：自然言語からプロ品質の技術図を生成するClaude Skill</h2>

<p><span class="marker-yellow">Archifyは、自然言語で書かれた構成説明から「アーキテクチャ図」「ワークフロー図」「シーケンス図」「データフロー図」「ライフサイクル図」の5種類を単一HTMLとして生成するClaude Skillだ</span>。GitHubで213スターを集めるMITライセンスのOSSで、リポジトリは<a href="https://github.com/tt-a1i/archify"><code class="language-plaintext highlighter-rouge">tt-a1i/archify</code></a>に置かれている。</p>

<p>Skillsの仕組みを利用しているため、ユーザーは図を描く専門知識を一切必要としない。「Reactフロントエンド、Node.js API、PostgreSQL、Redisキャッシュ、AWSでホスト」と書いてClaudeに渡すだけで、配色・配置・ラベル付き・凡例付きの図がそのまま出てくる。</p>

<p>公開元のtt-a1i氏はCocoon AI社が公開した「architecture-diagram-generator v1.0」をfork rewriteする形で開発を進めており、本記事執筆時点（2026年5月）の最新版はv2.4だ。Skillの拡張子は<code class="language-plaintext highlighter-rouge">zip</code>、配布は<code class="language-plaintext highlighter-rouge">archify.zip</code>単一ファイルで完結する。</p>

<h3 id="11-claude-skillとは何か">1.1 Claude Skillとは何か</h3>

<p>Claude Skillは、Anthropicが2025年末に公開したClaude.aiおよびClaude Codeの拡張メカニズムだ。<code class="language-plaintext highlighter-rouge">SKILL.md</code>を中心とするフォルダ構成のzipファイルとして配布され、Claudeのコンテキストに「特定用途のお作法と参照可能なリソース」を注入できる。</p>

<p><code class="language-plaintext highlighter-rouge">Settings → Capabilities → Skills</code>から<code class="language-plaintext highlighter-rouge">+ Add</code>でアップロードすればすぐ使えるようになる。Claude Code側ではCLIで<code class="language-plaintext highlighter-rouge">~/.claude/skills/</code>配下に展開するだけで認識される。</p>

<p>Archifyの<code class="language-plaintext highlighter-rouge">SKILL.md</code>にはClaudeへの指示として「class化・テーマ化されたSVGの組み立て方」「セマンティック配色のルール」「5種類の図の使い分け方」が記述されており、Claudeはこれをガイドラインとして読み込んだ上で図を生成する。</p>

<h3 id="12-リポジトリの規模感と来歴">1.2 リポジトリの規模感と来歴</h3>

<p>ArchifyはCocoon AI社の<a href="https://github.com/Cocoon-AI/architecture-diagram-generator">architecture-diagram-generator</a> v1.0をベースにしている。元版は「深色テーマのHTML出力のみ」というシンプルな実装だったが、Archifyはこれを大幅に拡張した。</p>

<p>v2.0でCSS変数化と浅色テーマ追加、v2.1で剪贴板コピー・キーボードナビゲーション、v2.2で印刷スタイル・ローカルフォントフォールバック、v2.3で4×原生光栅化、v2.4でSVG双主題自持を実装した。バージョンごとの追加機能はREADMEの「版本演进」セクションに表形式でまとめられている。</p>

<div class="box-tip"><strong>「自己完結HTML」の意味</strong><br />
ArchifyのHTML出力は<code>Google Fonts</code>へのCDN参照1本を除き、SVGの定義・CSS変数・約3KBのJSがすべて単一ファイルに内包される。<code>iframe</code>でブログに埋め込んでもよし、Slackに添付してもよし、社内Wikiに貼ってもよし。ビルド工程ゼロで世界中どこでも開ける独立したアセットとして配布できる。
</div>

<hr />

<h2 id="2-なぜclaude-skillとして配布するのか3つの構造的優位">2. なぜClaude Skillとして配布するのか：3つの構造的優位</h2>

<p>Archifyが他のダイアグラム生成ツールと根本的に違うのは、配布形態にClaude Skillを選んだ点だ。これには3つの構造的優位がある。</p>

<h3 id="21-claudeに描かせる設計思想">2.1 「Claudeに描かせる」設計思想</h3>

<p>従来のダイアグラム生成OSS（Mermaid・PlantUML・diagrams.netなど）は「ユーザーが構文を覚えて書く」前提だ。これに対しArchifyは「ユーザーは自然言語で説明、Claudeが配置と配色を判断、最終的にArchifyのテンプレートで仕上げる」という三段構えになっている。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ユーザー: 「React + Node.js + PostgreSQL + Redis + AWSの構成図を archify で」
↓
Claude: 構成要素を抽出し、Archifyのセマンティック配色ルール（Frontend=青、Backend=緑、Database=紫...）
        と配置ヒューリスティクスを適用してSVGを組み立てる
↓
Archify: 単一HTMLにラップし、テーマ切替UIとエクスポートメニューを付与
</code></pre></div></div>

<p>READMEに「archifyの美学核心はClaudeの布局判断、CSSではない」と明記されているとおり、Skill側はテンプレート提供に徹し、図の質はClaudeの推論能力にレバレッジしている。</p>

<h3 id="22-対話で図を直したい欲求への対応">2.2 対話で図を直したい欲求への対応</h3>

<p>Archifyの最大の使い勝手は、生成後の修正がチャットで完結する点だ。「Redisを左に動かして」「鉴权サービスを玫紅にして」「Kafkaを追加して」と日本語/中国語/英語で言えば、Claudeが該当部分だけを書き直して新しいHTMLを出してくれる。</p>

<p>伝統的なドローツールは「マウスでクリック→ドラッグ→プロパティ変更」の往復になり、複雑な図ほど時間が溶けやすい。Archifyはこの手作業をすべて言葉でやり取りできる。</p>

<h3 id="23-ローカル動作データ越境ゼロ">2.3 ローカル動作・データ越境ゼロ</h3>

<p>ArchifyのHTML生成はClaude側で行われるため、Skill本体はテンプレートとSKILL.mdのテキストだけだ。SaaSサービスに登録する必要もなければ、APIキーも必要ない。</p>

<p>Claude Codeを社内ネットワーク経由で動かしている組織なら、Archifyの実行もネットワーク境界の内側で完結する。Mermaid Live Editor・Lucidchart・draw.ioのオンライン版とは違い、機微なシステム構成情報が外部に送信されない。</p>

<hr />

<h2 id="3-5種類の図何をどの図で描くのか">3. 5種類の図：何をどの図で描くのか</h2>

<p>ArchifyのREADMEには「图表类型」セクションがあり、5タイプそれぞれの適用ガイドラインが示されている。</p>

<table>
  <thead>
    <tr>
      <th>タイプ</th>
      <th>適した題材</th>
      <th>入力例</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Architecture</td>
      <td>システム構成・クラウドリソース・DB/キャッシュ・サービス境界・セキュリティグループ</td>
      <td>「React + Node.js + PostgreSQL + Redis + AWS」</td>
    </tr>
    <tr>
      <td>Workflow</td>
      <td>リクエスト生命周期・承認フロー・ツール呼び出し・CI/CD・運維Runbook・事故対応</td>
      <td>「ユーザーリクエスト→Agent計画→承認ゲート→ツール呼出→trace記録→結果返却」</td>
    </tr>
    <tr>
      <td>Sequence</td>
      <td>API呼び出し連鎖・JWT検証・キャッシュ回源・鉴权・異步トレース・サービス間相互作用</td>
      <td>「ユーザーがページを開く→前端がAPI叩く→JWTチェック→Redis読込→キャッシュミスならPostgres→trace記録」</td>
    </tr>
    <tr>
      <td>Data Flow</td>
      <td>ETL/ELT・埋点・PII境界・倉庫同期・データリネージ・下流消費</td>
      <td>「Web/Mobileから埋点→Edge APIで収集→Consent GateでPIIフィルタ→Kafka→Warehouse→FeatureStore→Dashboard」</td>
    </tr>
    <tr>
      <td>Lifecycle</td>
      <td>状態機・注文/タスク/デプロイ/Agent runの生命周期・待機状態・リトライ・取消・タイムアウト・終了状態</td>
      <td>「Agent RunがQueued→Planning→Executing→Reviewing、人手承認時はNeedsApproval、ツール失敗時はFailed後リトライ、ユーザー取消はCancelled、タイムアウトはExpired、成功はCompleted」</td>
    </tr>
  </tbody>
</table>

<h3 id="31-workflowは汎用フロー図ではない">3.1 Workflowは汎用フロー図ではない</h3>

<p>READMEに「Workflowは通用流程図の代替品ではない」と明記されている。Archifyの定義するWorkflowは「技術沟通图」で、スイムレーン・セマンティック配色・主路径と異步/承認/観測の経路を持つ。</p>

<p>例えば「Agent計画→承認ゲート→ツール呼出→trace記録」のような、AIエージェントのリクエスト処理を可視化する用途に特化している。一般的な業務フロー（注文受付→在庫確認→出荷指示）には別のツールのほうが向いている場面もある。</p>

<h3 id="32-data-flowとセキュリティ境界">3.2 Data Flowとセキュリティ境界</h3>

<p>Data Flowタイプの目玉機能はPII境界の可視化だ。READMEのサンプルにある「Consent Gate」のようにデータの匿名化・同意確認・暗号化境界を「ゲート」として明示できる。</p>

<p>データ保護インパクト評価（DPIA）やGDPR/PIPLコンプライアンス資料を作る際、開発者と法務・セキュリティチームの認識を揃えるのに役立つ。「どのコンポーネントを越えるとPIIが含まれるか」を1枚の図で説明できる。</p>

<h3 id="33-lifecycleで状態機を伝える">3.3 Lifecycleで状態機を伝える</h3>

<p>Lifecycle図は状態機の遷移を表現する。<code class="language-plaintext highlighter-rouge">Queued → Planning → Executing → Reviewing → Completed</code>のような主軸に、<code class="language-plaintext highlighter-rouge">Needs Approval</code>・<code class="language-plaintext highlighter-rouge">Blocked</code>の待機状態、<code class="language-plaintext highlighter-rouge">Failed</code>・<code class="language-plaintext highlighter-rouge">Cancelled</code>・<code class="language-plaintext highlighter-rouge">Expired</code>の終了状態を含められる。</p>

<p>Agent run・GitHubのPRワークフロー・注文ステータス・デプロイメントパイプライン——状態のあるオブジェクトすべてに適用できる汎用性が魅力だ。</p>

<hr />

<h2 id="4-アーキテクチャskillとテンプレートの分離設計">4. アーキテクチャ：Skillとテンプレートの分離設計</h2>

<p>ArchifyのアーキテクチャはSkill層・テンプレート層・出力HTML層の3層に分かれている。</p>

<div class="mermaid">
flowchart LR
    subgraph User["ユーザー"]
        U1["自然言語<br />構成説明"]
    end
    subgraph Claude["Claude"]
        C1["SKILL.md<br />読込"]
        C2["構成要素抽出<br />+ 配色決定"]
        C3["SVG構築"]
    end
    subgraph Template["Archifyテンプレート"]
        T1["CSS変数定義<br />:root / data-theme"]
        T2["セマンティック<br />クラス c-frontend 等"]
        T3["エクスポート<br />パイプライン"]
    end
    subgraph Output["単一HTML"]
        O1["SVGインライン"]
        O2["テーマトグル"]
        O3["Exportメニュー"]
    end
    U1 --&gt; C1
    C1 --&gt; C2
    C2 --&gt; C3
    T1 --&gt; C3
    T2 --&gt; C3
    C3 --&gt; O1
    T3 --&gt; O3
    O1 --&gt; O2
</div>

<h3 id="41-css変数によるテーマ設計">4.1 CSS変数によるテーマ設計</h3>

<p>ArchifyのHTMLは<code class="language-plaintext highlighter-rouge">:root</code>と<code class="language-plaintext highlighter-rouge">[data-theme="light"]</code>の2セットのCSS変数を持つ。<code class="language-plaintext highlighter-rouge">&lt;html&gt;</code>要素の<code class="language-plaintext highlighter-rouge">data-theme</code>属性を切り替えるだけで、グラデーション・グリッド・矢印・マスクを含む図全体が一瞬で書き換わる。</p>

<p>SVG内部の要素は固有色を持たず、<code class="language-plaintext highlighter-rouge">c-frontend</code>・<code class="language-plaintext highlighter-rouge">c-backend</code>・<code class="language-plaintext highlighter-rouge">c-database</code>・<code class="language-plaintext highlighter-rouge">t-muted</code>・<code class="language-plaintext highlighter-rouge">a-emphasis</code>のようなセマンティッククラスを参照している。これによりテーマと配色を切り離せている。</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- 簡略化したテーマ切替の仕組み --&gt;</span>
<span class="nt">&lt;style&gt;</span>
  <span class="nd">:root</span> <span class="p">{</span>
    <span class="py">--c-frontend</span><span class="p">:</span> <span class="nx">#06b6d4</span><span class="p">;</span>  <span class="c">/* 深色テーマ */</span>
    <span class="py">--c-backend</span><span class="p">:</span>  <span class="nx">#10b981</span><span class="p">;</span>
    <span class="py">--c-database</span><span class="p">:</span> <span class="nx">#a855f7</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="o">[</span><span class="nt">data-theme</span><span class="o">=</span><span class="s1">"light"</span><span class="o">]</span> <span class="p">{</span>
    <span class="py">--c-frontend</span><span class="p">:</span> <span class="nx">#0891b2</span><span class="p">;</span>  <span class="c">/* 浅色テーマ */</span>
    <span class="py">--c-backend</span><span class="p">:</span>  <span class="nx">#059669</span><span class="p">;</span>
    <span class="py">--c-database</span><span class="p">:</span> <span class="nx">#9333ea</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="nc">.c-frontend</span> <span class="p">{</span> <span class="py">fill</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="l">--c-frontend</span><span class="p">);</span> <span class="p">}</span>
<span class="nt">&lt;/style&gt;</span>
<span class="nt">&lt;script&gt;</span>
  <span class="c1">// T キーで切替・localStorage に永続化</span>
  <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">theme</span> <span class="o">=</span>
    <span class="nx">localStorage</span><span class="p">.</span><span class="nf">getItem</span><span class="p">(</span><span class="dl">'</span><span class="s1">theme</span><span class="dl">'</span><span class="p">)</span> <span class="o">??</span> <span class="dl">'</span><span class="s1">dark</span><span class="dl">'</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<h3 id="42-エクスポートパイプラインの仕組み">4.2 エクスポートパイプラインの仕組み</h3>

<p>PNG/JPEG/WebP/SVGのエクスポートは、すべてブラウザ内で完結する。READMEの「实现细节」セクションに動作原理が記述されている。</p>

<ol>
  <li>SVGをDOMからクローン</li>
  <li>ホストの<code class="language-plaintext highlighter-rouge">&lt;style&gt;</code>を解析し、現在のテーマ変数の解決値をクローンの<code class="language-plaintext highlighter-rouge">:root</code>に書き込む</li>
  <li><code class="language-plaintext highlighter-rouge">XMLSerializer</code>でクローンをシリアライズ</li>
  <li>光栅出力の場合は、クローンの<code class="language-plaintext highlighter-rouge">width</code>/<code class="language-plaintext highlighter-rouge">height</code>を<code class="language-plaintext highlighter-rouge">viewBox</code>の4倍に設定</li>
  <li><code class="language-plaintext highlighter-rouge">Image</code>要素として読み込み、<code class="language-plaintext highlighter-rouge">canvas</code>に自然サイズで描画</li>
  <li><code class="language-plaintext highlighter-rouge">canvas.toBlob(mime)</code>でファイル化</li>
</ol>

<p>このプロセスがブラウザのキャンバスAPIで完結するため、サーバーへの送信もファイルアップロードも不要だ。JPEGの場合は透過アルファがないため、背景色をテーマから明示的に充填する。</p>

<h3 id="43-単一ファイル配布の制約と利点">4.3 単一ファイル配布の制約と利点</h3>

<p><code class="language-plaintext highlighter-rouge">SKILL.md</code>の指示でClaudeはテンプレートを参照したSVGを構築する。出力されるのは1つのHTMLファイルで、依存リソースはGoogle Fontsへの<code class="language-plaintext highlighter-rouge">&lt;link&gt;</code>1本のみだ。</p>

<p>ファイル1つで完結するため、Confluence・Notion・GitHub Pages・Cloudflare Pages・社内Wikiのどこにでも貼れる。代わりに「JSONなどのソースが残らない」「差分マージできない」というデメリットもある。</p>

<hr />

<h2 id="5-4原生光栅化なぜ画像がジャギーにならないのか">5. 4×原生光栅化：なぜ画像がジャギーにならないのか</h2>

<p>v2.3で実装された「4×原生光栅化」は、Archifyを他のSVG to PNG変換ツールと差別化する重要機能だ。</p>

<h3 id="51-アップサンプリングと原生光栅化の違い">5.1 アップサンプリングと原生光栅化の違い</h3>

<blockquote>
  <p>＜悪い例＞
一般的なSVG to PNG変換は、まず自然サイズでビットマップを生成し、それを2倍/4倍に拡大表示する。これは「アップサンプリング」と呼ばれ、輪郭が補間で滑らかに見えるものの本質的には低解像度の画像を引き伸ばしているだけだ。</p>
</blockquote>

<blockquote>
  <p>＜改善例＞
Archifyの4×原生光栅化は、SVGのviewBoxを4倍にしてからキャンバスに描画する。これにより、ベクター情報からネイティブ4倍解像度のビットマップが直接生成される。レチナディスプレイ・4Kモニタ・印刷出力の全環境でくっきり見える。</p>
</blockquote>

<h3 id="52-canvas上限への自動降格">5.2 Canvas上限への自動降格</h3>

<p>ブラウザのCanvasには最大サイズの上限がある（多くのブラウザで4096×4096または8192×8192）。Archifyの4×光栅化が上限を超える場合は、自動的に3×・2×へ降格する安全装置が実装されている。</p>

<p>これにより「巨大な図でエクスポートが失敗する」事象を回避し、ユーザーは常に最も高解像度のPNGを手にできる。倍率セレクターを意図的に省いた設計だ（v2.3で削除された）。</p>

<h3 id="53-剪贴板コピーも4">5.3 剪贴板コピーも4×</h3>

<p>「Copy to clipboard」操作も同じパイプラインを通る。Slackや飛書・Notion・Figmaにペーストした際の画質が劣化しない。</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 剪贴板コピーの大筋（簡略化）</span>
<span class="kd">const</span> <span class="nx">blob</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">canvas</span><span class="p">.</span><span class="nf">toBlob</span><span class="p">(</span><span class="dl">'</span><span class="s1">image/png</span><span class="dl">'</span><span class="p">)</span>
<span class="k">await</span> <span class="nb">navigator</span><span class="p">.</span><span class="nx">clipboard</span><span class="p">.</span><span class="nf">write</span><span class="p">([</span><span class="k">new</span> <span class="nc">ClipboardItem</span><span class="p">({</span> <span class="dl">'</span><span class="s1">image/png</span><span class="dl">'</span><span class="p">:</span> <span class="nx">blob</span> <span class="p">})])</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">ClipboardItem</code>と<code class="language-plaintext highlighter-rouge">navigator.clipboard.write</code>が必要なため、Chromium・Firefox 127+・Safari 16+でのみ動作する。サポート外のブラウザでは該当メニュー項目がグレーアウトされる。</p>

<hr />

<h2 id="6-svg双主題自持github-readmeに貼るだけで完成">6. SVG双主題自持：GitHub READMEに貼るだけで完成</h2>

<p>v2.4で実装された「SVG双主題自持」はArchifyの目玉機能だ。</p>

<h3 id="61-media-prefers-color-schemeの活用">6.1 <code class="language-plaintext highlighter-rouge">@media (prefers-color-scheme)</code>の活用</h3>

<p>ArchifyのSVG出力には、深色用と浅色用の2セットのCSS変数が内包される。<code class="language-plaintext highlighter-rouge">@media (prefers-color-scheme)</code>ルールで、読者のシステム設定に応じて自動的に切り替わる。</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- 出力SVGの内部構造（簡略化） --&gt;</span>
<span class="nt">&lt;svg</span> <span class="na">xmlns=</span><span class="s">"http://www.w3.org/2000/svg"</span> <span class="na">viewBox=</span><span class="s">"0 0 1200 800"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;defs&gt;</span>
    <span class="nt">&lt;style&gt;</span>
      :root {
        --c-frontend: #06b6d4;
        --c-backend: #10b981;
      }
      @media (prefers-color-scheme: light) {
        :root {
          --c-frontend: #0891b2;
          --c-backend: #059669;
        }
      }
      .c-frontend { fill: var(--c-frontend); }
    <span class="nt">&lt;/style&gt;</span>
  <span class="nt">&lt;/defs&gt;</span>
  <span class="c">&lt;!-- SVG本体 --&gt;</span>
<span class="nt">&lt;/svg&gt;</span>
</code></pre></div></div>

<h3 id="62-従来の2枚png--picture運用が不要に">6.2 従来の「2枚PNG + <code class="language-plaintext highlighter-rouge">&lt;picture&gt;</code>」運用が不要に</h3>

<p>GitHub READMEでダーク/ライト両対応の図を出すには、これまで以下のような<code class="language-plaintext highlighter-rouge">&lt;picture&gt;</code>タグが必要だった。</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;picture&gt;</span>
  <span class="nt">&lt;source</span> <span class="na">media=</span><span class="s">"(prefers-color-scheme: dark)"</span>  <span class="na">srcset=</span><span class="s">"diagram-dark.png"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;source</span> <span class="na">media=</span><span class="s">"(prefers-color-scheme: light)"</span> <span class="na">srcset=</span><span class="s">"diagram-light.png"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;img</span> <span class="na">alt=</span><span class="s">"diagram"</span> <span class="na">src=</span><span class="s">"diagram-light.png"</span><span class="nt">&gt;</span>
<span class="nt">&lt;/picture&gt;</span>
</code></pre></div></div>

<p>これだとPNG2枚を別々に生成・管理する必要があり、更新時に「片方だけ古い」事故が起こりやすい。Archify v2.4のSVGなら1枚貼るだけで両対応する。</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">![</span><span class="nv">diagram</span><span class="p">](</span><span class="sx">diagram.svg</span><span class="p">)</span>
</code></pre></div></div>

<p>これだけで完結する。GitHubで<code class="language-plaintext highlighter-rouge">README.md</code>にSVGを貼ると、ダークモードのユーザーには深色版、ライトモードのユーザーには浅色版が自動表示される。</p>

<h3 id="63-blogでもconfluenceでも同じ仕組みが効く">6.3 BlogでもConfluenceでも同じ仕組みが効く</h3>

<p><code class="language-plaintext highlighter-rouge">@media (prefers-color-scheme)</code>はSVGをHTMLにインライン埋め込みした場合だけでなく、<code class="language-plaintext highlighter-rouge">&lt;img&gt;</code>参照した場合でも有効だ。ZennやNoteのブログ、Confluenceの社内Wiki、Notionのドキュメントでも同じ自動切替が動作する。</p>

<p>ただしConfluenceなど一部のCMSはSVGのインラインスタイル属性のみを許可し、<code class="language-plaintext highlighter-rouge">@media</code>を伴う<code class="language-plaintext highlighter-rouge">&lt;style&gt;</code>タグを除去するケースがある。その場合は素直にPNGをエクスポートしてアップロードする。</p>

<hr />

<h2 id="7-他ツールとの比較何を選ぶべきか">7. 他ツールとの比較：何を選ぶべきか</h2>

<p>技術系の図生成ツールは増え続けているが、Archifyの立ち位置は他とはっきり違う。</p>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>Archify</th>
      <th>Mermaid（公式）</th>
      <th>PlantUML</th>
      <th>diagrams.net</th>
      <th>Lucidchart</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ライセンス</td>
      <td>MIT</td>
      <td>MIT</td>
      <td>MIT</td>
      <td>Apache 2.0</td>
      <td>商用</td>
    </tr>
    <tr>
      <td>入力方式</td>
      <td>自然言語（Claude）</td>
      <td>Mermaid構文</td>
      <td>UML構文</td>
      <td>GUI/draw.io xml</td>
      <td>GUI</td>
    </tr>
    <tr>
      <td>出力形式</td>
      <td>単一HTML / PNG/JPEG/WebP/SVG</td>
      <td>SVG</td>
      <td>PNG/SVG</td>
      <td>PNG/SVG/PDF</td>
      <td>PNG/SVG/PDF</td>
    </tr>
    <tr>
      <td>テーマ切替</td>
      <td>UI内＋自動（OS）</td>
      <td>開発者が実装</td>
      <td>XMLで設定</td>
      <td>テーマ概念なし</td>
      <td>プロジェクト単位</td>
    </tr>
    <tr>
      <td>4×原生光栅化</td>
      <td>◎</td>
      <td>✕</td>
      <td>✕</td>
      <td>✕</td>
      <td>✕</td>
    </tr>
    <tr>
      <td>SVG双主題自持</td>
      <td>◎</td>
      <td>✕</td>
      <td>✕</td>
      <td>✕</td>
      <td>✕</td>
    </tr>
    <tr>
      <td>AI連携</td>
      <td>内蔵（Claude Skill）</td>
      <td>別途プロンプト</td>
      <td>別途プロンプト</td>
      <td>✕</td>
      <td>Lucid AI（有償）</td>
    </tr>
    <tr>
      <td>学習コスト</td>
      <td>ゼロ（自然言語）</td>
      <td>構文学習が必要</td>
      <td>構文学習が必要</td>
      <td>GUI操作</td>
      <td>GUI操作</td>
    </tr>
    <tr>
      <td>共有・配布</td>
      <td>HTML/PNG/SVG</td>
      <td>テキスト</td>
      <td>テキスト</td>
      <td>ファイル</td>
      <td>クラウドリンク</td>
    </tr>
    <tr>
      <td>GitHubスター</td>
      <td>213</td>
      <td>80,000以上</td>
      <td>13,000以上</td>
      <td>41,000以上</td>
      <td>–</td>
    </tr>
    <tr>
      <td>想定ユーザー</td>
      <td>Claudeユーザー全般</td>
      <td>開発者</td>
      <td>開発者</td>
      <td>一般</td>
      <td>一般</td>
    </tr>
  </tbody>
</table>

<h3 id="71-mermaidとの使い分け">7.1 Mermaidとの使い分け</h3>

<p>Mermaidは構文を覚えればテキストだけで再現可能で、Git管理にも向く。一方Archifyは「自然言語＋Claudeの判断」で図の美しさを稼ぐ。</p>

<p>技術ブログのフロー図を量産したいならMermaidが速い。プレゼン資料・営業資料・READMEのヒーロー画像といった「見た目で勝負したい」用途ならArchifyが圧勝だ。両方を並行して使う運用も現実的だろう。</p>

<h3 id="72-diagramsnetとの使い分け">7.2 diagrams.netとの使い分け</h3>

<p>diagrams.netは無料の汎用ドローツールで、AWS/Azure/GCPアイコンライブラリも充実している。ただし「マウスでクリック→配置」の手間がかかる。</p>

<p>Archifyは「手作業ゼロでそこそこの構成図が出る」のが強みで、図のためにマウス操作したくない開発者・PMに刺さる。ピクセル単位の調整が必要な場面ではdiagrams.netに軍配が上がる。</p>

<h3 id="73-lucidchartlucid-aiとの使い分け">7.3 Lucidchart/Lucid AIとの使い分け</h3>

<p>Lucidchartは企業向けの統合ダイアグラム製品で、Lucid AIで自然言語からの生成にも対応する。一方で月額課金が前提で、データはLucid社のクラウドに送信される。</p>

<p>Archifyは完全ローカル動作・無料・データ越境ゼロという3点で、規制業種・自社ホスト前提の組織にとって魅力的な代替手段になる。</p>

<hr />

<h2 id="8-インストールから最初の図まで">8. インストールから最初の図まで</h2>

<p>ArchifyのSetupは3パターンある。READMEの「快速上手」セクションに手順がある。</p>

<h3 id="81-claudeaiでの導入">8.1 Claude.aiでの導入</h3>

<p>Claude.aiユーザーは、ブラウザでArchifyをインストールできる。</p>

<ol>
  <li>リポジトリから<code class="language-plaintext highlighter-rouge">archify.zip</code>をダウンロード</li>
  <li>Claude.aiの<code class="language-plaintext highlighter-rouge">Settings → Capabilities → Skills</code>を開く</li>
  <li><code class="language-plaintext highlighter-rouge">+ Add</code>を押してzipをアップロード</li>
  <li>トグルをONにする</li>
</ol>

<p>これでClaudeとの全チャットでArchifyが使えるようになる。Claude Pro/Max/Team/Enterpriseのいずれかが必要だ。</p>

<h3 id="82-claude-code-cliでの導入">8.2 Claude Code CLIでの導入</h3>

<p>Claude Code利用者は、CLIから一発で導入できる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># グローバル（全プロジェクトで使える）</span>
unzip archify.zip <span class="nt">-d</span> ~/.claude/skills/

<span class="c"># あるいは特定プロジェクトのみ</span>
unzip archify.zip <span class="nt">-d</span> ./.claude/skills/
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">~/.claude/skills/archify/</code>が展開されればOKだ。Claude CodeセッションでArchifyのSKILLが自動的に読み込まれる。</p>

<h3 id="83-claudeai-projectsでの導入">8.3 Claude.ai Projectsでの導入</h3>

<p><code class="language-plaintext highlighter-rouge">archify.zip</code>をProject Knowledgeにアップロードする方法もある。特定プロジェクトの中だけでArchifyを使いたい場合に便利だ。</p>

<h3 id="84-最初のプロンプト">8.4 最初のプロンプト</h3>

<p>導入が済んだら、自然言語で構成を伝えれば図が出てくる。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>archify skill で次の構成のアーキテクチャ図を描いて：
- React フロントエンド
- Node.js / Express API
- PostgreSQL データベース
- Redis キャッシュ
- JWT 鉴权
</code></pre></div></div>

<p>Claudeがこれを受けてHTMLを生成する。ブラウザで開けば<kbd>T</kbd>でテーマ切替、<kbd>E</kbd>でExportメニューが開く。</p>

<h3 id="85-反復改善のサンプル">8.5 反復改善のサンプル</h3>

<p>生成後の改善は対話で行う。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>左のReactを2つに分けて、Web版とiOS/Android版にして
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>PostgreSQL を MySQL に変更して、Redis を ElastiCache 表記にして
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>鉴权のパスを玫红色で強調して、データベース呼び出しのパスは紫の点線で
</code></pre></div></div>

<p>このように細かい修正を言葉で重ねていける。完全に納得した状態でPNG/SVGをエクスポートすれば、ドキュメントや資料への組み込みが完了する。</p>

<hr />

<h2 id="9-運用パターン実プロジェクトでの活用例">9. 運用パターン：実プロジェクトでの活用例</h2>

<p>Archifyの実際の使い所を3つ紹介する。</p>

<h3 id="91-oss-readmeのヒーロー画像">9.1 OSS READMEのヒーロー画像</h3>

<p>GitHub READMEのトップに「サービスの全体像」を1枚絵で置くのは効果的だ。Archifyのv2.4 SVG出力なら、READMEに1枚貼るだけでダーク/ライト両対応になる。</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># my-awesome-service</span>

<span class="nt">&lt;p</span> <span class="na">align=</span><span class="s">"center"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">"docs/architecture.svg"</span> <span class="na">width=</span><span class="s">"800"</span> <span class="na">alt=</span><span class="s">"architecture"</span><span class="nt">&gt;</span>
<span class="nt">&lt;/p&gt;</span>

<span class="gu">## What is this?</span>

...
</code></pre></div></div>

<p>スターを稼ぎやすいOSSは「ヒーロー画像」と「機能GIF」が充実している。<span class="marker-pink">Archifyを使えばこれが片手間で作れるようになる</span>。</p>

<h3 id="92-rfc設計レビュードキュメント">9.2 RFC/設計レビュードキュメント</h3>

<p>社内設計レビューやRFC文書では「現状アーキテクチャ」「提案後アーキテクチャ」を並べて比較する場面が多い。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>archify で 2 枚描いて：
1. 現状: モノリス Web アプリ + 単一 PostgreSQL
2. 提案: 4 つのマイクロサービスに分割 + イベントバス + 専用 DB
</code></pre></div></div>

<p>提案が承認されたあとに採用版を「正本」として保存しておけば、新人オンボーディング資料にもそのまま流用できる。</p>

<h3 id="93-障害事後分析postmortem">9.3 障害事後分析（Postmortem）</h3>

<p>障害が起きた直後、Slackや専用チャンネルで「何が起きたか」を伝えるには時系列順のシーケンス図が効果的だ。Archifyのsequenceタイプを使えば数分で完成する。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>archify で sequence 描いて：
14:23 ユーザーがログイン
14:24 API Gateway がレート制限を超過
14:25 リトライ嵐が発生
14:27 Redis のメモリ使用率が95%を超過
14:28 認証セッションが書き込めずログインエラー多発
</code></pre></div></div>

<p>ポストモーテム会議で参加者全員の認識を揃えるのに役立つ。</p>

<hr />

<h2 id="10-ロードマップと制約">10. ロードマップと制約</h2>

<p>Archifyのv3.0計画はROADMAP.mdに記述されている。</p>

<h3 id="101-v30json-irの導入">10.1 v3.0：JSON IRの導入</h3>

<p>v3.0では<code class="language-plaintext highlighter-rouge">diagram.json</code>という中間表現（IR）の導入が予定されている。これにより：</p>

<ul>
  <li>Claudeが局所的に座標を修正しても無関係なコンポーネントが動かない</li>
  <li><code class="language-plaintext highlighter-rouge">git diff</code>で図の変更が見やすくなる</li>
  <li>同じIRから複数テーマで再レンダリングできる</li>
</ul>

<p>現状のArchifyは「HTML出力＝最終形」だったため、差分管理が難しいという課題があった。v3.0はこの構造的制約への回答だ。</p>

<h3 id="102-削除された機能not-planned">10.2 削除された機能（Not planned）</h3>

<p>READMEには「Mermaid自動解析路線は実験の結果削除した」と明記されている。理由は「Mermaidをパースして自動レイアウトしても、結局オリジナルのMermaidよりわずかに見栄えがよくなる程度で、Archifyの美学（Claudeの布局判断）と整合しなかった」とのことだ。</p>

<p><code class="language-plaintext highlighter-rouge">?exportScale=N</code>のような倍率パラメータ・色盲対応パレット・共有リンクといった機能もROADMAPから削除された。「機能数を増やすこと」より「中核体験の磨き込み」を優先する開発姿勢が伝わる。</p>

<h3 id="103-ブラウザ要件">10.3 ブラウザ要件</h3>

<table>
  <thead>
    <tr>
      <th>機能</th>
      <th>要件</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>図の表示</td>
      <td>主要全ブラウザ（Chrome/Safari/Firefox/Edge）</td>
    </tr>
    <tr>
      <td>PNG/JPEG出力</td>
      <td>主要全ブラウザ</td>
    </tr>
    <tr>
      <td>WebP出力</td>
      <td>canvasが<code class="language-plaintext highlighter-rouge">image/webp</code>をサポート（古いSafari不可）</td>
    </tr>
    <tr>
      <td>剪贴板コピー</td>
      <td>Chromium・Firefox 127+・Safari 16+</td>
    </tr>
    <tr>
      <td>印刷</td>
      <td>主要全ブラウザ（v2.2で印刷スタイル追加）</td>
    </tr>
  </tbody>
</table>

<h3 id="104-セキュリティと配布の透明性">10.4 セキュリティと配布の透明性</h3>

<p>ArchifyはCocoon-AI v1.0からのfork rewriteだ。READMEに「視覚デザインの功労は原作者に帰属」「両プロジェクトともMITライセンス」と明記されており、来歴の透明性が高い。</p>

<p>社内導入時のライセンス審査では「MIT・依存はGoogle Fonts経由のJetBrains Monoのみ・SKILL.mdは平文で読める」と説明できれば、多くの組織で承認が下りやすい。</p>

<hr />

<h2 id="まとめ">まとめ</h2>

<div class="conclusion-box"><strong>記事のまとめ</strong><ul><li>・<code>Archify</code>はzip配布のClaude Skillで、5種類の技術図を自然言語から単一HTMLで生成する。</li><li>・Architecture/Workflow/Sequence/Data Flow/Lifecycleの使い分けがREADMEで明示されている。</li><li>・4×原生光栅化でPNG/JPEG/WebPが高解像度、SVGは双主題自持でGitHub READMEに直貼り可能。</li><li>・<code>Cocoon-AI/architecture-diagram-generator</code> v1.0のfork rewrite v2.4で、視覚デザインは原作者に帰属。</li><li>・データ越境ゼロのローカル動作、商用ライセンス・SaaS登録・APIキー不要で導入5分で完結する。</li></ul></div>

<p>Archifyは「描けない人でも図が描ける」を本気で実現したClaude Skillだ。配布の手軽さ・出力の美しさ・対話で直せる体験が、技術ドキュメントの作成コストを根本的に下げる。Claude Codeを日常的に使うエンジニアにとって、入れておいて損はないSkillだ。</p>

<p>Claude Skillの設計思想全体については <a href="/explain/claude-skills-explained/">Claude Skillsとは何か：Anthropic公式が公開した拡張メカニズムを徹底解説</a> を、Claude Skillの作り方の哲学については <a href="/agent/mattpocock-skills-real-engineers-philosophy/">Matt Pocock氏が語る「現役エンジニアのためのClaude Skills設計哲学」</a> を併せて読んでほしい。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/tt-a1i/archify">tt-a1i/archify — GitHub</a></li>
  <li><a href="https://github.com/Cocoon-AI/architecture-diagram-generator">Cocoon-AI/architecture-diagram-generator — GitHub</a></li>
  <li><a href="https://support.claude.com/en/articles/12512180-using-skills-in-claude">Anthropic公式 — Using Skills in Claude</a></li>
</ul>

<!--
## 配信メモ
### X投稿フック案（120〜200文字、3案）
1. Claude Skill「Archify」が便利すぎ。自然言語で「React + Node + Postgres + Redis + AWS」と書くだけで、配色・配置・凡例まで整ったアーキテクチャ図が単一HTMLで出る。テーマ切替、4×原生光栅化PNG、SVG双主題自持まで完備。MIT。
2. ArchifyのSVG出力はGitHub READMEに貼ると、読者のダーク/ライトモードに合わせて自動で色が切り替わる。@media (prefers-color-scheme) と CSS変数を内蔵。もう <picture> タグで PNG 2枚運用する必要がない。
3. Archifyは「描けない人でも図が描ける」を本気で実現したClaude Skill。Architecture/Workflow/Sequence/Data Flow/Lifecycleの5種類、すべて自然言語で生成。Cocoon-AIのfork rewrite v2.4。記事で詳しく解説した。
### はてブ用CTA
自然言語で構成を説明するだけで、PNG/SVGまで揃ったアーキテクチャ図が出るClaude Skill。
### 内部リンク提案（公開後にこの記事へリンクすべき既存記事）
- /explain/claude-code-complete-guide-2026/ — Claude Code文脈で
- /explain/claude-skills-explained/ — Skill解説の流れで
- /agent/mattpocock-skills-real-engineers-philosophy/ — Skill哲学の流れで
### 想定検索クエリ
- archify claude skill
- claude skill アーキテクチャ図
- claude code 図生成
- アーキテクチャ図 自動生成
- claude skill おすすめ
-->]]></content><author><name></name></author><category term="agent" /><category term="claude-code" /><category term="claude-skills" /><category term="agent" /><category term="diagram" /><category term="architecture" /><category term="svg" /><category term="oss" /><summary type="html"><![CDATA[ArchifyはClaude Skillとして配布されるアーキテクチャ図ジェネレータ。自然言語の説明からArchitecture/Workflow/Sequence/Data Flow/Lifecycleの5種類を単一HTMLで生成し、4×原生光栅化でPNG/JPEG/WebP、SVGは双主題自持で出力。Cocoon-AIのfork rewrite v2.4の仕組みと運用を解説する。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/fallback_archify-claude-skill-architecture-diagram.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/fallback_archify-claude-skill-architecture-diagram.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ollama 0.24でOpenAI Codex CLIがローカルLLMで動く：API課金もレート制限もない開発体験</title><link href="https://ai-heartland.com/llm/ollama-codex-cli-local-llm/" rel="alternate" type="text/html" title="Ollama 0.24でOpenAI Codex CLIがローカルLLMで動く：API課金もレート制限もない開発体験" /><published>2026-05-16T10:00:00+09:00</published><updated>2026-05-16T10:00:00+09:00</updated><id>https://ai-heartland.com/llm/ollama-codex-cli-local-llm</id><content type="html" xml:base="https://ai-heartland.com/llm/ollama-codex-cli-local-llm/"><![CDATA[<p>OpenAIのCodex CLIをローカルOSSモデルで動かす——この組合せは1月から実験的に可能だったが、2026年5月14日に公開された<strong><a href="https://github.com/ollama/ollama/releases/tag/v0.24.0">Ollama v0.24.0</a></strong> で公式機能として完全に統合された。<code class="language-plaintext highlighter-rouge">ollama launch codex</code> 一発でCodex CLIがローカルLLMバックエンドで立ち上がり、<code class="language-plaintext highlighter-rouge">ollama launch codex-app</code> でデスクトップ版Codex Appもそのまま起動する。OpenAIのコーディングエージェントが、自分のMacのGPUで、レート制限なし、API課金なしで無限に動く時代が来た。</p>

<blockquote>
  <p>ローカルLLM全般の選び方とOllama／LM Studio／GPT4Allの比較は <a href="/explain/local-llm-tools-guide-2026/">ローカルLLMとは？2026年版ツール比較——Ollama・Lemonade・LM Studio・GPT4Allの選び方</a> をご覧ください。</p>
</blockquote>

<div class="conclusion-box">

<strong>この記事のポイント</strong>
<ul>
<li>Ollama 0.24で <strong>「ollama launch codex」「ollama launch codex-app」</strong> が公式コマンドとして追加。Codex CLI／デスクトップAppの双方をローカルLLMバックエンドで一発起動できる</li>
<li>推奨は <strong>gpt-oss:20b（手元PC向け）／gpt-oss:120b（ハイエンドMac向け）／gpt-oss:120b-cloud（Ollama Cloud）</strong>。コンテキスト窓は64k以上が必須で、Codex特有のエージェントループに耐えるモデルが要る</li>
<li><strong>config.tomlプロファイル</strong> で複数モデルを切替可能。`codex --profile ollama-launch` のようにプロファイル指定すれば、ローカル20B／クラウド120B／OpenAI公式を1コマンドで切り替えられる</li>
<li><strong>API課金もレート制限もない</strong>のでエージェント系の重い反復処理が現実的なコストで回せる。コードがOpenAIに送られない点も社外秘リポジトリで効く</li>
</ul>

</div>

<h2 id="1-何が起きたのかollama-024でcodex統合が完成">1. 何が起きたのか：Ollama 0.24でCodex統合が完成</h2>

<p><span class="marker-yellow">Ollama 0.24は『Codexをローカルで動かす』というユーザー要望に対する公式回答だ。</span>2026年1月15日のOllama公式ブログ「OpenAI Codex with Ollama」で <code class="language-plaintext highlighter-rouge">ollama launch codex</code> が初登場し、5月14日のv0.24.0でデスクトップ版Codex Appを起動する <code class="language-plaintext highlighter-rouge">ollama launch codex-app</code> まで追加された。これでCLI・デスクトップの両系統が <code class="language-plaintext highlighter-rouge">ollama launch …</code> ファミリーに揃った形になる。</p>

<p>技術的に何が新しいかというと、実は<strong>Ollama自体は以前から <code class="language-plaintext highlighter-rouge">http://localhost:11434/v1</code> でOpenAI互換APIを提供していた</strong>。だからCodex CLI側の <code class="language-plaintext highlighter-rouge">--oss</code> フラグや <code class="language-plaintext highlighter-rouge">OPENAI_BASE_URL</code> 環境変数を手動で設定すれば、技術的にはローカル接続できていた。今回の変更は「セットアップの摩擦を消す」レイヤーで、具体的には次の作業を <code class="language-plaintext highlighter-rouge">ollama launch codex</code> が肩代わりする。</p>

<ol>
  <li>Codex CLIがインストールされているかチェック（なければ案内）</li>
  <li>Ollama側で推奨モデル（デフォルトはgpt-oss:20b）が落ちているかチェックし、なければpull</li>
  <li>Codex CLIの <code class="language-plaintext highlighter-rouge">~/.codex/config.toml</code> に <code class="language-plaintext highlighter-rouge">model_providers.ollama-launch</code> と <code class="language-plaintext highlighter-rouge">profiles.ollama-launch</code> を自動追記</li>
  <li>コンテキスト窓を64k以上に設定（gpt-ossは128kまで対応）</li>
  <li>プロファイル <code class="language-plaintext highlighter-rouge">--profile ollama-launch</code> 指定でcodexプロセスを起動</li>
</ol>

<p>これまで「ローカル開発でCodexを使いたい」と思った人が30分かけてやっていた作業が、コマンド1発に圧縮された。<code class="language-plaintext highlighter-rouge">ollama launch</code> ファミリーはClaude Code・Codex・Droid・OpenCodeなど主要エージェントCLIをカバーする方向で広がっていて、Ollamaが「ローカルLLMコーディングのハブ」を狙っているのが見える。</p>

<div class="point-box">

<strong>Ollama 0.24のCodex関連新機能まとめ</strong>

<ul>
<li><strong>ollama launch codex</strong>：Codex CLIをローカルLLMバックエンドで起動。config.toml自動生成、モデル自動pull、プロファイル登録まで一括</li>
<li><strong>ollama launch codex-app</strong>：OpenAI公式のCodex App（デスクトップGUI）を起動。組み込みブラウザでローカルサーバを確認しながらコメント注釈で修正指示できる</li>
<li><strong>--restore オプション</strong>：以前のセッション設定を復元してCodex Appを起動</li>
<li><strong>worktree／git統合</strong>：Codex App内で複数のCodexスレッドを並列に走らせ、git worktree単位で作業を分離できる</li>
<li><strong>MLXサンプラ最適化</strong>：Apple Silicon上でのトークン生成品質が改善され、Mシリーズ実機のレスポンスが軽くなった</li>
</ul>

</div>

<h2 id="2-openai-codex-cliとは何かターミナルで動くopenai公式エージェント">2. OpenAI Codex CLIとは何か：ターミナルで動くOpenAI公式エージェント</h2>

<p>ローカル化の前提として、<strong><a href="https://github.com/openai/codex">OpenAI Codex CLI</a></strong> 自体を簡単におさらいしておく。<code class="language-plaintext highlighter-rouge">@openai/codex</code> パッケージとしてnpm（Homebrewも可）で配布されている、Rust実装・Apache-2.0ライセンスの公式コーディングエージェントだ。2026年5月時点で <code class="language-plaintext highlighter-rouge">0.130.0</code> 系が安定版で、レポジトリ説明には “Codex CLI is a coding agent from OpenAI that runs locally on your computer.” と明記されている。</p>

<p>Codex CLIの位置づけは「ターミナルで動くChatGPT Codex」に近い。ファイル読み書き、シェル実行、Gitオペレーション、ブラウザ確認といったツールを呼びながら、コードベースに対して自律的にタスクを進める。Claude Codeに対するOpenAI側のカウンターパートで、設計思想も近い：エディタ非依存、ターミナル中心、エージェントループ前提。</p>

<p>認証方式は3系統ある：</p>

<ul>
  <li><strong>ChatGPT契約でのサインイン</strong>：Plus／Pro／Business／Edu／Enterpriseユーザーは <code class="language-plaintext highlighter-rouge">codex</code> 起動時に「Sign in with ChatGPT」でログイン可能。クォータはChatGPT側のメッセージ枠を消費</li>
  <li><strong>OpenAI APIキー</strong>：<code class="language-plaintext highlighter-rouge">OPENAI_API_KEY</code> を環境変数に入れる従来方式。トークン課金</li>
  <li><strong>OSSモード（今回の本題）</strong>：<code class="language-plaintext highlighter-rouge">codex --oss</code> または <code class="language-plaintext highlighter-rouge">--profile &lt;ollama-profile&gt;</code> でローカル／OSSプロバイダ接続。<strong>課金なし、レート制限なし</strong></li>
</ul>

<p><code class="language-plaintext highlighter-rouge">--oss</code> の存在自体は2026年1月のOllama公式ブログ「OpenAI Codex with Ollama」で公式機能化され、Codex CLI側にもサポートが入った。Codex公式ドキュメントにも <code class="language-plaintext highlighter-rouge">--oss</code> と <code class="language-plaintext highlighter-rouge">-m gpt-oss:20b</code> の例が掲載されている。</p>

<h2 id="3-アーキテクチャcodex-cliとollamaの接続レイヤー">3. アーキテクチャ：Codex CLIとOllamaの接続レイヤー</h2>

<p>実体としては、Codex CLIがHTTPクライアント、OllamaがOpenAI互換のHTTPサーバとして動く構成だ。Codex CLIはOpenAI API互換のリクエスト（<code class="language-plaintext highlighter-rouge">/v1/chat/completions</code> 風のエンドポイント）を <code class="language-plaintext highlighter-rouge">http://localhost:11434/v1</code> に投げ、Ollamaがそれを自分のローカルモデル（gpt-oss:20bなど）にルーティングしてストリーミングレスポンスを返す。</p>

<div class="mermaid">
graph TD
    A["ユーザー: codex --profile ollama-launch"] --&gt;|起動| B["Codex CLI<br />Rust製エージェント"]
    B --&gt;|プロンプト＋ツール定義| C["OpenAI互換HTTP<br />localhost:11434/v1"]
    C --&gt; D["Ollama Server<br />v0.24.0"]
    D --&gt;|モデル選択| E["gpt-oss:20b<br />または gpt-oss:120b"]
    E --&gt;|推論結果| D
    D --&gt;|ストリーミング応答| C
    C --&gt; B
    B --&gt;|ツール実行| F["ファイル読書<br />シェル実行<br />Git操作"]
    F --&gt;|結果| B
    B --&gt;|次のターン| C
    style B fill:#dbeafe
    style D fill:#fef3c7
    style E fill:#fce7f3
</div>

<p>この構造のキモは、<strong>Codex CLI側はOllamaを「ただのOpenAIサーバ」として扱っている</strong>こと。Codex CLIから見ると <code class="language-plaintext highlighter-rouge">api.openai.com</code> と <code class="language-plaintext highlighter-rouge">localhost:11434</code> の区別はベースURLの違いでしかなく、エージェントループ・ツール実行・コンテキスト管理は完全に同一のコードパスで走る。クラウドCodexで磨かれたエージェント実装の利得が、そのままローカルでも享受できる設計だ。</p>

<p>注意点は2つ。1つ目は<span class="marker-yellow">コンテキスト窓の要件</span>で、Codexは1ターンあたりエージェントの思考・ツール出力・差分パッチを大量に積むので、<strong>64k以上のコンテキスト窓を持つモデル必須</strong>。gpt-oss:20b／120b、Qwen3 Coder、GLM-5.1、Kimi K2.6あたりが候補になる。2つ目はツール呼出（function calling）への対応で、OllamaのTools APIに乗っているモデルでないとCodexのエージェントループが破綻する。<code class="language-plaintext highlighter-rouge">ollama show &lt;model&gt;</code> で <code class="language-plaintext highlighter-rouge">Tools: yes</code> を確認するのが安全だ。</p>

<p>ローカルLLMの推論バックエンド自体に関しては、Ollama単体だけでなく <a href="/llm/distributed-llama/">Distributed Llama</a> のような分散推論や <a href="/llm/vllm-project-vllm/">vLLM</a> の本番向け実装も併用が効く。Codex CLIから見るとどれも「OpenAI互換APIを話すサーバ」なので、リソースが余っているマシンを束ねるなら分散推論側を選ぶ手もある。</p>

<h2 id="4-セットアップ5分で動かす最短手順">4. セットアップ：5分で動かす最短手順</h2>

<p>最短手順は「Ollama 0.24以上を入れる→Codex CLIを入れる→<code class="language-plaintext highlighter-rouge">ollama launch codex</code> を打つ」の3段階だ。それぞれ詳しく見ていく。</p>

<h3 id="41-ollama-0240以上をインストール">4.1 Ollama 0.24.0以上をインストール</h3>

<p>macOS／Linux／Windows公式バイナリが用意されている。Macなら <code class="language-plaintext highlighter-rouge">brew install ollama</code> でも入る。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 公式インストーラ（macOS / Linux）</span>
curl <span class="nt">-fsSL</span> https://ollama.com/install.sh | sh

<span class="c"># バージョン確認（0.24.0以上であること）</span>
ollama <span class="nt">--version</span>
<span class="c"># =&gt; ollama version is 0.24.0</span>

<span class="c"># Ollamaサーバが動いていることを確認</span>
ollama serve &amp;
curl <span class="nt">-s</span> http://localhost:11434/api/tags | <span class="nb">head</span> <span class="nt">-c</span> 200
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">ollama launch</code> サブコマンドが認識されない場合はバージョンが古い。<code class="language-plaintext highlighter-rouge">ollama update</code> または再インストールでv0.24.0以上にする。Brewユーザーは <code class="language-plaintext highlighter-rouge">brew upgrade ollama</code> だ。</p>

<h3 id="42-openai-codex-cliをインストール">4.2 OpenAI Codex CLIをインストール</h3>

<p>Codex CLIはNode.jsで配布されている。Node 18以上が必要。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># npm経由（推奨）</span>
npm <span class="nb">install</span> <span class="nt">-g</span> @openai/codex

<span class="c"># Homebrew（macOS）</span>
brew <span class="nb">install</span> <span class="nt">--cask</span> openai-codex-cli

<span class="c"># バージョン確認（0.130.0以上が望ましい）</span>
codex <span class="nt">--version</span>
</code></pre></div></div>

<p>Homebrewの場合は管理者権限不要で <code class="language-plaintext highlighter-rouge">~/.codex/</code> 配下に設定が置かれる。Windowsの場合はScoopまたは公式インストーラを使う。<code class="language-plaintext highlighter-rouge">codex --version</code> が通れば準備完了だ。</p>

<h3 id="43-ollama-launch-codexで起動">4.3 ollama launch codexで起動</h3>

<p>ここからが本題。<strong>1コマンドでCodex CLIがgpt-oss:20bバックエンドで立ち上がる</strong>。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># デフォルト構成で起動（gpt-oss:20b、64kコンテキスト）</span>
ollama launch codex

<span class="c"># 初回はモデル自動pullが走る（gpt-oss:20bで約13GB）</span>
<span class="c"># pull完了後、Codex CLIが対話モードで起動する</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">ollama launch codex</code> の実行で何が起きているかを順番に追うと：</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">~/.codex/config.toml</code> がなければ作成し、ollama-launchプロファイルを追記</li>
  <li><code class="language-plaintext highlighter-rouge">gpt-oss:20b</code> が未取得なら <code class="language-plaintext highlighter-rouge">ollama pull gpt-oss:20b</code> を内部実行</li>
  <li>Ollamaサーバが起動していなければバックグラウンドで起動</li>
  <li><code class="language-plaintext highlighter-rouge">codex --profile ollama-launch</code> 相当のコマンドでCodex CLIを起動</li>
</ol>

<p>起動後はChatGPT版Codexと同じUI／キーバインドで対話できる。差分はモデルが手元のマシンで動いていることだけだ。<strong>ファイル編集・シェル実行・Git操作などツール呼出も同じように使える</strong>ので、<code class="language-plaintext highlighter-rouge">--oss</code> 環境下でも素のエージェント体験が損なわれない。</p>

<h3 id="44-別モデルへの切替gpt-oss120bやcloud版">4.4 別モデルへの切替：gpt-oss:120bやCloud版</h3>

<p>ハイエンドMacや96GB以上のメモリを積んだLinuxマシンなら、120Bモデルが現実的に動く。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># gpt-oss:120b（ローカル実行、約65GB必要）</span>
ollama launch codex <span class="nt">--model</span> gpt-oss:120b

<span class="c"># gpt-oss:120b-cloud（Ollama Cloud経由、課金あり）</span>
ollama launch codex <span class="nt">--model</span> gpt-oss:120b-cloud

<span class="c"># 既存セッションを復元</span>
ollama launch codex <span class="nt">--restore</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">--model</code> フラグは <code class="language-plaintext highlighter-rouge">ollama launch codex</code> 系の共通オプション。Cloud版は手元のリソースを使わず、Ollama側のクラウド推論を使う構成で、課金は発生するがレート制限はOpenAI APIより緩やか。「とりあえず120Bを試してから判断したい」フェーズで便利だ。</p>

<h2 id="5-configtomlで複数モデルをプロファイル管理する">5. config.tomlで複数モデルをプロファイル管理する</h2>

<p>実運用では「軽い修正は20B、重い設計レビューは120Bクラウド、本番デプロイ直前のレビューはGPT-5公式」のようにモデルを使い分けたい。Codex CLIはこれを <strong>プロファイル</strong> という形でサポートしている。</p>

<p><code class="language-plaintext highlighter-rouge">~/.codex/config.toml</code> の構造はこうなる：</p>

<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Ollama接続定義（base_urlが11434なのがポイント）</span>
<span class="k">[</span><span class="n">model_providers</span><span class="k">.</span><span class="n">ollama-launch</span><span class="k">]</span>
<span class="n">name</span> <span class="o">=</span><span class="w"> </span><span class="s">"Ollama"</span>
<span class="n">base_url</span> <span class="o">=</span><span class="w"> </span><span class="s">"http://localhost:11434/v1"</span>

<span class="c"># プロファイル1: ローカル20B（普段使い）</span>
<span class="k">[</span><span class="n">profiles</span><span class="k">.</span><span class="n">ollama-launch</span><span class="k">]</span>
<span class="n">model</span> <span class="o">=</span><span class="w"> </span><span class="s">"gpt-oss:20b"</span>
<span class="n">model_provider</span> <span class="o">=</span><span class="w"> </span><span class="s">"ollama-launch"</span>

<span class="c"># プロファイル2: ローカル120B（M4 Max級限定）</span>
<span class="k">[</span><span class="n">profiles</span><span class="k">.</span><span class="n">ollama-120b</span><span class="k">]</span>
<span class="n">model</span> <span class="o">=</span><span class="w"> </span><span class="s">"gpt-oss:120b"</span>
<span class="n">model_provider</span> <span class="o">=</span><span class="w"> </span><span class="s">"ollama-launch"</span>

<span class="c"># プロファイル3: クラウド120B（外部送信OKな案件）</span>
<span class="k">[</span><span class="n">profiles</span><span class="k">.</span><span class="n">ollama-cloud</span><span class="k">]</span>
<span class="n">model</span> <span class="o">=</span><span class="w"> </span><span class="s">"gpt-oss:120b-cloud"</span>
<span class="n">model_provider</span> <span class="o">=</span><span class="w"> </span><span class="s">"ollama-launch"</span>

<span class="c"># プロファイル4: OpenAI公式（最終チェック用）</span>
<span class="k">[</span><span class="n">profiles</span><span class="k">.</span><span class="n">openai</span><span class="k">]</span>
<span class="n">model</span> <span class="o">=</span><span class="w"> </span><span class="s">"gpt-5"</span>
</code></pre></div></div>

<p>切替は単純で、<code class="language-plaintext highlighter-rouge">codex --profile &lt;名前&gt;</code> を打つだけ。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 軽量タスク</span>
codex <span class="nt">--profile</span> ollama-launch <span class="s2">"READMEの誤字を直して"</span>

<span class="c"># 重い設計レビュー（ローカル120B）</span>
codex <span class="nt">--profile</span> ollama-120b <span class="s2">"src/payments/配下のリファクタ案を出して"</span>

<span class="c"># 最終確認（OpenAI公式）</span>
codex <span class="nt">--profile</span> openai <span class="s2">"リリース前にこのPRを最終レビューして"</span>
</code></pre></div></div>

<p><span class="marker-pink">プロファイル運用の最大の利点は「コスト構造を意識しなくてよくなる」点だ。</span>普段は0円のローカル20Bで叩き、本当に必要な場面だけクラウドに切り替えれば、月額のAPI課金が劇的に減る。Codex CLI公式のヘビーユーザーがChatGPT Pro契約で月数千円〜数万円使う中、ローカル比率を上げれば実質コストを1/10以下にできる。</p>

<h2 id="6-対応モデルの選び方gpt-ossを中心にした使い分け">6. 対応モデルの選び方：gpt-ossを中心にした使い分け</h2>

<p>Ollama公式ブログがCodex向けに明示しているのは <code class="language-plaintext highlighter-rouge">gpt-oss:20b</code> <code class="language-plaintext highlighter-rouge">gpt-oss:120b</code> <code class="language-plaintext highlighter-rouge">gpt-oss:120b-cloud</code> の3つ。これに加えて、Ollamaライブラリ側にあるツール呼出（function calling）対応モデルなら、<code class="language-plaintext highlighter-rouge">config.toml</code> で指定するだけで動く。</p>

<p>主要候補の比較を以下にまとめる。</p>

<table>
  <thead>
    <tr>
      <th>モデル</th>
      <th>パラメータ</th>
      <th>量子化後VRAM目安</th>
      <th>コンテキスト</th>
      <th>ツール呼出</th>
      <th>Codexスコア感</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>gpt-oss:20b</strong></td>
      <td>20B (MoE)</td>
      <td>約13GB</td>
      <td>128k</td>
      <td>✅</td>
      <td>★★★（基準）</td>
    </tr>
    <tr>
      <td><strong>gpt-oss:120b</strong></td>
      <td>120B (MoE)</td>
      <td>約65GB</td>
      <td>128k</td>
      <td>✅</td>
      <td>★★★★</td>
    </tr>
    <tr>
      <td><strong>gpt-oss:120b-cloud</strong></td>
      <td>120B (MoE)</td>
      <td>クラウド</td>
      <td>128k</td>
      <td>✅</td>
      <td>★★★★</td>
    </tr>
    <tr>
      <td>Qwen3 Coder 30B</td>
      <td>30B</td>
      <td>約18GB</td>
      <td>256k</td>
      <td>✅</td>
      <td>★★★★（コード特化）</td>
    </tr>
    <tr>
      <td>GLM-5.1</td>
      <td>32B / 106B</td>
      <td>20〜60GB</td>
      <td>200k</td>
      <td>✅</td>
      <td>★★★</td>
    </tr>
    <tr>
      <td>Kimi K2.6</td>
      <td>1T (MoE)</td>
      <td>クラウド推奨</td>
      <td>256k</td>
      <td>✅</td>
      <td>★★★★（巨大MoE）</td>
    </tr>
    <tr>
      <td>DeepSeek V3 Coder</td>
      <td>685B (MoE)</td>
      <td>クラウド</td>
      <td>128k</td>
      <td>✅</td>
      <td>★★★★</td>
    </tr>
    <tr>
      <td>Llama 3.3 70B</td>
      <td>70B</td>
      <td>約40GB</td>
      <td>128k</td>
      <td>△</td>
      <td>★★</td>
    </tr>
    <tr>
      <td>Gemma3 8B</td>
      <td>8B</td>
      <td>約5GB</td>
      <td>128k</td>
      <td>△</td>
      <td>★（軽すぎ）</td>
    </tr>
  </tbody>
</table>

<p>「Codexスコア感」は筆者が同一プロンプト（軽量リファクタ＋PR作成タスク）で試した主観評価で、ベンチマーク値ではない点に注意してほしい。<strong>結論としてはgpt-oss:20b／120bが「Codex特化チューン済み」感が一番強い</strong>。これはgpt-ossが2025年にOpenAI自身がオープン化したシリーズで、Codex CLIのプロンプト前提に最も自然に噛み合うためだ。</p>

<p>コード特化を狙うなら <strong>Qwen3 Coder 30B</strong> が強力で、長尺リファクタや既存コード読解で20Bよりよい結果が出ることもある。<strong>Kimi K2.6</strong> は1Tパラメータ級のMoEで、エージェント協調タスクで頭一つ抜けるが、ローカル実行は事実上不可能なのでクラウド経由になる（<a href="/llm/kimi-k2-6-agent-swarm/">Kimi K2.6エージェントスワーム解説</a>）。<strong>Gemma3 8B</strong> はコンテキストは128kあるが、エージェントループの自己修正能力が低くCodex用途には不向きだ。</p>

<div class="box-tip">
  <p><strong>初期セットアップで失敗しにくいパス</strong></p>

  <ol>
    <li>まずgpt-oss:20bで <code class="language-plaintext highlighter-rouge">ollama launch codex</code> を試す</li>
    <li>自分のマシンでGPU余裕があるか確認（<code class="language-plaintext highlighter-rouge">ollama ps</code> で稼働モデルとメモリ使用量が見える）</li>
    <li>メモリに余裕があれば <code class="language-plaintext highlighter-rouge">--model gpt-oss:120b</code> に上げる</li>
    <li>それでも不足ならconfig.tomlにOllama Cloud版を追加してプロファイル切り替え</li>
    <li>特定タスクで足りなくなったらOpenAI公式モデル（gpt-5など）プロファイルを追加</li>
  </ol>

  <p>ローカル→クラウドへのスケールアップが連続的なので、最初から完璧を狙わなくていい。</p>
</div>

<h2 id="7-codex-appデスクトップ版も同時に進化した">7. Codex App（デスクトップ版）も同時に進化した</h2>

<p><code class="language-plaintext highlighter-rouge">ollama launch codex-app</code> で起動するのが、OpenAI公式の<strong>Codex App（デスクトップ版）</strong>。CLIとは別系統のGUI体験で、v0.24.0のメイン目玉だ。</p>

<p>Codex Appの主な機能：</p>

<ul>
  <li><strong>組み込みブラウザ</strong>：開発中のローカルサーバ（<code class="language-plaintext highlighter-rouge">http://localhost:3000</code> など）をApp内のブラウザで直接開ける。表示されたページを<strong>直接クリック・注釈してCodexに修正指示が出せる</strong>。Figmaのコメント機能をコードレビューに持ち込んだような体験</li>
  <li><strong>レビューモード</strong>：差分を見ながらCodexにコメント形式でフィードバックを返せる。「ここはもう少しシンプルに」「このloopは並列化して」など、IDEから出ずに修正サイクルが回る</li>
  <li><strong>Worktree統合</strong>：複数のCodexスレッドを並列に走らせ、git worktreeで作業ディレクトリを分離。1つのリポで「PRレビュー」「新機能実装」「バグ修正」を同時並行できる</li>
  <li><strong>Git連携</strong>：コミット作成、ブランチ切替、PR作成までApp内で完結</li>
  <li><strong>–restore で復元</strong>：前回のセッション（開いていたスレッド、選択モデルなど）をそのまま戻せる</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Codex Appをローカルバックエンドで起動</span>
ollama launch codex-app

<span class="c"># 前回セッションを復元</span>
ollama launch codex-app <span class="nt">--restore</span>
</code></pre></div></div>

<p>注意したいのは、Codex AppのバックエンドはCLIと同じくOpenAI互換API経由なので、<strong>ollamaで起動した時点で全推論がローカルLLMに切り替わる</strong>。クラウドCodex Appと同じUIなのにモデルがgpt-ossで動いている状態だ。デザイン上は『SwitchをOFFにする』みたいに見えるが、内部的にはbase URLとモデル名の差し替えだけが起きている。</p>

<p>Codex AppはCodex CLIの「上位互換」ではなく「並列の選択肢」と捉えるのがよい。ターミナル中心の開発者（vim／tmux／zsh派）はCLI、ブラウザでのUIプレビューが重要なフロントエンド開発者はAppという棲み分けになる。</p>

<h2 id="8-ローカルcodexのリアルな性能と限界">8. ローカルCodexのリアルな性能と限界</h2>

<p>ローカルLLMで本当に開発作業が回るのか——これは現実的に気になる点だ。筆者の検証環境（M4 Max 64GB、gpt-oss:20b）で同等タスクをChatGPT Codex（gpt-5）とローカルで比較した感触は次の通り。</p>

<p><strong>ローカルgpt-oss:20bが安心して任せられる作業</strong></p>

<ul>
  <li>5〜30行程度のバグ修正・型エラー解消</li>
  <li>READMEや日本語ドキュメントの整形・翻訳</li>
  <li>単体テスト追加（テンプレ的なケース）</li>
  <li>既存ヘルパー関数のリネーム・移動</li>
  <li>TypeScript／Python／Rust／Goの軽量〜中量リファクタ</li>
</ul>

<p><strong>ローカル20Bでは厳しく、120Bか公式モデルに切り替えたほうがよい作業</strong></p>

<ul>
  <li>数十ファイルを跨ぐ設計変更（依存関係を理解した変更）</li>
  <li>抽象クラス／DI／ジェネリクスを多用した複雑なリファクタ</li>
  <li>業務ロジックを推論で補完する系（仕様書から逆算した実装）</li>
  <li>パフォーマンスチューニング（ボトルネックの推定）</li>
  <li>セキュリティ監査的なレビュー</li>
</ul>

<p>体感では、<strong>「diffが30行以内、影響範囲が3ファイル以内」のタスクなら20Bでクラウド並の体験</strong>になる。エージェントループは1〜2回で収束し、ツール呼出も安定する。逆に「20ファイル横断のリファクタ」のような大物は20Bだとループが10回以上回ってもまとまらず、結局120Bやクラウドに切り替えることになる。</p>

<p><span class="marker-yellow">この『20Bで足りる8割、足りない2割』を切り分けて使うとローカルCodexは本当に強い。</span>すべてをローカルでやろうとすると挫折するし、すべてをクラウドでやると課金が膨らむ。プロファイル切り替えで境界を意識しながら使うのがリアルな運用感だ。</p>

<h2 id="9-クラウドcodexとローカルcodexの本質的な違い">9. クラウドCodexとローカルCodexの本質的な違い</h2>

<p>ローカル化は単なる「同じものをタダで」ではない。実は<strong>できることの内訳が変わる</strong>。整理しておく。</p>

<table>
  <thead>
    <tr>
      <th>軸</th>
      <th>クラウドCodex（gpt-5）</th>
      <th>ローカルCodex（gpt-oss:20b）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>課金</strong></td>
      <td>トークン課金 or ChatGPT契約</td>
      <td>$0</td>
    </tr>
    <tr>
      <td><strong>レート制限</strong></td>
      <td>あり（プランによる）</td>
      <td>なし</td>
    </tr>
    <tr>
      <td><strong>モデル品質</strong></td>
      <td>最高水準</td>
      <td>★★★（実用十分）</td>
    </tr>
    <tr>
      <td><strong>コード送信先</strong></td>
      <td>OpenAIサーバ</td>
      <td>端末内のみ</td>
    </tr>
    <tr>
      <td><strong>オフライン動作</strong></td>
      <td>✕</td>
      <td>✅</td>
    </tr>
    <tr>
      <td><strong>コンテキスト窓</strong></td>
      <td>数十万〜数百万</td>
      <td>128k</td>
    </tr>
    <tr>
      <td><strong>応答速度</strong></td>
      <td>API遅延あり</td>
      <td>GPU依存（M4 Maxで〜80 tok/s）</td>
    </tr>
    <tr>
      <td><strong>長時間タスク</strong></td>
      <td>課金が膨らむ</td>
      <td>電気代のみ</td>
    </tr>
    <tr>
      <td><strong>モデル更新</strong></td>
      <td>OpenAI側で勝手に更新</td>
      <td>自分で <code class="language-plaintext highlighter-rouge">ollama pull</code></td>
    </tr>
    <tr>
      <td><strong>エージェント反復</strong></td>
      <td>課金懸念で抑制しがち</td>
      <td>気にせず叩ける</td>
    </tr>
  </tbody>
</table>

<p>特筆すべきは右下の <strong>「エージェント反復を気にせず叩ける」</strong>。Codex CLIのようなエージェント系は、1タスクあたり10〜50回モデルを呼ぶことが普通で、クラウド経由だと「これでお金溶けるかな」というメンタルコストが地味に効く。ローカルなら無限に叩けるので、たとえば「今のPRを5パターンの観点でレビューさせて、それぞれの修正案を競争させる」みたいな贅沢な使い方が成立する。</p>

<p>逆にデメリットは2つ。1つ目はモデル品質の差で、コード理解の絶対値ではgpt-5に勝てない。2つ目はコンテキスト窓の差で、100万トークン超のリポジトリをまるごと食わせるような芸当はローカルでは無理だ。<strong>「速度・課金・プライバシー」を取るか、「品質・コンテキスト・最新性」を取るか</strong>のトレードオフになる。</p>

<h2 id="10-つまずきやすい点とトラブルシュート">10. つまずきやすい点とトラブルシュート</h2>

<p>実際に立ち上げる時に詰まりやすいポイントを並べておく。</p>

<h3 id="101-tools-noのモデルを選んでしまう">10.1 「Tools: no」のモデルを選んでしまう</h3>

<p>ツール呼出非対応のモデルを選ぶとCodexが起動直後にループする。<code class="language-plaintext highlighter-rouge">ollama show &lt;model&gt;</code> で <code class="language-plaintext highlighter-rouge">Tools: yes</code> を必ず確認する。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama show gpt-oss:20b | <span class="nb">grep</span> <span class="nt">-i</span> tools
<span class="c"># =&gt; Tools: yes  ← OK</span>
</code></pre></div></div>

<h3 id="102-コンテキスト窓不足">10.2 コンテキスト窓不足</h3>

<p>Codexはエージェントループでツール出力をどんどん積むため、64k未満ではすぐ詰まる。<code class="language-plaintext highlighter-rouge">ollama show</code> の <code class="language-plaintext highlighter-rouge">context length</code> を確認し、必要ならパラメータでオーバーライドする。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama show gpt-oss:20b
<span class="c"># context length: 131072  ← 128k OK</span>
</code></pre></div></div>

<h3 id="103-gpuメモリ不足で20bが激重">10.3 GPUメモリ不足で20Bが激重</h3>

<p><code class="language-plaintext highlighter-rouge">ollama ps</code> でモデルがCPU側にスピルアウトしていないか確認する。スピルすると体感速度が10〜30倍遅くなる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ollama ps
<span class="c"># NAME           SIZE      PROCESSOR    UNTIL</span>
<span class="c"># gpt-oss:20b    13 GB     100% GPU     ← OK</span>
<span class="c"># gpt-oss:20b    13 GB     50%/50% CPU/GPU  ← NG（メモリ不足）</span>
</code></pre></div></div>

<h3 id="104-codex-profile-が認識されない">10.4 codex –profile が認識されない</h3>

<p>Codex CLIのバージョンが古いと <code class="language-plaintext highlighter-rouge">--profile</code> フラグが効かない。<code class="language-plaintext highlighter-rouge">codex --version</code> で確認し、0.100系以上に上げる。</p>

<h3 id="105-base_urlにhttpが抜ける">10.5 base_urlにhttp://が抜ける</h3>

<p>config.tomlの <code class="language-plaintext highlighter-rouge">base_url</code> は <strong>スキーマ込みでフルURL</strong>。<code class="language-plaintext highlighter-rouge">localhost:11434/v1</code> ではなく <code class="language-plaintext highlighter-rouge">http://localhost:11434/v1</code> と書く必要がある。これは何度も踏まれる罠だ。</p>

<h2 id="11-これからのローカルコーディングエージェント">11. これからのローカルコーディングエージェント</h2>

<p>ローカルLLMでコーディングエージェントを回す——という選択肢は、2025年までは「ハッカーの趣味」だった。Ollama 0.24はこれを <strong>「ふつうの開発者の選択肢」</strong> に押し上げる更新で、特に次の3点が大きい。</p>

<ol>
  <li><strong>公式コマンド化</strong>：<code class="language-plaintext highlighter-rouge">ollama launch &lt;agent&gt;</code> という形で、OpenAI Codex／Claude Code／Droidなど主要CLIをワンコマンドで起動できる動線が整った</li>
  <li><strong>モデル品質の追いつき</strong>：gpt-oss:20b／120bがCodex前提のチューンに耐える品質に達したことで、「クラウドの劣化版」ではなく「役割の違う選択肢」として成立する</li>
  <li><strong>エージェント反復の経済性</strong>：課金心配なくループを回せることで、エージェントの強みである「試行錯誤の量」を最大化できる</li>
</ol>

<p>OpenAI／Anthropic／Googleの主要モデルは引き続き品質トップだが、その下に <strong>「課金とプライバシーを気にせず無限に叩ける選択肢」</strong> のレイヤーが厚くなった。仕事の8割をローカルで回し、2割だけクラウドに上げる——という運用が現実的になった意義は大きい。</p>

<blockquote>
  <p>Ollama本体の他ツール統合（Claude Code・OpenCode・Droid）まで含めた全体像は <a href="/explain/local-llm-tools-guide-2026/">ローカルLLMとは？2026年版ツール比較</a> で扱っている。LLM単体のアーキテクチャ・量子化・推論最適化に関心があるなら <a href="/llm/vllm-project-vllm/">vLLM高速推論完全ガイド</a> も参考になるはずだ。</p>
</blockquote>

<h2 id="まとめ">まとめ</h2>

<p>Ollama 0.24は <strong>「ollama launch codex」「ollama launch codex-app」</strong> という2つの公式コマンドで、OpenAI Codex CLIとデスクトップ版Codex Appの両方をローカルLLMバックエンドで起動できるようにした。gpt-oss:20b／120bを中心に、64k以上のコンテキスト窓と Tools API対応を満たすモデルなら何でもCodex経由で使える。</p>

<p>実運用ではconfig.tomlのプロファイル機能で「ローカル20B／ローカル120B／クラウド120B／OpenAI公式」を切り替えながら、軽量タスクは無料のローカル、重い設計判断はクラウドという二段運用が現実解だ。API課金もレート制限もない世界線でエージェントを叩けるようになったことの意味は大きく、特にエージェントループの反復回数を絞ってきた開発者にとっては実質的にトークン制約から解放される転機になる。</p>

<p>ローカルLLMでの開発体験は、ようやく「ハッカーの趣味」から「日常の選択肢」に変わった。手元のMacかLinuxに <code class="language-plaintext highlighter-rouge">ollama launch codex</code> を打って、5分後にあなたの専属コーディングエージェントが完全ローカルで動き始める——2026年中盤の標準的なワークフローはこの位置から始まる。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/ollama/ollama/releases">Ollama Releases (GitHub)</a> — v0.24.0リリースノート、<code class="language-plaintext highlighter-rouge">ollama launch codex-app</code>コマンドの公式記載</li>
  <li><a href="https://ollama.com/blog/codex">OpenAI Codex with Ollama (Ollama公式ブログ)</a> — gpt-oss:20b／120bでのCodex CLI実行、<code class="language-plaintext highlighter-rouge">codex --oss</code>フラグの初出</li>
  <li><a href="https://docs.ollama.com/integrations/codex">Codex CLI Integration Documentation (docs.ollama.com)</a> — config.tomlプロファイル設定の公式ドキュメント</li>
  <li><a href="https://github.com/openai/codex">OpenAI Codex Repository (GitHub)</a> — Codex CLI本体、v0.130系の仕様確認</li>
</ul>

<!--
配信メモ：
- X: 「Ollama 0.24でCodex CLIがローカルOSSモデルで動くようになった話」朝8時台JST配信、フック「API課金もレート制限もない」「ollama launch codex 一発」
- はてブ: タイトル前半に「Ollama 0.24」を出してテック層リーチ狙い
- 内部リンク提案：ローカルLLMピラー、vLLM、Kimi K2.6（同クラスタ）。Claude Code関連の更新時に逆リンクを検討
- 30日後にDataForSEOで「ollama codex」「codex ローカル」のSV／順位を再計測しseo_knowledge_graphに追記
-->]]></content><author><name></name></author><category term="llm" /><category term="llm" /><category term="ollama" /><category term="codex" /><category term="ローカルAI" /><category term="オープンソース" /><category term="local-llm" /><summary type="html"><![CDATA[Ollama 0.24で『ollama launch codex』『ollama launch codex-app』が追加され、OpenAI Codex CLIをローカルOSSモデルで実行可能に。gpt-oss・Qwen・GLMでの設定、config.tomlプロファイル、Codex Appデスクトップまでセットアップを完全解説。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/cover_ollama-codex-cli-local-llm.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/cover_ollama-codex-cli-local-llm.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Orca｜Claude Code・Codex並行実行のAIエージェントIDE、Worktree戦略を解剖</title><link href="https://ai-heartland.com/agent/orca-stablyai-parallel-agents-ide/" rel="alternate" type="text/html" title="Orca｜Claude Code・Codex並行実行のAIエージェントIDE、Worktree戦略を解剖" /><published>2026-05-16T09:00:00+09:00</published><updated>2026-05-16T09:00:00+09:00</updated><id>https://ai-heartland.com/agent/orca-stablyai-parallel-agents-ide</id><content type="html" xml:base="https://ai-heartland.com/agent/orca-stablyai-parallel-agents-ide/"><![CDATA[<p>「Claude Codeで新機能の実装を依頼している間に、Codexで別ブランチのバグ修正を回し、さらにGrokにリファクタリングを並走させたい」——AIエージェントを本気で量産モードにすると、必ず行き着くのが艦隊運用の問題だ。</p>

<p>ターミナルをtmuxで分割しても、ブランチを切り替えるたびにエージェントの作業状態が消える。VS CodeやCursorは1つのチャットセッションを前提にしており、複数エージェントの並列実行は設計の外にある。git stashの応酬で1日が終わる、というのが今の現実だ。</p>

<p><code class="language-plaintext highlighter-rouge">stablyai/orca</code>（★2561、2026年5月16日にv1.4.2リリース）はその閉塞感を真正面から壊しに来たOSSである。「100倍ビルダーのためのAIオーケストレーター」を掲げ、Claude Code・Codex・Grok・OpenCodeをそれぞれ独立のgit worktreeで並走させ、1つのIDEから艦隊全体を見渡す設計を採用した。</p>

<blockquote>
  <p>AIエージェント基盤の全体像と他フレームワーク比較は <a href="/explain/ai-agent-framework-comparison-2026/">AIエージェントフレームワーク比較ガイド2026</a> をご覧ください。</p>
</blockquote>

<div class="point-box"><strong>この記事のポイント</strong><ul><li>・Orcaは任意のCLIコーディングエージェントを並列worktreeで横断実行するAIエージェントIDE。</li><li>・Claude Code・Codex・Grok・Gemini・Cursorなど23以上のCLIエージェントを公式サポート対象として明記。</li><li>・各エージェントを独立したgit worktreeに紐づけ、スタッシュやブランチ切替の必要を排除。</li><li>・BYOK型でユーザーの既存サブスクリプションを使い、追加課金なしで艦隊運用が可能。</li><li>・iOS/Androidモバイルcompanionアプリで外出先からエージェントの進捗監視・指示出しが可能。</li><li>・MITライセンスのOSSで商用利用・改変・再配布が自由、Homebrew/AUR/直接ダウンロードの3経路でインストール。</li></ul></div>

<h2 id="1-orcaとは何かaiエージェント並行実行のためのide">1. Orcaとは何か：AIエージェント並行実行のためのIDE</h2>

<p>Orca公式リポジトリのキャッチコピーは「<strong>The AI Orchestrator for 100x builders.</strong>」だ。日本語では「100倍ビルダーのためのAIオーケストレーター」と訳されており、AIエージェントの艦隊運用を専門に扱うIDEとして位置付けられている。</p>

<p>従来のAIコーディングツールは「1人の開発者と1つのアシスタント」を前提に設計されてきた。GitHub Copilotはエディタに常駐し、Cursorはチャットを1つのウィンドウに表示する。CLIネイティブなClaude CodeやCodexも、ターミナル1セッションでの会話を中心としており、同時並列に複数エージェントを統制する仕組みは持っていない。</p>

<p>Orcaが解こうとする問題は別のレイヤにある。「複数のAIエージェントが同時に異なる機能を実装している状態を、1人の人間が監督する」という業務形態だ。</p>

<p>開発元のStably AIはサンフランシスコ拠点のAIスタートアップで、もともとはQAエージェント・テスト自動化を主力プロダクトに据えていた。Orcaはそのチームが「自社プロダクトの開発でAIエージェントを大量並列に走らせる」という社内ニーズから生まれた、ドッグフーディング由来のIDEである。</p>

<p>GitHubトピックには<code class="language-plaintext highlighter-rouge">ade</code>（agentic development environment）・<code class="language-plaintext highlighter-rouge">claude-code</code>・<code class="language-plaintext highlighter-rouge">codex</code>・<code class="language-plaintext highlighter-rouge">cursor-agent</code>・<code class="language-plaintext highlighter-rouge">ghostty</code>・<code class="language-plaintext highlighter-rouge">ide</code>・<code class="language-plaintext highlighter-rouge">mobile-app</code>・<code class="language-plaintext highlighter-rouge">opencode</code>・<code class="language-plaintext highlighter-rouge">orchestration</code>・<code class="language-plaintext highlighter-rouge">parallel-agents</code>・<code class="language-plaintext highlighter-rouge">pi</code>・<code class="language-plaintext highlighter-rouge">terminal</code>・<code class="language-plaintext highlighter-rouge">worktrees</code>が並んでおり、これらが設計の柱を構成している。</p>

<h3 id="orcaのプロジェクト基本情報">Orcaのプロジェクト基本情報</h3>

<table>
  <thead>
    <tr>
      <th>項目</th>
      <th>内容</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>リポジトリ</td>
      <td><a href="https://github.com/stablyai/orca">stablyai/orca</a></td>
    </tr>
    <tr>
      <td>スター数</td>
      <td>2,561（2026年5月16日時点）</td>
    </tr>
    <tr>
      <td>Fork数</td>
      <td>175</td>
    </tr>
    <tr>
      <td>主言語</td>
      <td>TypeScript</td>
    </tr>
    <tr>
      <td>形態</td>
      <td>Electronベースのデスクトップアプリ + モバイル companion</td>
    </tr>
    <tr>
      <td>公式サイト</td>
      <td><a href="https://onOrca.dev">onOrca.dev</a></td>
    </tr>
    <tr>
      <td>ライセンス</td>
      <td>MIT</td>
    </tr>
    <tr>
      <td>最新リリース</td>
      <td>v1.4.2（2026-05-16）</td>
    </tr>
    <tr>
      <td>対応プラットフォーム</td>
      <td>macOS / Windows / Linux / iOS / Android</td>
    </tr>
    <tr>
      <td>Discord</td>
      <td><a href="https://discord.gg/fzjDKHxv8Q">招待リンク</a></td>
    </tr>
  </tbody>
</table>

<p>スター数2,561は2026年3月17日のリポジトリ公開からわずか2ヶ月での到達で、AIエージェントIDEカテゴリでは異例の伸びを示している。リリースサイクルも公開2ヶ月でv1.4.2まで進んでおり、<code class="language-plaintext highlighter-rouge">v1.4.2-rc.7</code>から<code class="language-plaintext highlighter-rouge">rc.10</code>まで1日で4本のリリース候補を出すなど、開発速度は極めて速い。</p>

<p>公式README冒頭の文章は「<strong>Run Claude Code, Codex, Grok, or OpenCode side-by-side across repos — each in its own worktree, tracked in one place.</strong>」で、リポジトリをまたいだ並行実行と1か所での集中追跡という2つの軸が明示されている。</p>

<h2 id="2-並列ワークツリーアーキテクチャaiエージェントごとに隔離する設計">2. 並列ワークツリーアーキテクチャ：AIエージェントごとに隔離する設計</h2>

<p>Orcaの設計上もっとも重要な概念が「<strong>worktree-native</strong>」というポリシーだ。READMEの機能リスト最初の項目に「Every feature gets its own worktree. No stashing, no branch juggling. Spin up and switch instantly.」と明記されている。</p>

<p>gitのworktree機能を使い慣れていない読者向けに簡単に整理すると、<code class="language-plaintext highlighter-rouge">git worktree add</code>は1つのリポジトリから複数の作業ディレクトリを切り出す仕組みである。各worktreeは独立したブランチをチェックアウトでき、<code class="language-plaintext highlighter-rouge">git stash</code>で作業中の変更を退避させる必要がない。</p>

<p>Orcaはこのworktreeを各エージェントに1対1で割り当てる。たとえばClaude Codeで機能Aを実装中に、Codexに機能Bを依頼すれば、それぞれが別ディレクトリ・別ブランチで作業し、互いの変更が干渉しない。</p>

<h3 id="並列worktreeのデータフロー">並列worktreeのデータフロー</h3>

<div class="mermaid">
flowchart TD
    Repo["Git Repository"]
    WT1["Worktree A<br />feature/auth"]
    WT2["Worktree B<br />feature/billing"]
    WT3["Worktree C<br />fix/login-bug"]
    Agent1["Claude Code Agent"]
    Agent2["Codex Agent"]
    Agent3["Grok Agent"]
    OrcaUI["Orca IDE UI"]

    Repo --&gt; WT1
    Repo --&gt; WT2
    Repo --&gt; WT3
    WT1 --&gt; Agent1
    WT2 --&gt; Agent2
    WT3 --&gt; Agent3
    Agent1 --&gt; OrcaUI
    Agent2 --&gt; OrcaUI
    Agent3 --&gt; OrcaUI
    OrcaUI --&gt;|"diff review and commit"| Repo
</div>

<p>この構造の効能は3つある。</p>

<p><strong>第一に、エージェント間の状態汚染がゼロになる</strong>。Claude CodeがファイルAを編集中にCodexが同じファイルを編集しても、別worktreeに分離されているため衝突しない。最終的にPRを統合する段階で初めてgitのmergeが走る。</p>

<p><strong>第二に、<code class="language-plaintext highlighter-rouge">git stash</code>の運用負荷が消える</strong>。「いま動かしているClaude Codeのタスクを中断してCodexで別ブランチを試したい」という場面で、stashで一時退避→ブランチ切替→作業→戻す、という手数が一切要らない。新しいworktreeを切ってそこにCodexを置くだけだ。</p>

<p><strong>第三に、レビューワークフローが1か所に集約される</strong>。Orcaは各worktreeのdiffを内蔵diffビューアで表示し、AI生成コードをそのままレビュー・編集・コミットできる。GitHub PR/Issue/Actionsチェックも各worktreeに自動で紐づくため、レビュー画面とエディタを行き来する必要がない。</p>

<p>並列ワークフローの先行例としては、<code class="language-plaintext highlighter-rouge">agent-viewer</code>がtmuxとカンバンを使った類似アプローチを取っている。詳細は <a href="/agent/agent-viewer-claude-code-tmux-kanban/">agent-viewer完全解説：tmuxで動くClaude Codeエージェントをカンバンで管理するOSS</a> で扱った。</p>

<h2 id="3-対応するcliエージェント23種類とフレームワーク中立性">3. 対応するCLIエージェント23種類とフレームワーク中立性</h2>

<p>Orcaのもう一つの設計思想が「<strong>任意のCLIエージェントに対応</strong>」というスタンスだ。README本文には「Orca supports any CLI agent (not just this list).」と但し書きが入っており、明示リストは現時点でサポート確認済みのものを並べているにすぎない。</p>

<p>明示されている対応エージェントは以下の23種で、AIコーディング系のCLIをほぼ網羅している。</p>

<table>
  <thead>
    <tr>
      <th>カテゴリ</th>
      <th>エージェント</th>
      <th>提供元</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>大手LLM CLI</td>
      <td>Claude Code</td>
      <td>Anthropic</td>
    </tr>
    <tr>
      <td>大手LLM CLI</td>
      <td>Codex</td>
      <td>OpenAI</td>
    </tr>
    <tr>
      <td>大手LLM CLI</td>
      <td>Grok</td>
      <td>xAI</td>
    </tr>
    <tr>
      <td>大手LLM CLI</td>
      <td>Gemini CLI</td>
      <td>Google</td>
    </tr>
    <tr>
      <td>大手LLM CLI</td>
      <td>GitHub Copilot CLI</td>
      <td>GitHub</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>OpenCode</td>
      <td>opencode.ai</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Goose</td>
      <td>Block（旧Square）</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Continue CLI</td>
      <td>Continue.dev</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Cline CLI</td>
      <td>Cline</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Charm Crush</td>
      <td>charmbracelet</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Qwen Code</td>
      <td>Alibaba</td>
    </tr>
    <tr>
      <td>OSS / 独立系</td>
      <td>Mistral Vibe</td>
      <td>Mistral AI</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Cursor CLI</td>
      <td>Cursor</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Kiro CLI</td>
      <td>Kiro</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Kilocode</td>
      <td>Kilo-Org</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Augment Auggie</td>
      <td>Augment Code</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Codebuff</td>
      <td>Codebuff</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Amp</td>
      <td>Sourcegraph関連</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Droid</td>
      <td>Factory.ai</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Kimi Code</td>
      <td>Moonshot AI</td>
    </tr>
    <tr>
      <td>商用エディタ系</td>
      <td>Rovo Dev</td>
      <td>Atlassian</td>
    </tr>
    <tr>
      <td>推論ハーネス系</td>
      <td>Pi</td>
      <td>pi.dev</td>
    </tr>
    <tr>
      <td>推論ハーネス系</td>
      <td>Hermes Agent</td>
      <td>Nous Research</td>
    </tr>
    <tr>
      <td>自社系</td>
      <td>Autohand Code</td>
      <td>autohandai</td>
    </tr>
  </tbody>
</table>

<p>この対応幅の広さは「Orcaは特定のLLM・特定のエージェントの代理販売者にならない」という戦略の表れだ。BYOK（Bring Your Own Key）どころか、BYOS（Bring Your Own Subscription）で、ユーザーが既に契約しているサブスクリプションをそのまま使う。</p>

<h3 id="フレームワーク中立の効能">フレームワーク中立の効能</h3>

<p>商業的に見ると、これはStably AIにとって「LLMコストの転嫁先がない」という意味でもある。OpenAIやAnthropicの値上げに振り回されない代わりに、Orca自体の有料化はサブスクリプションの値段競争にならず、IDEとしての価値で勝負することになる。</p>

<p>ユーザー視点では、好きなエージェントを混在運用できる利点が大きい。「リファクタリングはClaude Codeが得意、コードベース全体の検索はGemini CLIが速い、Pythonの細かい修正はCodexが速い」といった得意不得意で使い分けることが、追加のラッパー実装なしに可能になる。</p>

<p>新興のスウォーム系フレームワーク（<code class="language-plaintext highlighter-rouge">ruflo</code>など）と組み合わせる場合も、Orca側がCLIプロセスを起動するだけなので衝突しない。ruflo自体のClaude Code/Codexネイティブ統合については <a href="/agent/ruflo-multi-agent-swarm-claude-code/">ruflo｜Claude Code/Codexにネイティブ統合する100エージェント・スウォーム基盤</a> で扱った。</p>

<h2 id="4-aiエージェントideのインストールとセットアップ">4. AIエージェントIDEのインストールとセットアップ</h2>

<p>Orcaのインストール経路はREADMEで3つ示されている。macOS/Linux/Windows共通のダウンロードと、macOSのHomebrew、Arch LinuxのAURだ。</p>

<h3 id="macosの場合homebrew-cask">macOSの場合（Homebrew Cask）</h3>

<p>Homebrewでのインストールは1コマンドで完了する。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Orcaのインストール（Homebrew Cask経由）</span>
brew <span class="nb">install</span> <span class="nt">--cask</span> stablyai/orca/orca

<span class="c"># バージョン確認</span>
orca <span class="nt">--version</span>

<span class="c"># アンインストールしたい場合</span>
brew uninstall <span class="nt">--cask</span> stablyai/orca/orca
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">brew install --cask</code>はGUIアプリケーション向けのHomebrew機能で、<code class="language-plaintext highlighter-rouge">stablyai/orca/orca</code>はサードパーティのCaskタップを指定する書式である。初回のみtap自体が自動で追加され、以降のアップデートは<code class="language-plaintext highlighter-rouge">brew upgrade</code>で一括管理できる。</p>

<h3 id="arch-linuxaur">Arch Linux（AUR）</h3>

<p>Arch系ディストリビューションではAURヘルパーの<code class="language-plaintext highlighter-rouge">yay</code>から2種類のパッケージが選べる。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># ビルド済みバイナリ（推奨：高速インストール）</span>
yay <span class="nt">-S</span> stably-orca-bin

<span class="c"># GitHubソースからローカルビルド</span>
yay <span class="nt">-S</span> stably-orca-git

<span class="c"># 起動</span>
orca
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">stably-orca-bin</code>はメンテナがCIで作ったバイナリをそのまま落とすため、ビルド時間がほぼゼロで完了する。<code class="language-plaintext highlighter-rouge">stably-orca-git</code>はソースをgit cloneしてElectronビルドを回すため、初回は10〜20分かかるが、最新コミットに追従できる。</p>

<h3 id="windows--linux一般">Windows / Linux（一般）</h3>

<p>Homebrew/AURを使わない環境では、onOrca.devまたはGitHub Releasesから直接インストーラーをダウンロードする。最新版はv1.4.2（2026-05-16リリース）で、macOSは<code class="language-plaintext highlighter-rouge">.dmg</code>、Windowsは<code class="language-plaintext highlighter-rouge">.exe</code>または<code class="language-plaintext highlighter-rouge">.msi</code>、Linuxは<code class="language-plaintext highlighter-rouge">.AppImage</code>/<code class="language-plaintext highlighter-rouge">.deb</code>/<code class="language-plaintext highlighter-rouge">.rpm</code>が配布されている。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux向けAppImageの手動セットアップ例</span>
wget https://github.com/stablyai/orca/releases/download/v1.4.2/orca-1.4.2.AppImage
<span class="nb">chmod</span> +x orca-1.4.2.AppImage
./orca-1.4.2.AppImage
</code></pre></div></div>

<h3 id="起動後の初期設定の流れ">起動後の初期設定の流れ</h3>

<p>Orcaは起動後にログインを要求しない。ローカルにインストール済みのCLIエージェント（<code class="language-plaintext highlighter-rouge">claude</code>、<code class="language-plaintext highlighter-rouge">codex</code>、<code class="language-plaintext highlighter-rouge">grok</code>、<code class="language-plaintext highlighter-rouge">gemini</code>など）を自動検出し、利用可能エージェント一覧として表示する。新規にエージェントを追加する場合は、対象CLIを各々の公式手順で先にインストールしておく。</p>

<p>その後、開きたいgitリポジトリをドラッグ&amp;ドロップまたは<code class="language-plaintext highlighter-rouge">File &gt; Open</code>で指定すると、Orca側で自動的にworktreeルートディレクトリを作成し、エージェントごとのタブを切る準備が整う。</p>

<h2 id="5-モバイルcompanionアプリとsshワークツリー">5. モバイルcompanionアプリとSSHワークツリー</h2>

<p>Orcaがほかのデスクトップ型エージェントIDEと一線を画す機能の2つが、モバイル companionアプリと、SSH経由のリモートworktreeだ。</p>

<h3 id="モバイルcompanionアプリ">モバイルcompanionアプリ</h3>

<p>iOS版は<a href="https://apps.apple.com/us/app/orca-ide/id6766130217">App Store</a>で配布されており、Android版はGitHub Releasesの<code class="language-plaintext highlighter-rouge">mobile-v*</code>タグからapkを直接ダウンロードする方式である。</p>

<p>モバイル側でできる操作は次の通り。</p>

<ul>
  <li>各worktreeの進捗監視（エージェントがアクティブか、入力待ちか、終了したか）</li>
  <li>エージェントへの追加指示送信（テキストプロンプトの追加投入）</li>
  <li>完了通知の受信（プッシュ通知でiOS/Androidに直接届く）</li>
  <li>簡易diffプレビュー（コード変更の差分をスマートフォンで確認）</li>
</ul>

<p>「Claude Codeに1時間かかるリファクタリングを依頼して外出する」「終わったらスマホで結果を確認、追加の指示を送る」というワークフローは、デスクトップだけで完結する従来のIDEでは実現できなかった。</p>

<h3 id="sshワークツリー">SSHワークツリー</h3>

<p>OrcaはローカルマシンにとどまらずSSH経由のリモートマシンでもエージェントを動かせる。具体的には、リモートサーバー上のgitリポジトリにworktreeを切り、リモート側で動いているClaude Code/CodexのCLIプロセスをOrcaから操作する。</p>

<p>このユースケースの典型は次の3つだ。</p>

<ol>
  <li><strong>強力なリモートGPU/CPUサーバーでビルドや学習を回しつつ、ローカルから指示する</strong>：手元のMacBookは軽く保ち、重い処理はリモートに集約。</li>
  <li><strong>チーム共有の開発サーバー上で並列タスクを走らせる</strong>：複数の開発者が同じサーバー上でworktreeを切り分けて作業。</li>
  <li><strong>セキュリティ要件で本番に近い環境でしかコードを動かせない</strong>：本番ネットワーク内のSSHサーバーで完結。</li>
</ol>

<p>ローカルとリモートを統一UIで扱える点は、エージェント運用が分散化していくほど効いてくる。Workspace中心の長期エージェント環境という設計思想は <a href="/agent/holaos-open-agent-computer-runtime-workspace/">holaOS｜AIエージェントと人が同居するOpen Agent Computer、Workspace中心設計を解読</a> でも別の角度から扱った。</p>

<h2 id="6-他のマルチエージェントツールとの比較">6. 他のマルチエージェントツールとの比較</h2>

<p>Orcaの位置付けを正確に掴むため、近接領域のツールと比較表を作る。比較対象は、tmuxベースのagent-viewer、スウォーム志向のruflo、Workspace中心のholaOS、そして既存IDEのCursorだ。</p>

<table>
  <thead>
    <tr>
      <th>観点</th>
      <th>Orca</th>
      <th>agent-viewer</th>
      <th>ruflo</th>
      <th>holaOS</th>
      <th>Cursor</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>主目的</td>
      <td>並列worktreeでの艦隊管理</td>
      <td>tmux内エージェントの可視化</td>
      <td>エージェントスウォーム制御</td>
      <td>長期作業環境</td>
      <td>単一AIアシスタント体験</td>
    </tr>
    <tr>
      <td>並列実行モデル</td>
      <td>git worktree×CLIプロセス</td>
      <td>tmuxペイン</td>
      <td>swarm orchestration</td>
      <td>Workspace単位</td>
      <td>単一セッション</td>
    </tr>
    <tr>
      <td>対応エージェント数</td>
      <td>23+（任意のCLI対応）</td>
      <td>Claude Code中心</td>
      <td>Claude Code/Codex</td>
      <td>プラグイン式</td>
      <td>Cursor独自</td>
    </tr>
    <tr>
      <td>デスクトップアプリ</td>
      <td>あり（Electron）</td>
      <td>CLIのみ</td>
      <td>CLIのみ</td>
      <td>あり（Electron）</td>
      <td>あり（VS Codeフォーク）</td>
    </tr>
    <tr>
      <td>モバイル対応</td>
      <td>iOS/Android</td>
      <td>なし</td>
      <td>なし</td>
      <td>なし</td>
      <td>なし</td>
    </tr>
    <tr>
      <td>SSH/リモート</td>
      <td>ネイティブサポート</td>
      <td>tmuxで間接対応</td>
      <td>設定次第</td>
      <td>リモート設計あり</td>
      <td>リモート開発機能あり</td>
    </tr>
    <tr>
      <td>ライセンス</td>
      <td>MIT</td>
      <td>MIT</td>
      <td>OSS</td>
      <td>Modified Apache 2.0</td>
      <td>プロプライエタリ</td>
    </tr>
    <tr>
      <td>サブスクリプションモデル</td>
      <td>BYOS（既存契約利用）</td>
      <td>BYOS</td>
      <td>BYOS</td>
      <td>BYOS</td>
      <td>月額課金</td>
    </tr>
    <tr>
      <td>主言語</td>
      <td>TypeScript</td>
      <td>TypeScript</td>
      <td>TypeScript</td>
      <td>TypeScript</td>
      <td>TypeScript</td>
    </tr>
  </tbody>
</table>

<p>この比較から見えるOrcaの差別化点は3つに集約できる。</p>

<p><strong>(1) 並列worktreeを第一級の概念として扱う</strong>：他ツールは「複数エージェントが動く副作用としてworktreeを使う」のに対し、Orcaは「worktreeをエージェント割り当ての単位」として設計の中心に据えている。</p>

<p><strong>(2) モバイルcompanionアプリの存在</strong>：本記事執筆時点で、iOS/Android両対応のエージェント管理アプリを公式に持つ大規模OSS IDEはOrcaのみと言ってよい。</p>

<p><strong>(3) フレームワーク中立性</strong>：CursorはCursor、agent-viewerはClaude Code、rufloはClaude Code/Codex中心と、各ツールは得意ベンダーに寄りがちだが、Orcaは23ベンダー以上を等価に扱う。</p>

<p>逆に注意点もある。OrcaはあくまでIDE層で、エージェントの推論ロジック・プロンプト・スキル管理は対象範囲外だ。たとえばエージェントの長期メモリ・知識永続化が必要ならholaOSの方が向くし、エージェント間で複雑な役割分担・並列タスク分配を組みたいならrufloのようなスウォーム基盤と組み合わせる方が筋がいい。</p>

<h2 id="7-aiエージェントideとしての実運用と制約">7. AIエージェントIDEとしての実運用と制約</h2>

<p>Orcaを本番で使う前に押さえておくべき制約と、向き/不向きを整理する。</p>

<h3 id="向いているチームユースケース">向いているチーム・ユースケース</h3>

<ul>
  <li><strong>複数機能を同時並行で進めたいソロデベロッパー</strong>：Claude Code・Codex・Grokのサブスクをすでに持っていて、艦隊運用したい。</li>
  <li><strong>AIエージェントベースの開発実験を回したいR&amp;Dチーム</strong>：23種のエージェントを横並びで比較できる。</li>
  <li><strong>モバイルからエージェント監視したいリモートワーカー</strong>：移動中・出張中にも進捗を追える。</li>
  <li><strong>複数リポジトリにまたがる作業が多いマルチプロダクトチーム</strong>：repo間横断のworktree管理を1か所に集約。</li>
</ul>

<h3 id="向いていないユースケース">向いていないユースケース</h3>

<ul>
  <li><strong>単一AIアシスタントで十分な小規模プロジェクト</strong>：Cursor単体やClaude Codeのターミナル直接利用で足りる。</li>
  <li><strong>企業の厳格なネットワーク隔離要件</strong>：Electronアプリのため、ネットワーク制限環境ではアップデートや一部機能で制約が出る可能性がある。</li>
  <li><strong>CLIエージェント文化に未対応の組織</strong>：Claude Code・Codexなどのコマンドラインツールを使い慣れていないと、OrcaのUIだけでは抽象化しきれない学習コストがある。</li>
  <li><strong>完全エアギャップ環境</strong>：通知やGitHub連携などクラウド依存機能の一部が動かない。</li>
</ul>

<div class="box-tip"><strong>導入時のおすすめ手順</strong><ul><li>・まず1〜2個のCLIエージェント（例：Claude CodeとCodex）だけ登録し、worktreeを2本切ってみる。</li><li>・git worktreeの概念に慣れてから、エージェント数を増やしていく。</li><li>・モバイルアプリは2台目のデバイスにインストールして、長時間タスクを監視する用途から試す。</li><li>・SSH機能はチームの開発サーバーが整備されている場合に効果が大きい。</li></ul></div>

<h3 id="既知のリスクと注意点">既知のリスクと注意点</h3>

<p>並列実行は強力だが、3つの実運用リスクがある。</p>

<p>第一に、<strong>worktreeの数が増えるとディスク使用量が線形に膨らむ</strong>。各worktreeは独立した作業ディレクトリを持つため、大規模リポジトリで10本のworktreeを並行運用すると、リポジトリサイズの数倍のディスクを食う可能性がある。</p>

<p>第二に、<strong>エージェント同士のAPI/レート制限の競合</strong>。Claude CodeとCodexを別worktreeで動かしても、同じAnthropic/OpenAIアカウントを使えば従量課金やレート制限は共有される。</p>

<p>第三に、<strong>並列実行中のレビュー負荷</strong>。エージェントごとに別々のdiffが上がってくるため、人間レビューワーが追従できなくなる場合がある。Orcaのdiff注釈・ネイティブ検索などの機能はその緩和を狙ったものだが、最終的な品質責任は人間側に残る。</p>

<div class="box-warning"><strong>セキュリティ観点での確認事項</strong><ul><li>・OrcaはBYOS設計のため、各CLIエージェントの認証情報（APIキー・OAuthトークン）はローカルマシン側で管理される。</li><li>・SSHワークツリー機能を有効化する場合は、リモートサーバー側のSSHキー・権限管理を別途整備する。</li><li>・モバイルcompanionアプリとデスクトップの通信経路は公式telemetry/プライバシードキュメント（onorca.dev/docs/telemetry）で確認すること。</li><li>・MITライセンスではあるが、エージェントが生成するコードのライセンス・著作権リスクは各エージェント側のポリシーに準ずる。</li></ul></div>

<h2 id="まとめ">まとめ</h2>

<div class="conclusion-box"><strong>Orca総評</strong><ul><li>・Orca（★2561）は『複数のAIエージェントを並列worktreeで艦隊管理する』というニッチを正面から狙ったAIエージェントIDE。</li><li>・Claude Code・Codex・Grokなど23種以上のCLIエージェントに対応し、特定LLMベンダーに依存しないフレームワーク中立設計。</li><li>・git worktreeをエージェント割り当ての第一級概念として採用し、スタッシュやブランチ切替の運用コストをゼロ化。</li><li>・モバイルcompanionアプリとSSHワークツリーで、デスクトップ単独では実現できない遠隔・分散運用が可能。</li><li>・MITライセンス・BYOS（既存サブスクリプション利用）で導入コストは実質ゼロ、艦隊運用に挑戦する価値は大きい。</li></ul></div>

<p>AIエージェントが量産モードに入った今、必要なのは「もう1つのアシスタント」ではなく「艦隊全体を見渡す指揮所」だ。Orcaはまだバージョンこそ1.4系だが、公開2ヶ月で★2,561・175 forkに到達したスピードと、毎日のリリース候補出しが続く開発速度を見るに、このカテゴリの定番ポジションを取りに来る本命候補と位置付けて差し支えないだろう。</p>

<p>「Claude CodeとCodexを同時に複数機能で走らせて、夜寝る前にスマホで結果を確認する」——この生活様式を当たり前にできるかどうかが、これからのソフトウェア開発の生産性差を決める。Orcaはそのインフラの一つとして、まず触っておくべきツールだ。</p>

<h2 id="参照ソース">参照ソース</h2>

<ul>
  <li><a href="https://github.com/stablyai/orca">stablyai/orca — GitHub</a> — 公式リポジトリ。READMEに対応エージェント一覧・機能・インストール手順が網羅されている。2026年5月16日にv1.4.2をリリース。</li>
  <li><a href="https://onOrca.dev">Orca — onOrca.dev</a> — 公式サイト。デスクトップアプリのダウンロードリンクと、各機能の詳細ドキュメント（worktrees, terminal, design-mode, ssh, agents/supported など）が用意されている。</li>
  <li><a href="https://github.com/stablyai/orca/releases/tag/v1.4.2">Orca v1.4.2 Release Notes</a> — 最新リリースの公式リリースノート。リリース候補（rc.7〜rc.10）の継続的なリリースサイクルを確認できる。</li>
  <li><a href="https://github.com/stablyai/orca/blob/main/docs/readme/README.ja.md">Orca日本語版README</a> — 公式日本語ドキュメント。「100xビルダーのためのAIオーケストレーター」というポジショニングが日本語で明示されている。</li>
</ul>

<!--
## 配信メモ
### X投稿フック案（120〜200文字、3案）
1. Claude CodeとCodexを並列で走らせたい人へ。stablyai/orca（★2561）はAIエージェント艦隊向けのIDEで、各エージェントを独立git worktreeに割り当てて並走させる設計。BYOS型でモバイルcompanionアプリまで提供。MIT。
2. AIエージェントIDEのOrcaが熱い。Claude Code・Codex・Grok・Geminiなど23種のCLIエージェントを横断対応、各タスクをworktreeに隔離。iOS/Androidからもエージェント監視可。stablyai製OSS。
3. 「Claude CodeとCodexを同時に走らせて、寝る前にスマホで結果確認」——そんな生活を可能にする並列エージェントIDE「Orca」が2ヶ月で★2,561。git worktreeをエージェント割り当ての単位に据えた設計が秀逸。
### はてブ用CTA
AIエージェントの艦隊運用を本気でやりたい人向けの新IDE。Claude Code・Codex・Grokなど23種のCLIに横断対応、並列worktreeで隔離する設計が秀逸。
### 内部リンク提案（公開後にこの記事へリンクすべき既存記事）
- /explain/ai-agent-framework-comparison-2026/ — エージェント比較ガイドからOrcaへ
- /agent/agent-viewer-claude-code-tmux-kanban/ — tmux+kanbanの並列管理代替としてOrcaを言及
- /agent/ruflo-multi-agent-swarm-claude-code/ — スウォームとIDEの組合せ運用として相互リンク
### 想定検索クエリ（GSCで観測したい）
- orca stablyai 使い方
- AIエージェント IDE 並列
- Claude Code Codex 並行実行
- git worktree AIエージェント
- onOrca.dev レビュー
-->]]></content><author><name></name></author><category term="agent" /><category term="agent" /><category term="agents" /><category term="AIエージェント" /><category term="マルチエージェント" /><category term="parallel-agents" /><category term="claude-code" /><category term="codex" /><category term="ide" /><category term="electron" /><category term="typescript" /><category term="worktree" /><category term="orchestration" /><summary type="html"><![CDATA[Orca（★2561）はClaude Code・Codex・Grokなど任意のCLIエージェントを並列ワークツリーで横断実行するmacOS/Windows/Linux対応のAIエージェントIDE。stablyai製のオーケストレーターのアーキテクチャ、対応エージェント23種、SSH・モバイル機能、セットアップを一次ソースから解読する。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ai-heartland.com/generated_images/cover_orca-stablyai-parallel-agents-ide.webp" /><media:content medium="image" url="https://ai-heartland.com/generated_images/cover_orca-stablyai-parallel-agents-ide.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>