docs GitHub

ContributingDraft

Settings inventory

Every option a person can set in Vyre, where it lives, and where you change it. The rule: nothing is config-file-only. Every row here gets a control in the app (Settings) and a CLI route (vyre config).

Status on 2026-09-27: main c8fb9aae, plus work/sessions (9eb5d18b and its uncommitted step 6) and the ADR 0031 design on work/teammates. "UI" and "CLI" say what exists today.

Update (42dcb98c): each module now declares its settings in its own module.json ("settings"), with keys named after the module (sessions.mode, push.watch, vault.lock_idle). core/config/settings.js checks declarations and stores; core/settings serves only running modules' keys. The tables below are the inventory the declarations came from.

Levels and precedence

Five levels, highest wins:

  1. This session. A chip in the composer (model, effort, mode). Lasts for the session only. Each chip has "Make default for this project" and "Make default everywhere".
  2. Agent or teammate. The agent's own record (model, prompt, tools, budget).
  3. Project. Overrides for one project, keyed by its slug.
  4. Account. Your defaults on this box, for every project.
  5. Built in. The shipped default.

Claude Code's own files sit beside this, not inside it. Vyre starts every SDK session with settingSources: ["user","project","local"], so ~/.claude/settings.json, .claude/settings.json and .claude/settings.local.json still load. Where a Vyre value and a Claude Code value cover the same thing, the Vyre value is passed as an SDK option and wins for sessions Vyre starts. The terminal keeps reading only Claude Code's files.

To keep the terminal and Vyre in agreement, the options below split into two kinds:

  • Vyre-owned (V): stored by Vyre, passed as SDK options. Model, fallback, effort, permission mode, system prompt, max turns, budget, concurrency, and every Vyre module setting.
  • Claude-Code-owned (C): the source of truth stays in Claude Code's files, so the terminal sees the same thing. Vyre's screen reads and writes those files. Account level writes ~/.claude/settings.json; project level writes .claude/settings.local.json (the person's own, never committed) unless they choose "Share with the repo" (.claude/settings.json). Permission rules, hooks, env, MCP servers (.mcp.json), plugins, output style, CLAUDE.md memory.

Every screen shows the effective value and where it comes from ("Project", "Account", "Built in", "~/.claude/settings.json"), with a reset arrow to fall back one level.

Storage plan

One registry, core/settings, describes every key: type, default, allowed levels, owner module, backing store, and whether a change applies live, next session or after a restart. It adds:

  • tools settings.schema, settings.get {key, project?} (effective value plus source), settings.set {key, value, level, project?}, settings.reset, and one settings.changed event;
  • vyre config list|get|set|reset [--project <slug>] [--account], with --json.

Keys keep their current backing stores behind adapters (config.json, sessions_models, sessions_prompts, push_state, planner_state, agent rows, Claude Code files), so nothing migrates on day one. New project overrides go in one settings_values table (scope = account | project:<slug> | agent:<name>, key, JSON value, who, when). The project marker stays identity only (name, slug, workspaces), because it may be committed.

A. Claude Code and Agent SDK options

Legend: Lv = levels (S session, A account, P project, G agent/teammate). Own = V (Vyre) or C (Claude Code files). SDK = the query() option or Query method.

OptionSDKOwnLvDefaultTodayUI todayCLI today
Modelmodel, setModel() liveVS A P G, plus per purposeopus for chat, agent, project; haiku for capsule, job, memory, planner, learnsessions.models.<purpose> in config.json; sessions_models for purpose:/project: overrides; agent rowagents.js model select onlyvyre sessions models (polish-cli), vyre call sessions.models.set
Model per purpose(resolves model)VA Pas abovesamenonesame
Fallback modelfallbackModelVA P Gnonenot passednonenone
Effort / thinkingeffort (low, medium, high, xhigh, max), thinking, setMaxThinkingTokens()VS A P Gmodel defaultnot passed; agent "Effort" select is saved nowhere (bug)agents.js (broken)none
Show thinking(translate keeps reasoning)VAshown foldeddropped by the drivernonenone
Fast modeapplyFlagSettings({fastMode})VS A Poffnot passednonenone
Permission modepermissionMode, setPermissionMode() liveVS A P Gdefaultonly live via threads.mode; lost on resumeShift+Tab chip (chat branch)none
Modes offereddefault, acceptEdits, plan, auto, dontAsk, bypassPermissionsVAfirst three; bypass behind a confirmfirst three onlynonenone
Allow rulesallowedTools / permissions.allowCA PnoneClaude Code files; "Always in project" writes settings.local.jsonAsk card "Always" onlynone
Deny rulesdisallowedTools / permissions.denyCA P GnoneClaude Code filesnonenone
Ask rulespermissions.askCA PnoneClaude Code filesnonenone
Additional foldersadditionalDirectories / permissions.additionalDirectoriesC, V per sessionS A Pnonenot passednonenone
System promptsystemPrompt preset claude_code + append, or replaceVA (assistant) P Gappend, emptysessions_prompts, versionednonevyre sessions prompt (polish-cli)
Plan mode instructionsplanModeInstructionsVA Pnonenot passednonenone
Output styleoutputStyle in settingsCA PdefaultClaude Code filesnonenone
CLAUDE.md memoryfilesCA (~/.claude/CLAUDE.md) P (CLAUDE.md, CLAUDE.local.md)nonefilesnonenone
MCP servers for sessionsmcpServers, .mcp.json, enabledMcpjsonServersC, plus Vyre hubA PVyre hub onlyVyre hub via plugin; .mcp.json via settingSourcesConnections (hub servers)vyre mcp
MCP live toggletoggleMcpServer(), reconnectMcpServer(), mcpServerStatus()VSn/anonenonenone
Hookshooks in settingsCA PVyre Harness plugin hooksClaude Code files, Harness pluginnonenone
Plugins and skillsplugins, enabledPlugins, skillsC, V for learned skillsA PHarness + learned skillsdriver passes Harness dir and learned skillsnonevyre learn
Env for sessionsenv / settings envCA Pvyred env copy (should be built from nothing, ADR 0030)full process.env copynonenone
Max turnsmaxTurnsVA P Gunlimited for chat; set for jobsnot passednonenone
Budget per sessionmaxBudgetUsdVA P Gnone for chat; agent budget_usdagent rowagents.jsvyre call agents.update
Auth modeenv CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_API_KEY / loginVA (per machine)Mac login, box setup-token, API key fallbacksessions.auth in config.jsonnonevyre sessions setup (polish-cli)
Providerdriver router (claude now; codex, acp later)VA P Gclaudesessions.driver/providersnonenone
Claude binarypathToClaudeCodeExecutableVA (per machine)box bundled, Mac installedsessions.claudenonenone
File checkpoints (rewind)enableFileCheckpointing, rewindFiles()VAonnot passednonenone
SandboxsandboxCA Poffnot passednonenone
Attributionattribution / includeCoAuthoredByCA PClaude Code defaultClaude Code filesnonenone
Auto-compactsettings autoCompactWindow, /compactCAonClaude Code filesnonenone
Prompt suggestionspromptSuggestionsVAoffnot passednonenone
Subagent textforwardSubagentText, agentProgressSummariesVAsummaries ondroppednonenone
Session nametitle, extraArgs.nameVSfirst linepassed on newrename in chatnone
Session cleanupcleanupPeriodDaysCA30Claude Code filesnonenone

Composer behaviour (Vyre-owned, account level with a session override):

OptionDefaultToday
Send while busy: steer, queue or interruptsteer (the user's decision)built in chat, needs sessions step 6
Enter vs Cmd+Enter to send; Shift+Enter newlineEnter sendsbuilt
Tool call detail: summary or fullsummarynone
Always expand thinkingoffCtrl+O only
Vim keys in the composeroffnone
Code font, content sizetheme defaultnone

B. Vyre settings

AreaSettingLvDefaultTodayUI todayCLI today
SessionsIdle close minutesA10sessions.idle_minutesnonenone
SessionsMax live sessions (machine)Abox 6, Mac no capsessions.max_livenonenone
SessionsDriver (sdk or cli fallback)Asdk after the flipsessions.drivernoneenv only
SessionsSDK install on first useAonsessions.installnonenone
ConcurrencyPreset Light 1/2, Balanced 3/4, Max 6/10, CustomPBalancedADR 0031, not builtnonenone
ConcurrencyMax active teammates 1..8, max subagents 0..16P3, 4not builtnonenone
ConcurrencyBox ceiling teammates, subagentsA6, 8not builtnonenone
ConcurrencyPause at usage warning; API key fallbackPon, offnot builtnonenone
TeammatesPer teammate daily turns, budget, model, role promptG200 turnsnot builtnonenone
TeammatesIntegrator: auto-merge when green, push after merge, test commandPon, off, detectednot builtnonenone
AgentsInstructions, skills, projects, computer, model, auth, budgetGagent rowagents.jsvyre agents
AgentsComputer CPUs, memoryGpool tableagents.jscall
AssistantName, instructionsAonboard, agentsSettings > The assistantnone
YouYour name, domains, emailsAonboard.person, me.*name read-onlynone
ProjectsProjects folder, extra rootsA~/Vyre/projectsconfig.jsonnonenone
ProjectsName, workspaces, people, watchersPmarkerread-onlyvyre new, pick
NotificationsKinds (ask, draft, watch, lesson, planner), quiet hoursA, per device laterall onpush_state4 of 5 kindscall
NotificationsPlanner labelAoffpush_statenonecall
PlannerTime zone, escalate after/max, event leadAsystem zone, 5, 3, 10planner_statenoneread only
MemoryModel on, daily and per-call spendAon, 0.05, 0.01config.jsonnonenone
MemoryLearn relations (prefers, decided)Aoffconfig.jsonnonenone
LearnDistill per dayA6config.jsonnonenone
LearnLessons (edit, retire, scope)A Plearn tablesSettings > Lessonsvyre learn
RecallIndex cadence, duty cycle, low battery, embedder, transcript foldersA5, 0.5, 30config.jsonHistory (reindex only)none
PresencePasskeysper devicepresence tableSecurityvyre presence code
VaultLock idle, max, on sleep, on screen lockA10m, 12h, on, onconfig.jsonnonenone
VaultRelay, fill, ssh agentAoffconfig.jsonnonenone
VyreDriveDefault access, sharesAroconfig.jsonNetwork (read-only)call
FilesRoots, max fetch, dotfilesAconfig.jsonnonenone
TerminalKeep hours, max, shell, login, scrollbackA12, 8config.jsonnonenone
GlassHand-back minutes, roots, upload size, egressA5config.jsonhand-back onlycall
NetworkName, owner, guests, origins, onboarding port, ACMEAconfig.jsonread-onlyvyre name, owner
RelayOn, URL, web link expiryAoffconfig.jsonnonecall
WebhooksOn, port, routesAoffconfig.jsonread-onlyvyre hooks
MCP hubIdle minutes, HTTP hosts, per-tool modeA10config.json, mcp tablesper-tool modevyre mcp
GateApprovers, sendersAchatconfig.jsonnonenone
Voice (Mac)Provider, speak, voiceAdeepgram, offconfig.jsonnonevyre voice
Capsule (Mac)Start at loginAoffconfig.jsonnonenone
ModulesEnable, disableAby roleconfig.jsonstatus onlynone
AppearanceTheme, coloursper device, A for coloursdarklocalStorage, config.jsonAppearance (theme)none

Gaps this inventory found

  1. No settings API: each screen calls its module's own tool, and 40-odd keys are file-only.
  2. No vyre config verb.
  3. Sessions settings (models, prompts, idle, caps) have no screen.
  4. Agent "Effort" says Saved and saves nothing.
  5. Notifications miss the planner kind and the planner label; quiet hours are box-wide with one browser's time zone.
  6. Most config.json keys need a restart; there is no config.changed event.
  7. Permission mode is lost when an idle session resumes.
  8. No project-level settings screen exists at all.