はじめに

English

ForgeKairos は Zed のコードエディターのフォークである。Zed のリリースを 1 版ずつ取り込み (現在は Zed v1.22.0 を基にしている)、次のものを足している。

変更点の一覧は Zed からの変更点 にまとめてある。このサイトは ForgeKairos が足した点・変えた点だけを書く。それ以外は Zed の文書 を見る。

対応するシステム

ForgeKairos は Windows 向けに開発し、Windows のインストーラーで配布する。macOS と Linux は インストールと更新 を見る。リモート開発は Linux のホストで使える。

Zed Industries との関係

「Zed」は Zed Industries, Inc. の商標である。ForgeKairos は独立したフォークで、Zed Industries とは関係が なく、Zed Industries が承認・支援しているものではない。Zed AI、Zed Pro など Zed のサービスの名前は、その サービスを指すときにだけ使う。

ライセンス

ForgeKairos は Zed のライセンスを引き継ぐ: 主に GPL-3.0-or-later、一部のクレートは Apache-2.0 (各クレートの 表記に従う。LICENSE-GPL と LICENSE-APACHE を参照)。Zed の著作権は Zed Industries, Inc. にある。Windows の インストーラーが同梱する clang-format は LLVM プロジェクトの一部で、Apache-2.0 with LLVM Exceptions で ある。そのほかの第三者のものは THIRD_PARTY_NOTICES.md に載せている。

リポジトリ

https://github.com/SeiyaFunaokaJP/ForgeKairos

リポジトリの履歴は Zed の履歴に繋がっており、Zed のリリースを順に merge で取り込む。

Zed からの変更点

English

ForgeKairos が Zed と違う動きをする点を 1 か所にまとめる。名前の変更など見た目だけの違いは載せない。 詳しくは各節のリンク先を見る。

言語

  • UI を他の言語で表示できる (まず英語と日本語)。ソースは英語の原文のままで、訳は locales/ の gettext の PO ファイルに置く。言語は ui_language で選び、再起動なしで切り替わる。アクションの説明と設定の スキーマも訳す。(表示言語と翻訳)
  • ビルドし直さずに訳を試したり足したりできる。リモートサーバーの文もクライアントの言語で出る。

通信とプライバシー

  • AI の機能が始める外部への通信は既定で拒否し、ホストごとに許可する (設定 → ネットワーク)。リダイレクト は 1 hop ずつ確かめ、同意の確認からホストを足せる。(外部通信の統制)
  • ACP のエージェント、MCP サーバー、エージェントを入れる npm には loopback のプロキシを渡し、同じ許可 リストで確かめる。SSH リモートでも同じ。
  • Zed 社へは何も送らない: テレメトリー、クラッシュレポート、Zed のホスト型の編集予測は使わず、 コラボレーション (通話・画面共有・LiveKit) はビルドに含めない。
  • 更新の確認はこのリポジトリの GitHub Releases だけに行い、自動更新は既定でオフ。 (インストールと更新)
  • 言語サーバーや Copilot が開かせるリンクは先に確認を出し、http と https だけを開く。

AI

  • AI の機能はすべて、有効にするまでオフ (agent.enabled)。既定のモデルは決めず、動いているローカル LLM が選ばれる。(AI)
  • クラウドのプロバイダーは、入力が保存・学習に使われうるという警告を受け入れてから使える。自分で足した プロバイダーは設定で編集・削除できる。
  • Claude Code の CLI をエージェントパネルのタブで動かし、ForgeKairos を IDE として繋げる (loopback の IDE サーバー。ハイライト・注釈・解説ツアー・定義・参照・シンボル検索のツール付き)。
  • エージェントのコマンドはサンドボックスの中で動く。SSH リモートでも同じ (Linux はネットワーク名前空間と slirp4netns)。外で動かすのはユーザーの明示の選択だけで、エージェントからは求められない。
  • ツールの権限に、別のモデルが安全かを判定する「AI が判定」のモードと、「編集のみ」のプロファイルを足した。
  • エージェントがプロジェクトのフォルダーに書き込むと、そのフォルダー自身のコード (フォーマッター、 リンター、ビルドスクリプト) は、ユーザーが確かめて再開するまで止まる。
  • プロジェクトの設定に書かれた MCP サーバー・言語サーバー・フォーマッターは、その内容をユーザーが承認する まで起動しない。
  • 秘密のファイルとプロジェクトの外のファイルはエージェントに見せない。同じパスの別の綴りでも見せない。
  • 大きな添付は予算の範囲でアウトラインにして送る。モデルの選択はお気に入り以外の群を畳む。信頼していない フォルダーではツールを外し、その理由を伝える。
  • エージェントのスレッドをタブとして開き、分割したり、別のパネルや別のウィンドウに移したりできる。

ワークスペース

  • タブやパネルを窓の外へドラッグすると、それだけの新しいウィンドウが開く。パネルはドックの間をドラッグで 移せる。
  • 1 つのドックに 2 枚のパネルを並べて表示できる (既定は右にエージェントとブラウザー)。
  • 内蔵ブラウザーのパネル (Microsoft Edge WebView2、Windows のみ)。タブはエディターやターミナルのペインと 行き来できる。
  • VS Code に近い配置と既定値: プロジェクト・アウトライン・Git のパネルは左、エージェントは右、タイトル バーにメニュー、起動時にターミナルを開く、空白を表示、日本語のフォールバックフォント、ステータスバーに Vim モード・SSH リモート・整形のボタン。(設定の一覧)
  • Windows のインストーラーはエクスプローラーの右クリックに「ForgeKairos で開く」を足す。
  • 足りない言語サーバーやフォーマッターは、通知のボタンからデータフォルダーに入れられる。

C と C++

  • 名前ベースのシンボル索引がコンパイル情報なしでプロジェクト全体を受け持ち、定義へ移動とシンボル検索で 言語サーバーを補う。(C と C++ のコードの移動)
  • 呼び出し元と呼び出し先を見る呼び出しグラフのパネル。
  • ホバーに型の中身 (構造体のメンバー、列挙の定数、マクロの定義) を出す。
  • clangd の索引の範囲・スレッド数・メモリを設定でき、メモリを使いすぎたら再起動できる。
  • C と C++ は clang-format (Windows では同梱) の GNU 風のスタイルで整形する。
  • 言語サーバーを再起動したとき、開いたままのバッファーを正しく開き直す。

ターミナル

  • 変数・分岐・出力待ちを持つマクロ。タブの中でカードとして編集し、フォルダーで整理する。 (ターミナルのマクロとセッション)
  • SSH と Telnet のクイック接続。パスワードは任意で OS の資格情報ストアに預ける。
  • セッションのログと、ターミナルからのファイル転送 (SFTP、SCP、FTP)。

Git

  • 履歴の書き換え (amend・fixup・squash・並べ替え・削除・メッセージの変更) をメニューとドラッグ & ドロップで行える コミットグラフ。できないときは始める前に断り、元に戻す道を出す。(Git)
  • 選んだコミットからブランチを組むマージリクエストの箱と、2 つの ref の比較。
  • 各操作の説明を画面に出し、Git の操作ガイドを持つ。
  • 古い git (Ubuntu 18.04 のものなど) でも動き、失敗は Git パネルに出す。

Markdown と Mermaid

  • 書式のアクションと書式バー、画像の挿入 (貼り付けを含む)、文字色・マーカー・文字サイズ、PDF への出力。 (Markdown と Mermaid)
  • Mermaid の図をタブで編集する構造化エディターと、プレビューでのラベルの編集。
  • プレビューは <details> と <br> を描き、改行 1 つを改行として表示し、既定で全幅を使う。

CSV と TSV

  • CSV と TSV のファイルを表計算ソフトのようなグリッドで開く: 編集、行と列の操作、フィルター、セルの色、 比較。編集はテキストバッファーへの編集なので、元に戻すと保存はいつもどおり。 (CSV と TSV のグリッド)

リモート開発

  • 静的リンクのリモートサーバーを同梱するので、glibc の古い Linux (Ubuntu 18.04 で確認) でもダウンロード なしで使える。(リモート開発)
  • 1 つのホストのプロジェクトはすべて 1 つのサーバープロセスが受け持ち、ネットワークの切断やスリープの後は 自動で繋ぎ直す。
  • SSH のターミナルは切断や再起動をまたいで動き続け、繋ぎ直すと出力を流し直す。
  • インターネットに出られないホストは、言語サーバーなどをこの PC 経由でダウンロードする。
  • Linux のファイル監視は inotify の枠を他のプログラムに残し、残りはポーリングで見る。プロジェクトパネルに 手動の更新がある。

インストールと更新

English

Windows のインストーラー

ForgeKairos は Windows のインストーラー forgekairos-windows-<arch>-setup.exe で配布する。入手先は リポジトリの GitHub Releases。

  • 今のユーザー向けに、管理者の権限なしで、ユーザーのプログラムのフォルダーの下の ForgeKairos に入れる。
  • 64 ビットの Windows 10 バージョン 1709 以降が要る。
  • インストーラーで選べるもの: デスクトップのアイコン (既定でオフ)、エクスプローラーの右クリックのメニューの ForgeKairos で開く (ファイルとフォルダー)、ファイルの関連付け、コマンドラインの道具を PATH に足す。
  • アプリは ForgeKairos.exe、コマンドラインの道具は bin\forgekairos.exe。
  • インストーラーは clang-format (C と C++ の整形に使う) と、Linux のホスト向けのリモートサーバーを同梱する。

Windows 11 では、ForgeKairos で開く が「その他のオプションを確認」の下に出ることがある。

更新

自動更新はオフ (auto_update は false)。更新を確かめるには、アプリのメニューの 更新を確認 (またはコマンドパレットの auto update: check) を使う。ForgeKairos はこのリポジトリの GitHub Releases だけを見て、Zed の更新は見ない。リリースノートは GitHub のリリースのページを開く。

既定では正式なリリースだけを対象にする。プレリリースも対象にするには、設定 → 全般 → 自動更新 の プレリリースを含める をオンにする ("auto_update_include_prereleases": true)。対象のリリースのうち、 公開日が最も新しいものではなく、タグの版が最も大きいものを選ぶ。

更新はこのリポジトリのリリースのダウンロードからだけ取得する。GitHub がインストーラーの SHA-256 の ダイジェストを示しているときは、それと合わないインストーラーは入れない。確認に失敗したとき (GitHub に 繋がらない、ダウンロードしたものが合わない) は、「最新です」とせずにその旨を知らせる。この OS 向けの インストーラーが無いリリースは、新しい版が無いのと同じに扱って飛ばす。

Zed-JP-Enhance からの移行

ForgeKairos の以前の名前は Zed-JP-Enhance である。

  • ForgeKairos は手でインストールする。 Zed-JP-Enhance は自動更新で ForgeKairos に移れない。 ForgeKairos のインストーラーは旧版の上に入れ、旧版の登録を消す。

  • Zed-JP-Enhance はアンインストールし、併用しない。 旧版のサンドボックスは ForgeKairos のフォルダーを 守らない。

  • データは初回の通常の起動で移る。 旧のフォルダー (Windows では %APPDATA% と %LOCALAPPDATA% の Zed-JP-Enhance) を ForgeKairos の名前に変える (rename)。コピーはしない。設定、ネットワーク許可リスト、 同意、データベース、スレッドが一緒に移る。次のときは移さない。

    • 新しいフォルダーに中身がある
    • Zed-JP-Enhance が起動中 (今回の起動は旧のフォルダーを使い、その旨を知らせる)
    • rename に失敗した (移した分を戻し、知らせる)
    • --user-data-dir 付き、補助のプロセス、コマンドラインの道具として起動した

    後で Zed-JP-Enhance が旧のフォルダーを作り直したら、1 回だけ知らせる。

  • C と C++ のシンボル索引は新しい形式で作り直す。

  • 公式の Zed のフォルダーは読まず、移さない。

データフォルダー

OS設定データ
Windows%APPDATA%\ForgeKairos%LOCALAPPDATA%\ForgeKairos
Linux$XDG_CONFIG_HOME/forgekairos$XDG_DATA_HOME/forgekairos
macOS~/.config/forgekairos~/Library/Application Support/ForgeKairos

プロジェクトの設定は各プロジェクトの .zed/ のまま、環境変数も ZED_ の名前のまま。

ほかの OS

ForgeKairos は Windows で開発し、確かめている。macOS と Linux のパッケージを作るスクリプトは残しているが、 それらのパッケージはまだ作っても確かめてもいない。

表示言語と翻訳

English

ForgeKairos は選んだ言語で UI を表示する。英語と日本語を同梱している。ソースの UI の文字列は英語で、 訳はリポジトリの locales/ にある gettext の PO ファイルである。

言語の選び方

設定 → 全般 → 表示言語 で選ぶか、settings.json の ui_language に書く。

{ "ui_language": "ja" }
値意味
"system" (既定)OS の優先言語に従う。その言語の訳が無ければ英語。
"en"英語 (訳を使わない)。
"ja"、"pt-BR" などの BCP 47 タグその言語。

メニュー、設定、コマンドパレットはすぐに切り替わる。タブの題名など一部の文字列は再起動後に切り替わる。

訳される範囲

  • メニュー、設定ウィンドウ、コマンドパレット、各パネルの文字列。
  • コマンドパレットの項目は、訳した名前でも英語の名前でも検索できる。
  • アクションの説明 (キーマップエディター、キーマップと設定ファイルのホバーに出る) と、設定ファイルの JSON スキーマの説明。キーマップのファイルでは、ForgeKairos が足したアクションの引数の説明も表示言語で 出す (Zed のアクションの引数の説明は英語のまま)。
  • 同梱のスニペット (Markdown で出す Mermaid の図など) は言語ごとに別の版を持つ。

言語モデルに送る文字列 (ツールの説明、システムプロンプト、ツールの結果) は英語のままで、表示言語によって モデルへの指示は変わらない。ログのメッセージも訳さない。

言語の代替

訳が無いときは、詳しいタグから基本の言語、英語の順に代わりを探す: pt-BR → pt → 英語。 訳が無い・空・#, fuzzy の付いたメッセージは、次の言語で表示する。

再ビルドせずに訳を試す・足す

PO ファイルを <設定フォルダー>/locales/<タグ>/ に置く。設定フォルダーは次のとおり。

OS設定フォルダー
Windows%APPDATA%\ForgeKairos
Linux$XDG_CONFIG_HOME/forgekairos (設定していなければ ~/.config/forgekairos)
macOS~/.config/forgekairos

ここに置いた訳は同梱の訳をメッセージ単位で上書きし、同梱していない言語のフォルダーを置けばその言語を 足せる。ファイルはその言語に切り替えたときに読むので、編集したら再起動する。ファイルの誤りは通知とログに 出し、読めた訳は使う。

リモート

SSH・WSL・Docker のリモートでは、リモートのサーバーが書く文字列 (一部の git のエラー、ターミナルの通知など) を、サーバーに組み込んだ訳で、接続時に送った言語に訳す。設定フォルダーに置いたファイルはサーバーには 届かない。サーバーは接続しているすべてのクライアントに 1 つの言語を使う (最後に接続したクライアントの言語)。

翻訳への参加

ファイルの構成、PO のヘッダー、プレースホルダー、複数形、文脈、コマンドラインの道具 i18n_tool は locales/README.md (英語) に書いてある。

AI と通信の制限の全体図

English

ForgeKairos の AI と外部通信の制限を図で示す。細かい規則は 外部通信の統制 と AI を見る。

1 つの要求が通るか

AI の機能が始める HTTP の要求は、次の順に判定する。

flowchart TD
    R["外部への要求"] --> O{"エディター自身の通信の印があるか<br/>(言語サーバー、拡張機能、更新、Git など)"}
    O -- "ある" --> FREE["制限しない"]
    O -- "無い (AI の通信として扱う)" --> L{"loopback か<br/>127.0.0.0/8、::1、localhost"}
    L -- "はい" --> ALLOW["許可"]
    L -- "いいえ" --> B{"組み込みの許可か<br/>(マーケットプレイス、ACP レジストリ、<br/>ForgeKairos の更新の確認。決まったパスだけ)"}
    B -- "はい" --> ALLOW
    B -- "いいえ" --> A{"許可リストのホストに一致するか<br/>network_allowlist.json"}
    A -- "はい" --> ALLOW
    A -- "いいえ" --> DENY["拒否"]
    ALLOW --> RD{"リダイレクトか"}
    RD -- "いいえ" --> DONE["送る"]
    RD -- "はい: 次の hop も同じ判定へ<br/>(別のホストなら資格情報のヘッダーを外す)" --> L
  • 許可リストが空でも loopback は通るので、ローカル LLM (Ollama、LM Studio、llama.cpp) は設定なしで使える。
  • ホストを許可すると、そのホストのすべてのポートを許可する。

誰がどの経路で制限されるか

flowchart LR
    subgraph APP["ForgeKairos 本体"]
        AI["AI の機能<br/>プロバイダー、編集予測、<br/>fetch と Web 検索、MCP (HTTP)"]
        TOOLS["エディターの道具<br/>言語サーバー、拡張機能、<br/>更新、Git、リモートのサーバー"]
        GATE["許可リストの判定<br/>(loopback + 組み込みの許可 + allowed_hosts)"]
        PROXY["loopback のプロキシ<br/>(loopback + allowed_hosts だけ。<br/>組み込みの許可は使わない)"]
    end
    subgraph CHILD["子プロセス"]
        ACP["ACP エージェント"]
        MCP["MCP サーバー (stdio)"]
        NPM["エージェントを入れる npm"]
    end
    SB["エージェントのサンドボックス<br/>(WSL / bubblewrap / Seatbelt)"]
    BR["内蔵ブラウザー"]
    NET(("インターネット"))

    AI --> GATE --> NET
    TOOLS -- "制限しない" --> NET
    ACP & MCP & NPM -- "HTTP_PROXY / HTTPS_PROXY" --> PROXY --> NET
    SB -- "サンドボックス自身の許可 ∩ 許可リスト" --> NET
    BR -- "既定は制限しない。<br/>browser.use_egress_proxy で許可リストを通す" --> NET
  • 子プロセスのプロキシは、プログラムがプロキシの環境変数を読むことに頼る。読まないプログラムは制限できない。 proxy_child_processes: false で切れる。
  • サンドボックスは許可リストを狭めることはできるが、広げることはできない。

クラウドの AI を使い始めるまで

既定ではどの AI も動かず、外部のプロバイダーには何も送らない。

sequenceDiagram
    actor U as ユーザー
    participant FK as ForgeKairos
    participant AL as 許可リスト
    participant P as クラウドのプロバイダー

    Note over FK: agent.enabled = false (既定)。AI はすべてオフ
    U->>FK: 設定 → AI → エージェントを有効にする
    Note over FK: ローカル LLM (loopback) はこの時点で使える
    U->>FK: 外部のプロバイダーを選ぶ
    FK-->>U: 警告 (入力と会話が送られる) と必要なホスト
    U->>FK: 確認のチェック
    Note over FK: acknowledged_external_ai_providers に記録
    U->>AL: 許可リストに追加
    FK->>P: ここで初めて要求が通る
    Note over U,AL: 承諾を取り消すと、ほかが使わないホストを<br/>許可リストから外すか尋ねる

承諾しても許可リストに足さなければ、そのプロバイダーへの通信は拒否のまま。

エージェントがコマンドやツールを実行するとき

flowchart TD
    T["エージェントのツールの呼び出し"] --> AC{"どのモードでも確認するものか<br/>安全の規則、always_confirm、<br/>サンドボックスの外、権限の昇格、<br/>.zed や設定への書き込み、プロジェクトの外"}
    AC -- "はい" --> ASK["ユーザーに確認"]
    AC -- "いいえ" --> M{"agent.tool_permissions.default"}
    M -- "confirm (既定)" --> ASK
    M -- "deny" --> NO["実行しない"]
    M -- "allow" --> RUN
    M -- "auto" --> J{"判定用のモデルに尋ねる<br/>(10 秒の上限)"}
    J -- "SAFE" --> RUN
    J -- "それ以外" --> ASK
    ASK -- "承認" --> RUN["サンドボックスの中で実行"]
    RUN --> NETSB["ネットワークは許可リストで制限<br/>資格情報 (~/.ssh、.npmrc など) は読めない"]
    RUN --> PAUSE["プロジェクトに書き込んだら、<br/>そのフォルダーのコード (フォーマッター、<br/>言語サーバーのビルドスクリプトなど) を<br/>再開するまで止める"]
  • auto はコマンドとパスを判定用のモデルのプロバイダーに送るので、ローカルのモデルを勧める。
  • サンドボックスを切れるのは agent.sandbox_permissions.allow_unsandboxed だけで、切っている間はすべてのコマンドで確認する。

SSH のリモート

flowchart LR
    subgraph LOCAL["手元の PC"]
        AL["許可リスト<br/>(手元のものだけ)"]
        CL["ForgeKairos"]
    end
    subgraph REMOTE["リモートのホスト"]
        RS["リモートのサーバー"]
        RP["リモートの loopback のプロキシ<br/>(Windows のリモートを除く)"]
        RA["ACP エージェント / MCP サーバー"]
    end
    NET(("インターネット"))

    AL --> CL
    CL -- "接続時と変更のたびに送る" --> RS
    RS --> RP
    RA -- "HTTP_PROXY" --> RP --> NET
    RS -- "ダウンロード<br/>(relay_http_through_client、既定でオン)" --> CL --> NET

インターネットに出られないリモートでも、手元の PC 経由で言語サーバーを取ってこられる。

外部通信の統制

English

ForgeKairos は、AI の機能が始める外部への通信を、許可したホスト以外は拒否する。許可するホストの一覧を ネットワーク許可リストと呼ぶ。

全体の図は AI と通信の制限の全体図 を見る。

許可リストが統制する範囲

許可リストは AI の機能が始める通信に効く。

  • AI のモデルのプロバイダーと編集予測のプロバイダー
  • エージェントの fetch と Web 検索のツール
  • MCP サーバー (HTTP と OAuth)
  • 外部エージェント (ACP) とそのバイナリーのダウンロード
  • エージェントをインストールする npm
  • エージェントがサンドボックスの中で実行するコマンド

エディター自身の道具は制限しない: 言語サーバー、フォーマッター、デバッグアダプター、拡張機能、それらの ための node と npm、本体の更新、リモートのサーバー、Git、内蔵ブラウザー (内蔵ブラウザー を参照)。

エディター自身の通信の印が無い要求は、AI の通信として扱う。

既定で拒否

統制の対象の要求は、ホストが許可リストのどれかに一致しない限り拒否する。loopback は常に許可する: 127.0.0.0/8、::1、::ffff:127.0.0.1、localhost (*.localhost は含まない)。このため、この PC で動く ローカル LLM のサーバー (Ollama、LM Studio、llama.cpp) は、許可リストが空でも使える。

リダイレクトは 1 hop ずつ許可リストで確かめる。別のホストへのリダイレクトでは、資格情報のヘッダー (authorization、cookie、x-api-key、api-key など) を外す。

次の組み込みの許可は、決まったパスに限って、許可リストに書かなくても通る。

  • 拡張機能のマーケットプレイス
  • ACP エージェントのレジストリとそのアイコン
  • ForgeKairos の GitHub Releases への更新の確認

許可リストの編集

設定 → ネットワーク → 外部通信の統制 → ネットワーク許可リスト を開く。ここでホストの追加・編集・削除、 ファイルの再読み込み、network_allowlist.json をエディターで開く (無ければ作る) ができる。変更は再起動 なしで効く。

ファイルは設定フォルダーの settings.json の隣にある。

OSパス
Windows%APPDATA%\ForgeKairos\network_allowlist.json
Linux$XDG_CONFIG_HOME/forgekairos/network_allowlist.json
macOS~/.config/forgekairos/network_allowlist.json
{
  "allowed_hosts": [
    "api.openai.com",
    "*.example.com",
    "[fd00::1]"
  ],
  // 省略可。省略すると true
  "proxy_child_processes": true
}
  • 項目は、ホスト名そのもの、*.domain (サブドメインだけ。そのドメイン自体は含まない)、IPv4 か IPv6 の アドレスのどれか。
  • 大文字・小文字と末尾のドットは区別しない。国際化ドメイン名は Punycode で比べる。
  • ポートは比べない。ホストを許可すると、すべてのポートを許可する。
  • コメントと末尾のカンマを書ける。
  • ファイルが無い・空・読めないときは loopback だけを許可する。誤った項目は飛ばしてログに出す。 ファイルを解析できないときは、設定ページから編集しない。

同意の画面からホストを足す

  • 外部の AI プロバイダーを有効にするとき、必要なホストと 許可リストに追加 のボタンを出す。 追加しなければ、そのプロバイダーへの通信は拒否のまま。
  • ACP エージェントのインストールと更新では、配布元のホストを調べ、許可リストに無ければ足す前に確認する。 更新のたびに調べ直し、インストールのときの同意は引き継がない。
  • MCP サーバーのテンプレートも、必要なホストを同じボタンとともに出す。

エージェントと MCP サーバー

ACP エージェント、MCP サーバー、エージェントをインストールする npm には、HTTP_PROXY と HTTPS_PROXY で loopback のプロキシを渡す (NO_PROXY は loopback)。このプロキシが通すのは allowed_hosts のホストと loopback だけで、組み込みの許可は使わない。プロキシの設定があれば、その先へ転送する。

  • "proxy_child_processes": false か、設定ページの AI エージェントの子プロセスにプロキシを適用 で 切れる。変更は、その後に起動する子プロセスから効く。
  • プロキシは、プログラムがプロキシの環境変数を読むことに頼る。読まないプログラムは制限できない。
  • エージェントの env の設定でプロキシの変数を指定しているときは、何も注入しない。

SSH のリモート

許可リストは手元の PC のものだけで、接続時と変更のたびにリモートのサーバーへ送る。リモートで動く ACP エージェントと MCP サーバーには、リモートのサーバーが自分の loopback のプロキシを立てる (Windows のリモートを除く)。

remote.relay_http_through_client (既定でオン) では、リモートのダウンロードを手元の PC 経由で行う。 インターネットに出られないリモートでも言語サーバーを取ってこられる。

エージェントのサンドボックス

サンドボックスの中のコマンドが届く範囲は、サンドボックス自身の許可を許可リスト (と loopback) で 絞ったもの。サンドボックスは許可リストを狭めることはできるが、広げることはできない。WSL と SSH の リモートでも同じ。変更は次のコマンドから効く。

内蔵ブラウザー

内蔵ブラウザーのパネルは、ターミナルと同じく人が操作するものとして、既定では制限しない。 browser.use_egress_proxy (内蔵ブラウザーを許可リストの対象にする) をオンにすると許可リストを通す。 ブラウザーを次に起動したときから効く。

テレメトリ、コラボレーション、更新

  • このビルドは Zed 社へテレメトリもクラッシュレポートも送らず、設定にも出ない。
  • コラボレーション (通話と画面共有) は ForgeKairos に組み込んでいない。
  • auto_install_extensions は空で、起動時に何もダウンロードしない。
  • auto_update はオフ。更新の確認は ForgeKairos の GitHub Releases だけに問い合わせる (インストールと更新 を参照)。
  • 編集予測はオフ (edit_predictions.provider は "none")。

AI

English

Zed と共通の AI の機能 (エージェントパネル、インラインアシスタント、プロバイダー) は Zed の AI の文書 を見る。この章は ForgeKairos が変えた点と足した点を書く。 制限の全体の図は AI と通信の制限の全体図 を見る。

既定でオフ

AI の機能はすべて、有効にするまでオフである。設定 → AI の先頭の エージェントを有効にする (設定 agent.enabled、既定 false) で有効にする。変更は再起動なしで効き、同じ場所で戻せる。

AI を切るのに disable_ai を使わない。一方向の切り替えで、戻せない。

  • 既定のモデルは設定していない。エージェントを有効にすると、認証済みの最初のプロバイダーを使う。 このため、動いているローカルの Ollama や LM Studio は設定なしで選ばれる。
  • 編集予測はオフ (edit_predictions.provider は "none")。
  • エージェントパネルは起動時に開かない (agent.starts_open は false)。

ローカル LLM

Ollama (localhost:11434)、LM Studio (localhost:1234)、llama.cpp (localhost:8080) は loopback で動き、 loopback は許可リストが常に許可する。同意も許可リストへの追加も要らない。OpenAI 互換と Anthropic 互換の サーバーは、カスタムのプロバイダーとして足せる。

自分で足したプロバイダーは、設定 → AI → LLM プロバイダー で、その見出しの鉛筆 (編集) とゴミ箱 (削除) の ボタンから後で変えられる。

  • 編集では API キーの欄は空で始まり、空のままなら保存済みのキーを使う。API URL を変えるとキーを入れ直させ (保存済みのキーを別の URL へ送らない)、古い URL 用に保存したキーをシステムのキーチェーンから消す。 API キーなしで接続する をオンにして保存しても、保存済みのキーを消す。どちらも、同じ URL を使うほかの プロバイダーがあればキーを残す。ホストが変わると同意をやり直させる。
  • 名前を変えると、エージェントの設定でそのプロバイダーを指す箇所と同意を新しい名前に移す。保存済みの スレッドは古い名前のまま。
  • 削除は確認してから行い、消えるもの (設定の項目、保存済みの API キー (同じ URL をほかのプロバイダーが使うなら 残す)、同意と許可リストのホスト、そのプロバイダーを指すモデルの選択) を示す。プロバイダー自身の画面の プロバイダーを削除 も同じ。
  • リリースチャンネル・OS・プロファイルの上書きで定義したプロバイダーは、ここでは編集できないと示す。

クラウドのプロバイダー

外部の AI プロバイダーを使う前に、入力と会話がプロバイダーに送られ、保存や学習に使われうるという警告を 出す。確認のチェックを入れるとそのプロバイダーが有効になる。それまでは何も送らない。

  • 警告には、そのプロバイダーに必要なホストと 許可リストに追加 のボタンを出す (外部通信の統制 を参照)。
  • 承諾したプロバイダーは acknowledged_external_ai_providers に記録する。項目を消すと警告が戻る。 承諾を取り消すと、ほかの承諾済みのプロバイダーが使わないホストを許可リストから外すか尋ねる。
  • プロジェクトの設定では承諾できない。
  • Copilot と Zed のホスト型の編集予測にも同じ承諾が要る。

Claude のサブスクリプション

内蔵の Anthropic プロバイダーは API キーだけを使う。Claude Pro / Max のサブスクリプションは Claude Code で使う。

  • Claude Code を起動 は、公式の改変していない Claude Code CLI を開く。エージェントが有効ならエージェント パネルのタブに、そうでなければターミナルパネルに開く。サインインは CLI の中で Anthropic 自身の手順で 行い、ForgeKairos は URL もトークンも扱わない。
  • ACP の Claude エージェントは、それ自身の /login でサブスクリプションのサインインができる。API キーでも 使え、両方あれば API キーを優先する。サブスクリプションのサインインを隠すには agent_servers.<id>.allow_subscription_sign_in を false にする。
  • 内蔵のエージェントと、後述の権限の判定にはサブスクリプションを使わない。

Claude Code 向けの IDE サーバー

ide_server.enabled (IDE サーバーを有効にする、既定でオフ) をオンにすると、ForgeKairos は Claude Code CLI が繋いでくる loopback のサーバーを 127.0.0.1 で動かす。外部へは接続しない。動いている間、ローカルの プロジェクトごとに ~/.claude/ide/<port>.lock を書く。

これを通して CLI は次のことができる。

  • ForgeKairos のタブで差分を開き、承認・却下する (書き込みは CLI が行う)
  • 診断、開いているエディター、選択範囲、ワークスペースのフォルダーを読む
  • ファイルを開く、保存する
  • 最後に失敗したタスクの出力の末尾を読む (ide_server.share_task_output)

ide_server.assist_tools (エージェントに IDE ツールを渡す、既定でオン) では、エージェントに MCP サーバー zed を渡す。ツールは highlightCode、annotateCode、startCodeTour、clearAnnotations、getHover、 getDocumentSymbols、searchSymbols、findDefinition、findReferences、getCallHierarchy、 getTypeLayout。注釈は保存せず、Esc で消える。シンボル検索はモデルも埋め込みも使わない。

内蔵のエージェントには、対応するツール hover、search_symbols、call_hierarchy、type_layout、 highlight_code、annotate_code、code_tour、clear_annotations がある。

エージェントのサンドボックス

エージェントが実行するコマンドは常にサンドボックスの中で動く。エージェントはサンドボックスの外での実行を 求められない。サンドボックスを作れないときは、再試行か取り消しを選ぶ。

  • Windows は ForgeKairos の WSL の補助、Linux は bubblewrap、macOS は Seatbelt を使う。
  • ~/.ssh、.npmrc、クラウドの CLI の設定、ブラウザーのプロファイル、ForgeKairos 自身のデータなどの 資格情報は、サンドボックスの中から読めない。
  • 外部の ACP エージェントもサンドボックスの中で動く (Windows では WSL の中)。
  • リポジトリのメタデータを書く Git の操作 (コミットなど) はユーザーが行う。
  • サンドボックスのネットワークは許可リストで制限する。
  • サンドボックスを切る手段は agent.sandbox_permissions.allow_unsandboxed (既定 false) だけ。切っている 間は、すべてのコマンドで確認する。

サンドボックスの外で起動する

Claude Code や ACP エージェントを、ユーザーが自分でサンドボックスの外で起動できる。

  • エージェントパネルの + メニューの Claude Code をサンドボックスの外で起動…
  • 起動に失敗したときの通知や ACP の失敗のカードのボタン
  • パネルの ⋯ メニューからの起動し直し
  • agent.claude_code_run_outside_sandbox と agent_servers.<id>.run_outside_sandbox (どちらも既定 false、 ユーザー設定のファイルからだけ読む)

外で動いている間は常にバナーを出し、タブの名前にもそれを示す (例:「Claude Code (サンドボックスの外)」)。 サインインはふだんの ~/.claude のものを使う。ACP のスレッドの同意はスレッドごとに残り、AI のページの サンドボックスの外での起動の同意 で取り消せる。

ツールの権限

agent.tool_permissions.default は "confirm" (既定)、"allow"、"deny"、"auto" のどれか。 エージェントパネルのメニューには 確認する、AI が判定 (安全なら自動実行)、全自動 (サンドボックス内) がある。

  • "auto" は、操作ごとに別のモデル (agent.permission_judge_model、無ければ高速モデル、次に既定のモデル) に 10 秒の上限で尋ねる。答えが SAFE のときだけ確認なしで実行する。コマンドとパスがそのモデルの プロバイダーに送られるので、ローカルのモデルを勧める。
  • 次のものは、どのモードでも確認する: 組み込みの安全の規則と always_confirm の規則、サンドボックスの外の コマンド、サンドボックスの権限の昇格、.zed・グローバルの設定・スキル・シンボリックリンクへの書き込み、 プロジェクトの外のファイル操作。

プロファイルは 書き込み (既定)、質問、編集のみ、最小。編集のみはファイルを読み、編集するが、 ターミナル、fetch、削除、MCP のツールを持たない。

エージェントが書き込んだ後のプロジェクトのコードの停止

agent.pause_worktree_code_after_agent_writes をオンにすると、エージェントがプロジェクトのフォルダーに書き込んだ後、 そのフォルダー自身のコード (フォーマッター、ESLint、Python のインタープリター、rust-analyzer のビルドスクリプト) は、 変更を確認して 再開 を押すまで動かない。既定はオフで、オンにできるのはユーザー設定のファイルだけ。 止めているフォルダーがある間は、ステータスバーに件数が出る。押すと確認と再開の画面が開く。

MCP サーバー

設定 → AI → MCP サーバー で、各サーバーの状態の表示、接続の確認、追加ができる。ここで足したサーバーは ユーザー設定に入る。追加の画面には同梱のテンプレート (filesystem、github、playwright、fetch、memory) があり、必要なホストを出す。

プロジェクトの .zed/settings.json が定義する MCP サーバー、言語サーバー、外部のフォーマッターは、その中身を 承認するまで起動しない。中身が変わればまた確認する。承認の一覧は 設定 → 全般 → セキュリティ にあり、 取り消せる。session.trust_all_worktrees でも承認されない。

エージェントに見せないファイル

private_files (既定では .env*、*.pem、*.key、*.cert、*.crt、secrets.yml) や file_scan_exclusions に一致するファイル、プロジェクトの外のファイル、外を指すシンボリックリンクは、 エージェントのツールと添付から隠す。こうしたファイルについて、定義と参照は場所 (パスと行) だけを返し、 中身は返さない。同じパスの別の綴り (大文字・小文字、Windows の短い名前、Unicode の正規化) も同じに扱う。

定義・参照・呼び出し階層の 1 回の応答が新しく開くファイルは、1000 個・合計 64 MiB までにする。

添付

大きな添付は、agent.context_attachments の上限 (設定の一覧 を参照) の中で、アウトラインと 続きの読み方の案内にして送る。添付のチップには大きさの見積もりを出し、右クリックで 自動・全文・要約 を 選べる。ブランチの差分は要約して送り、全文はエージェントが git_diff ツールで読める。

モデルの選択

お気に入りのモデル (agent.favorite_models) があるときは、ほかのプロバイダーの群を件数付きの見出しに 畳み、使っているモデルの群は開いたままにする。検索は群の名前にも一致する。最下段の エージェント の節 から、Claude Code の起動や、ほかのエージェントでのスレッドの開始ができる。

信頼していないフォルダー

信頼していないフォルダーでは、エージェントのプロファイルを「最小」(ツールなし) に下げる。入力欄の上に 理由を出し、モデルにもツールが無い理由を伝える。フォルダーを信頼すると、すぐにツールが戻る。

C と C++ のコードの移動

English

ForgeKairos は、C と C++ の名前ベースのシンボル索引、呼び出しグラフのパネル、ホバーの型の中身、clangd の メモリを抑える設定を足す。言語サーバー全般は Zed の C と C++ の文書 を見る。

シンボル索引

C か C++ のファイルがあるプロジェクトでは、名前の索引を作る (symbol_index.enabled = "auto")。索引は コンパイルの情報を使わず、何も実行しない。信頼していないプロジェクトでも作る。関数とプロトタイプ、 #define、構造体・共用体・列挙・typedef、列挙の定数、大域変数、直接とメンバーの呼び出し、関数ポインターへの 代入、マクロの本体の中の呼び出しを持つ。

  • 索引はアプリのデータフォルダーに、プロジェクトのフォルダーごとに置く。計測ではソースのおよそ半分の 大きさだった。
  • 90 日使わなかった索引は消す。
  • 索引から来た結果には「名前一致」の印を付ける。同じ名前の無関係なシンボルに一致しうるからである。

定義へ移動

C と C++ では、言語サーバーが何も返さない・失敗する・symbol_index.language_server_timeout_ms (1500 ms) を超えるとき、定義へ移動に索引を使う。一致が 1 つならそこへ移動し、短く知らせる。複数なら一覧に出す。 コメントと文字列の中では使わない。F12、Ctrl+クリック、ホバーのリンクで効く。

シンボル検索

プロジェクトのシンボル検索 (ctrl-t) は、索引の答えを先に出し、言語サーバーの結果が届いたら重複を除いて 足す。ns::f のような C++ の修飾名でも検索できる。

呼び出しグラフのパネル

呼び出しグラフのパネルは、関数の呼び出し元か呼び出し先を木で出す。行を展開したときだけ、1 段ずつ 問い合わせる。既定では根はカーソルに追従せず、ユーザーが選ぶ。

操作Windows / LinuxmacOS
パネルのフォーカスの切り替えctrl-k ctrl-gcmd-k cmd-g
カーソル位置の関数の呼び出し元を出すctrl-k ctrl-shift-gcmd-k cmd-shift-g

パネルの中では、左で畳み、右で展開し、Space で呼び出し箇所を下見し、ctrl-c (cmd-c) で名前をコピーし、 alt-left / alt-right で根の履歴を移動する。呼び出し箇所が複数ある行で Enter を繰り返すと、次の箇所へ移る。

  • 索引の答えを先に出し、言語サーバーの答えは届いたら合わせる。
  • 再帰には印を付ける。関数ポインターを通した間接の呼び出しには候補を並べる。
  • 名前に定義が複数あるときは、根の候補を一覧にする。
  • call_graph_panel.excluded_callees にある呼び出し先 (printk、printf など) は最後の行で件数を出し、 求めに応じて表示する。

call_graph_panel の設定は 設定の一覧 を見る。

ホバーの型の中身

C と C++ で名前にホバーすると、言語サーバーのホバーの下に、その型の中身も出す。

  • 名前、種類、定義の場所
  • typedef の連鎖 (例: alias_t → outer_t → struct outer)
  • 構造体・共用体・クラスのメンバー (1 段ずつ展開できる)
  • 列挙の定数、マクロの本文
  • 同じ名前の定義の切り替え

中身は索引から名前で探したもので、言語サーバーが解決したものではない。symbol_index.hover_type_contents で切れる。

clangd のメモリ

設定効果
clangd.index_mode"full" (既定) はプロジェクト全体を裏で索引する。"light" は開いたファイルだけを索引し、メモリが最も少ない。参照、呼び出し階層、名前の変更は開いたファイルだけが対象になる。
clangd.max_workersclangd のスレッド数 (-j)。0 は clangd の既定。
clangd.memory_limit_mb30 秒ごとに測るメモリがこの MB を超えたら clangd を再起動する。10 分以内の 2 回目は知らせるだけ。0 は再起動しない。
  • 既定値では引数を足さない。lsp.clangd.binary.arguments に同じ種類の指定があれば、何も足さない。設定を 変えると clangd を再起動する。
  • memory_limit_mb と max_workers はユーザー設定からだけ読む。
  • メモリは clangd とその子プロセスすべての合計で測り、言語サーバーのメニューに出す。
  • メモリの上限の通知から、軽量モード (light) に切り替えられる。

AI のツール

内蔵のエージェントには call_hierarchy と type_layout、IDE サーバーで繋いだエージェントには getCallHierarchy と getTypeLayout がある (AI を参照)。どちらも読み取りだけ。エージェントに 見せないファイルの名前は返さない。

C と C++ の整形

C と C++ のファイル (.h を含む) は、GNU を基にした書式の clang-format で整形する: 括弧の前に空白、 120 桁、1 行のブロックや関数を作らない、case のラベルを字下げ、include を並べ替えない。「選択範囲をフォーマット」は 選んだ行だけを整形する。clang-format は、アプリのフォルダー、その bin フォルダー、足りないツールの通知から 入れたもの、PATH の順に探す。Windows のインストーラーは clang-format を同梱する。

ターミナルのマクロとセッション

English

ForgeKairos は Tera Term 風のターミナルの道具を足す: 文字列を送り出力を待つマクロ、SSH と Telnet の クイック接続、セッションのログ、ファイル転送。

操作コマンドWindows / LinuxmacOS
マクロを実行terminal: run macroctrl-shift-alt-mcmd-ctrl-alt-m
マクロを編集terminal: edit macros
クイック接続terminal: quick connectctrl-shift-alt-kcmd-ctrl-alt-k

マクロ

マクロは、アクティブなターミナルに対して実行するステップの並び。

ステップ動作
送信ターミナルに文字列を送る。
期待文字を待つ出力に部分文字列か正規表現が現れるまで、タイムアウト付きで待つ。
秒待ち決まった時間待つ。
画面を消去ターミナルを消去する。
繰り返し中のステップを繰り返す。
分岐出力、画面、変数で分岐する。
変数に設定変数に値を入れる。

変数

送る文字列とパターンの中の ${name} を置き換える。定義していない変数は書いたまま残すので、打ち間違いが 見える。${ そのものは $${ と書く。正規表現に入れる値はエスケープする。

変数は次のものから値を得る。

  • 「期待文字を待つ」と「分岐」のステップ (「そのとき」の側) の 取り込む変数名
  • 正規表現の名前付きグループ (?P<name>…)
  • 「変数に設定」のステップ

エディターは、その位置でまだ値の無い ${name} を警告し、正規表現の誤りをその場に出す。エディターの 分岐と変数の使い方 に例付きの説明がある。

分岐

  • 分岐 は、最後の送信以降の出力 (既定)、画面全体、変数のどれかと照合する。値の無い変数は 「それ以外」の側に進む。分岐は待たないので、必要なら前に「期待文字を待つ」を置く。
  • 期待文字を待つ は、マクロを止める代わりに タイムアウト時 の分岐を持てる。
  • 分岐は入れ子にできる。

マクロのエディター

マクロのエディターは中央のペインのタブで開く。開いているマクロをもう一度開くと、そのタブに切り替わる。

  • 各ステップはカード。見出しのクリックで畳む・開く。すべて展開 と すべて折りたたむ はすべてのカード に効く。
  • カードの間の線の + でステップを挿入する。カードの見出しを + へドラッグすると移動する。分岐の中へも 外へも移せる。
  • 分岐は 2 つの側 (「そのとき」と「それ以外」) を列で並べ、タブが狭いときは縦に積む。
  • 上へ・下へ・削除は、各カードの … メニューと右クリックのメニューにある。
  • 畳んだカードに誤りがあるとアイコンを出す。

保存していない変更があるとタブに点を出し、閉じるときに保存するか尋ねる。開いていたマクロのタブは再起動後に 戻る (保存していない変更は戻らない)。マクロのファイルがエディターの外で変わったとき、保存していない変更が 無いタブは追従し、あるタブは上書きの前に尋ねる。

フォルダー

マクロはフォルダーに置く。フォルダーは空でもよく、順序を持ち、別のフォルダーには同じ名前のマクロを置ける。 フォルダーは 新しいフォルダー… で足し、フォルダーの右クリックのメニューで作成・名前の変更・移動・削除を する。空でないフォルダーを消すときは、中のマクロを「未分類」に移すか消すかを選ぶ。フォルダーは入れ子に できない。マクロを実行… のピッカーはフォルダーごとにまとめる (terminal.macro_picker_folders_collapsed ですべてのフォルダーを畳んで開く)。

マクロの保存先

マクロ、フォルダー、クイック接続は設定フォルダーの terminal_sessions.json に保存する (Windows は %APPDATA%\ForgeKairos、macOS と Linux は ~/.config/forgekairos)。書き込みは不可分に行い、ForgeKairos の 動作中にファイルを編集しても読み直す。

クイック接続

クイック接続は、ホスト、ポート、ユーザー、接続後に実行するマクロ (任意)、ログの指定で、SSH か Telnet の セッションを新しいターミナルのタブに開く。Windows の telnet.exe が無いときは、有効にする方法を知らせる。

パスワードは記憶できる (パスワードを記憶する、既定でオフ)。OS の資格情報の保存先 (Windows では資格情報 マネージャー) に置き、JSON のファイルには書かない。SSH には askpass で最初の問い合わせにだけ渡し、Telnet では パスワードの問い合わせを 1 回だけ待つ。

セッションのログ

ターミナルの出力をログのファイルに保存できる (切り替え、開始、停止、ファイルの場所を開く、末尾を追って エディターで開く)。記憶したパスワードを入力する間はログを止める。terminal.session_log の設定は 設定の一覧 を見る。

ファイル転送

ターミナルの右クリックのメニューの ファイル転送… (または terminal: open file transfer) で、SFTP、SCP、 FTP、FTPS の 2 画面のウィンドウを開く。OS の sftp、scp、curl を使う。接続先はアクティブなターミナルから 取る。SSH のリモートのプロジェクトでは、手元の側をリモートのホストにできる。転送はユーザーの操作で、 エージェントからは始められない。

Git

English

ForgeKairos は、履歴を編集する操作を持つコミットグラフ、マージリクエストのブランチを組む箱、操作のガイド、 古い git への対応を足す。Zed の Git パネルは Zed の Git の文書 を見る。

Git メニュー

メニューバーに Git メニューがある: コミットグラフを開く、ブランチを作成…、ブランチを切り替え…、 直前のコミットを修正 (amend)、今の変更を昔のコミットに入れる (fixup)…、MR を作る、2 つのブランチを比較…、 フェッチ、プル、プッシュ、強制プッシュ (lease 付き)…、stash…、Git の操作ガイド。

コミットグラフ

グラフには HEAD、ローカルとリモートのブランチ、タグのチップを出す。すべてのブランチ・現在のブランチ・ 選んだブランチの表示を切り替え、検索できる一覧からタグを選び、Shift か Ctrl で複数のコミットを選べる。 コミットの詳細には、その前の最新のタグを出す。

コミットの右クリックでできること:

  • そこからブランチを作る (切り替えるか、作るだけか)
  • チェックアウトする (detached HEAD)
  • タグを付ける
  • 現在のブランチへ cherry-pick する、revert する
  • メッセージを書き直す
  • そこへ reset する: soft、mixed、hard (hard は確認する)
  • そのコミットを捨てる

使えない操作は灰色にして理由を出す。

履歴の書き換え

  • amend: Git パネルのコミットの欄に「直前のコミットを修正 (amend)」のチェックがある。そのコミットをプッシュ 済みなら警告する。
  • fixup: 今の変更 (ステージしたものだけ、またはすべて) を以前のコミットに入れる。できないときは始める 前に断る: rebase やマージの途中、衝突がある、detached HEAD、現在のブランチの外のコミット、範囲にマージが ある、など。成功の知らせから 元に戻す… ができる。
  • squash・並べ替え・削除: コミットの一覧のダイアログで、残す・squash・捨てる・書き直すを選び、行の ドラッグで並べ替える。
  • 強制プッシュ: 書き換えの後の強制プッシュは「リース付き」だけを、コミットがプッシュ済みのときだけ出す。 強制プッシュは常に確認する。

書き換えの前に、無視しているローカルのファイル (.env など) が上書きされるなら始めない。衝突で止まった 書き換えは、続行・スキップ・中止のバナーを出す。

ドラッグ・アンド・ドロップ

  • Git パネルのファイルを「ステージ済み」か「未ステージ」の節へドラッグして、ステージ・ステージ解除する。
  • ファイルをグラフのコミットへドラッグして、そのコミットへ fixup する。
  • コミットを別のコミットへドラッグして並べ替える。
  • コミットを HEAD のチップへドラッグして cherry-pick する。
  • HEAD のチップをコミットへドラッグして、そこへ reset する (soft、mixed、hard)。

マージリクエストの箱

マージリクエストを作成 (Git メニューでは「MR を作る」) で、グラフの横に箱を開く。開発のブランチと基点を選び、コミットを箱へドラッグし、 メッセージとブランチ名 (既定は mr/<ブランチ>) を書いてブランチを作る。今のブランチはチェックアウトした ままである。

作った後、結果を比べてファイルごとに分類する (一致、除外したコミットによる変更、入れ忘れの疑い (関係する コミット付き) など)。マージリクエストのブランチが最新の基点に乗っていなければ警告する。まだ箱に入れていない コミットはグラフに印を付け、順に辿れる。

2 つの ref の比較

2 つのブランチを比較… で、2 つの ref の間で変わったファイルと読み取り専用の差分のタブを開く。

検索

グラフの検索は author:、tag:、branch:、path:、file:、since:、after:、until:、before:、 change:、merge:、sha: を受け付け、AND で組み合わせる。日本語の書き方 (著者:、タグ:、ブランチ:、 ファイル:、以降:、以前:、変更:、マージ:) と全角のコロンも使える。

画面の中の説明

  • グラフのツールバー、Git パネルの見出し、マージリクエストの箱の ? (git: show guide) で Git ガイドを 開く: amend、fixup、書き直し、squash、cherry-pick、マージリクエスト、ブランチ、元に戻す方法、reset の 種類、比較、タグ、検索。
  • ボタンの行の下の 1 行に、マウスの下のボタンの説明を出す。メニューは各項目の横に短い説明を出し、使えない 項目は理由を、破壊的な項目は注意を出す。

そのほかの操作

Git パネルとコマンドパレットに次の操作がある: リポジトリの初期化、リモートの追加と削除、ブランチのマージ、 ローカルのブランチをリモートに合わせる (確認する)、作業ツリー・ステージした変更・直前のコミットからの パッチの作成、パッチの適用。

大量の ref

数万のタグやブランチがあっても、ステージとコミットは遅くならない。loose な ref が 1,000 以上あると、 まとめる (pack) ことを勧めるバナーを出す。

古い git

Git の連携は古い git (古い Linux のサーバーなど) でも動く。入っている git より新しい版が要る機能は、必要な版を 示して断る。信頼していないプロジェクトで git が 2.12 より古いときは、フックを実行する操作とプッシュ・プル・ フェッチを断る。git status が失敗したときは、Git パネルにバナーでエラーを出す。

Markdown と Mermaid

English

ForgeKairos は、Markdown の入力補助、幅の広いプレビューと HTML の対応、画像と文字色の補助、PDF の書き出し、 Mermaid の図の構造化エディターを足す。Zed の Markdown の対応は Zed の Markdown の文書 を見る。

入力補助

  • Enter で引用、箇条書き、番号付きリスト、タスクリストを続ける。Tab でリストの項目を字下げする。
  • Markdown では、Enter の前に強制改行の行末のスペース 2 つを足す (hard_break_on_newline、Markdown では オン)。Shift+Enter は 1 回だけ逆の動きをする。
  • 整形のアクション: 引用、太字、斜体、取り消し線、インラインコード、見出し 1〜3、箇条書き、番号付き リスト、タスクリスト、リンク、水平線、コードブロック。ctrl-b、ctrl-i、ctrl-shift-x (macOS は cmd) は、Markdown のファイルでだけ太字・斜体・取り消し線になる。
  • Markdown のファイルを開いている間、ツールバーの下に整形のバーを出す (toolbar.markdown_format_bar)。 <details>、画像、Mermaid の図の挿入と、文字色・マーカー・段落の文字サイズもここから行う。
  • 見出し、コードブロック、<details> はガターから折り畳め、ある段の見出しをまとめて折り畳める。

プレビュー

  • 目のボタンは同じペインにプレビューを開く。Ctrl+クリック (macOS は Cmd+クリック) でエディターの横に開く。
  • プレビューはペインの幅いっぱいを使う (markdown_preview.limit_content_width はオフ)。
  • 1 つの改行を改行として表示する (markdown_preview.soft_break_as_hard_break)。
  • 表の列に最小の幅を持たせ、列が収まらないときだけ横にスクロールする。
  • 対応する HTML: <details> と <summary> (クリックで開閉)、<br>、<div align>、<center>、<b>、 <kbd>、<u>、<s>、<hr>、<sub>、<sup>、<a href>。javascript:、data:、vbscript: の リンクは開かない。

画像

markdown: insert image (整形のバーにもある) は、パス、代替テキスト、配置、大きさのダイアログを開く。指定に応じて ![alt](path)、 幅と高さ付きの <img>、画像を囲む <div align> のどれかを書く。パスは Markdown のファイルからの相対で、 プロジェクトの外の画像は images フォルダーにコピーする。SSH と WSL のリモートでも使える。

  • 保存済みの Markdown に画像を貼り付けると、images/image-YYYYMMDD-HHMMSS.<ext> に保存してリンクを書く。
  • OS からファイルをドロップするとコピーし、プロジェクトパネルからドロップするとリンクを書く。
  • ](、![](、src="、href=" の後ではパスを補完する。

表

markdown: edit table は、カーソルの下のパイプの表 (無ければ空の表) をセルの格子で開く。行と列の挿入・ 削除・移動、列ごとの配置の指定、表計算ソフトからコピーした範囲の貼り付け (表に広げる) ができる。 更新 で Markdown の表として書き戻す。

文字色、マーカー、文字サイズ

  • 文字色は <span style="color: …"> を書く (8 色)。
  • マーカーは <mark> (黄) か <mark style="background-color: …"> を書く。
  • 段落の文字サイズは段落を <span style="font-size: …"> で囲む。

マークアップを壊す位置 (タグ・コメント・コードの中、リンクや表のセルをまたぐ範囲) では、知らせを出して 何もしない。GitHub は style 属性を捨てるので、そこでは色と大きさは出ない。

PDF の書き出し

markdown: export to pdf (ツールバー、プレビュー、タブの右クリックのメニューから) は、保存済みの Markdown の 隣に同じ名前の PDF を書く。Microsoft Edge のヘッドレスモードを使い、Edge が見つからなければ PATH の pandoc を使う。ページは A4 で、Mermaid の図を含み、文字色を保つ。

Mermaid

Mermaid の図は ForgeKairos 自身が描く (JavaScript を使わない)。Markdown のプレビューとエージェントパネルで 表示する。

  • Mermaid 図を挿入 (整形のバー、右クリックのメニュー、mermaid-* のスニペット) で、選んだ種類の図を 挿入する。
  • Mermaid 図を編集… (右クリック、プレビューの図の 編集 ボタン、整形のバー) で、カーソルの位置か 近くの図の構造化エディターを、ファイルと並ぶタブとして開く。左が入力欄、右が大きなプレビューで、境目は ドラッグで動かせる (幅の狭いペインでは上下に並ぶ)。プレビューは図をペインいっぱいに拡大・縮小して 見せるほか、拡大・縮小のボタンや Ctrl+スクロールで選んだ倍率でも見られる (ペインより大きいとスクロール)。同じ図をもう一度開くと、そのタブが前に出る。反映 (Ctrl+Enter、またはタブの 保存) で 1 回の取り消し単位で書き戻し、タブは開いたまま残る。未反映の変更があるとタブに印が付き、 閉じるときにどうするかを聞く。タブに変更がないあいだに文書の側で図が変わると、タブはそれに合わせる。 変更があるときは警告を出し、上書きを選ばない限り書き込まない。エディターが理解しない行はそのまま残す。 再現できない構文があるときは、理由を示して開かない。このタブは再起動では戻らない。
  • プレビューでは、フローチャート、ER 図、状態図、クラス図、シーケンス図、円グラフ、ガントチャートの ラベルをダブルクリックで編集できる。
  • 描画に失敗する図は、ForgeKairos を止めず、その場所にエラーを出す。

構造化エディターは 26 種類の図に対応する: フローチャート、シーケンス図、クラス図、状態図、ER 図、 ガントチャート、円グラフ、GitGraph、マインドマップ、タイムライン、ユーザージャーニー、象限チャート、 XY チャート、レーダー、要求図、C4、ブロック図、Sankey、パケット図、ベン図、カンバン、ツリーマップ、 アーキテクチャ図、ツリービュー、石川図 (特性要因図)、イベントモデリング。

CSV と TSV のグリッド

English

ForgeKairos は .csv、.tsv、.psv、.ssv を表計算ソフトのようなグリッドで開く (tabular_data.open_as_grid)。元はファイルのテキストのままで、グリッドの操作はすべてテキストへの編集として 行い、1 回で取り消せる。保存、未保存の印、Git の差分、自動保存はふつうのテキストのファイルと同じに働く。

  • グリッドのツールバーからテキストを横に開ける。テキストのエディターでは目のボタンでグリッドを開く。両方は 同期する。Alt+クリックでタブをその場でグリッドとテキストに切り替える。
  • 改行を含むセルは全部表示する (tabular_data.multiline_cells)。
  • 「先頭行を見出し」は切れる。

編集

キー操作
Enter / Shift+Enter、Tab / Shift+Tab次・前のセルへ移る
文字の入力セルの中身を置き換える
F2 かダブルクリックセルをその場で編集する
Alt+Enterセルの中で改行する
Delete中身を消す
Ctrl+Shift+= / Ctrl+-行か列を挿入・削除する
Shift+Space / Ctrl+Space行・列を選ぶ
Ctrl+D / Ctrl+R下へ・右へ埋める
Ctrl+F / Ctrl+H検索・置換 (正規表現と選択範囲の中も)
  • コピーは表計算ソフトが読めるタブ区切りの形式。
  • 日本語入力などの IME をセルで使える。
  • 空行は行として残し、元の引用符の付け方を保つ。

行と列

  • 端に + の行と 列を追加 の列がある。行と列の境目の細い帯でその位置に挿入する。
  • セル、行の見出し、列の見出しの右クリックのメニューで、挿入・削除・消去ができる。
  • フィルハンドルは、1 つのセルからはコピーする (Ctrl を押すと数値は 1 ずつ増やす)。数値か日付 (曜日と 日本語の日付の書き方を含む) が等差に並んだ 2 つ以上のセルからは、その並びを延ばす (Ctrl を押すとコピー)。
  • 選択範囲の枠をドラッグするとセルを移し、Ctrl+ドラッグでコピーする。
  • Ctrl+クリックで範囲を選択に足す。

フィルター

列の見出しの ▾ (または Alt+Down) で、値の一覧か文字列で絞り込む: 含む、含まない、等しい、で始まる、で終わる、 空白、空白以外。1 列に 2 つまでの条件を AND か OR で組み合わせられる。フィルターと並べ替えはファイルごとに 覚える。

セルの色

セル、行、列、表全体に、8 色の塗りと文字の色を付けられる。色はファイルではなく ForgeKairos が保存する。

比較

Git の HEAD の版、別のファイル、選んだセル・行・列どうしと比べられる。両側を並べ、セルと文字の違いを強調し、 どちらかが変われば比べ直す。複数行のセルは全体を比べる。

対応していないもの

数式、数値と日付の書式、セルの結合、列のドラッグでの並べ替えには対応していない。

リモート開発

English

SSH のホスト、WSL、コンテナへの接続は Zed のリモート開発の文書 を見る。この章は ForgeKairos が変えた点を書く。

同梱のリモートサーバー

ForgeKairos は、静的にリンクした (musl) Linux x86_64 用のリモートサーバーを同梱し、接続時に確認なしで 送り込む。ホストの glibc に依存しないので、VS Code のリモートサーバーが動かない古い Linux でも動く (Ubuntu 18.04 で確かめている)。WSL と Docker の接続も同じサーバーを使う。

リモートサーバーのファイルの名前は forgekairos-remote-server-*。ホストの古いファイルを掃除するときは ForgeKairos 自身のファイルだけを消し、公式の Zed のファイルは消さない。

1 ホストに 1 プロセス

1 つの ForgeKairos から同じホストへの接続は 1 つのサーバープロセスを共有し、プロジェクトはその中の セッションになる。セッションは最後の接続から 10 分で終わり、プロセスは最後のセッションから 60 秒で終わる。 起動時に、自分の残骸を消す: 無くなったセッションの古い状態、新しい 5 つより古いサーバーのログ、30 日使って いない言語サーバーの版。

再接続

ネットワークの切断やスリープの後は自動で再接続する: 約 3 分の間に最大 15 回試し、PC がスリープから戻ると すぐに接続を確かめる。切れた接続は約 45 秒以内に検知する。

接続の往復は少ない: ホストの環境を 1 回の SSH のコマンドで調べ、結果を覚えておく。

切断をまたいで生きるターミナル

Windows 以外の SSH のホストでは、リモートサーバーが各ターミナルのシェルを生かしておく (terminal.remote_persistence.enabled、既定でオン)。接続が切れても ForgeKairos を再起動しても、コマンドは 動き続ける。再接続すると、最近の出力 (4 MiB まで) を流し直し、ターミナルはそのまま続く。シェルは、タブを 閉じたとき、またはターミナルが繋がっていない状態が terminal.remote_persistence.detached_timeout_hours (24) 続いたときに終わる。

タスク、エージェントのシェル、WSL、Docker、Windows のホストでは使わない。

インターネットに出られないホスト

remote.relay_http_through_client (既定でオン) では、ホストのダウンロード (言語サーバー、node、拡張機能、 エージェント) を手元の PC 経由で行う。インターネットに出られないホストにも言語サーバーを入れられる。設定は 再接続なしで効く。

言語サーバーやフォーマッターが無いときは、通知から入れられる (dev_tools.suggest_missing)。リモートに 接続している間は、そのホストに入れる。

Linux のファイルの監視

Linux (手元とリモートのホスト) では、ユーザーの全プロセスの inotify の監視の合計が上限の 4 分の 1 に 収まる間だけ監視を足し、残りのフォルダーはポーリングで見る。ホストのビルドなどのツールが監視の上限に当たらないようにするためである。 ポーリングのフォルダーの変化は数秒遅れて見える。

ホストの古い git

Git の連携はホストの古い git でも動く。Git を見る。

追跡していないファイルの git status

とても大きなリポジトリでは、git.status_untracked_files を "normal" か "no" にすると git status が 軽くなる。SSH ではホストでも同じ値を使う。

ファイル転送

SSH のプロジェクトでは、ターミナルのファイル転送の手元の側をリモートのホストにでき、そのとき転送の コマンドはホストで動く。ターミナルのマクロとセッション を見る。

設定の一覧

English

ForgeKairos が Zed に足した設定と、既定値を変えた Zed の設定の一覧。値は同梱の assets/settings/default.json のもの。ほかの設定は Zed の設定の文書 を見る。

外部通信の許可リストは settings.json の設定ではなく、network_allowlist.json に置く (外部通信の統制 を参照)。

ForgeKairos が足した設定

全般とレイアウト

キー既定値説明
ui_language"system"表示言語。"system"、"en"、または "ja" などの BCP 47 タグ。
default_stacked_dock"right"プロジェクトを初めて開いたときに 2 つのパネルを並べるドック (left、right、bottom)。
default_stacked_panel"agent"そのドックの 1 枚目のパネル (none、agent、browser、terminal、project、git、outline、debug)。
default_stacked_secondary_panel"browser"そのドックの 2 枚目のパネル (選択肢は同じ)。
tab_bar.show_buttons_on_inactive_panestrueフォーカスの無いペインにもタブ行のボタンを出す。
acknowledged_external_ai_providers[]学習リスクの警告を承諾した AI プロバイダー。設定 UI が書く。
auto_update_include_prereleasesfalse更新の確認で GitHub のプレリリースも対象にする (インストールと更新 を参照)。

エディターとファイル

キー既定値説明
toolbar.markdown_format_bartrueMarkdown を開いている間、エディターのツールバーの下に整形の行を出す。
hard_break_on_newlinefalse (Markdown は true)Enter を押したとき、先に Markdown の強制改行 (行末のスペース 2 つ) を足す。
markdown_preview.soft_break_as_hard_breaktrueMarkdown のプレビューで 1 つの改行を改行として表示する。
tabular_data.open_as_gridtrueCSV と TSV をグリッドで開く。
tabular_data.multiline_cellstrue改行を含むセルを、行の高さを伸ばして全部表示する。
git.status_untracked_files"all"git status が追跡していないファイルをどこまで報告するか (all、normal、no)。SSH のリモートでも使う。

C と C++

キー既定値説明
symbol_index.enabled"auto"名前ベースのシンボル索引を作る条件: auto (C か C++ のファイルがあるとき)、on、off。
symbol_index.include_ignoredfalse.gitignore で除外したファイルも索引に入れる (プロジェクトパネルが読み込んだものだけ)。
symbol_index.language_server_timeout_ms1500「定義へ移動」が言語サーバーを待つ時間。過ぎると名前一致も出す。
symbol_index.hover_type_contentstrueホバーに型の中身 (構造体のメンバー、列挙の定数、マクロの定義) を出す。
clangd.index_mode"full"full: clangd がプロジェクト全体を裏で索引する。light: 開いたファイルだけ。
clangd.max_workers0clangd のスレッド数 (-j)。0 は clangd の既定。
clangd.memory_limit_mb0clangd のメモリがこの MB を超えたら再起動する (30 秒ごとに確認、10 分に 1 回まで)。0 は再起動しない。
call_graph_panel.buttontrueステータスバーに呼び出しグラフのボタンを出す。
call_graph_panel.dock"right"呼び出しグラフのパネルのドック (left、right)。
call_graph_panel.default_width320呼び出しグラフのパネルの既定の幅。
call_graph_panel.max_children200「さらに表示」の行の前に並べる呼び出し元・呼び出し先の数。
call_graph_panel.follow_cursorfalseカーソルが動くたびに、カーソル位置の関数を根にする。
call_graph_panel.sources"all"呼び出しの出どころ: all、language_server、name_match。
call_graph_panel.excluded_callees["printk", "pr_info", …]呼び出し先から外す関数 (最後の行で件数を出す)。

AI とエージェント

キー既定値説明
agent.pause_worktree_code_after_agent_writesfalseエージェントが書き込んだプロジェクトのフォルダーは、変更を確認して再開するまで、そのフォルダーのコード (フォーマッター、リンター、インタープリター、ビルドスクリプト) を実行しない。ユーザー設定のファイルからだけ読む。
agent.language_servers_allowed_while_paused[]フォルダーの停止中も動かしてよい拡張機能の言語サーバー。ユーザー設定のファイルからだけ読む。
agent.starts_openfalse起動時にエージェントパネルを開く。
agent.sidebar_enabledfalseウィンドウ全体のスレッドのサイドバーを使えるようにする。
agent.panel_thread_historytrueエージェントパネルの中にスレッドの履歴の一覧を出す。
agent.panel_tab_bar"auto"エージェントパネル自身のタブ行を出す条件 (auto、always、never)。
agent.auto_compact_min_context_window80000自動の要約を行うモデルの文脈長 (トークン) の下限。8000 未満は 8000 になる。
agent.attach_active_filefalse送るメッセージごとに、開いているエディター (選択範囲、無ければファイル全体) を添付する。
agent.context_attachments.inline_max_bytes16384これより大きいファイルはアウトラインで添付する。
agent.context_attachments.message_budget_bytes655361 メッセージの添付の合計がこれを超えると、大きいものからアウトラインか参照に減らす。
agent.context_attachments.outline_max_bytes81921 ファイルのアウトラインの上限。
agent.context_attachments.fetch_max_bytes32768取得した Web ページを添付する量の上限。
agent.context_attachments.diagnostics_max_files50診断を添付するファイル数の上限。
agent.system_prompt_repo_map_bytes0エージェントのシステムプロンプトに入れるリポジトリの地図のバイト数。0 で無効、上限 32768。
agent.idle_disconnect_minutes5外部エージェントのスレッドが無くなってから接続を保つ分数。0 はウィンドウを閉じるまで保つ。
agent.agent_servers_update_check"on_startup"ACP レジストリからインストールした外部エージェントの新しいバージョンを確認するタイミング。"on_startup" は IDE の起動時に 1 回、"manual" は agent: check for agent updates を実行したときだけ確認する。更新に同意するまでは、インストール済みのバージョンで起動する。
agent.claude_code_run_outside_sandboxfalse「Claude Code を起動」で、確認せずに常にサンドボックスの外で起動する。ユーザー設定のファイルからだけ読む。
ide_server.enabledfalseForgeKairos を Claude Code CLI 向けの loopback の IDE サーバーとして公開する。
ide_server.assist_toolstrueエージェントに IDE のツール (ハイライト、注釈、ツアー、定義、参照、シンボル検索) を MCP サーバー名 zed で渡す。
ide_server.share_active_filetrue何も選択していなくても、開いているファイルを接続中の Claude Code CLI に知らせる。
ide_server.share_task_outputtrue最後に失敗したタスクの出力の末尾 (4 KB まで) をエージェントが読めるようにする。

エージェントのプロファイルには 編集のみ (agent.profiles.edit) が加わる。ファイルを読み、編集するが、 コマンドを実行せず、ネットワークにも出ない。パスの削除・移動・コピーも含めない。 agent.tool_permissions.default には 4 つ目の値 "auto" がある (AI を参照)。

ターミナル

キー既定値説明
terminal.macro_picker_folders_collapsedfalseマクロのピッカー (「マクロを実行…」) をすべてのフォルダーを畳んで開く。
terminal.session_log.autofalse新しく開いたターミナルのログを自動で取る。
terminal.session_log.directory""ログの保存先 (~ を展開する)。空ならログフォルダーの下の terminal-sessions。
terminal.session_log.file_name_template"{date}_{time}_{title}.log"ログのファイル名。{date} {time} {title} {host} {pid} を展開する。
terminal.session_log.strip_control_sequencestrueANSI / VT のエスケープシーケンスを除いて、平文で保存する。
terminal.session_log.timestampsfalse各行の先頭に [YYYY-MM-DD HH:MM:SS] を付ける。
terminal.remote_persistence.enabledtrueSSH のターミナルを切断をまたいで生かす (Windows 以外のリモート)。
terminal.remote_persistence.detached_timeout_hours24どのターミナルも繋がっていない状態がこの時間続いたら、リモートのシェルを終える。0 は終えない。

内蔵ブラウザー

キー既定値説明
browser.buttontrueステータスバーにブラウザーのボタンを出す。
browser.dock"right"ブラウザーのパネルのドック (left、right、bottom)。
browser.starts_openfalse起動時にブラウザーのパネルを開く。
browser.default_width480左右のドックでの既定の幅。
browser.default_height320下のドックでの既定の高さ。
browser.home_url"https://m365.cloud.microsoft/chat"開始ページ。
browser.search_url"https://www.google.com/search?q={query}"アドレスバーの入力が URL でないときに使う URL。
browser.copilot_url"https://github.com/copilot"選択した文字列について「Copilot に聞く」で開く URL。
browser.use_egress_proxyfalse内蔵ブラウザーの通信にも許可リストを適用する。

ブラウザーのパネルは Windows では Microsoft Edge WebView2 を使う。ほかの OS では「対応していない」旨と、 外部のブラウザーで開く手段だけを出す。

リモートと開発ツール

キー既定値説明
remote.relay_http_through_clienttrueリモートのダウンロード (言語サーバー、node、拡張機能、エージェント) をこの PC 経由で行う。
dev_tools.suggest_missingtrue足りない言語サーバーとフォーマッターを通知し、データフォルダーに入れるボタンを出す。
dev_tools.ignored[]通知しないツール (例: "clangd")。

既定値を変えた Zed の設定

キーForgeKairosZed
agent.enabledfalsetrue
agent.dock"right""left"
agent.default_model未設定 (認証済みの最初のプロバイダーを使う)zed.dev / claude-sonnet-4
edit_predictions.provider"none""zed"
edit_predictions.allow_data_collection"no""default"
telemetry.diagnostics、telemetry.metricsfalse (使われない。値によらず Zed へ送らない)true
auto_updatefalsetrue
auto_install_extensions{}{ "html": true }
project_panel.dock、outline_panel.dock、git_panel.dock、collaboration_panel.dock"left""right"
project_panel.git_status_indicatortruefalse
title_bar.show_menustruefalse
show_whitespaces"all""selection"
terminal.starts_opentruefalse
markdown_preview.limit_content_widthfalsetrue
buffer_font_fallbacks["BIZ UDGothic", "MS Gothic", "Yu Gothic UI"]null
ui_font_fallbacks["Yu Gothic UI", "Meiryo"]null
languages.C.formatter、languages.C++.formatterGNU を基にした書式の clang-format未設定

Windows でのビルド

English

Windows で ForgeKairos をビルドする手順の概要。Zed 自身のビルドの手引きは Zed の開発の文書 にある。

必要なもの

  • Visual Studio 2022 (C++ のワークロード、MSVC v143、Spectre の緩和ライブラリ、Windows 11 SDK 10.0.26100、 CMake。CMake は Visual Studio 同梱のものでよい)
  • rustup (rust-toolchain.toml が指定するツールチェーンとターゲットは最初のビルドで入る)
  • 長いパスを Git (core.longpaths) と Windows (LongPathsEnabled) で有効にする
  • RUSTFLAGS を設定しない
  • 十分なディスクの空き (target フォルダーは 100 GB を超えることがある)

ビルド

powershell -NoProfile -File script\build.ps1            # debug ビルド (target\debug)
powershell -NoProfile -File script\build.ps1 -Run       # ビルドしてから起動
powershell -NoProfile -File script\build.ps1 -Release   # release ビルド (target\x86_64-pc-windows-msvc\release)

スクリプトが行うこと:

  • CMake が無ければ、Visual Studio 同梱の CMake を PATH に足す
  • ディスクの空きが少なければ警告する
  • -j 8 でビルドする (-Jobs で変えられる。並列を制限しないと rustc がメモリ不足で落ちることがある)
  • Linux 用のリモートサーバー (x86_64-unknown-linux-musl、静的リンク) を zig と cargo-zigbuild で ビルドし (無ければ入れる。zig は winget で)、forgekairos-remote-server-linux-x86_64.gz としてエディターの隣に置く
  • リモートのホストでエージェントのサンドボックスが使う slirp4netns を取ってくる
  • clang-format.exe をエディターの隣の bin\ に置く

出力先は target\debug (-Release では target\x86_64-pc-windows-msvc\release)。CARGO_TARGET_DIR があれば target の代わりにそこを使う。

オプション効果
-Releaserelease のプロファイルで target\x86_64-pc-windows-msvc\release に、インストーラーのスクリプトと同じ形でビルドする (下を参照)。
-Runビルドに成功したらエディターを起動する。
-Jobs <n>-j 8 の代わりに -j <n> でビルドする。
-FreeDisk先に、ビルドするプロファイルの incremental フォルダーと、deps の .exe と .pdb を消す。
-SkipCliコマンドラインの道具をビルドしない。
-SkipRemoteServerリモートサーバーをビルドしない。
-SkipSlirp4netnsslirp4netns を取ってこない。
-SkipClangFormatclang-format を置かない。
-ClangFormatPath <ファイル>置く clang-format.exe。指定が無いか、そのファイルが無ければ Visual Studio 2022 同梱の LLVM のものを使う。

エディターは ForgeKairos.exe、コマンドラインの道具は forgekairos-cli.exe で、どちらも target\debug (または target\x86_64-pc-windows-msvc\release) にできる。コマンドラインの道具は隣のエディターを探す。インストーラーはコマンドラインの 道具を bin\forgekairos.exe として入れる。ビルドのフォルダーで名前が違うのは、Windows では forgekairos.exe と ForgeKairos.exe が同じファイルになるため。

release ビルドは stable チャンネルのデータフォルダー (インストールした ForgeKairos と同じ) を使う。分けるには --user-data-dir <フォルダー> を付けて起動する。

インストーラー

script\build.ps1 はインストーラーを作らない。作るのは script\bundle-windows.ps1: release ビルド (x86_64-pc-windows-msvc 向け。出力は target\x86_64-pc-windows-msvc\release) をし、Windows 用のリモートサーバーの ビルド、Linux 用のクロスビルド、clang-format とそのライセンスと slirp4netns の同梱を行い、Inno Setup 6 (winget install JRSoftware.InnoSetup) を実行する。インストーラーは target\forgekairos-windows-x86_64-setup.exe に できる。オプションには -Architecture、-Install (できたものを入れる)、-ReleaseTag <タグ> (公開する GitHub リリースのタグ。更新の確認が比べる)、-ClangFormatPath、-Fast (下を参照) などがある。Visual Studio 2022 とネットワーク (ConPTY、 AMD GPU Services のライブラリ、slirp4netns、無ければ zig を取ってくる) が要る。

pwsh -NoProfile -File script\bundle-windows.ps1

インストーラーは script\build.ps1 -Release の release ビルドをそのまま使う。両方とも同じパッケージ (zed、cli、auto_update_helper を 1 回の cargo で)、同じターゲット、Visual Studio の開発者環境、リリース チャンネルの設定でビルドするため。どれかが違うと (素の cargo build --release、別のパッケージの組み合わせ、開発者 環境の外でのビルド)、cargo は C の依存とエディターをビルドし直す。何も変えていなければ数秒で終わる。コミットの後は エディターに埋め込むコミットのハッシュが変わるので、release のプロファイル (thin LTO) でのエディターのコンパイルと リンクに 30 分ほどかかる。

-Fast は手元で試す用のインストーラーを作る (公開用ではない)。release-fast のプロファイル (LTO なし、デバッグ 情報は limited) で target\x86_64-pc-windows-msvc\release-fast にビルドし、lzma2/fast で圧縮する。 初回はこのプロファイル用にすべての依存をビルドし直すので、時間とディスクを使う。

PowerShell 7 (pwsh。winget install Microsoft.PowerShell) が要る。Windows PowerShell 5.1 (powershell) から起動すると同じオプションのまま pwsh で起動し直し、pwsh が入っていなければ説明を出して止まる。

ほかの OS

script/bundle.ps1 (PowerShell 7。Linux と macOS では pwsh で起動する script/bundle も使える) は、どの OS の パッケージも 1 つのコマンドで作る。-Os で選ぶ: windows、linux、macos、all。省くと動いている OS。

pwsh -NoProfile -File script/bundle.ps1 -Os windows    # script\bundle-windows.ps1 (上を参照)
pwsh -NoProfile -File script/bundle.ps1 -Os linux      # Windows では WSL の Docker の中で
pwsh -NoProfile -File script/bundle.ps1 -Os macos -Wait
pwsh -NoProfile -File script/bundle.ps1 -Os all -DryRun
作る OSWindows でLinux でmacOS で
Windowsscript\bundle-windows.ps1ワークフロー (-Os all か -Ci のときだけ)ワークフロー (-Os all か -Ci のときだけ)
LinuxWSL の Docker のコンテナーで script/bundle-linuxscript/bundle-linux (-Container でコンテナー)ワークフロー。-Container なら手元の Docker のコンテナー
macOSワークフローワークフローscript/bundle-mac

パッケージは target に、更新の確認が探す名前でできる: forgekairos-windows-x86_64-setup.exe、 forgekairos-linux-x86_64.tar.gz、forgekairos-macos-aarch64.dmg、forgekairos-macos-x86_64.dmg。リモート サーバーは forgekairos-remote-server-linux-x86_64.gz と forgekairos-remote-server-macos-<arch>.gz。

Linux と macOS のパッケージにも、Windows のインストーラーと同じく、SSH・WSL・Docker の接続が Linux のホストに 入れるもの (Linux x86_64 のリモートサーバー forgekairos-remote-server-linux-x86_64.gz と slirp4netns-linux-x86_64) が入る。無いとエディターはサーバーをダウンロードすることになり、既定のネットワークの 方針がそれを止める。置き場所はエディターが探す所: Linux のパッケージではエディターと同じ libexec/、macOS では アプリの Contents/Resources。clang-format は Linux と macOS には入れない: エディターは PATH の clang-format (ディストリビューションのパッケージ、Homebrew の brew install clang-format、Xcode) を使う。

オプション: -Architecture (この機械で作るものの x86_64 か aarch64。既定はこの機械)、-MacosArchitecture (both、aarch64、x86_64: ワークフローが作る macOS。Windows と Linux はワークフローでは x86_64)、 -ReleaseTag (インストーラーと同じ)、 -Jobs <n> (cargo の -j)、-Ci (すべてワークフローで作る)、-Wait (ワークフローの終わりを待ち、できたものを target/ci-<実行の ID>/ に落とす)、-Ref (ワークフローがビルドするブランチかタグ。既定は今のブランチ)、 -DryRun (実行せずにコマンドを表示する)。Windows 用の -Fast、-Install、-ClangFormatPath は script\bundle-windows.ps1 に渡す。

Linux

Linux では先に script/linux でビルドに要るものを入れる。パッケージはその機械の glibc にリンクし、同じか新しい 版の glibc でだけ動く。Windows では WSL の Docker (wsl.exe -e docker) の ubuntu:22.04 のコンテナー (glibc 2.35) でビルドするので、Ubuntu 22.04、Debian 12 とそれ以降で動く。イメージは script/linux で依存を、 rust-toolchain.toml のツールチェーンを入れる。-LinuxImage で別のベースイメージを、-Container で Linux の 機械でもコンテナーを使う。

作業ツリーをコンテナーにマウントするので、ビルドは手元の作業ツリー (コミットしていない変更も含む) から作る。cargo のレジストリと target フォルダーは target の下ではなく、WSL の中の Docker のボリューム forgekairos-bundle-cargo-ubuntu-22.04 と forgekairos-bundle-target-ubuntu-22.04 に置く (target は数十 GB に なる)。空けるには wsl.exe -e docker volume rm で消す。初回はイメージとすべての依存をビルドする。2 回目からは変わった ところだけをビルドし直す。

macOS

macOS のパッケージは Mac (Xcode、script/bundle-mac。Linux のリモートサーバーを cargo-zigbuild で クロスビルドするので zig も要る: brew install zig。cargo-zigbuild は無ければスクリプトが入れる) で作るか、下の GitHub Actions のワークフローで作る。 ほかの OS では script/bundle.ps1 -Os macos が GitHub CLI (gh workflow run。先に gh auth login) で ワークフローを起動する。ワークフローは GitHub にある状態のブランチをビルドするので、先にプッシュする。署名の シークレットが無ければアプリはアドホック署名になり、ダウンロードしたアプリを macOS は初回は開かない: システム設定の 「プライバシーとセキュリティ」の「このまま開く」で許可するか、 xattr -dr com.apple.quarantine /Applications/ForgeKairos.app で隔離の印を外す。リポジトリにシークレット MACOS_SIGNING_IDENTITY、MACOS_CERTIFICATE、MACOS_CERTIFICATE_PASSWORD、APPLE_NOTARIZATION_KEY、 APPLE_NOTARIZATION_KEY_ID、APPLE_NOTARIZATION_ISSUER_ID を設定すると、その Developer ID で署名し、 公証 (notarization) も行う。

リリースのワークフロー

.github/workflows/forgekairos_release.yml は GitHub のホストするランナーでビルドする: Windows x86_64 は windows-2022、Linux x86_64 は ubuntu-22.04、macOS の aarch64 と x86_64 は macos-14 (x86_64 はクロス コンパイル)。各ジョブは script/bundle.ps1 -Os <OS> を実行し、パッケージをファイル名と同じ名前の アーティファクトとして上げる。動くのは、起動したとき (Actions のタブから入力 os、macos_arch、 release_tag を付けて、または script/bundle.ps1 から) と、v* のタグをプッシュしたときだけ。タグのときは 最後のジョブがすべてのパッケージを付けた下書きの GitHub リリースを作る (確かめてから公開する)。

リポジトリは非公開なので、ワークフローはアカウントの課金される Actions の時間を使い、macOS の時間は 10 倍に 数える。標準のランナーでは 1 ジョブに数時間かかる (thin LTO の release ビルド) ので、要る OS だけを起動する (-Os macos、入力 macos_arch)。ジョブは Swatinem/rust-cache で cargo のレジストリとビルドをキャッシュし、 依存が変わらない再実行を安くする。GitHub が保つキャッシュはリポジトリあたり 10 GB までで、古いものから消える。

リリースの作り方

  1. タグを決める: v と crates/zed/Cargo.toml の版 (v1.22.0)。プレリリースは後ろに付ける (v1.22.0-pre、v1.22.0-pre.2)。- を含むタグはプレリリースとして公開し、更新の確認は auto_update_include_prereleases を有効にした人にだけ出す。タグはどのビルドにも -ReleaseTag で渡す: ビルドに埋め込まれ、更新の確認は GitHub のリリースをこれと比べる。

  2. Windows と Linux は手元で作る:

    pwsh -NoProfile -File script/bundle.ps1 -Os windows -ReleaseTag v1.22.0
    pwsh -NoProfile -File script/bundle.ps1 -Os linux -ReleaseTag v1.22.0
    
  3. macOS はワークフローで作る (先にコミットをプッシュする。課金される): pwsh -NoProfile -File script/bundle.ps1 -Os macos -ReleaseTag v1.22.0 -Wait がディスクイメージと macOS の リモートサーバーを target/ci-<実行の ID>/ に落とす。

  4. 下書きのリリースを作り、パッケージをその名前のまま上げる (更新の確認はこの名前で探す):

    gh release create v1.22.0 --repo SeiyaFunaokaJP/ForgeKairos --draft --target (git rev-parse HEAD) --title "ForgeKairos v1.22.0" --generate-notes
    gh release upload v1.22.0 --repo SeiyaFunaokaJP/ForgeKairos `
        target/forgekairos-windows-x86_64-setup.exe `
        target/forgekairos-linux-x86_64.tar.gz target/forgekairos-remote-server-linux-x86_64.gz `
        (Get-ChildItem -Recurse -File target/ci-<実行の ID>).FullName
    

    プレリリースなら --prerelease を足す。下書きを確かめてから GitHub で公開する。公開でタグができる。

代わりにタグをプッシュする (git push origin v1.22.0) と、ワークフローがすべての OS をビルドし、下書きの リリースも作る。時間はいちばんかかる。下書きの公開でできたタグでもワークフローが動くことがある: パッケージを もう上げてあるなら、その実行は gh run cancel で止める。

更新の確認はサインインせずにリリースを読むので、リポジトリが非公開のあいだは何も見えない。

確認

upstream の規約は引き続き守る: cargo clippy ではなく ./script/clippy を使う。翻訳の確認は locales/README.md (英語) を見る。

既知の制限

English

プラットフォーム

  • ForgeKairos は Windows で開発し、確かめている。macOS と Linux のパッケージは作っても確かめてもいない。
  • 内蔵ブラウザーのパネルは Microsoft Edge WebView2 を使い、Windows でだけ動く。
  • 同梱のリモートサーバーは Linux x86_64 のホスト用である。
  • Windows 11 では、ForgeKairos で開く が「その他のオプションを確認」の下にだけ出ることがある。
  • コラボレーション (通話と画面共有) は含まない。

外部通信の統制

  • エージェントと MCP サーバーに渡すプロキシは、プロキシの環境変数を読むプログラムにだけ効く。
  • 許可リストはエディター自身の道具 (言語サーバー、拡張機能、更新、Git) を制限せず、既定では内蔵ブラウザーも 制限しない。
  • サンドボックスの外では、エージェントの通信はプロキシの設定に従う範囲でしか制限できない。

翻訳

  • 言語モデルに送る文字列とログのメッセージは英語のまま。
  • タブの題名など一部の表示は、再起動しないと言語が切り替わらない。
  • リモートサーバーは、接続しているすべてのクライアントに 1 つの表示言語を使う。

C と C++

  • シンボル索引は名前で一致させるので、同じ名前の無関係なシンボルが結果に出ることがある。索引からの結果には 「名前一致」の印を付ける。
  • 言語サーバーを再起動した後、誰も開いていないファイルの診断は消えたままになる。ファイルを 1 つも開いて いない状態の「すべてのサーバーを再起動」では、サーバーは止まったままになる。
  • clangd.index_mode が "light" のときは、参照、呼び出し階層、名前の変更は開いたファイルだけが対象。

リモート開発

  • 切断をまたいで生きるターミナルは、Windows 以外の SSH のホストでだけ動き、タスクとエージェントのシェルには 使わない。
  • Linux でポーリングで見ているフォルダーの外部の変化は、数秒遅れて見える。

Markdown、Mermaid、CSV

  • 文字色と文字サイズは HTML の style 属性を使うので、GitHub では表示されない。
  • プレビューでのダブルクリックによる Mermaid のラベルの編集は、フローチャート、ER 図、状態図、クラス図、 シーケンス図、円グラフ、ガントチャートだけ。構造化エディターは、再現できない構文を含む図は開かない。
  • CSV のグリッドには、数式、数値と日付の書式、セルの結合、列のドラッグでの並べ替えが無い。