Skip to content

First-run UX: an interactive local/cloud flow in jarvis init? #489

Description

@joshazmy

Problem Statement

First run has friction for less-technical users: choosing between a local model and a cloud provider, and landing on a model that fits their hardware. A lot of the machinery already exists — jarvis init detects hardware, calls recommend_engine() / recommend_model() (core/config.py), writes ~/.openjarvis/config.toml, and seeds memory files, and cli/_bootstrap.py already detects cloud keys including OPENROUTER_API_KEY (with secret redaction). What's missing is a friendly, guided way to choose "100% local" vs "OpenRouter cloud" without reading docs first.

Proposed Solution

Extend jarvis init (no new top-level command, one config writer) with:

  • jarvis init --interactive — friendly local-vs-cloud prompts, reusing the existing recommenders and the single write_initial_config() path.
  • jarvis init --local — force the local path.
  • jarvis init --cloud openrouter — cloud path, only when explicitly chosen or when OPENROUTER_API_KEY is already set.
  • No secret storage: if cloud is chosen, point the user to set OPENROUTER_API_KEY (already auto-detected by _bootstrap.py); never write API keys into config.toml.
  • Keep jarvis ask strictly non-interactive — if there is no config/engine, fail with a crisp hint ("run jarvis init"), not an interactive launch.
  • Lean on jarvis doctor for post-setup diagnostics rather than new wizard branching.

The one question I'd like guidance on before writing code

Should first-run setup live inside jarvis init (my lean: yes — single config writer, no drift), or would you prefer a separate top-level command? I want to avoid creating two config-generation paths that diverge over time.

Explicitly OUT of scope for v1

Voice/STT setup, any third-party dictation app (e.g. Wispr Flow), manual GPU-size / VRAM tier menus, AMD-specific model heuristics, and storing API keys in config — all deferrable to separate discussions if there's appetite.

Alternatives Considered

  • A new jarvis setup wizard command — rejected: duplicates and drifts from jarvis init's config writing.
  • Auto-launching the flow from jarvis ask — rejected: breaks scripts, CI, --json, quiet / non-TTY runs.
  • Prompting for and storing API keys — rejected: new secret-handling surface; environment variables already work.

Primitive Area

Other (CLI first-run / jarvis init).


If the direction is agreed, I'm happy to implement it as a small, tested PR that proves non-interactive behavior is unchanged.

Metadata

Metadata

Assignees

No one assigned

    Fields

    Priority

    P1

    Effort

    S

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions