背景
PR #178 で macOS .app 版を導入。F1-F8 で構造を整えたが、F5 (Claude CLI 自動インストーラー) は skeleton 状態 で deferred。現状の `packages/desktop/src/claude-installer.ts` は
- 起動時に system `claude` の有無を検出
- 同梱 Node binary (`process.resourcesPath/bin/node`) を探すが 配置されていないため必ず null
- 結果として system claude にフォールバック → PATH に claude が無いと ターミナルセッションが起動できない
beacon (AI アシスタント) は PR #180 で SDK の bundled binary (`app.asar.unpacked/.../claude-agent-sdk-darwin-arm64/claude`) を使うようになり、claude CLI 未インストールでも動作する。しかし Ark の主機能であるターミナルセッションは `tmux send-keys "claude"` で shell PATH 経由 (`tmux-manager.ts:210-214`) のため、system claude のインストールが依然として必須。
ゴール
claude CLI を ユーザーに別途インストールさせずに Ark .app 単独で動かす。
やること (順番)
F5-1: 同梱 Node binary を CI で配置
- `packages/desktop/build-assets/node/` に platform/arch 別の Node binary を配置 (electron-builder の `extraResources` で `Contents/Resources/bin/node` に展開済み)
- CI workflow (新規 or `build-bin.yml` 拡張) で nodejs.org official tarball から arm64 darwin の Node 22.x LTS を fetch → SHA256 verify → `build-assets/node/{bin/node,lib/node_modules/npm/**}` に展開
- `packages/desktop/electron-builder.yml` の `extraResources` の `build-assets/node` セクション (現状コメントアウト) を有効化
F5-2: claude-installer.ts の実装本体
- `resolveBundledNodePath()` / `resolveBundledNpmCliPath()` が non-null を返す状態で
`spawn(, [, "install", "-g", "--prefix", , "@anthropic-ai/claude-code"])`
- 進捗を `onProgress` callback で IPC 経由 renderer に転送 → `ClaudeInstallProgressDialog.tsx` 表示
- 完了後 `/bin/claude` を生成
- 既存ロジック: `ARK_CLAUDE_RUNTIME_DIR` 環境変数で server に伝達済み (`system.ts:getClaudeRuntimeBinPath()` が読む)
F5-3: shim 問題の解消 (known limitation)
npm install で生成される `/bin/claude` は `#!/usr/bin/env node` shebang を持つ shim。
system PATH に node が無いと実行不能。tmux send-keys 経由で起動された shell の PATH に
bundled node を載せる必要がある。
候補:
- wrapper script を Ark 側で生成 → shebang を `#!` に書き換え (`claude-installer.ts` 冒頭コメント参照)
- `tmux new-session` / send-keys 前に `PATH=:$PATH` を export
- Anthropic から standalone binary distribution が出るのを待つ
mac 実機検証で実 install 後の `bin/claude` 内容を確認してから決定。
F5-4: mac 実機 E2E 検証
F5-5: release.yml への組み込み
- `packages/desktop/scripts/build-bin/manifest.json` の SHA256 placeholder を CI 計算結果で埋める
- `build-bin.yml` の Node fetch 結果を `release.yml` が `actions/download-artifact` で取得 → electron-builder に渡す
スコープ外
Windows 対応
Ark は現状 macOS arm64 only (`electron-builder.yml` の target / `CLAUDE.md` の「macOS / Windows 非対応」記載)。
Windows 版を出すなら別途以下が必要なため、F5 のスコープからは 除外 する:
- `.exe` 拡張子の付与 (`resolveUnpackedSdkClaudeExecutablePath` の platform 分岐)
- Windows 用 Node binary の build pipeline
- shim の Windows 互換 (`.cmd` wrapper, path separator)
- Keychain → Windows Credential Manager 切替 (F6 Keychain bridge も同じ問題を抱える)
- electron-builder の target に `win` を追加
Windows 対応は需要があれば別 issue ("Ark Windows .exe 版を追加") として起票する。
Linux desktop .app
現状 Linux は "server mode + pm2" 想定で `.AppImage` 等の Linux .app は対象外。
`resolveUnpackedSdkClaudeExecutablePath` は linux も許容しているが、build target が無いので実際には asar.unpacked が存在しない。Linux desktop .app を出すなら別 issue。
関連
参考: F0:B-2 (open block)
`packages/desktop/src/claude-installer.ts` 冒頭コメント:
本ファイルは skeleton: 実際の Node 同梱は F0:B-2 結果待ちで F5-followup へ deferred。
skeleton 段階では packaged 時に同梱 node が見つからなければ system claude (`@ark/server` の system.ts) にフォールバックする。
"F0:B-2" は PR #178 の "既知の制約・残作業" に書かれた:
F0:B-2: Claude CLI 同梱方式の最終決定
の確定が前提。本 issue でその確定も含めて進める。
追記: Scope 縮小方針 (Epic #184 起票後)
Epic #184 を起票し、子 issue #186 で 代替案 B (SDK 付属 binary をターミナルでも流用) を進める方針が確定。本 issue (A 案: 同梱 Node + npm install) は scope 縮小もしくは close が妥当。
A 案 (本 issue) と B 案 (#186) の比較
| 観点 |
A 案 (本 issue) |
B 案 (#186) |
| 配布サイズ |
+50MB (Node bundle) |
+0 (SDK の opt dep に既存) |
| 初回起動 |
install 進捗 dialog 必要、network 必須 |
即動く、offline OK |
| CLI バージョン |
npm registry の最新取得 |
SDK update に追従 (差は実質ゼロ、SDK 0.2.120 = CLI 2.1.120) |
| 実装規模 |
claude-installer.ts + build-bin の Node fetch |
tmux-manager.ts 数十行 |
| エッジケース |
network / proxy / registry mirror / shebang shim 問題 |
spawn できれば終わり |
| cleanup |
~/Library/Application Support/Ark/claude-runtime/ 残る |
.app 削除のみ |
A 案の固有メリットは「CLI 最新版への独立追従」のみだが、SDK と CLI の release tempo はほぼ一致しているため実質メリット薄。
次のアクション
背景
PR #178 で macOS .app 版を導入。F1-F8 で構造を整えたが、F5 (Claude CLI 自動インストーラー) は skeleton 状態 で deferred。現状の `packages/desktop/src/claude-installer.ts` は
beacon (AI アシスタント) は PR #180 で SDK の bundled binary (`app.asar.unpacked/.../claude-agent-sdk-darwin-arm64/claude`) を使うようになり、claude CLI 未インストールでも動作する。しかし Ark の主機能であるターミナルセッションは `tmux send-keys "claude"` で shell PATH 経由 (`tmux-manager.ts:210-214`) のため、system claude のインストールが依然として必須。
ゴール
claude CLI を ユーザーに別途インストールさせずに Ark .app 単独で動かす。
やること (順番)
F5-1: 同梱 Node binary を CI で配置
F5-2: claude-installer.ts の実装本体
`spawn(, [, "install", "-g", "--prefix", , "@anthropic-ai/claude-code"])`
F5-3: shim 問題の解消 (known limitation)
npm install で生成される `/bin/claude` は `#!/usr/bin/env node` shebang を持つ shim。
system PATH に node が無いと実行不能。tmux send-keys 経由で起動された shell の PATH に
bundled node を載せる必要がある。
候補:
mac 実機検証で実 install 後の `bin/claude` 内容を確認してから決定。
F5-4: mac 実機 E2E 検証
F5-5: release.yml への組み込み
スコープ外
Windows 対応
Ark は現状 macOS arm64 only (`electron-builder.yml` の target / `CLAUDE.md` の「macOS / Windows 非対応」記載)。
Windows 版を出すなら別途以下が必要なため、F5 のスコープからは 除外 する:
Windows 対応は需要があれば別 issue ("Ark Windows .exe 版を追加") として起票する。
Linux desktop .app
現状 Linux は "server mode + pm2" 想定で `.AppImage` 等の Linux .app は対象外。
`resolveUnpackedSdkClaudeExecutablePath` は linux も許容しているが、build target が無いので実際には asar.unpacked が存在しない。Linux desktop .app を出すなら別 issue。
関連
参考: F0:B-2 (open block)
`packages/desktop/src/claude-installer.ts` 冒頭コメント:
"F0:B-2" は PR #178 の "既知の制約・残作業" に書かれた:
の確定が前提。本 issue でその確定も含めて進める。
追記: Scope 縮小方針 (Epic #184 起票後)
Epic #184 を起票し、子 issue #186 で 代替案 B (SDK 付属 binary をターミナルでも流用) を進める方針が確定。本 issue (A 案: 同梱 Node + npm install) は scope 縮小もしくは close が妥当。
A 案 (本 issue) と B 案 (#186) の比較
~/Library/Application Support/Ark/claude-runtime/残るA 案の固有メリットは「CLI 最新版への独立追従」のみだが、SDK と CLI の release tempo はほぼ一致しているため実質メリット薄。
次のアクション