Setup Module Specification¶
Status: Draft
Fixes: Plan review issue #15 (reversibility) + issue #13 (install delivery)
Related: PRD · ADR-0006
Install delivery¶
| Phase | Method | Notes |
|---|---|---|
| Phase A | ./scripts/install.sh in repo |
Checks Python 3.12, venv, Ollama, pulls default model |
| Phase A.1 | daari install CLI command |
Same logic as shell script in a clone; falls back to daari onboard after pip/brew |
| Phase A.1 | daari onboard --yes |
Pure-Python first-run: probe Ollama, pull L3 + embed, run doctor |
| Demo | ./scripts/demo.sh |
One-command smoke: serve + curl + stats + setup dry-run |
| Future | brew install daari / curl pipe |
Requires domain + release artifacts — not MVP |
Removed from MVP claims: curl https://daari.dev/install — domain does not exist yet.
Setup commands¶
| Command | Phase | Behavior |
|---|---|---|
daari setup |
A.1 | Interactive wizard — pick clients, models, run doctor (see below) |
daari setup cursor |
A.1 | Patch Cursor custom model settings |
daari setup models |
A.1 | Pick / map Ollama models to L3 tier (interactive or flags) |
daari setup claude-code |
B | Requires Anthropic-compat gateway |
daari setup openai-compat |
B | Print env vars for generic SDK |
daari setup intellij |
B.1 | Register IntelliJ path for Lt tier (not AI client) |
daari setup --all |
B | Detect + run applicable recipes (non-interactive) |
daari setup --undo <tool> |
A.1 | Restore latest backup for tool |
daari doctor |
A.1 | Health check |
daari onboard |
A.1 | pip/brew first-run (no git clone) |
daari service |
A.1 | user systemd / launchd stay-up (no root) |
Interactive wizard (daari setup)¶
Yes — users need a guided path. Not everyone knows what to configure or that IntelliJ is an Lt backend, not an AI client.
Two entry modes (same engine):
| Mode | When |
|---|---|
daari setup |
First install, exploratory — prompts for choices |
daari setup <tool> |
Scriptable, docs, CI — skip prompts |
Wizard flow (Phase A.1)¶
$ daari setup
daari setup — configure your local stack
Detected on this machine:
✓ Ollama (3 models: llama3.2:3b, llama3.1:8b, …)
✓ Cursor
✗ IntelliJ IDEA (not found)
✗ Claude Code (not supported in this version)
What do you want to set up? [Space to select, Enter to confirm]
❯ Cursor — point AI chat at daari (OpenAI-compat)
Local model — choose default model for L3 tier
Run health check — daari doctor after setup
Skip for now
→ User picks Cursor
Configure Cursor to use http://127.0.0.1:11435/v1 ? [Y/n]
→ Backup + patch settings
→ Done. Run: daari serve
Optional: configure local model now? [y/N]
→ Lists `ollama list`, user picks default for L3
→ Writes ~/.daari/config.yaml
Phase B+ wizard additions¶
| Step | Command / screen | Notes |
|---|---|---|
| IntelliJ (Lt) | daari setup intellij |
Explain: "Registers IDE for refactor/lint — not your AI chat client" |
| OpenAI SDK | daari setup openai-compat |
Print export OPENAI_BASE_URL=… |
| Claude Code | daari setup claude-code |
Only when Anthropic gateway ships (C2) |
| All detected | daari setup --all |
Non-interactive batch for power users |
Model selection (daari setup models)¶
daari setup models # interactive: ollama list → pick L3 default
daari setup models --tier l3 --model llama3.2:3b # non-interactive
daari setup models --list # show current tier → model map
- Pulls from
ollama list(live) — not hard-coded - Phase A.1: L3 only; Phase B adds L4/L5 mapping
- If Ollama missing: wizard offers
ollama pull llama3.2:3bhint
Help & discoverability¶
daari setup --help # list subcommands
daari setup cursor --dry-run # show diff, no writes
daari doctor # post-setup: daemon, ollama, cursor endpoint, sample route
Phase A (tracer bullet): Manual only — cursor.md. No wizard yet.
Phase A.1: Ship daari setup wizard + daari setup cursor + daari setup models + daari doctor.
Reversibility (required)¶
Every daari setup <tool> must:
- Detect if tool is installed; exit with message if not
- Backup affected config files to
~/.daari/backups/<tool>/<ISO8601>/ - Apply changes (patch or write)
- Print summary: files changed, backup path, undo command
- Support dry-run:
daari setup cursor --dry-runshows diff without writing
Undo¶
daari setup --undo cursor
# Restores most recent backup for cursor; restarts nothing
- Keep last 5 backups per tool; prune older
- Backup manifest:
manifest.jsonlisting original paths
Cursor recipe (Phase A.1)¶
Code: daari/clients/cursor/recipe.py
Manual doc: cursor.md
Changes (automated by daari setup cursor):
- Backs up settings.json and state.vscdb under ~/.daari/backups/cursor/<timestamp>/
- Patches settings.json: openai.baseUrl, openai.apiKey, and daari.setup.cursor marker
- Patches Cursor state.vscdb application storage: openAIBaseUrl, useOpenAIKey, availableAPIKeyModels
- Base URL: http://127.0.0.1:11435/v1 (from user config)
- API key: daari-local (or match DAARI_API_KEY in future)
- Model name: daari
Known limitation: Cursor may store the OpenAI API key in OS secure storage on some versions. If chat still fails after setup, enter daari-local once in Cursor Settings → Models → OpenAI API Key. Restart Cursor after apply.
Manual fallback (Phase A): Document in docs/setup/cursor.md.
Idempotency¶
Re-running daari setup cursor when already configured:
- Detects existing daari endpoint
- No-op with message, or --force to re-apply
Claude Code (Phase B — honest limitation)¶
Claude Code uses Anthropic API shape. Setup deferred until: - Anthropic-compat gateway exists (Phase C1), OR - Claude Code adds OpenAI-compat mode
Document in setup output: "Claude Code not supported in this version."