Skip to content

SDK 付属 claude binary をターミナルセッション (tmux send-keys) でも使う #186

@shomatan

Description

@shomatan

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions