Epic: #184
背景
`.app` フル同梱化 (Epic #184) が進んでも、初回起動時にユーザーが `claude /login` で claude.ai と OAuth する手順が必要。これは現状ターミナル知識が要る:
- ターミナルセッションを開く必要を理解
- `/login` の打ち方を理解
- ブラウザに表示される OAuth flow を完走
非エンジニア向けには、起動時 Welcome dialog で「ログインする」をクリックするだけで完了する UX が必要。
やること
1. 初回起動判定
- `~/Library/Application Support/Ark/onboarding.json` (もしくは existing DB) で `first_run: false` flag を持つ
- 起動時に未 set なら Welcome dialog を出す
- `~/.claude/.credentials.json` が既に存在する場合 (= 過去 claude /login 済み) は Welcome をスキップ
2. Welcome dialog (Renderer)
- `packages/web/src/components/WelcomeDialog.tsx` を新規追加
- "Ark へようこそ"、"claude.ai にログインして始める" ボタン
- ボタン押下で IPC `ark:start-onboarding-login` を main に送る
3. main プロセス側のログインフロー
候補 A: 既存 tmux session を作って `/login` を送る方式
- pros: 既存 session-orchestrator 経路を再利用
- cons: tmux 内のターミナル UI を見せることになり「ターミナルレス」のメリットが薄れる
候補 B: subprocess で `claude /login` を直接 spawn し、stdout を Renderer のモーダルに stream
- pros: ターミナルを見せず、専用 OAuth フロー UI を出せる
- cons: claude CLI の出力フォーマット依存 (URL 抽出 / 完了検知)
候補 C: shell.openExternal で claude.ai の OAuth URL を直接開き、callback はディープリンク
- pros: 最もリッチな UX
- cons: claude.ai 側に Ark 用 OAuth client 登録が必要 (Anthropic 側依頼)
MVP は B 案: `claude /login` の stdout を parse して claude.ai の URL を抽出 → `shell.openExternal` で開く → polling で credentials 完了検知。
4. 完了後の挙動
- `~/.claude/.credentials.json` 検知で onboarding 完了
- Welcome dialog を閉じてメインダッシュボードへ
- 初回セッションは "ようこそ、まずはここに hello と入力してみましょう" 等のチュートリアル文を表示
スコープ外
- F6 Keychain bridge: 現状 unsupported モード。本 issue では `~/.claude/.credentials.json` 平文に依存し、F6 完成 (別途) で Keychain 経由に切替
- 多言語化: 日本語のみ初期対応、英語は別 issue
Epic: #184
背景
`.app` フル同梱化 (Epic #184) が進んでも、初回起動時にユーザーが `claude /login` で claude.ai と OAuth する手順が必要。これは現状ターミナル知識が要る:
非エンジニア向けには、起動時 Welcome dialog で「ログインする」をクリックするだけで完了する UX が必要。
やること
1. 初回起動判定
2. Welcome dialog (Renderer)
3. main プロセス側のログインフロー
候補 A: 既存 tmux session を作って `/login` を送る方式
候補 B: subprocess で `claude /login` を直接 spawn し、stdout を Renderer のモーダルに stream
候補 C: shell.openExternal で claude.ai の OAuth URL を直接開き、callback はディープリンク
MVP は B 案: `claude /login` の stdout を parse して claude.ai の URL を抽出 → `shell.openExternal` で開く → polling で credentials 完了検知。
4. 完了後の挙動
スコープ外