このドキュメントは、clikae のコマンド文法(grammar)と語彙(lexicon)を定義します。
これが唯一の信頼できる情報源(SSOT)です。bin/clikae(ディスパッチ)、
lib/commands/help.sh、ユーザーの目に触れるすべての文言、ホームダッシュボード、
そしてドキュメント類は、すべてここに書かれている内容に従います。文法とコードが
食い違ったときは、文法が正です — コードのほうを直してください。
コマンド表面やユーザー向けの文言に手を入れる前に、最後まで通して読んでください。
0. 核心となる一つの考え
clikae は動詞です。 名前は CLI + kae(切り替え、kirikae —「切り替える」)
からできています。このツールの仕事はまるごと切り替えなので、clikae という語自体が
すでに「切り替える」を意味しています。文法はこの考えの上に組み立てられています。
- 看板となる操作 — CLI をあるタンク(tank)に向けて起動する — には、動詞がまったく
要りません。動詞はプログラム名そのものだからです。
clikae claude workは 「claude を work に切り替える」と読めます。覚えることは何もありません。clikaeの意味はもうわかっているはずです。 - 切り替えでない操作(作成、削除、確認、監視)には、明示的でありふれた動詞を そのまま使います。
これは凝った動詞を発明するのとは正反対です。私たちは run を burn に
リネームしたりはしません。プログラム名がすでに動詞を担っているところでは動詞を
省略し、それ以外ではどんなパワーユーザーも手に覚えているありふれた動詞を使います。
1. 二つの層、一つのルール
インターフェースは慣習に従う。メタファーはモデルの中に宿る。
| 層 | ここに入るもの | ルール |
|---|---|---|
| 動詞/操作 | 入力し、タブ補完し、スクリプトに書くもの | 慣習に従う。init / remove / list / status は git、docker、npm、kubectl、gh が使うものそのまま。切り替えの操作は省略される(プログラム名=動詞)。新しく覚える動詞はゼロ。 |
| 名詞/モデル | 読んで覚える概念 | ここで燃料のメタファーが本領を発揮する。キー入力のコストをかけずにモデルを記憶に残りやすくする。 |
| 文章/ダッシュボード | ヘルプの導入、ステータス行、エラー、README、ボード | ここでは燃料の物語を自由に語ってよい。 |
メタファーが満たすべきテスト: 理解の助けにはなってよい。操作に必要であっては
ならない。clikae run claude work に物語は要りません。メタファーを読み解かないと
使えない動詞を、私たちは決して出荷しません。
2. 用語(名詞)
| 概念 | 言葉 | 補足 |
|---|---|---|
| clikae が管理する CLI ツール(claude、codex、agy…) | engine(別名 CLI) | 燃料を燃やすもの。引数は <engine>。内部コード、アダプタ、lib/adapters/ では cli という名前を保つ — ユーザーにはengineと見える。 |
| 燃やせる一つのアカウント/設定 | tank(別名 profile) | 中核となる名詞。ユーザーの目に触れるあらゆる場所で profile と slot を置き換える。 旧来の言葉を知っている人のために、ヘルプ本体および init/list の --help で初出時に「(別名 profile)」と注記する。 |
| タンク内の使用枠 | fuel / quota | — |
| 枠を使い切ったタンク | dry(ガス欠)タンク | ボード上で ⚠ のバッジが付く。 |
| CLI を使うこと(燃料を消費すること) | burn | 文章でのみ用いる(「タンクを差し替えて、燃やし続ける」)。コマンドではない。 |
| あるタンクがガス欠になったときに落ち込む先の控え | あなたの他のタンク | 別概念は不要。ボード上のタンク群がそのまま控えになる。(旧 pool コマンドは削除済み — 発見しづらく冗長だった。) |
| 進行中のセッションを別のタンクへ運ぶこと | relay(同じ CLI)/ handoff(別の CLI) | 内部用・旧来の用語。ユーザー向けの動詞は to(§3)。 |
profile と slot はユーザー向けの文言から退役しました。 これらは内部識別子と
ディスク上(~/.clikae/profiles/<engine>/<tank>/、profile_dir、profiles_root)でのみ
生き残ります — ストレージのレイアウトや中核関数をかき回したりはしません。ユーザーが
目にする言葉はただ一つ、tank です。
3. 文法(動詞)
3.1 切り替え — 省略された動詞
| 入力 | 意味 | 置き換える対象 |
|---|---|---|
clikae | タンクボード(ホーム)を開く。 | — |
clikae <engine> <tank> | <engine> を <tank> に切り替えて、まっさらな状態で開始する。 | run |
clikae <engine> | タンクが一つ → そこへ切り替える。複数 → 一覧/選択。なし → 作成を提案。 | — |
clikae <engine> <tank> -- <args> | …<args> をそのまま CLI に渡しつつ。 | run … -- … |
3.2 セッションを運ぶ — to
to は 「いまの作業を一緒に連れていく」 ためのマーカーです。clikae to codex は
「codex に切り替える」と読め、まっさらに始めるのではなく現在のセッションを運びます。
| 入力 | 意味 | 置き換える対象 |
|---|---|---|
clikae to <tank> | このシェルの現在のセッションを、同じ CLI の別タンクへ運ぶ → 本物の --resume。 | relay |
clikae to <engine> [tank] | それを別の CLI へ運ぶ → そのエンジンは他所のセッションを再開できないので、clikae は書き起こした**ブリーフ(brief)**を渡す(コールドスタート)。 | handoff |
ソースは自動検出されます。まず実行中の環境変数、次に — 素の切り替え/エイリアス/.app
はエンジンを prefix 代入付きで起動し、それが親シェルには届かないため — このディレクトリで
最も新しいトランスクリプトを持つタンク(ステートレス、「さっきここにいたセッション」)を
見ます。シェルをあるタンクに明示的に固定したいときは eval "$(clikae env <engine> <tank>)"
を実行します。clikae はどの仕組みを使ったかを常に告知するので、resume か brief かの
違いは覚える必要なく実行時に示されます。
✓ carried your live session → claude/personal (thread resumed)
⚠ codex can't resume a claude session — handed it a written brief (cold start)
正確に(タンクは燃料以上のものを保持する)。
toが運ぶのはセッションの トランスクリプト — スレッドは続きます — であって、エンジンの長期記憶ではありません。 長期記憶はタンクのディレクトリ内(例:CLAUDE_CONFIG_DIR配下にある claude のファイル メモリ)にあり、ソース側のタンクに残ります。つまり「再開」とは会話のことであって、 頭脳のことではありません。タンク間でメモリを運ぶ/共有することは、別個の、将来の オプトイン機能です(§10 のリンク/オーバーレイ案を参照)。「コンテキストはそのまま」と 言わないでください。
to の引数は、まずエンジン名、次に現在のエンジンのタンクとして解決されます
(ステートレスで予測可能:既知のエンジン名なら常にそこへ渡る)。明示的に区別したいときは
clikae to <engine> <tank> とします。clikae は何を解決したかを常に告知するので、推測が
外れても目に見え、訂正できます。
3.3 管理 — ありふれた慣習的な動詞
これらは切り替えではないので、明示的でありふれた動詞をそのまま保ちます。燃料の言葉を 無理に押し付けたりはしません。
| コマンド | 目的 |
|---|---|
clikae init <engine> <tank> | タンクを作成する。(--alias を付けるとシェルのエイリアスも書き込む。) |
clikae remove <engine> <tank> | タンクを削除する(ディレクトリ、エイリアス、.app)。 |
clikae rename <engine> <old> <new> | タンクをリネームする(ディレクトリ、エイリアス、ログインを引き継ぐ)。 |
clikae git-id <engine> <tank> [--name N --email E | --unset] | タンクに任意の git コミット用 ID を付与する。設定すると clikae env が GIT_AUTHOR_*/GIT_COMMITTER_* も export するので、そのシェルでのコミットは、エンジンのアカウントのメールではなく、あなたが意図した ID で刻まれる(issue #22 / HANDOFF §13)。素直なメタデータ動詞(タンクの状態を作成・確認する)で、燃料のメタファーはなし。正直に言うと:環境変数は git config には勝つが、明示的な git -c user.email=… には勝てない。効くのは以後のコミットのみ。 |
clikae tanks(エイリアス:clikae list / ls) | すべてのタンクを、ログイン中のアカウントとともに一覧する。tanks が正典 — 既存の adapters コマンドと同じ名詞のクエリであって、造語の動詞ではない。list/ls は慣習として、また GUI の list --json のために残す。 |
clikae status [cli] | このシェルで各 CLI がどのタンクにいるか。 |
clikae to [target] | セッションを先へ運ぶ。引数なし=燃やす順での次のタンク(あなたのタンク群が控えになる)。 |
clikae auto [ask|safe|full] | (BETA、claude)ガス欠タンクで、監督付きの起動がどこまで自力で運ぶか。 |
clikae watch <engine> [tank] | ガス欠タンクに気づき、燃やす順での次のタンクへの引き継ぎを提案/自動実行する。 |
clikae burn <engine> <tank> --artifact <path> (--prompt-file <f> | -- <cmd…>) | タンク上でヘッドレスのタスクを実行し、それが生成すべき成果物(artifact)で検証する(終了コードでは決して検証しない — codex exec は制限がかかっても 0 で終了する)。このタンクがガス欠になったら、同じタスクを次の控えタンクで再発火する。タスクの渡し方は簡単な方法(--prompt-file/--prompt + --add-dir:clikae が各エンジンのヘッドレス書き込みフラグをアダプタから埋めるので、エンジンをまたぐ再ルートも破綻しない)か、パワーユーザー向けの方法(生の -- <cmd…>)のどちらか。切り替えのヘッドレス版にあたる:バッチ/並列はオーケストレーターの仕事のまま。burn は、それがファンアウトして再発火する単一タスクの単位。--to で次の遷移先を明示的に強制できる。 |
clikae conduct --leg <e>/<t>… (--prompt-file <f> | --prompt <s>) | (BETA) 垂直オーケストレーションのプリミティブ:一つのプロンプトを N 個のアカウントへ並列に展開し、それぞれが自分のタンク(自分の枠)上でヘッドレス・読み取り専用で動く。そして各レグの全出力を集め、captured/dry の表を出力する。clikae は判定しない — N 個の結果ファイルと正直な表を渡すので、勝者はあなた(または指揮者として振る舞うセッションモデル)が選ぶ。頭脳と筋肉の分担:clikae は筋肉(アカウント、ガス欠検出、並列ルーティング)、指揮者は頭脳。設計上、読み取り専用なので、レグが共有ツリーを壊すことはない。書き込み/実装のトーナメントはオーケストレーターの仕事のまま。 |
clikae migrate [cli] | 手作りの config ディレクトリ+エイリアス構成を取り込む。 |
clikae app / clikae alias | macOS ランチャーを生成する/シェルのエイリアスを書き込む。 |
clikae lang [en-US|ja-JP|zh-TW] | インターフェース言語(ダッシュボード+プロンプト)を表示または設定する。ボードの l キーで言語ピッカーが開く。 |
clikae doctor / info / adapters / demo / help / version | 確認/メタ。 |
4. 構文解析と優先順位
bin/clikae は最初の引数を次の順で解決します。
- 予約コマンドか?(
init、remove、list、tanks、status、to、watch、auto、burn、conduct、rename、git-id、migrate、env、app、alias、lang、run、continue、relay、handoff、doctor、info、adapters、demo、home、help、version、加えてagy/dashboard/ls/rmのエイリアスと-h/--help/-v/--version)→ そのコマンドを実行する。(git-idはgit_id.shコマンドへルーティングされる —-を_にしたファイル/関数を持つ 唯一の動詞。) - そうでなければ、既知の CLI か?(
lib/adapters/のアダプタ、またはlib/targets/のターゲット、例:claude、codex、agy)→ §3.1 の素の切り替え。 - それ以外 → 不明。エラー+
helpを表示する。
驚かれないよう、その帰結も明文化しておきます。
- 予約コマンドが勝ちます。もし予約語そのままの名前を持つ CLI があった場合は、明示的な
エイリアス経由で到達します:
clikae run <engine> <tank>。 clikae <engine> --helpは曖昧なので推測しません。clikae 自身のヘルプはclikae help <engine>、CLI 向けのフラグは--の後に置きます (clikae <engine> <tank> -- --help)。
5. to の落とし穴 — そしてその無害化のしかた
clikae claude work(まっさらに開始)と clikae to claude work(セッションを運ぶ)は
一語しか違いません。素の切り替えは何も壊しません — 元のタンクのトランスクリプトは
あとで to で戻れるようにちゃんと残っています — ので、to を忘れたコストはたいてい
一手の無駄で済み、回復できます。
本当に痛むのはただ一つ、いまいるタンクがちょうどガス欠になったときです。限界に ぶつかって、続けたいのに、黙ってまっさらに始まるのは意図の真逆です。だから緩和策は 意図的に狭く — そこでのみ発火します。
緩和策(オプション B): 素の切り替えは、一般的にセッションを意識するのではなく、
ガス欠を意識します。clikae <engine> <tank> が呼ばれたとき、そのエンジンで現在
いるタンクが**枠を超えている(dry)**場合、clikae は黙ってまっさらに始めません。TTY では
こう尋ねます。
claude/main is out of fuel right now.
❯ Carry this session over to work (= clikae to)
Start work fresh
非対話的(パイプ/スクリプト)にはまっさらに開始をデフォルトとしつつ、こう表示します:
hint: to continue this session, use clikae to claude work。
現在のタンクがガス欠でないときは、素の切り替えは静かに即座に行われます — 別のタンクへの 切り替えはおそらく意図的なものだと尊重するからです。これにより、ただ一つのプロンプトを、 製品の核心の瞬間(ガス欠 → タンクの差し替え)にぴたりと置き、それ以外の場所には置きません。
6. Antigravity(agy)も同じ文法に畳み込まれる — 特別な動詞なし
このエンジンの正典の名前は agy です — それがこの CLI が自分自身を呼ぶ名前であり、
エンジン引数は常にバイナリ名(claude、codex、gh)というルールに一致します。
Antigravity は文章や UI のタイトルで使う固有名(「Antigravity (agy)」)であり、
antigravity は隠れた長い形のエイリアスとしてのみ生き残ります。あなたが入力するのは
agy です。
agy は ~/.gemini をハードコードし、あらゆる環境変数を無視し、config ディレクトリの
フラグも持たないため、他のエンジンのようにシェルごとに切り替えることができません。clikae は
~/.gemini をシンボリックリンクでタンクディレクトリ間で差し替えることで対応します — 機械全体で
一度に一つのタンクだけが有効になる、グローバルなパワーモードです。ユーザーがこのために
別個のコマンドツリーを覚えることはありません。agy は他のすべてと同じ動詞を使い、
特別なサブコマンドはゼロです。
| 入力 | agy のふるまい |
|---|---|
clikae init agy work | 初回: トレードオフを警告し、明示的に [y/N] を一度尋ねてから clikae が ~/.gemini を引き取る。そのうえでバックアップし、現在のログインを default タンクへ移し、work を作成する。以降: 単にタンクを作るだけ(儀式なし — 危険な一度きりの引き取りはもう済んでいる)。 |
clikae agy work | 有効なタンクを work に切り替え(agy が稼働中なら拒否)、agy を起動する。副作用が機械全体に及ぶため、agy is global — switched all terminals to work と表示する。 |
clikae list / status | agy のタンクも他と並んで現れる。● は唯一の有効なタンクを示し、(global) と表示される。 |
clikae remove agy work | タンクを削除する。最後のタンクを削除すると、素の ~/.gemini を復元して引き取りを解除することも提案する — それが解体で、remove に畳み込まれている。 |
clikae agy --release | まれな「タンクは残すが ~/.gemini の管理はやめたい」ケース:通常の単一アカウントの ~/.gemini を復元し、シンボリックリンクによる引き取りを解除して、タンクディレクトリは後のためにディスク上に残す。フラグ(タンク名ではない → 素の切り替えと衝突しない)。 |
clikae agy disable / antigravity disable はありません — それは素の切り替えと
衝突します(clikae agy <tank> は disable でも何でもタンク名として読む)。解体は
remove(最後のタンク)と --release フラグに置かれています。
要点:
- agy は多くのタンクを持てます(好きなだけ保管できる)。ただし機械全体で一度に
有効にできるのは一つだけです — agy のエンジンは単一のハードコードされた燃料ライン
(
~/.gemini)を持つからです。ボードの●がそれを可視化します。 - 警告と確認は初回の引き取りのときだけ(本物の
~/.geminiを管理下のシンボリック リンクに変えるとき)に行われます。以降のinit agy <tank>は素のmkdirで、init claudeと同じ摩擦です。 - agy は relay/
toのターゲットにはなれますが(clikae to agy→ ブリーフ+起動)、 ソースにはなれません(その.pbトランスクリプトは不透明)。watch agyは 通知のみです。
7. 後方互換(隠れエイリアス)
これらは動き続けますが、clikae help では宣伝されません(clikae help <cmd> には
現れることがあります)。
| 隠れエイリアス | 正典 |
|---|---|
run <engine> <tank> | clikae <engine> <tank> |
continue / relay / handoff | clikae to … |
antigravity add / use / enable / disable | init /素の切り替え/初回 init /remove-最後のタンク+--release に畳み込み |
antigravity(エンジン名として) | agy(正典のエンジン名。antigravity は隠れた長いエイリアス) |
list / ls → tanks、rm → remove、dashboard → home | tanks が正典。list/ls はエイリアス |
スクリプトや CI では、簡潔さより明確さが勝つ場面では明示的なエイリアス(clikae run …)を
優先すべきです — まさにそのためにあるものです。
8. ヘルプは省略形を先頭に置かねばならない
素の切り替えには動詞がないため、教えられない限り見えません。ホーム画面(素の clikae)と
clikae help は、これを冒頭に置かねばなりません。
clikae <engine> <tank> switch <engine> to <tank> and run it ← the main thing
clikae to <where> carry your current session elsewhere
clikae your tank board
clikae init <engine> <tank> create a new tank
clikae help full command reference
9. 実装チェックリスト(コードをこのドキュメントに合わせる)
- ディスパッチ(
bin/clikae):§4 の第一引数リゾルバ — 予約コマンド → 素の切り替え(既知の CLI)→ エラー。toとtanksを配線し、run、continue、relay、handoffを隠れエイリアスとして保つ。 - 素の切り替え:
<engine> <tank>を既存のcmd_runパス(env 適用+exec)に 通す。§5 のセッションを意識したプロンプトを追加する。 -
to:ソースを自動検出し、resume(同じ CLI)か brief(別の CLI)かを選び、 どちらを使ったかを告知する単一のコマンド。今日のrelay+handoffのふるまいを その背後に畳み込む。 - agy:
init/素の切り替え/removeでcli ∈ {agy, antigravity}をload_adapterの前に横取りする(agy にはアダプタがない)。初回のinit agyは 警告と確認の引き取りを実行する。素の切り替えはスロット選択+起動+グローバル通知を 行う。最後のタンクの削除は解体を提案し、clikae agy --releaseが タンクは残して解除を扱う。disableサブコマンドはなし(素の切り替えと衝突する)。 正典のエンジン名はagy。antigravityは隠れた長いエイリアスになる — 旧来のcmd_antigravityサブコマンドツリーを廃止する。 - 文言の一掃:
help.sh、listヘッダー(PROFILE→TANK)、init/run/removeのプロンプト、エラー文字列、ホームダッシュボードにわたってprofile/slot→tank(別名 profile)。ディスクレイアウトと中核関数名はprofileのまま。 - ヘルプ:
cmd_helpを §8 に書き換える — 省略形を先頭に。 - ドキュメント:
usage.md/README.mdをこの文法に合わせて更新する。 推奨の表面からrunとrelay/handoffを一掃する(エイリアスとしては残す)。 - テスト:第一引数の解決、
toの落とし穴プロンプト(TTY か非 TTY か)、 agy の畳み込み、後方互換エイリアスについて bats を書く。 - PowerShell ミラー:該当する箇所では同じ文法を
Clikae.psm1に反映する。
10. 設計の未踏領域 — タンクは燃料以上のものを保持する
並行セッション(枠超え検出の作業、プロファイル b、2026-06-01)からの寄与。ここには 未踏領域として記録しており、まだ決定ではありません — モデルに畳み込むかどうかは メンテナーの判断です。
緊張の在りか。 §2 は燃料=枠、タンク=一つのアカウント/設定だと言います。本当
ですが、タンクディレクトリは燃料よりはるかに多くを保持します — エンジンの長期記憶と
あらゆるトランスクリプトです。燃料は代替可能ですが、メモリはそうではありません。だから
「タンクを差し替えて、燃やし続ける」は、ひそかにエンジンの頭脳まで差し替えています。
(証拠:claude のファイルメモリは CLAUDE_CONFIG_DIR の中にあるので、profiles/claude/a と
…/b はまったく別のメモリストアを持ちます — 命名規則すら別々に漂流してきました。
タンク間でメモリが伝わるのは、手作りのブリッジを通したときだけです。)
統一されるパターン。 agy の ~/.gemini シンボリックリンク差し替え(§6)は単発の
特例ではありません。clikae は、自分の状態がどこにあるかをハードコードし、それが望む
カーディナリティと噛み合わないエンジンに何度もぶつかります — そしてその修正は常に、その
対応関係を作り直すためのファイルシステム的な間接化です。
| ケース | エンジンの想定 | clikae の望み | 間接化 |
|---|---|---|---|
| agy(§6) | ハードコードされた一つの ~/.gemini | 多くのタンク | シンボリックリンクが外向きにファンする(1 パス → N の中から選ぶ) |
| 共有メモリ | メモリは差し替えるディレクトリに同梱 | 一つの共有ストア | シンボリックリンクが内向きにファンする(N パス → 1 ストア) |
to(§3.2) | トランスクリプトはタンクごとに孤立 | それをまたいで運ぶ | コピーが境界を橋渡しする |
同じプリミティブ、三つの方向。協力的なエンジン(claude/codex/gh)が易しいケース
です — 環境変数なので、env-dir/env-file/flag がそれを指すだけです。agy とメモリが、
同じ道具を欲しがる絡み合ったケースです。
検討すべきアイデア: env-dir/env-file/flag と並ぶ第四の戦略 —
リンク/オーバーレイ戦略。これは(a)agy を「ターゲットであってアダプタではない」という
変わり種ではなく筋の通った戦略にし、(b)タンク間メモリ共有に居場所を与え(警告付き・
可逆のオプトインで、一つの共有メモリストアを各タンクにシンボリックリンクする — §6 と
同じインフォームド・コンセント方式)、(c)to のトランスクリプト運搬を同じ系譜につなげ
ます。つまり「agy が同じ文法に畳み込まれる」を一段下げて「agy が同じ状態制御モデルに
畳み込まれる、特別な仕組みなし」へ拡張したものです。
詳細:~/clikae-handoff-state-mapping.md。
§10 の残りは、その贈り物の上に積み上げたメンテナーの設計セッション(2026-06-01)です。 いまだ未踏領域であって、出荷された決定ではありません — ただ、形は合意されています。
10.1 統合:clikae はエンジンの頭脳の制御プレーン
上の緊張は、一つの考えに解けます。clikae はすでにエンジンの燃料がどこから来るか (どのアカウント/枠か)を制御しています。同じレバー — config ディレクトリへの ファイルシステム的な間接化 — が、エンジンのメモリも制御します。だからメモリも もう一つのダイヤルにすぎず、スペクトラムを成します。
| モード | メモリの対応 | 対象 |
|---|---|---|
| share | N タンク → 1 ストア(ファンイン) | 複数のアカウントにまたがる自分の頭脳を集約する |
| isolate | N → N(今日のデフォルト) | 現在のふるまい。被害範囲の封じ込め |
| evaporate | N → 0(使い捨てへリダイレクト) | 外科的/一時的なパワーユーザー |
agy のシンボリックリンクと同じプリミティブを、三つの目的に向けたもの。clikae の本質を 一言で:状態がどこに、どれだけの間、どれだけ広く共有されて存在するかを制御する — 認証/ 設定について(今日)、燃料について(捉え直し)、そしていまやメモリについて。
派生:MCP コネクタ。 各タンクに隔離された claude.ai のログインは、そのセッションで どの MCP コネクタが有効になるかも決めます — タンクを切り替えると、Stripe、Drive、 WordPress のコネクタも一緒に切り替わります。clikae は MCP を管理しないし、コネクタを プロビジョニングもしません。これは単に、アカウントごとの認証の隔離が、燃料とメモリに 並ぶ第三の層として実を結んだものです。
指針となる価値(メンテナー、確定): 集約せよ、ソースを書き換えるな。 メモリの 移動/共有/変換は、外へ向かうコピーに対して行われ、ソース側のタンクのメモリはその場で 書き換えられることが決してありません。relay の「コピーであって移動ではない、ソースは 無傷」と同じ DNA です。
10.2 ブリッジ — プラグ可能でローカルファーストな翻訳器
エンジンをまたぐメモリはシンボリックリンクではありません:claude/codex/agy は
互換性のない形式でメモリを保管します。修正は handoff の既存の
CLIKAE_HANDOFF_SUMMARIZER を写したもの — プラグ可能でローカル/安価なモデルが意味的な
仕事をこなし、clikae は配管を回すだけです。CLIKAE_MEMORY_TRANSLATOR='<cmd>' を
提案します:model-agnostic で、ローカルファースト(枠を燃やさず、何も機械から
出ない — メモリは機微なものだから)。Apple Intelligence はバックエンドの一つ
(そのオンデバイスモデルは Swift の FoundationModels 経由でしか届かないので、小さな
clikae-translate シムを介する — GUI はすでに Swift)。llm/ollama も別の一つ。
異議の焦点が形式から損失へ移ります。 一度きりの handoff ブリーフのための要約器が 安全なのは、ブリーフが使い捨てだからです。メモリはその正反対 — 権威があり、累積し、 セッションをまたいで信頼されます。LLM が同期のたびにメモリを書き直すと漂流します(伝言 ゲーム)。だからメモリの翻訳は、レビュー可能かつ可逆として扱われねばならず、黙ってバック グラウンドで書き直すものであってはなりません。
10.3 軽量か重量か — そしてアイデア B
- 軽量 —
toごとのメモリ注入(使い捨て)。clikae to codexのとき、翻訳器は ソース側タンクのメモリの関連する一片を codex が使える形に変換し、handoff ブリーフと 並べて一度だけ注入する。codex は claude の頭脳を恒久的に育てるわけではない。この 続行に足るだけを知るだけ。正典のストアなし、伝言ゲームなし、並行性なし。文字どおりhandoff++ :ブリーフがスレッドを運び、これが頭脳の一片を運ぶ。まずこれをやる。 - 重量 — 恒久的な正典ストア。 clikae が唯一の正典メモリストアを保ち、翻訳器が 正典↔各エンジンを担い、すべてのツールが長期記憶を共有する。終着点だが、正典スキーマ、 レビュー可能な同期(差分を見せて、承認する)、漂流の制御、並行性の処理が要る。
- アイデア B(エンジンが clikae をネイティブに読み書きする) — 半分は本当、半分は壁。
すでに本当: clikae の config ディレクトリ間接化は、メモリを物理的にすでに自分の
ツリーに置いている — まさにこのファイルの
MEMORY.mdが…/profiles/claude/b/…/memory/配下にある。壁: エンジンはメモリの場所のフック (環境変数)は公開するが、メモリの形式のフックは公開しない — claude のメモリを 移動はできても、clikae のスキーマで書かせたり、codex に claude のファイルを読ませたりは できない。だから B のきれいな形=claude のほぼ中立な markdown を正典として採用する。 claude はほぼネイティブ、他は翻訳器でブリッジ。B は翻訳から逃れるのではなく、最も中立な 形式をアンカーに選ぶことで翻訳を最小化する。(B は別の扉から到達する重量版。)
10.4 一時的メモリ(「evaporate」モード) — ✅ 出荷済み
外科的なパワーユーザーは、何も覚えないモデルを望みます。clikae はすでに config
ディレクトリの間接化を握っているので、memory サブディレクトリを使い捨てに向けるのは
造作もない — 同じプリミティブの三つ目の方向です。clikae <engine> <tank> --ephemeral と
して出荷済み(lib/commands/switch.sh):タンクの本物の projects/<slug>/memory を
脇へ退避し、その場所に mktemp -d の使い捨てをシンボリックリンクし、エンジンを子として
(exec ではなく、なのでクリーンアップが走る)実行し、終了時に本物のメモリを復元して
使い捨てを消去します。クラッシュした実行は次の --ephemeral で自己回復します。ログインと
トランスクリプトは通常どおり — メモリだけが使い捨てです。新しい任意フック
adapter_memory_dir <dir> でエンジン側のゲートをかけます(claude が定義し、他は
--ephemeral をきれいに拒否します)。bats は tests/bats/ephemeral.bats に。
正直な枠付け(書いたとおりに出荷): clikae が保証するのはメモリディレクトリが
使い捨てであること — 一時的メモリであって、「どこにも何も覚えない」ではありません
(キャッシュ、シェル履歴、テレメトリ、Keychain は手の届かない外側)。--help/ドキュメントは
保たれるものだけを約束します。
10.5 出荷の順序
- ✅ 一時的メモリ — 出荷済み(
--ephemeral;最小、モデル/翻訳ゼロ、外科的ユーザーに 即座の価値)。 toごとの軽量メモリ注入 — ローカル翻訳器の試金石(handoff++)。次。- 重量の正典ストア(=アイデア B) — ローカルブリッジが信頼できると証明され、 使い捨ての一片だけでは足りないとわかってから。
三つとも一つの link/overlay 戦略(§10 冒頭)です — エンジンの頭脳に対するダイヤルとしての
clikae。
この文法はスケッチではなく決定です。コードを変える前に、まずここで、メンテナーとともに 変えてください。