AGENTS.md です。CLAUDE.md を別に置いているのは、Claude Code がプロジェクトルートの CLAUDE.md を自動的に読み込む仕様で、かつ @<path> というディレクティブで他ファイルを取り込めるためです。scaffolder が CLAUDE.md を新規生成する場合のデフォルト内容は @AGENTS.md の 1 行のみで、Claude Code が AGENTS.md の中身を自動的に context に展開してくれるため、2 ファイルを二重管理せずに済みます。プロジェクト固有の CLAUDE.md が既に存在する場合、scaffolder はそれを上書きせず、既存の内容が引き続き有効です。
ソース以外に重要なのは 2 層の状態です: .arkor/(プロジェクトごと、リポジトリ内)と ~/.arkor/(ユーザーごと、ホームディレクトリー)。
src/arkor/
Arkor は src/arkor/index.ts を見てプロジェクトを認識します。このファイルから createArkor() の結果をエクスポートしてください。CLI は次の 3 つのエクスポート形を優先順位順に受け付けます:
export const arkor = createArkor({ trainer })(推奨。テンプレートが生成する形)。export const trainer = createTrainer({ ... })(パワーユーザー向けショートカット。ラッパーが不要な場合)。- デフォルトエクスポート(
Arkorマニフェスト orTrainerのいずれか)。
index.ts を薄く保ちます:
index.ts だけです。
将来的に複数トレーナーを登録する場合は、ファイルを増やして createArkor に渡すことになります。今のところ API は単一の trainer だけを受け付けます。deploy と eval のスロットは型上で予約されていますが未実装です。
arkor.config.ts
プロジェクト生成ツールはデフォルトで次の arkor.config.ts を生成します:
maxSteps、learningRate、lora など)はすべて Trainer 自体に持たせるので、プロジェクトレベルではなくトレーナーごとにコントロールできます。削除する理由がない限り、ファイルはそのままにしておいてください。
.arkor/(プロジェクトごと、gitignore 済み)
このディレクトリーはコミットしないでください。
-
.arkor/state.json。プロジェクトのルーティング:orgSlug、projectSlug、projectId。これによってランタイムはローカルリポジトリをマネージドバックエンドのワークスペースにマップします。ファイルはensureProjectState()が作成し、CLI や Studio がスコープを必要とする最初のアクション(学習の開始、ベースモデル推論、Studio の Endpoints ページからの初回 deployment 作成など)で走ります。純粋な read 経路(Endpoints / Jobs の一覧表示など)は意図的に初期化を起こさないので、新規チェックアウト直後に Studio を開いてもリモートにプロジェクトを副作用で作ったりせず、空一覧が表示されるだけです。匿名ワークスペースではこの初回 write 呼び出しで自動作成されます。OAuth ワークスペースの場合はランタイムがエラーを返します。今のところarkor loginもarkor initもこのファイルに値を書き込まないので、{ orgSlug, projectSlug, projectId }を手動で書いて作るのが現実的な方法です。一度作られた後は手で編集しないでください。arkor logout後の注意点: logout はcredentials.jsonだけを削除するため、前の匿名 ID が残した.arkor/state.jsonはそのまま残ります。次の匿名セッションは新しい組織になり、read 経路ではこの古いファイルを無視します(一覧は空のまま、Studio も開けます)が、上記の write 経路は(手動管理された OAuth スコープの可能性があるため)それを再利用も上書きもせず、409/エラーで「.arkor/state.jsonを削除して新しい匿名プロジェクトを開始するか、そのプロジェクトを所有するアカウントでarkor loginしてください」と案内して失敗します。 -
.arkor/build/index.mjs。arkor buildの出力。src/arkor/index.tsを Node 22.22 ターゲットで esbuild した単一バンドルで、bare specifier は外部のままにしてあります。arkor startがこれを実行します。
~/.arkor/(ユーザーごと)
ホームディレクトリーにあり、そのユーザーのすべての Arkor プロジェクト間で共有されます。
~/.arkor/credentials.json。認証状態。arkor login --oauthまたは対話的なarkor loginのピッカーでOAuth (browser)を選んだ場合に書かれる Arkor Cloud OAuth トークンか、未ログインで初使用時に作られる匿名トークンのいずれか。ファイルはmodeフィールドが"oauth"か"anon"でタグ付けされており、CLI はどのモードにいるかを把握します。arkor loginはこのファイルだけを書きます。.arkor/state.jsonは 作成しません。~/.arkor/studio-token(一時的)。arkor devが起動ごとに書く CSRF トークン(モード0600)。Studio が CLI のローカルサーバーへの呼び出しを認可するのに使います。arkor dev起動のたびにローテートされます。
arkor logout は確認後(または --force 指定時)に credentials.json を削除します。匿名認証情報が入っている場合、そのファイルを削除すると、バックアップしていない限り同じ匿名 ID には戻れません。プロジェクトローカルの .arkor/state.json には触れません。そのまま新しい匿名セッションを始めると、残ったファイルが write 経路をブロックするので、削除するかサインインが必要です(上の .arkor/state.json の注記を参照)。Studio トークンはプロセス終了時にベストエフォートで削除され(arkor dev がクラッシュすると残る場合あり)、次回起動時にローテートされます。
CLI が探すもの
arkor devは Studio の Web サーバーを127.0.0.1:4000で起動し、~/.arkor/studio-tokenを書きます。src/arkor/をファイル監視はしません。Studio の/api/manifestエンドポイントは確かにrunBuildを呼び、bundle の content-addressed コピー経由で再 import します(無編集の再読込は Node のモジュールキャッシュを再利用し、編集はキャッシュをバストします)が、それは Studio UI が fetch したときだけです(現状は Run training ページのマウント時)。同じページに留まったまま学習を複数回実行すると、ビルド成果物は再利用されます。編集した後は Run training ページをリロード(あるいはターミナルからarkor build)して変更を取り込んでください。arkor devは単独で.arkor/state.jsonを書きません。arkor buildはsrc/arkor/index.ts(または渡したエントリー)を読んで.arkor/build/index.mjsを書きます。Studio の dev ループの外側で直接呼ぶ必要があるのは CI や、スクリプトからarkor startの直前に走らせる場合などです。arkor startはランナー経由でエントリーを解決し、.arkor/build/index.mjsがない、もしくは明示的なエントリーを渡したときはリビルドして実行します(これがtrainer.start()とtrainer.wait()を呼びます)。Studio から学習をトリガーすると内部的にarkor startがサブプロセスとして起動されます。
.arkor/state.json と ~/.arkor/credentials.json を覗いてみてください。