Skip to content

F5: Claude CLI 自動同梱インストーラー (skeleton → 実装) #183

@shomatan

Description

@shomatan

背景

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 を載せる必要がある。

候補:

  1. wrapper script を Ark 側で生成 → shebang を `#!` に書き換え (`claude-installer.ts` 冒頭コメント参照)
  2. `tmux new-session` / send-keys 前に `PATH=:$PATH` を export
  3. 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 はほぼ一致しているため実質メリット薄。

次のアクション

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