Lumoswitch 文档
Agent 接入

Mistral Vibe 接入

Mistral Vibe 是开源编码 Agent,提供终端、VS Code、Web 和 ACP 入口。CLI 与 VS Code 扩展共享本机配置和会话。本指南使用 Vibe 官方的 VIBE_HOME 覆盖,让 Lumoswitch 与默认 ~/.vibe 目录完全隔离。

先安装 Vibe:

uv tool install mistral-vibe

Windows 用户先安装 uv,在 PowerShell 中运行相同命令,并使用现代终端。Vibe 可以在 Windows 原生运行,但其上游项目主要面向 Unix 环境。

先创建输出协议为 OpenAI-compatible 的 Lumoswitch 配置 API。

连接参数

占位符
{{api_base_url}}下游 API URL,包含 /v1
{{access_key}}为 Lumoswitch 配置 API 选择的 Access Key
{{model}}客户端可见的模型名称

生成的配置使用 Vibe 通用 OpenAI 后端,并把 Key 放在环境变量而不是 TOML 中。它不会猜测有效 Lumoswitch 配置中没有提供的价格、Token 限制或推理能力。

仅本次启动

在希望 Vibe 操作的项目中运行:

(
  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
)

Vibe 退出时会删除临时 Vibe 主目录、配置和会话日志;默认 ~/.vibe 目录不会被读取或修改。

永久使用

此方案把托管配置放在 ~/.config/lumoswitch,把 Vibe 状态放在 ~/.local/share/lumoswitch。清理时会恢复首次接入前已存在于专属 Vibe 主目录中的文件,并保留之后产生的会话日志、Skill、Agent 和 Prompt。

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

接入后请打开新终端。日常直接运行 vibe。受信任项目中的 .vibe/config.toml 优先级高于此用户配置;如果项目有意选择了其他模型,可用 /config 检查。

Windows 原生 PowerShell 接入

Vibe 可以在 Windows 原生运行。以下命令使用隔离的 VIBE_HOME,不需要 WSL。

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 }
}

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 }
}

Windows 接入会保存并恢复已有的用户级 VIBE_HOMELUMOSWITCH_VIBE_API_KEY。配置和启动器使用仅当前用户可读的 ACL;清理后仍保留独立 Vibe 数据目录,因此会话与自定义资源不会丢失。

清除 Lumoswitch 接入

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

清理会移除托管提供方配置、凭证环境、Shell 钩子和启动器。独立数据目录中的 Vibe 会话日志,以及后来创建的 Skill、Agent、Prompt 或工具会保留;默认 ~/.vibe 不会被修改。

VS Code 与 ACP 入口

官方 Vibe VS Code 扩展与 CLI 共享配置和会话。永久接入后,从新终端启动 VS Code,或重启编辑器,让其中的 Vibe 进程读取 VIBE_HOME 和 Key。兼容 ACP 的编辑器可在相同环境中启动 vibe-acp

Vibe Code Web 是托管入口,不会继承本机自定义提供方凭证。此配置覆盖本机 CLI、官方 VS Code 扩展和 ACP 客户端。

验证与排查

  • 运行 /config,确认当前模型别名为 lumoswitch
  • 如果项目包含 .vibe/config.toml,信任目录前请先检查;项目配置可能选择其他提供方。
  • 通用后端要求 OpenAI-compatible 流式输出和原生工具调用。开始大型修改前,先测试文件读取与无害 Shell 命令。
  • Windows 显示异常时,请使用 Windows Terminal、WezTerm 或其他现代终端。

参考:Vibe Code安装配置与 VIBE_HOMEAPI Key 与提供方配置,以及 CLI/VS Code 会话共享

维护者发布字段
  • Platform ID:mistral-vibe
  • 显示名称:Mistral Vibe CLI
  • 下游协议:openai-compatible
  • macOS/Linux 与 Windows 临时模式:启用
  • macOS/Linux 与 Windows 永久策略:native
  • 两个平台后续命令:vibe
  • 显示顺序:28
  • 最近结构验证:2026-08-27

On this page