Lumoswitch Docs
Agent setup

Mistral Vibe setup

Mistral Vibe is an open-source coding Agent with terminal, VS Code, Web, and ACP surfaces. The CLI and VS Code extension share the same local configuration and sessions. This guide uses Vibe's official VIBE_HOME override so Lumoswitch remains separate from the default ~/.vibe directory.

Install Vibe first:

uv tool install mistral-vibe

On Windows, install uv, run the same command in PowerShell, and use a modern terminal. Vibe works on Windows, although its upstream project primarily targets Unix environments.

Create a Lumoswitch API configuration with OpenAI-compatible output.

Connection values

PlaceholderValue
{{api_base_url}}Downstream API URL, including /v1
{{access_key}}Access Key selected for the Lumoswitch API configuration
{{model}}Client-facing model name

The generated profile uses Vibe's generic OpenAI backend and keeps the Key in an environment variable rather than TOML. It does not invent pricing, token limits, or reasoning capabilities that are absent from the effective Lumoswitch configuration.

One-time launch

Run this from the project you want Vibe to work on:

(
  set -e
  LUMOSWITCH_VIBE_HOME="$(mktemp -d "${TMPDIR:-/tmp}/lumoswitch-vibe.XXXXXX")"
  lumoswitch_cleanup() {
    rm -rf "$LUMOSWITCH_VIBE_HOME"
  }
  trap lumoswitch_cleanup EXIT HUP INT TERM
  umask 077
  cat > "$LUMOSWITCH_VIBE_HOME/config.toml" <<'LUMOSWITCH_VIBE_CONFIG_EOF'
active_model = "lumoswitch"
default_agent = "default"
log_interactions = true

[[providers]]
name = "lumoswitch"
api_base = "{{api_base_url}}"
api_key_env_var = "LUMOSWITCH_VIBE_API_KEY"
api_style = "openai"
backend = "generic"

[[models]]
name = "{{model}}"
provider = "lumoswitch"
alias = "lumoswitch"
LUMOSWITCH_VIBE_CONFIG_EOF
  env \
    VIBE_HOME="$LUMOSWITCH_VIBE_HOME" \
    LUMOSWITCH_VIBE_API_KEY="{{access_key}}" \
    vibe
)

The temporary Vibe home, configuration, and session log are deleted when Vibe exits. The default ~/.vibe directory is never read or changed.

Persistent use

This setup keeps managed configuration under ~/.config/lumoswitch and Vibe state under ~/.local/share/lumoswitch. Cleanup restores any file that existed in the dedicated Vibe home before the first import and preserves session logs, skills, agents, and prompts created there.

set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/mistral-vibe"
LUMOSWITCH_VIBE_HOME="$HOME/.local/share/lumoswitch/agents/mistral-vibe"
LUMOSWITCH_CONFIG="$LUMOSWITCH_VIBE_HOME/config.toml"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-mistral-vibe"
mkdir -p "$LUMOSWITCH_ROOT/original" "$LUMOSWITCH_VIBE_HOME" "$(dirname "$LUMOSWITCH_LAUNCHER")"
umask 077

if [ -L "$LUMOSWITCH_CONFIG" ] || { [ -e "$LUMOSWITCH_CONFIG" ] && [ ! -f "$LUMOSWITCH_CONFIG" ]; }; then
  printf '%s\n' 'Lumoswitch refused to replace a linked or non-regular Vibe config.' >&2
  exit 1
fi
if [ ! -f "$LUMOSWITCH_ROOT/original/config.toml.state" ]; then
  if [ -f "$LUMOSWITCH_CONFIG" ]; then
    cp "$LUMOSWITCH_CONFIG" "$LUMOSWITCH_ROOT/original/config.toml"
    printf '%s\n' present > "$LUMOSWITCH_ROOT/original/config.toml.state"
  else
    printf '%s\n' absent > "$LUMOSWITCH_ROOT/original/config.toml.state"
  fi
fi

if [ -f "$LUMOSWITCH_LAUNCHER" ]; then
  LUMOSWITCH_BACKUP="$LUMOSWITCH_LAUNCHER.backup.$(date +%Y%m%d-%H%M%S)-$$"
  cp "$LUMOSWITCH_LAUNCHER" "$LUMOSWITCH_BACKUP"
  chmod 600 "$LUMOSWITCH_BACKUP"
fi

cat > "$LUMOSWITCH_CONFIG" <<'LUMOSWITCH_VIBE_CONFIG_EOF'
active_model = "lumoswitch"
default_agent = "default"
log_interactions = true

[[providers]]
name = "lumoswitch"
api_base = "{{api_base_url}}"
api_key_env_var = "LUMOSWITCH_VIBE_API_KEY"
api_style = "openai"
backend = "generic"

[[models]]
name = "{{model}}"
provider = "lumoswitch"
alias = "lumoswitch"
LUMOSWITCH_VIBE_CONFIG_EOF

cat > "$LUMOSWITCH_ENV" <<'LUMOSWITCH_ENV_EOF'
export VIBE_HOME="$HOME/.local/share/lumoswitch/agents/mistral-vibe"
export LUMOSWITCH_VIBE_API_KEY="{{access_key}}"
LUMOSWITCH_ENV_EOF

case "$SHELL" in
  */zsh) LUMOSWITCH_PROFILE="$HOME/.zshrc" ;;
  */bash) LUMOSWITCH_PROFILE="$HOME/.bashrc" ;;
  *) LUMOSWITCH_PROFILE="$HOME/.profile" ;;
esac
touch "$LUMOSWITCH_PROFILE"
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: mistral-vibe'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/mistral-vibe/env.sh" ] && . "$HOME/.config/lumoswitch/agents/mistral-vibe/env.sh"'
if ! grep -Fqx "$LUMOSWITCH_SOURCE_LINE" "$LUMOSWITCH_PROFILE"; then
  printf '\n%s\n%s\n' "$LUMOSWITCH_PROFILE_MARKER" "$LUMOSWITCH_SOURCE_LINE" >> "$LUMOSWITCH_PROFILE"
fi
printf '%s\n' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_ROOT/profile-path"

cat > "$LUMOSWITCH_LAUNCHER" <<'LUMOSWITCH_LAUNCHER_EOF'
#!/usr/bin/env bash
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/mistral-vibe"
LUMOSWITCH_VIBE_HOME="$HOME/.local/share/lumoswitch/agents/mistral-vibe"
LUMOSWITCH_CONFIG="$LUMOSWITCH_VIBE_HOME/config.toml"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-mistral-vibe"

if [ "$1" = "--lumoswitch-clean" ]; then
  if [ -f "$LUMOSWITCH_ROOT/profile-path" ]; then
    LUMOSWITCH_PROFILE="$(cat "$LUMOSWITCH_ROOT/profile-path")"
    if [ -f "$LUMOSWITCH_PROFILE" ]; then
      LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: mistral-vibe'
      LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/mistral-vibe/env.sh" ] && . "$HOME/.config/lumoswitch/agents/mistral-vibe/env.sh"'
      LUMOSWITCH_PROFILE_TMP="$LUMOSWITCH_PROFILE.lumoswitch.$$"
      awk -v marker="$LUMOSWITCH_PROFILE_MARKER" -v source="$LUMOSWITCH_SOURCE_LINE" '$0 != marker && $0 != source' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_PROFILE_TMP"
      mv "$LUMOSWITCH_PROFILE_TMP" "$LUMOSWITCH_PROFILE"
    fi
  fi
  if [ -L "$LUMOSWITCH_CONFIG" ] || { [ -e "$LUMOSWITCH_CONFIG" ] && [ ! -f "$LUMOSWITCH_CONFIG" ]; }; then
    printf '%s\n' 'Lumoswitch refused to clean a linked or non-regular Vibe config.' >&2
    exit 1
  fi
  if [ -f "$LUMOSWITCH_ROOT/original/config.toml.state" ] && [ "$(cat "$LUMOSWITCH_ROOT/original/config.toml.state")" = present ]; then
    cp "$LUMOSWITCH_ROOT/original/config.toml" "$LUMOSWITCH_CONFIG"
  else
    rm -f "$LUMOSWITCH_CONFIG"
  fi
  if [ -d "$LUMOSWITCH_ROOT" ]; then
    find "$LUMOSWITCH_ROOT" -depth \( -type f -o -type l \) -delete
    find "$LUMOSWITCH_ROOT" -depth -type d -exec rmdir {} \; 2>/dev/null || true
  fi
  find "$(dirname "$LUMOSWITCH_LAUNCHER")" -maxdepth 1 -type f -name 'lumoswitch-mistral-vibe.backup.*' -delete
  rm -f "$LUMOSWITCH_LAUNCHER"
  printf '%s\n' 'Lumoswitch Vibe setup removed. Vibe sessions and custom resources were preserved.'
  exit 0
fi

if [ -f "$LUMOSWITCH_ENV" ]; then . "$LUMOSWITCH_ENV"; fi
exec vibe "$@"
LUMOSWITCH_LAUNCHER_EOF

chmod 600 "$LUMOSWITCH_CONFIG" "$LUMOSWITCH_ENV"
find "$LUMOSWITCH_ROOT" -type f -exec chmod 600 {} \;
chmod 700 "$LUMOSWITCH_LAUNCHER"
. "$LUMOSWITCH_ENV"
printf '%s\n' 'Native Lumoswitch setup saved. Future command: vibe'
printf '%s\n' 'Optional maintenance launcher: ~/.local/bin/lumoswitch-mistral-vibe'
vibe

Open a new terminal after setup. For everyday use, run vibe. A trusted project-level .vibe/config.toml has higher precedence than this user profile; use /config if a project intentionally selects another model.

Native Windows PowerShell import

Vibe runs natively on Windows. These commands use an isolated VIBE_HOME and do not require WSL.

One-time use on Windows

& {
  $ErrorActionPreference = 'Stop'
  $lumoswitchVibeHome = Join-Path ([IO.Path]::GetTempPath()) ('lumoswitch-vibe-' + [Guid]::NewGuid().ToString('N'))
  [IO.Directory]::CreateDirectory($lumoswitchVibeHome) | Out-Null
  $lumoswitchConfig = @'
active_model = "lumoswitch"
default_agent = "default"
log_interactions = true

[[providers]]
name = "lumoswitch"
api_base = "{{api_base_url}}"
api_key_env_var = "LUMOSWITCH_VIBE_API_KEY"
api_style = "openai"
backend = "generic"

[[models]]
name = "{{model}}"
provider = "lumoswitch"
alias = "lumoswitch"
'@
  [IO.File]::WriteAllText((Join-Path $lumoswitchVibeHome 'config.toml'), $lumoswitchConfig, [Text.UTF8Encoding]::new($false))
  $lumoswitchEnvironmentNames = @('VIBE_HOME', 'LUMOSWITCH_VIBE_API_KEY')
  $lumoswitchPreviousEnvironment = @{}
  foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
    $lumoswitchPreviousEnvironment[$lumoswitchName] = [Environment]::GetEnvironmentVariable($lumoswitchName, 'Process')
  }
  $lumoswitchExitCode = 0
  try {
    [Environment]::SetEnvironmentVariable('VIBE_HOME', $lumoswitchVibeHome, 'Process')
    [Environment]::SetEnvironmentVariable('LUMOSWITCH_VIBE_API_KEY', '{{access_key}}', 'Process')
    $lumoswitchExecutable = Get-Command 'vibe.exe' -CommandType Application -ErrorAction SilentlyContinue
    if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe.cmd' -CommandType Application -ErrorAction SilentlyContinue }
    if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe' -CommandType Application -ErrorAction Stop }
    & $lumoswitchExecutable.Path
    if ($null -ne $LASTEXITCODE) { $lumoswitchExitCode = $LASTEXITCODE }
  } finally {
    foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
      [Environment]::SetEnvironmentVariable($lumoswitchName, $lumoswitchPreviousEnvironment[$lumoswitchName], 'Process')
    }
    Remove-Item -LiteralPath $lumoswitchVibeHome -Recurse -Force -ErrorAction SilentlyContinue
  }
  if ($lumoswitchExitCode -ne 0) { throw 'vibe exited with code ' + $lumoswitchExitCode }
}

Persistent use on Windows

& {
  $ErrorActionPreference = 'Stop'
  $lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\mistral-vibe'
  $lumoswitchVibeHome = Join-Path $env:LOCALAPPDATA 'Lumoswitch\data\mistral-vibe'
  $lumoswitchConfig = Join-Path $lumoswitchVibeHome 'config.toml'
  $lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-mistral-vibe.ps1'
  $lumoswitchBackupSuffix = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + $PID

  function Protect-LumoswitchFile([string] $Path) {
    $lumoswitchSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
    & icacls.exe $Path '/inheritance:r' '/grant:r' ('*' + $lumoswitchSid + ':(F)') '*S-1-5-18:(F)' '*S-1-5-32-544:(F)' | Out-Null
    if ($LASTEXITCODE -ne 0) { throw "Could not restrict access to $Path" }
  }

  function Install-LumoswitchFile([string] $Path, [string] $Content) {
    [IO.Directory]::CreateDirectory((Split-Path -Parent $Path)) | Out-Null
    if (Test-Path -LiteralPath $Path) {
      $lumoswitchItem = Get-Item -LiteralPath $Path -Force
      if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
        throw "Lumoswitch refused to replace a directory or link: $Path"
      }
      $lumoswitchBackup = $Path + '.backup.' + $lumoswitchBackupSuffix
      Copy-Item -LiteralPath $Path -Destination $lumoswitchBackup
      Protect-LumoswitchFile $lumoswitchBackup
    }
    $lumoswitchTemporary = $Path + '.' + [Guid]::NewGuid().ToString('N') + '.tmp'
    try {
      [IO.File]::WriteAllText($lumoswitchTemporary, $Content, [Text.UTF8Encoding]::new($false))
      Move-Item -LiteralPath $lumoswitchTemporary -Destination $Path -Force
      Protect-LumoswitchFile $Path
    } finally {
      Remove-Item -LiteralPath $lumoswitchTemporary -Force -ErrorAction SilentlyContinue
    }
  }

  function Preserve-LumoswitchOriginalEnvironment([string] $Name) {
    $lumoswitchOriginalRoot = Join-Path $lumoswitchRoot 'original-environment'
    $lumoswitchState = Join-Path $lumoswitchOriginalRoot ($Name + '.state')
    if (Test-Path -LiteralPath $lumoswitchState -PathType Leaf) { return }
    [IO.Directory]::CreateDirectory($lumoswitchOriginalRoot) | Out-Null
    $lumoswitchValue = [Environment]::GetEnvironmentVariable($Name, 'User')
    if ($null -eq $lumoswitchValue) {
      Install-LumoswitchFile $lumoswitchState 'absent'
    } else {
      Install-LumoswitchFile (Join-Path $lumoswitchOriginalRoot ($Name + '.value')) $lumoswitchValue
      Install-LumoswitchFile $lumoswitchState 'present'
    }
  }

  function Preserve-LumoswitchOriginalConfig {
    $lumoswitchOriginalRoot = Join-Path $lumoswitchRoot 'original-config'
    $lumoswitchState = Join-Path $lumoswitchOriginalRoot 'config.toml.state'
    if (Test-Path -LiteralPath $lumoswitchState -PathType Leaf) { return }
    [IO.Directory]::CreateDirectory($lumoswitchOriginalRoot) | Out-Null
    if (Test-Path -LiteralPath $lumoswitchConfig -PathType Leaf) {
      $lumoswitchItem = Get-Item -LiteralPath $lumoswitchConfig -Force
      if ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Lumoswitch refused to preserve a linked Vibe config.' }
      Copy-Item -LiteralPath $lumoswitchConfig -Destination (Join-Path $lumoswitchOriginalRoot 'config.toml')
      Protect-LumoswitchFile (Join-Path $lumoswitchOriginalRoot 'config.toml')
      Install-LumoswitchFile $lumoswitchState 'present'
    } else {
      Install-LumoswitchFile $lumoswitchState 'absent'
    }
  }

  [IO.Directory]::CreateDirectory($lumoswitchRoot) | Out-Null
  [IO.Directory]::CreateDirectory($lumoswitchVibeHome) | Out-Null
  Preserve-LumoswitchOriginalConfig
  $lumoswitchConfigContent = @'
active_model = "lumoswitch"
default_agent = "default"
log_interactions = true

[[providers]]
name = "lumoswitch"
api_base = "{{api_base_url}}"
api_key_env_var = "LUMOSWITCH_VIBE_API_KEY"
api_style = "openai"
backend = "generic"

[[models]]
name = "{{model}}"
provider = "lumoswitch"
alias = "lumoswitch"
'@
  Install-LumoswitchFile $lumoswitchConfig $lumoswitchConfigContent

  foreach ($lumoswitchName in @('VIBE_HOME', 'LUMOSWITCH_VIBE_API_KEY')) {
    Preserve-LumoswitchOriginalEnvironment $lumoswitchName
  }
  $lumoswitchEnvironment = [ordered]@{
    VIBE_HOME = $lumoswitchVibeHome
    LUMOSWITCH_VIBE_API_KEY = '{{access_key}}'
  }
  foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
    [Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'User')
    [Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
  }

  $lumoswitchLauncherContent = @'
param([Parameter(ValueFromRemainingArguments = $true)][string[]] $AgentArgs)
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\mistral-vibe'
$lumoswitchVibeHome = Join-Path $env:LOCALAPPDATA 'Lumoswitch\data\mistral-vibe'
$lumoswitchConfig = Join-Path $lumoswitchVibeHome 'config.toml'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-mistral-vibe.ps1'

function Remove-LumoswitchFile([string] $Path) {
  if (-not (Test-Path -LiteralPath $Path)) { return }
  $lumoswitchItem = Get-Item -LiteralPath $Path -Force
  if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
    throw "Lumoswitch refused to remove a directory or link: $Path"
  }
  Remove-Item -LiteralPath $Path -Force
}

function Restore-LumoswitchOriginal([string] $Name) {
  $lumoswitchOriginalRoot = Join-Path $lumoswitchRoot 'original-environment'
  $lumoswitchState = Join-Path $lumoswitchOriginalRoot ($Name + '.state')
  if (-not (Test-Path -LiteralPath $lumoswitchState -PathType Leaf)) { return }
  $lumoswitchStatus = (Get-Content -LiteralPath $lumoswitchState -Raw).Trim()
  $lumoswitchValue = if ($lumoswitchStatus -eq 'present') {
    Get-Content -LiteralPath (Join-Path $lumoswitchOriginalRoot ($Name + '.value')) -Raw
  } else { $null }
  [Environment]::SetEnvironmentVariable($Name, $lumoswitchValue, 'User')
  [Environment]::SetEnvironmentVariable($Name, $lumoswitchValue, 'Process')
}

if ($AgentArgs.Count -gt 0 -and $AgentArgs[0] -eq '--lumoswitch-clean') {
  foreach ($lumoswitchName in @('VIBE_HOME', 'LUMOSWITCH_VIBE_API_KEY')) {
    Restore-LumoswitchOriginal $lumoswitchName
  }
  $lumoswitchOriginalConfigRoot = Join-Path $lumoswitchRoot 'original-config'
  $lumoswitchConfigState = Join-Path $lumoswitchOriginalConfigRoot 'config.toml.state'
  if (Test-Path -LiteralPath $lumoswitchConfigState -PathType Leaf) {
    if ((Get-Content -LiteralPath $lumoswitchConfigState -Raw).Trim() -eq 'present') {
      [IO.Directory]::CreateDirectory($lumoswitchVibeHome) | Out-Null
      Copy-Item -LiteralPath (Join-Path $lumoswitchOriginalConfigRoot 'config.toml') -Destination $lumoswitchConfig -Force
    } else {
      Remove-LumoswitchFile $lumoswitchConfig
    }
  }
  if (Test-Path -LiteralPath $lumoswitchRoot -PathType Container) {
    $lumoswitchRootItem = Get-Item -LiteralPath $lumoswitchRoot -Force
    if ($lumoswitchRootItem.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Lumoswitch refused to clean through a linked directory.' }
    foreach ($lumoswitchFile in @(Get-ChildItem -LiteralPath $lumoswitchRoot -File -Recurse -Force)) { Remove-LumoswitchFile $lumoswitchFile.FullName }
    foreach ($lumoswitchDirectory in @(Get-ChildItem -LiteralPath $lumoswitchRoot -Directory -Recurse -Force | Sort-Object FullName -Descending)) {
      if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchDirectory.FullName -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchDirectory.FullName -Force }
    }
    if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchRoot -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchRoot -Force }
  }
  $lumoswitchBin = Split-Path -Parent $lumoswitchLauncher
  if (Test-Path -LiteralPath $lumoswitchBin -PathType Container) {
    foreach ($lumoswitchBackup in @(Get-ChildItem -LiteralPath $lumoswitchBin -Filter 'lumoswitch-mistral-vibe.ps1.backup.*' -File -Force)) { Remove-LumoswitchFile $lumoswitchBackup.FullName }
  }
  Remove-LumoswitchFile $lumoswitchLauncher
  Write-Host 'Lumoswitch Vibe setup removed. Vibe sessions and custom resources were preserved.'
  exit 0
}

$lumoswitchApiKey = [Environment]::GetEnvironmentVariable('LUMOSWITCH_VIBE_API_KEY', 'User')
[Environment]::SetEnvironmentVariable('VIBE_HOME', $lumoswitchVibeHome, 'Process')
[Environment]::SetEnvironmentVariable('LUMOSWITCH_VIBE_API_KEY', $lumoswitchApiKey, 'Process')
$lumoswitchExecutable = Get-Command 'vibe.exe' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe.cmd' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe' -CommandType Application -ErrorAction Stop }
& $lumoswitchExecutable.Path @AgentArgs
if ($null -ne $LASTEXITCODE) { exit $LASTEXITCODE }
'@
  Install-LumoswitchFile $lumoswitchLauncher $lumoswitchLauncherContent
  Write-Host 'Native Lumoswitch setup saved. Future command: vibe'
  Write-Host 'Optional maintenance launcher:' $lumoswitchLauncher
  $lumoswitchExecutable = Get-Command 'vibe.exe' -CommandType Application -ErrorAction SilentlyContinue
  if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe.cmd' -CommandType Application -ErrorAction SilentlyContinue }
  if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'vibe' -CommandType Application -ErrorAction Stop }
  & $lumoswitchExecutable.Path
  if ($null -ne $LASTEXITCODE -and $LASTEXITCODE -ne 0) { throw 'vibe exited with code ' + $LASTEXITCODE }
}

The Windows setup preserves and restores existing user-level VIBE_HOME and LUMOSWITCH_VIBE_API_KEY values. Configuration and launcher files receive user-only ACLs, while the separate Vibe data directory remains after cleanup so sessions and custom resources survive.

Remove the Lumoswitch setup

Windows PowerShell

& {
  $lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-mistral-vibe.ps1'
  if (-not (Test-Path -LiteralPath $lumoswitchLauncher -PathType Leaf)) {
    throw 'The optional Lumoswitch maintenance launcher is missing. Run persistent import again before cleanup.'
  }
  & powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File $lumoswitchLauncher --lumoswitch-clean
}

macOS / Linux

"$HOME/.local/bin/lumoswitch-mistral-vibe" --lumoswitch-clean

Cleanup removes the managed provider profile, credential environment, shell hook, and launcher. It keeps Vibe session logs and any skills, agents, prompts, or tools created inside the isolated data directory; the default ~/.vibe directory remains untouched.

VS Code and ACP surfaces

The official Vibe VS Code extension shares the CLI's configuration and sessions. Start VS Code from a new terminal after persistent import, or restart the editor so its Vibe process receives VIBE_HOME and the Key. ACP-compatible editors can launch vibe-acp with the same environment.

Vibe Code Web is a hosted surface and does not inherit local custom-provider credentials. This setup covers the local CLI, official VS Code extension, and ACP clients.

Verify and troubleshoot

  • Run /config and confirm that the active model alias is lumoswitch.
  • If a project contains .vibe/config.toml, inspect it before trusting the folder; project configuration can select another provider.
  • The generic backend requires OpenAI-compatible streaming and native tool calls. Test file reads and a harmless shell command before a large edit.
  • If Windows rendering is poor, use Windows Terminal, WezTerm, or another modern terminal.

References: Vibe Code, installation, configuration and VIBE_HOME, API keys and provider profiles, and CLI/VS Code session sharing.

Maintainer publication fields
  • Platform ID: mistral-vibe
  • Display name: Mistral Vibe CLI
  • Downstream protocol: openai-compatible
  • macOS/Linux and Windows temporary modes: enabled
  • macOS/Linux and Windows persistent strategies: native
  • Future command on both platforms: vibe
  • Display order: 28
  • Last structurally verified: 2026-08-27

On this page