Claude Code に仕事を頼む「あなた」を、AI のクローンが代わりに務める。
alteroid とは · できること · 画面 · はじめる · 仕組み · ドキュメント
いま、あなたは PC の前に座って Claude Code に作業を頼み、出てきたものを読み、次の指示を出しています。 仕事が進む速さは、あなたが席にいられる時間で決まります。
alteroid は、この「あなた」の席に あなたの価値観を写し取ったクローン(AI) を座らせます。
人間が PC の前に座り、Claude Code に作業を依頼して物事を進める。 alteroid はこれを、人間の代わりにクローン(AI)が行うようにするためのツールである。 — docs/north_star.md
クローンは、アイデアを AI に相談し、調査を頼み、実装を指示し、結果をレビューします。あなたが寝ている間も動きます。 あなたの役目は 価値観を伝えることと、最終的な承認 だけになります。
クローンは「権限を絞った自動化ジョブ」ではありません。あなたが Claude Code でできることは、クローンの階層でも全部できる —— これがこのプロダクトの憲法です(できないなら、それは仕様ではなくバグとして扱います)。
会話から目的・価値観・好みを蒸留して、記憶 として溜めていきます。記憶はいつでも読めて、直接書き換えられます。 「何を任せてよくて、何は必ず聞いてほしいか」も、設定項目ではなく記憶として持ちます。
| 層 | 担当 | モデル |
|---|---|---|
| クローン | あなたの代理。最終判断と記憶を持つ | Fable または Opus(既定 Opus) |
| マネージャー | あなたが普段使う Claude Code に当たる層。仕事を進める | Opus |
| 作業者 | マネージャーが切り出した実作業(実装・調査・確認・レビュー) | Sonnet |
判断の質が要る層に上位モデルを置き、量の出る実作業を下の層へ回します。判断できないことは上の層へ上がり、結果は要約されて上へ届きます。
仕事の起点は、あなたの依頼だけではありません。
- あなたの依頼 —
alteroid chat、Web UI、HTTP API のどこからでも - 時間 — 日報や定期の見直し。cron と同じ書き方で周期を足せます
- 外部イベント — 失敗した CI、レビュー依頼、MCP 経由の通知
- クローン自身の発意 — 記憶にある目的から、次にやることを自分で決めます
承認が要る仕事は止まりますが、止まるのは その仕事だけ です。他の仕事は進み続けます。
何をあなたに確認し、何を確認せずに進めるかは、記憶に根拠があるか でクローンが判断します。 最初は質問が多く、価値観が溜まるほど減っていきます。一度「それはやっていい」と答えれば、以後の同じ種類の判断に効きます。
| 層 | 中身 |
|---|---|
| 日報 | 今日何をしたか・何が決まったか・何が保留か。普段はこれだけ読めばよい |
| 日誌 | 層どうしのやり取り、聞かずに実行した判断、ツール実行の記録 |
| セッションログ | 各セッションの生のトランスクリプト |
聞かずに実行した判断は必ず日誌に残るので、後から追って否定できます。その否定が、次の記憶になります。
仕事のやり方(依頼文の型、どこで切り出すか、何で検証するか)を書き留め、直していきます。 何を「良い結果」とするかの基準は、あなたの記憶の側に置きます。
CLI(alteroid)・HTTP API(GET /openapi.json)・Web UI のどれからでも、同じことができます。
どの入口も同じ API の上に乗っていて、片方でしかできないことは作りません。外部サービスとは MCP で繋がります。
会話 — クローンと話す(alteroid chat と同じことができる)
記憶 — クローンの価値観そのもの。いつでも読んで直せる
ほかに、承認待ち・未了の仕事・作業の進捗・マネージャー・日誌・日報・利用状況・スケジュールなどの画面があります (配置と接続先の決まり方は apps/web/README.md)。
必要なもの:
- Claude のサブスクリプション(
claude setup-tokenで発行する認証トークンを使います) - Docker(コンテナで動かす場合)または Node 22 + pnpm(手元で動かす場合)
デーモン / manager-runner / PostgreSQL の3コンテナ構成です。
cp .env.example .env # 2つ埋める(下記)
docker compose up -d
docker compose exec app alteroid token add --label <名前> -f <path> # 認証トークンを登録
docker compose exec app alteroid chat.env に要るのは2つだけです。
| 変数 | 取り方 |
|---|---|
ALTEROID_RUNNER_TOKEN |
openssl rand -hex 32。app と runner で同じ値 |
ALTEROID_DATABASE_URL |
postgres://alteroid:<openssl rand -hex 16>@db:5432/alteroid。内蔵 db もここから起動 |
クローン・マネージャーの認証(claude setup-token)は環境変数では持ちません
(2026-09-14 に廃止)。正本は認証トークンのプール(DB)だけで、上の
alteroid token add で登録します。1本も登録していないと、クローンもマネージャーも
走れません。
道具の鍵や PATH を .env に増やさないでください。 それは実行環境プロファイル(alteroid profile edit)
の側で、器を焼き直さずに差し替えられます。alteroid 自身の運用設定(TZ 等)も
alteroid credential / Web UI の「環境変数」画面で置きます(一部は初回起動時に
既定値が入ります)。境界の説明は .env.example と
compose.yaml の冒頭にあります。
実行系の版は mise.toml に一本化してあります(CI も同じファイルを読みます)。
mise install # Node 22 / pnpm。使わないなら corepack enable
pnpm install
pnpm build # **build が先。** ワークスペース間の型解決が各パッケージの dist/ に依存するCLI の実体は apps/cli/dist/index.js です。PATH に置くなら、コンテナと同じ形で繋ぎます:
ln -sf "$PWD/apps/cli/dist/index.js" /usr/local/bin/alteroid
alteroid init # 人格データディレクトリ(~/.alteroid)を作る
alteroid chat # クローンと会話する(デーモンが居なければ自分で起こす)- デーモンの待ち受けは
ALTEROID_PORT(既定 4517)。接続先と pid は$ALTEROID_HOME/state/daemon.json - 人格データは
ALTEROID_HOME(既定~/.alteroid)、マネージャーの作業ディレクトリはALTEROID_WORKSPACE(既定はデーモンの cwd) - 試すときは、両方とも捨ててよい一時ディレクトリを指してください。 既定のままだと自分の記憶と 実プロジェクトを直に触ります
Web UI の立ち上げ方と置き方は apps/web/README.md にあります。 手順の詳細は .claude/skills/running-alteroid/SKILL.md。
railway/README.md(Railway。runner は N 台に増やせます)。 端末を閉じても走り続けること以外、ローカルと能力は変わりません。
CLI の主なコマンド
| コマンド | 何をするか |
|---|---|
alteroid init |
人格データディレクトリを初期化する |
alteroid chat |
クローンと会話する。中は /help でスラッシュコマンド一覧 |
alteroid daemon start/stop/status |
常駐デーモンの操作 |
alteroid memory ... |
記憶(人格)を読む・書き換える・消す |
alteroid profile ... |
実行環境プロファイル(~/.zprofile に当たるもの) |
alteroid mcp ... |
MCP サーバの登録(.mcp.json に当たるもの) |
alteroid token ... |
認証トークンのプール(枠に当たったときに回す候補) |
alteroid usage |
使った分(トークンと費用)を見る |
alteroid runners |
委譲先の器と、いま走っている版を見る |
alteroid runners vacate <id> |
その器を空ける(載っている委譲を他の器へ移す) |
alteroid conversations ... |
会話の履歴を読む |
alteroid dropped |
握り潰しの跡を見る |
alteroid login/logout/whoami |
この端末用のアクセストークン |
alteroid access ... |
ログインしたアカウントへ使用許可を与える・取り消す |
HTTP API の仕様は GET /openapi.json(OpenAPI 3.1)、人間が読むなら GET /docs です。
flowchart LR
human(["あなた"])
subgraph daemon["alteroidd(デーモン)"]
clone["クローン<br/>Fable / Opus"]
memory[("記憶・日誌・日報")]
end
subgraph runner["alteroid-runner"]
manager["マネージャー<br/>Opus"]
workers["作業者<br/>Sonnet"]
end
events["時間・外部イベント"]
human -- "CLI / HTTP API / Web UI" --> clone
events --> clone
clone <--> memory
clone -- "委譲" --> manager
manager -- "切り出し" --> workers
workers -. "報告・エスカレーション" .-> manager
manager -. "報告・エスカレーション" .-> clone
clone -. "記憶に根拠が無いことだけ確認" .-> human
エージェント実行基盤は自作していません。Claude Agent SDK をラップしています。alteroid が書くのは配線と、独自価値の3点 —— クローンの永続記憶・ エスカレーション・プロトコル・役割別モデルルーティング です(docs/PRD.md 「提供価値」)。役割とモデル帯の対応は固定の設計判断で、変更には人間の承認が要ります。
デーモンと manager-runner を分けてあるのは、記憶ストアの鍵をマネージャーから遠ざけるためです。 同じ器で走らせている限り、
マネージャーは /proc/1/environ からデーモンの環境変数に届きます。ツールを削って塞ぐことは禁じている(正典の禁止2)ので、
実行環境のほうを分けて います(docs/architecture.md「プロセス境界」)。
リポジトリの構成
packages/core ドメイン全部: クローンループ、委譲(デーモン側)、runner 側の
SDK セッション、境界のプロトコル(zod)、ストアIF
packages/storage-fs ローカル用ドライバ(Markdown / JSONL / JSON)
packages/storage-pg クラウド用ドライバ(PostgreSQL / drizzle)
apps/daemon alteroidd = core をホストする常駐プロセス + HTTP API(hono)
apps/runner alteroid-runner = manager-runner。SDK を隔離して走らせる
apps/cli alteroid = daemon への薄いクライアント(hono/client で型共有)
apps/web 公式の画面。React Router v7 の SPA
packages/api-client 生成 spec から起こした外部向けクライアント
この README に要件は書きません。 正典は docs/ で、ここはその入口です。矛盾したら docs/ が勝ちます。 読む順序は番号順で、矛盾したら上が勝ちます。
| 文書 | 何が書いてあるか |
|---|---|
| 1. docs/north_star.md | 正典。プロダクトの全判断の基準。2つの禁止 |
| 2. docs/PRD.md | 正典から導出された要件(能力の等価性・自律・権限境界ほか) |
| 3. docs/architecture.md | 設計(プロセス境界・ストレージ・パッケージ構成・技術選定) |
| AGENTS.md | 実装する AI への指示(地雷・リポジトリの約束・報告の形) |
| .claude/skills/ | 部分系ごとの手順書(触るときだけ引く) |
| railway/README.md | クラウド(Railway)への常駐 |
| apps/web/README.md | 画面の配置・接続先の決まり方・ログイン |
docs/ は AI が単独で書き換えません。要件を変える必要が出たら人間に確認します。
alteroid の開発は、alteroid 自身(クローン・マネージャー・作業者)が多くを担っています。 人間でも AI でも、まず AGENTS.md を読んでください。
pnpm verify # 検証一式を正しい順序で通す。通し直しは指紋一致で無料になる中身は build → check:web-bundle-node-traces → check:web-bundle-size →
check:web-css-comment-classnames → check:web-css-no-inline-fonts → apps/daemon/openapi.json の一致 →
check:sdk-quotes → check:stale-token-restart-advice → check:restart-before-check-advice →
typecheck → lint → format:check → test の順で、build が先です。個別に打つこともできます。
pnpm testが「テスト0本のまま exit 1」になったら、落ちたのではなく走っていません。Test Files/Testsの行が出ているかで見ます。器が混んでいるときはpnpm test --maxWorkers=4- 経路やスキーマを変えたら
pnpm buildしてapps/daemon/openapi.jsonの差分も一緒にコミットします (手書きの spec を別に置きません) - コミットメッセージと PR のタイトルは
<type>: <description>(feat / fix / refactor / docs / test / chore / perf / ci)。トレーラは付けません - ブランチを切って PR を出します。main へ直接 push しません
CI(.github/workflows/ci.yml)は同じ一式に加えて、runtime
イメージを焼いて uid 1001=マネージャーが実際に走る主体 で道具が揃っているかも見ます。
MVP は終えています(2026-09-09、人間の決定)。ライセンスは MIT です。
マルチユーザー / チーム利用は非ゴールです(docs/PRD.md「スコープ外(非ゴール)」)。 ライセンスを置いたのは 各自が自分の器へセルフホストできる ようにするためであって、1つのインスタンスを 複数人で使えるようにするためではありません。この2つは別の軸です。


