Epic: #184
背景
PR #180 で beacon は `@anthropic-ai/claude-agent-sdk-darwin-arm64/claude` (SDK の optional dep、`app.asar.unpacked` 配下に 213MB の standalone Mach-O) を使うようになり、system claude 不要で動作する。
しかしターミナルセッション (tmux + ttyd 経路) は `tmux send-keys "claude"` でリテラル文字列を送る (`packages/server/src/lib/tmux-manager.ts:210-214`) ため、shell PATH に claude が無いと `command not found` で起動しない。これが "非エンジニア向けに system claude を不要にする" 上での最後の壁。
`packages/server/src/lib/system.ts:resolveClaudePath()` は PR #180 で `-1.` 同梱 SDK binary を最優先する優先順位を持っているが、tmuxManager がこの関数を使っていない。
やること
1. tmux-manager.ts の修正
`packages/server/src/lib/tmux-manager.ts:210-214`:
```ts
const claudeCmd =
this.options.commandLine ??
(this.skipPermissions
? "claude --dangerously-skip-permissions"
: "claude");
```
を `resolveClaudePath()` の戻り値の絶対パスに置き換える:
```ts
const claudeBin = resolveClaudePath() ?? "claude"; // PATH fallback 維持
const claudeCmd =
this.options.commandLine ??
(this.skipPermissions
? `\"${claudeBin}\" --dangerously-skip-permissions`
: `\"${claudeBin}\"`);
```
注意点:
- absolute path にスペース (例 `/Library/Application Support/Ark/...`) が含まれる可能性に備えて quote
- `options.commandLine` 経路 (テスト等の override) は維持
- tmux send-keys は shell が解釈するので quote 形式に注意 (`tmux send-keys -l` のリテラル送信 vs 通常 send-keys の eval)
2. 既存 tmuxManager コンシューマーへの影響確認
- session-orchestrator.ts でセッション起動経路を辿り、claudeCmd の組み立て位置を再検証
- 既存テスト (`tmux-manager.test.ts`) の期待値更新
- `SessionOrchestrator.restartWithProfile()` の再起動経路でも同パス採用
3. 動作確認
- system claude を PATH から外した状態 (`PATH=/usr/bin:/bin` 等) で .app を起動
- 新規ターミナルセッションを開いて `claude` が SDK 付属 binary で起動することを ps で確認
- beacon と並行使用しても問題ないこと (両者が独立に claude プロセスを spawn する)
4. #183 (F5 Node + npm install) の scope 縮小 / close
本 issue 完成で F5 skeleton の Node + npm install 経路は不要になる。
`packages/desktop/src/claude-installer.ts` 自体は「system claude 検出のみ行う / 同梱されていれば skip」に縮小、もしくは丸ごと削除して main.ts から呼び出しを外す。
メリット (A 案との比較)
| 観点 |
本案 (B) |
F5 skeleton (A) |
| 配布サイズ |
+0 (既に同梱) |
+50MB (Node bundle) |
| 初回起動 |
即動く |
install 進捗 dialog、network 必須 |
| offline 起動 |
OK |
NG |
| CLI バージョン |
SDK update に追従 (差は ~hours-days) |
npm registry 任意取得 |
| cleanup |
.app 削除のみ |
~/Library/Application Support/Ark/claude-runtime/ 残る |
| 実装規模 |
tmux-manager.ts 数十行 |
F5 全体 |
検証必須項目
- SDK 付属 `claude` バイナリが Claude Code CLI の通常 subcommand (`/login`, `/help`, ファイル編集等) を 完全に同等にサポート していること
- `~/.claude/.credentials.json` の読み書きが system claude と互換であること
非同等だった場合は A 案 (#183) に戻す。
スコープ外
- Linux: 現状 server mode 想定で .app build target 外。`resolveUnpackedSdkClaudeExecutablePath` は linux も許容しているが asar.unpacked が存在しないので no-op
- Windows: `@anthropic-ai/claude-agent-sdk-win32-x64/claude.exe` は存在するが、Ark の build target 外。別 Epic
Epic: #184
背景
PR #180 で beacon は `@anthropic-ai/claude-agent-sdk-darwin-arm64/claude` (SDK の optional dep、`app.asar.unpacked` 配下に 213MB の standalone Mach-O) を使うようになり、system claude 不要で動作する。
しかしターミナルセッション (tmux + ttyd 経路) は `tmux send-keys "claude"` でリテラル文字列を送る (`packages/server/src/lib/tmux-manager.ts:210-214`) ため、shell PATH に claude が無いと `command not found` で起動しない。これが "非エンジニア向けに system claude を不要にする" 上での最後の壁。
`packages/server/src/lib/system.ts:resolveClaudePath()` は PR #180 で `-1.` 同梱 SDK binary を最優先する優先順位を持っているが、tmuxManager がこの関数を使っていない。
やること
1. tmux-manager.ts の修正
`packages/server/src/lib/tmux-manager.ts:210-214`:
```ts
const claudeCmd =
this.options.commandLine ??
(this.skipPermissions
? "claude --dangerously-skip-permissions"
: "claude");
```
を `resolveClaudePath()` の戻り値の絶対パスに置き換える:
```ts
const claudeBin = resolveClaudePath() ?? "claude"; // PATH fallback 維持
const claudeCmd =
this.options.commandLine ??
(this.skipPermissions
? `\"${claudeBin}\" --dangerously-skip-permissions`
: `\"${claudeBin}\"`);
```
注意点:
2. 既存 tmuxManager コンシューマーへの影響確認
3. 動作確認
4. #183 (F5 Node + npm install) の scope 縮小 / close
本 issue 完成で F5 skeleton の Node + npm install 経路は不要になる。
`packages/desktop/src/claude-installer.ts` 自体は「system claude 検出のみ行う / 同梱されていれば skip」に縮小、もしくは丸ごと削除して main.ts から呼び出しを外す。
メリット (A 案との比較)
検証必須項目
非同等だった場合は A 案 (#183) に戻す。
スコープ外