yoi/.yoi/tickets/00001KSKBPSJG/item.md

5.1 KiB
Raw Blame History

title state created_at updated_at queued_by queued_at
TUI: ユーザーマニフェストのモデル設定 wizard closed 2026-05-27T00:00:18Z 2026-06-10T09:31:45Z yoi ticket 2026-06-10T07:59:32Z

Migration reference

  • legacy_ticket: tickets/tui-user-model-setup.md
  • migrated_from: TODO.md / tickets directory migration on 2026-05-27

TUI: ユーザーマニフェストのモデル設定 wizard

背景

spawn UItickets/tui-pod-spawn-ui.md)が [model] を user / project の cascade レイヤから取る前提なので、初回起動のユーザーは事前に ~/.config/insomnia/manifest.toml を手で書く必要がある。catalogcrates/provider/src/catalog.rs)に provider / model の一覧と AuthHintAPI key の env 名や Codex OAuth 等の認証方式)が既に揃っているので、これを使って TUI 内で対話的にセットアップできるようにする。

provider::catalog の公開 API:

  • load_providers() -> Vec<ProviderEntry>: builtin + user override マージ済み
  • load_models() -> Vec<ModelEntry>: 同上
  • ProviderEntry: id / display_name / scheme / auth_hint
  • ModelEntry: id / provider / capability
  • AuthHint: None / ApiKey { env: Option<String> } / CodexOAuth

これらが「UI で何を選ばせ、何を聞くか」を直接ガイドしてくれる構造になっている。

要件

起動経路

  • 専用サブコマンド tui setup-model(仮)として alt-screen TUI で起動する
  • 引数なしで叩くと既存の spawn flow に入るので、それとは別の入口

Wizard フロー

  1. provider 選択: load_providers() の結果をリスト表示。display_name を見せ、上下キー + Enter で選択
  2. model 選択: 選んだ provider の idload_models() をフィルタしてリスト表示。1 つだけならスキップ可
  3. 認証情報入力: 選んだ provider の auth_hint で分岐
    • None → スキップ
    • ApiKey { env: Some(name) } → 「環境変数 <name> を使う」または「key ファイルパスを入力」を選ばせる
    • ApiKey { env: None } → key ファイルパス入力(絶対パス推奨、ホーム展開はする)
    • CodexOAuth → 「codex login で OAuth を済ませてください」案内 + ~/.codex/auth.json の存在チェック
  4. 確認画面: 書き込み内容のプレビュー(生成される TOMLを表示、Enter で確定 / Esc でキャンセル
  5. 書き込み: ~/.config/insomnia/manifest.toml(または $XDG_CONFIG_HOME 配下、manifest::user_manifest_path())に [model] を書く

書き込みフォーマット

catalog 由来なので ref 形式を採用する:

[model]
ref = "<provider_id>/<model_id>"

[model.auth]
kind = "api_key"
file = "/abs/path/to/key"

AuthHint::None の場合は [model.auth] を省く。CodexOAuth の場合は kind = "codex_oauth"

既存ファイルの扱い

~/.config/insomnia/manifest.toml が既に存在する場合:

  • [model] セクションが無い → 末尾に追加
  • [model] セクションが既にある → 上書き確認を出す(既存の値をプレビュー表示してから)
  • ファイル全体が壊れた TOML → エラー表示してキャンセル

キャンセル / エラー経路

  • どのステップでも Esc / Ctrl-C で抜けられる。書き込み前ならファイルは触らない
  • catalog 読み込み失敗 / ファイル書き込み失敗は alt-screen 内でエラー表示してから終了

設計で決めること

  • API key ファイルパスの入力 UX: テキスト入力欄でフリーフォーム、補完なしで良いか、~ / $HOME 展開するか
  • 環境変数で済ませる選択肢の見せ方: ApiKey で env 指定がある場合、デフォルト「env を使う」かデフォルト「key ファイルを使う」か
  • 多 provider / 多 model 時の選択 UI: シンプルな縦リストか、検索フィルタ付きか
  • 既存 [model] の上書き確認の粒度: TOML 全体 diff か、変わるキーだけハイライトか

完了条件

  • tui setup-model サブコマンドで wizard が起動する
  • catalog から provider / model 一覧を取って表示・選択できる
  • AuthHint の各バリアントに対応した入力 UI が動く
  • 確定すると ~/.config/insomnia/manifest.toml[model] が書き込まれる
  • 既存ファイルの [model] 上書き時は確認が出る
  • セットアップ後に spawn flow引数なし tui 起動)が model resolve エラー無しで Pod を spawn できる

範囲外

  • catalog 自体の編集(新規 provider / model の追加UI。providers.toml / models.toml の手書き運用は維持
  • 複数モデル設定([compaction.model] 等)の wizard 化
  • project manifest (.insomnia/manifest.toml) への書き込み。本チケットは user 層のみ
  • spawn flow からの自動誘導model 不在検出時に「m で setup wizard を起動」分岐)。本チケット完了後に spawn UI 側で別途検討