1仕組みと動作原理
CLAUDE_CONFIG_DIRによるプロセスレベルの分離:プロバイダーごとに~/.claude-profiles/<name>/ディレクトリと独立した.claude.json(認証情報およびセッション履歴)を保持し、共有ディレクトリ(skills/projects/hooks/agents/pluginsコンテンツ)を~/.claudeへシンボリックリンクすることで、「複数ウィンドウで異なるプロバイダーを同時に実行しつつ設定の混同を防ぐ」構成を実現します。
The result: you can open one terminal with Kimi, another with DeepSeek, another with Anthropic — each running as a fully independent Claude Code process, without configuration bleed.
settings.json層での「デフォルトプロファイルからの収束」:sync-profile-settings.pyをSessionStartフックとして登録し、デフォルトプロファイルのsettings.jsonの各キーを各サードパーティプロファイルにコピー(model/advisorModelなどの識別キーやプロバイダールーティング環境変数は上書きせず保持)することで、サードパーティウィンドウでのフック/マーケットプレイス/環境変数のドリフトを解消します。
Two denylists define the identity boundary — these are NEVER synced:
.claude.jsonの動作キーに対する許可リスト収束+状態キーの3分類ガードレール:workflowSizeGuidelineなどの一部の動作キーのみを同期し、状態/認証情報/アイデンティティキー(oauthAccount/userID/token/secret…)は一切同期せず、その他のグレーゾーンのキーは自動書き込みせず報告のみとすることで、あるプロファイルのセッション状態やアカウント情報が他プロファイルへ漏洩・上書きされるのを防ぎます。
State keys (is_state_key(): prefixes/substrings/exact names) — per- profile runtime state, caches, counters, migration flags, identity and credentials. NEVER synced
プラグイン状態の特殊処理:known_marketplaces.jsonはプロファイルごとに独立させる必要があります(Claudeはpath.resolve()でinstallLocationを検証しシンボリックリンクを解決しないため、共有すると他プロファイルでcorrupted installLocationエラーが発生します)。claude-plugins-sync.pyが各プロファイル固有の構造を再構築し、enabledPluginsをミラーリングします。
Each profile runs with its own CLAUDE_CONFIG_DIR, so `c` is a DIFFERENT literal string per profile
メンテナー向けローカルソース同期:sync-local-skill-sources.pyは、ローカルのスキルソースリポジトリをシンボリックリンクでClaudeプラグインキャッシュおよびCodexの~/.agents/skills、~/.codex/skillsへ接続します。デフォルトはdry-runで、--apply指定時のみ変更を適用します。O_NOFOLLOW dirfd、renameat2/renameatx_npによる排他的リネーム、タイムスタンプ付きバックアップにより、並行処理やディレクトリの競合状態を防ぎます。
Real files/directories and third-party links are never deleted or automatically moved.
コンテキストウィンドウ設定の判断ルール化:実際のコンテキストが約1Mの場合のみリテラルの[1m]サフィックスを付与し(Claude Codeがこのリテラルに一致)、既知の小さいウィンドウには明示的なCLAUDE_CODE_MAX_CONTEXT_TOKENS/AUTO_COMPACTを使用し、未検証モデルでは推測を避けます。deepseek/glmテンプレートの二重記述は意図的に維持されています。
Claude Code matches this literal string, not a made-up marker like `[1million]` or `[max]`.
デプロイ規律:スクリプトはcpではなくシンボリックリンクでデプロイ(リポジトリ内で26日間放置されたバグ修正と、デプロイコピーにしか反映されなかったクリーンアップコードという過去の実事故による双方向ドリフトを防止)。setup.shインストーラーとclaude-profiles-init/doctor/rm運用コマンド群を提供します。
# Symlink rather than copy.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | claude(官方 CLI,按 profile 启动) |
| cli | python3 |
| cli | uv(仅 daemon --install 时 uv python install 3.12 取托管运行时) |
| cli | launchctl(macOS LaunchAgent 安装/启动) |
| network | provider API 端点(经 claude CLI 转发;模板列出 base URL 需用户核实) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: scripts/setup.sh
- 网络端点: 外部ネットワークアクセスの宣言: (SKILL実行時のユーザーアクション)各プロバイダーのエンドポイント/ゲートウェイへのclaude CLIアウトバウンド通信、daemon --install時のuv python取得
- 本地工作目录: ファイル読み書きおよび成果物の出力: ~/.claude-profiles/<name>/ ディレクトリ構造(.claude.json、シンボリックリンク群)
5二重目の独立検証
- [ok] 脚本零网络外发 — 全部脚本无 urllib/requests/socket;grep 到的 https 仅 setup.sh echo 链接与模板/文档里的 provider base URL
- [ok] 凭证键不被同步(防串 profile) — STATE_EXACT 含 projects/oauthAccount/userID 等;STATE_SUBSTR 匹配 token/secret/credential/apikey;ENV_KEY_DENYLIST 拦 ANTHROPIC_* 与隔离旗标;灰键仅报告
- [ok] converger 方向单向(默认→第三方) — docstring:'every key present in main's settings.json overwrites the profile's, except denylisted ones';顶层 profile-only 键保留
- [ok] 删除/修复路径受控 — claude-profile-rm:意外真实文件即 ABORT + y/N 确认;init --repair 把 real dir 归档为 .pre-symlink-bak-<ts> 再 symlink,不直接删
- [ok] 源码同步竞态防护真实存在 — O_NOFOLLOW 打开每个路径组件、libc renameat2/renameatx_np 独占改名、失败 exclusive_rename 回滚、KEEP_JSON_BACKUPS=20
- [ok] ‘claude-profiles-doctor 报 real dir’等能力声明有脚本支撑 — doctor 遍历 profile 目录对比 symlink 与 real dir('WARN: <name> is a real directory (expected symlink...)')
6結論
1c1947b7efbf6091…