Перейти к основному содержимому

Windows (нативная) — руководство

VibeOS работает нативно на Windows 10 и Windows 11 — без WSL, Cygwin или Docker. Эта страница — подробное погружение: что работает нативно, что только в WSL, что на самом деле делает установщик, и какие специфичные для Windows настройки могут вам понадобиться.

Если вы просто хотите установить VibeOS, однострочной команды с главной страницы или страницы установки достаточно. Возвращайтесь сюда, если что-то пойдёт не так.

Хотите WSL?

Если вы предпочитаете полноценное POSIX-окружение (для встроенного терминала панели управления, семантики fork, файловых наблюдателей в стиле Linux и т.д.), смотрите Руководство по Windows (WSL2). Оба варианта мирно сосуществуют: нативные данные хранятся в %LOCALAPPDATA%\vibeos, данные WSL — в ~/.vibeos.

Быстрая установка​

Откройте PowerShell (или Windows Terminal) и выполните:

iex (irm https://vibeos.com.ru/downloads/install.ps1)

Права администратора не требуются. Установщик помещает файлы в %LOCALAPPDATA%\vibeos\ и добавляет vibeos в ваш User PATH — откройте новый терминал после завершения.

Параметры установщика (требуют форму scriptblock для передачи параметров):

& ([scriptblock]::Create((irm https://vibeos.com.ru/downloads/install.ps1))) -NoVenv -SkipSetup -Branch main
ПараметрПо умолчаниюНазначение
-BranchmainКлонировать определённую ветку (полезно для тестирования PR)
-Commitне заданЗафиксировать установку на определённом SHA коммита (переопределяет -Branch)
-Tagне заданЗафиксировать установку на определённом git-теге (например, v0.14.0)
-NoVenvвыкл.Пропустить создание venv (для продвинутых — вы управляете Python сами)
-SkipSetupвыкл.Пропустить мастер vibeos setup после установки
-VibeosHome%LOCALAPPDATA%\vibeosПереопределить каталог данных
-InstallDir%LOCALAPPDATA%\vibeos\vibeos-agentПереопределить расположение кода

Установщик автоматически повторяет попытки при нестабильных git-запросах и удаляет BOM из любого загруженного install.ps1, так что BOM UTF-8, подхваченный во время передачи по HTTP, больше не ломает форму [scriptblock]::Create((irm ...)).

Десктопный установщик (альтернатива)​

Также доступен простой графический установщик — полезен, если вы предпочитаете дважды щёлкнуть .exe, а не открывать PowerShell. Скачайте VibeOS Desktop, запустите установщик, и при первом запуске графический интерфейс под капотом вызовет install.ps1 для установки Python (через uv), Node, PortableGit и остальных зависимостей, описанных ниже. После первого запуска десктопное приложение и установленный через PowerShell CLI vibeos используют один и тот же каталог установки %LOCALAPPDATA%\vibeos\vibeos-agent и каталог данных %LOCALAPPDATA%\vibeos — свободно переключайтесь между GUI и CLI.

Используйте десктопный установщик, если хотите привычный для Windows процесс установки или передаёте VibeOS не-разработчику; используйте однострочную команду PowerShell, если вы уже в терминале.

Загрузка зависимостей (dep_ensure)​

При первом запуске (и по требованию при обнаружении отсутствующего инструмента) VibeOS запускает небольшой загрузчик на Python — vibeos_cli/dep_ensure.py — который проверяет и лениво устанавливает необходимые не-Python-зависимости. В Windows актуальны следующие:

ЗависимостьЗачем VibeOS это нужно
PortableGitПредоставляет bash.exe для терминального инструмента и git для клонирования внутри сессии. Устанавливается во время установки, а не через dep_ensure.
Node.js 22Требуется для браузерного инструмента (agent-browser), веб-моста TUI и моста WhatsApp.
ffmpegПреобразование аудиоформатов для TTS / голосовых сообщений.
ripgrepБыстрый поиск файлов — если недоступен, используется grep.
npm-пакетыagent-browser, Playwright Chromium и любые Node-зависимости для каждого набора инструментов устанавливаются один раз при первом использовании браузерного инструмента.

Каждая зависимость проверяется в стиле shutil.which(...); если бинарник отсутствует и запуск интерактивный, dep_ensure предлагает установить его (передавая управление scripts\install.ps1 -ensure &lt;dep&gt; для фактической установки). При неинтерактивных запусках (шлюз, cron, безголовый десктопный запуск) запрос пропускается и выводится понятная ошибка: «для этой функции требуется <зависимость>`».

Что на самом деле делает установщик​

Сверху вниз, по порядку:

  1. Загружает uv — быстрый менеджер Python от Astral. Устанавливается в %USERPROFILE%\.local\bin.
  2. Устанавливает Python 3.11 через uv. Существующий Python не требуется.
  3. Устанавливает Node.js 22 (winget, если доступен, иначе портативный tarball Node распаковывается в %LOCALAPPDATA%\vibeos\node). Используется для браузерного инструмента и моста WhatsApp.
  4. Устанавливает портативный Git — если git уже есть в PATH, установщик использует его; в противном случае загружает урезанный, самодостаточный PortableGit (~45 МБ, из официального релиза git-for-windows) в %LOCALAPPDATA%\vibeos\git. Без прав администратора, без установщика Windows, без вмешательства в другие программы.
  5. Клонирует репозиторий в %LOCALAPPDATA%\vibeos\vibeos-agent и создаёт внутри virtualenv.
  6. Многоуровневая uv pip install — сначала пытается .[all], затем откатывается к постепенно меньшим наборам ([messaging,dashboard,ext] → [messaging] → .), если git+https зависимость сбоит из-за лимитов GitHub. Предотвращает ситуацию, когда один сбой приводит к голой установке.
  7. Автоустановка SDK для мессенджеров на основе .env — если присутствуют TELEGRAM_BOT_TOKEN / DISCORD_BOT_TOKEN / SLACK_BOT_TOKEN / SLACK_APP_TOKEN / WHATSAPP_ENABLED, выполняет python -m ensurepip --upgrade и целевые вызовы pip install, чтобы SDK каждой платформы были импортируемы.
  8. Устанавливает VIBEOS_GIT_BASH_PATH на найденный bash.exe, чтобы VibeOS находил его детерминированно в новых оболочках.
  9. Добавляет %LOCALAPPDATA%\vibeos\vibeos-agent\venv\Scripts в User PATH и устанавливает VIBEOS_HOME=%LOCALAPPDATA%\vibeos — делает команду vibeos доступной (и указывает на ваш каталог данных) после открытия нового терминала.
  10. Запускает vibeos setup — обычный мастер первого запуска (модель, провайдер, наборы инструментов). Пропускается с -SkipSetup.
Пропустите поиск провайдеров в Windows

В Windows настройка ключей API для каждого инструмента (Firecrawl, FAL, Browser Use, OpenAI TTS) — самая сложная часть получения полезного агента. Подписка на Nous Portal покрывает модель и все эти инструменты через один OAuth-вход. После завершения установки выполните vibeos setup --portal, чтобы всё настроить.

Матрица возможностей​

Всё, кроме встроенной терминальной панели дашборда, работает нативно в Windows.

ВозможностьНативная WindowsWSL2
CLI (vibeos chat, vibeos setup, vibeos gateway, …)✓✓
Интерактивный TUI (vibeos --tui)✓✓
Шлюз сообщений (Telegram, Discord, Slack, WhatsApp, 15+ платформ)✓✓
Планировщик Cron✓✓
Браузерный инструмент (Chromium через Node)✓✓
MCP-серверы (stdio и HTTP)✓✓
Локальный Ollama / LM Studio / llama-server✓✓ (через сеть WSL)
Веб-дашборд (сессии, задачи, метрики, конфиг)✓✓
Встроенная терминальная панель дашборда /chat✗ (требуется POSIX PTY)✓
Автозапуск при входе в систему✓ (schtasks)✓ (systemd)

Вкладка /chat дашборда встраивает настоящий терминал через POSIX PTY (ptyprocess). В нативной Windows нет эквивалентного примитива; Python pywinpty / Windows ConPTY могли бы работать, но это отдельная реализация — рассматривается как будущая работа. Остальная часть дашборда работает нативно — только эта вкладка показывает баннер «используйте WSL2 для этого».

Как VibeOS выполняет shell-команды в Windows​

Инструмент терминала VibeOS выполняет команды через Git Bash — та же стратегия, что и у Claude Code. Это обходит разрыв между POSIX и Windows без переписывания каждого инструмента.

Порядок разрешения bash.exe:

  1. Переменная окружения VIBEOS_GIT_BASH_PATH, если установлена.
  2. %LOCALAPPDATA%\vibeos\git\usr\bin\bash.exe (PortableGit, управляемый установщиком).
  3. %LOCALAPPDATA%\vibeos\git\bin\bash.exe (старая структура Git-for-Windows).
  4. Системная установка Git-for-Windows (%ProgramFiles%\Git\bin\bash.exe и т.д.).
  5. MSYS2, Cygwin или любой bash.exe в PATH как крайнее средство.

Установщик явно задаёт VIBEOS_GIT_BASH_PATH, чтобы новым сессиям PowerShell не приходилось переоткрывать его. Переопределите эту переменную, если хотите, чтобы VibeOS использовал конкретный bash — например, ваш системный Git Bash или bash из WSL через символическую ссылку.

Проблема: Структура MinGit отличается от полного установщика Git-for-Windows — bash находится в usr\bin\bash.exe, а не в bin\bash.exe. VibeOS проверяет оба пути. Если вы вручную распаковываете zip-архив MinGit, убедитесь, что выбрали вариант не-busybox (MinGit-*-64-bit.zip, а не MinGit-*-busybox*.zip) — сборки busybox поставляют ash вместо bash, и большинство coreutils отсутствуют.

Консоль UTF-8 в Windows​

Стандартный stdio Python в Windows использует активную кодовую страницу консоли (обычно cp1252 или cp437). Баннер VibeOS, список slash-команд, лента инструментов, панели Rich и описания навыков содержат Unicode. Без вмешательства любое из этого вызовет ошибку UnicodeEncodeError: 'charmap' codec can't encode character….

Исправление находится в vibeos_cli/stdio.py::configure_windows_stdio(), вызываемом рано во всех точках входа (cli.py::main, vibeos_cli/main.py::main, gateway/run.py::main). Он:

  1. Переключает кодовую страницу консоли на CP_UTF8 (65001) через kernel32.SetConsoleCP / SetConsoleOutputCP.
  2. Перенастраивает sys.stdout / sys.stderr / sys.stdin на UTF-8 с errors='replace'.
  3. Устанавливает PYTHONIOENCODING=utf-8 и PYTHONUTF8=1 (через setdefault, так что явные пользовательские значения имеют приоритет), чтобы дочерние процессы Python наследовали UTF-8.
  4. Устанавливает EDITOR=notepad, если ни EDITOR, ни VISUAL не заданы (см. раздел о редакторе ниже).

Идемпотентно. Не работает на не-Windows системах.

Отключение: VIBEOS_DISABLE_WINDOWS_UTF8=1 в окружении возвращает старый путь stdio cp1252. Полезно для диагностики ошибки кодировки; вряд ли это правильная настройка при нормальной работе.

Редактор (Ctrl-X Ctrl-E, /edit)​

До #21561 нажатие Ctrl-X Ctrl-E или ввод /edit молча ничего не делали в Windows. У prompt_toolkit есть жёстко заданный список POSIX-абсолютных путей (/usr/bin/nano, /usr/bin/pico, /usr/bin/vi, …), который никогда не разрешается в Windows — даже с полным Git for Windows.

Прокладка stdio VibeOS для Windows теперь устанавливает EDITOR=notepad по умолчанию. Блокнот поставляется с каждой установкой Windows и работает как блокирующий редактор — subprocess.call(["notepad", file]) блокируется до закрытия окна.

Пользовательские переопределения по-прежнему имеют приоритет (они проверяются до setdefault):

РедакторКоманда PowerShell
VS Code$env:EDITOR = "code --wait"
Notepad++$env:EDITOR = "'C:\Program Files\Notepad++\notepad++.exe' -multiInst -nosession"
Neovim$env:EDITOR = "nvim"
Helix$env:EDITOR = "hx"

Флаг --wait в VS Code критически важен — без него редактор возвращается немедленно, и VibeOS получает пустой буфер.

Установите его постоянно в своём профиле PowerShell:

# В $PROFILE
$env:EDITOR = "code --wait"

Или как переменную окружения пользователя в системных настройках, чтобы её подхватывала каждая новая оболочка.

Ctrl+Enter для новой строки в CLI​

Windows Terminal передаёт Ctrl+Enter как отдельную последовательность клавиш. VibeOS привязывает к ней «вставку новой строки», чтобы вы могли составлять многострочные запросы в CLI без использования Esc, а затем Enter. Работает в Windows Terminal, встроенном терминале VS Code и любом современном хост-приложении консоли Windows, поддерживающем управляющие последовательности VT.

В устаревших консолях cmd.exe Ctrl+Enter сводится к обычному Enter — используйте Esc Enter или обновитесь до Windows Terminal (он бесплатен и установлен по умолчанию в Windows 11).

Запуск шлюза при входе в Windows​

vibeos gateway install в Windows использует запланированные задачи с запасным вариантом в виде папки автозагрузки — права администратора не требуются.

Установка​

vibeos gateway install

Что происходит под капотом:

  1. schtasks /Create /SC ONLOGON /RL LIMITED /TN VibeOSGateway — регистрирует задачу, которая запускается при вашем входе в систему со стандартными (не повышенными) правами. Без запроса UAC.
  2. Если schtasks заблокирован групповой политикой, создаёт ярлык start /min cmd.exe /d /c &lt;обёртка&gt; в %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup`. Тот же эффект, немного грубее.
  3. Запускает шлюз отсоединённо через pythonw.exe — не python.exe. У pythonw.exe нет прикреплённой консоли, что защищает его от широковещательных рассылок CTRL_C_EVENT от родственных процессов (реальная проблема, которая раньше убивала шлюз, когда вы нажимали Ctrl+C в любой программе той же группы процессов).

Флаги, используемые при запуске: DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB.

Управление​

vibeos gateway status      # Объединённое представление: schtasks + папка автозагрузки + запущенный PID
vibeos gateway start # Запускает запланированную задачу сейчас
vibeos gateway stop # Эквивалент корректного SIGTERM (TerminateProcess через psutil)
vibeos gateway restart
vibeos gateway uninstall # Удаляет запись schtasks, ярлык автозагрузки, файл pid

vibeos gateway status идемпотентен — вызывайте его тысячу раз подряд, и он никогда случайно не убьёт шлюз. (До PR #21561 он молча это делал через os.kill(pid, 0), сталкивающийся с CTRL_C_EVENT на уровне C — см. «внутреннее устройство управления процессами» ниже, если вам интересна история.)

Почему не служба Windows?​

Службы требуют прав администратора для установки и привязывают жизненный цикл шлюза к загрузке машины, а не ко входу пользователя. Типичный пользователь VibeOS хочет: войти → шлюз доступен, выйти → шлюз остановлен. Запланированные задачи делают именно это без повышения прав. Если вам действительно нужна служба, используйте nssm или sc create вручную — но, вероятно, это не то, что вам нужно.

Структура данных​

ПутьСодержимое
%LOCALAPPDATA%\vibeos\vibeos-agent\Git-репозиторий + venv. venv\Scripts\vibeos.exe — команда, добавленная в User PATH. Безопасно удалить Remove-Item -Recurse и переустановить.
%LOCALAPPDATA%\vibeos\git\PortableGit (только если установщик его предоставил).
%LOCALAPPDATA%\vibeos\node\Портативный Node.js (только если установщик его предоставил).
%LOCALAPPDATA%\vibeos\bin\Управляемый VibeOS uv.exe (менеджер Python, используемый для обновлений).
%LOCALAPPDATA%\vibeos\ (корень)Ваши конфиги, аутентификация, навыки, сессии, логи (config.yaml, .env, skills\, sessions\, logs\, …). Сохраняется при переустановках.

В нативной Windows установщик задаёт VIBEOS_HOME=%LOCALAPPDATA%\vibeos, поэтому ваши данные и одноразовая установка находятся в одном корне %LOCALAPPDATA%\vibeos: установка/исполнение — это подкаталоги vibeos-agent\, git\, node\ и bin\, а ваши файлы данных находятся непосредственно в %LOCALAPPDATA%\vibeos. Переустановка заменяет только vibeos-agent\, поэтому ваши данные сохраняются — но, поскольку они находятся в одном корне, не выполняйте Remove-Item -Recurse %LOCALAPPDATA%\vibeos, если хотите сохранить данные; вместо этого удалите подкаталог vibeos-agent\. Структура вашего каталога данных идентична Linux ~/.vibeos, так что вы можете синхронизировать его между машинами.

Переопределение VIBEOS_HOME: установите переменную окружения, указывающую на другой каталог данных (например, %USERPROFILE%\.vibeos для соответствия структуре Linux/WSL). Работает так же, как в Linux.

Браузерный инструмент​

Браузерный инструмент использует agent-browser (Node-помощник) для управления Chromium. В Windows:

  • Установщик помещает agent-browser в PATH через npm.
  • shutil.which("agent-browser", path=...) автоматически подхватывает обёртку .cmd — CreateProcessW не может выполнить shebang-скрипт без расширения, поэтому VibeOS всегда разрешает через обёртку .CMD. Не вызывайте shebang-скрипт вручную; всегда используйте .cmd.
  • Playwright Chromium автоматически устанавливается при первом запуске (npx playwright install chromium). Если установка не удалась, vibeos doctor сообщит об этом с подсказкой по исправлению.

Практические заметки по запуску VibeOS в Windows​

PATH после установки​

Установщик добавляет %LOCALAPPDATA%\vibeos\vibeos-agent\venv\Scripts в ваш User PATH через [Environment]::SetEnvironmentVariable. Существующие терминалы этого не подхватывают — откройте новое окно PowerShell (или вкладку Windows Terminal) после установки. Закройте и откройте заново, не добавляйте $env:PATH += … вручную, если не уверены в своих действиях.

Проверка:

Get-Command vibeos        # должно вывести C:\Users\<вы>\AppData\Local\vibeos\vibeos-agent\venv\Scripts\vibeos.exe
vibeos --version

Переменные окружения​

VibeOS поддерживает как $env:X (область процесса), так и переменные окружения пользователя (постоянные, задаются в System Properties → Environment Variables). Установка ключей API в %LOCALAPPDATA%\vibeos\.env (ваш VIBEOS_HOME) — обычный путь, как в Linux:

OPENROUTER_API_KEY=sk-or-...
TELEGRAM_BOT_TOKEN=...

Не помещайте секреты в переменные окружения пользователя, если вы специально не хотите, чтобы их видели все процессы Windows (вам это не нужно).

Специфичные для Windows переменные окружения​

Эти переменные влияют только на нативные установки Windows:

ПеременнаяЭффект
VIBEOS_GIT_BASH_PATHПереопределяет поиск bash.exe. Укажите на любой bash — полный Git-for-Windows, bash из WSL через символическую ссылку, MSYS2, Cygwin. Установщик задаёт это автоматически.
VIBEOS_DISABLE_WINDOWS_UTF8Установите в 1, чтобы отключить прослойку UTF-8 stdio и вернуться к кодовой странице локали. Полезно для диагностики ошибки кодировки.
EDITOR / VISUALВаш редактор для /edit и Ctrl-X Ctrl-E. VibeOS по умолчанию использует notepad, если обе переменные не заданы.

Удаление​

Из PowerShell:

vibeos uninstall

Это чистый путь — удаляет запись schtasks, ярлык из папки автозагрузки, обёртку vibeos.cmd, удаляет %LOCALAPPDATA%\vibeos\vibeos-agent\ и очищает User PATH. Остальная часть %LOCALAPPDATA%\vibeos\ (ваши конфиги, аутентификация, навыки, сессии, логи) остаётся нетронутой на случай переустановки.

Чтобы удалить всё полностью:

vibeos uninstall
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\vibeos"
# Также удалите устаревший каталог данных CLI/WSL, если вы когда-либо его использовали:
Remove-Item -Recurse -Force "$env:USERPROFILE\.vibeos"

Подкоманда CLI vibeos uninstall также обрабатывает случай, когда запись schtasks была зарегистрирована под другим именем задачи (старые установки) — она ищет по пути установки, а не по жёстко заданному имени задачи.

Внутреннее устройство управления процессами​

Это справочный материал — пропустите, если не отлаживаете странность «само себя убивает».

В Linux и macOS идиома POSIX os.kill(pid, 0) — это проверка разрешений без побочных эффектов: «жив ли этот PID и могу ли я послать ему сигнал?» В Windows Python os.kill отображает sig=0 на CTRL_C_EVENT — они совпадают по целочисленному значению 0 — и направляет его через GenerateConsoleCtrlEvent(0, pid), который рассылает Ctrl+C всей группе процессов консоли, содержащей целевой PID. Это bpo-14484, открыт с 2012 года. Он не будет исправлен, потому что изменение сломает скрипты, зависящие от текущего поведения.

Следствие: любой код, который «проверял, жив ли этот PID» через os.kill(pid, 0) в Windows, молча убивал цель. VibeOS перенёс все такие места (14 в 11 файлах) на gateway.status._pid_exists(), который использует psutil.pid_exists() (который, в свою очередь, использует OpenProcess + GetExitCodeProcess в Windows — без сигналов). Если вы пишете плагин или патч, используйте psutil.pid_exists() напрямую или gateway.status._pid_exists() — никогда не используйте os.kill(pid, 0).

scripts/check-windows-footguns.py обеспечивает это в CI: любой новый вызов os.kill(pid, 0) приводит к провалу проверки «Windows footguns (blocking)», если строка не содержит маркер # windows-footgun: ok — <причина>`.

Частые проблемы​

vibeos: command not found сразу после установки. Откройте новое окно PowerShell. Установщик добавил %LOCALAPPDATA%\vibeos\bin в User PATH, но существующим оболочкам нужно перезапуститься, чтобы подхватить его. Тем временем вы можете выполнить & "$env:LOCALAPPDATA\vibeos\bin\vibeos.cmd".

WinError 193: %1 is not a valid Win32 application при запуске инструмента. Вы наткнулись на вызов shebang-скрипта, который обошёл обёртку .cmd. VibeOS разрешает команды через shutil.which(cmd, path=local_bin), чтобы PATHEXT подхватывал .CMD — если вы вызываете инструмент через жёстко заданный путь, переключитесь на вариант .cmd (например, npx.cmd, а не npx).

[scriptblock]::Create(...) завершается ошибкой The assignment expression is not valid. Ваша загрузка install.ps1 подхватила BOM UTF-8. Форма irm | iex автоматически удаляет BOM; [scriptblock]::Create((irm ...)) — нет. Повторите с простой формой irm | iex или загрузите скрипт вручную и сохраните без BOM через [IO.File]::WriteAllText($path, $text, (New-Object Text.UTF8Encoding $false)).

Шлюз не остаётся запущенным после перезагрузки. Проверьте vibeos gateway status — он объединяет запись schtasks, ярлык в папке автозагрузки (если используется) и живой PID. Если schtasks зарегистрирована, но не запускается, групповая политика может блокировать триггеры ONLOGON. Выполните schtasks /Query /TN VibeOSGateway /V /FO LIST, чтобы увидеть причину сбоя задачи, или вернитесь к пути через папку автозагрузки, удалив и переустановив с VIBEOS_GATEWAY_FORCE_STARTUP=1.

/edit по-прежнему ничего не делает после установки $env:EDITOR. Вы установили его только в текущем процессе; закройте и снова откройте оболочку или установите на уровне пользователя в System Properties → Environment Variables. Проверьте с помощью echo $env:EDITOR в новом окне PowerShell.

Браузерный инструмент запускается, но инструменты выходят по тайм-ауту. Chromium автоматически устанавливается при первом запуске. Если установка не удалась (лимиты GitHub, сбой CDN Playwright), выполните vibeos doctor — он сообщит об отсутствующем Chromium и выведет точную команду npx playwright install chromium для исправления.

agent-browser завершается ошибкой со странной ошибкой версии Node. Установщик предоставляет Node 22 в %LOCALAPPDATA%\vibeos\node, но ваш PATH может содержать более старую системную Node 18. Либо переместите каталог node от VibeOS раньше в PATH, либо удалите системную установку, если вы не используете Node в других целях.

Китайские / японские / арабские символы отображаются как ? в CLI. Прослойка UTF-8 stdio не активировалась. Проверьте, что VIBEOS_DISABLE_WINDOWS_UTF8 НЕ установлен (Get-ChildItem env:VIBEOS_DISABLE_WINDOWS_UTF8). Если он пуст, а вы всё ещё видите ?, хост консоли (очень старый cmd.exe) может вообще не поддерживать UTF-8 — переключитесь на Windows Terminal.

Шлюз не может отправить фотографии Telegram — «BadRequest: payload contains invalid characters». Это не связано с Windows, но иногда проявляется в первую очередь здесь. Обычно это означает, что ваш путь к файлу содержит неэкранированные обратные слеши в теле JSON. Telegram должен получать пути, нормализованные VibeOS, а не сырые пути Windows — если вы видите это внутри собственного плагина, убедитесь, что передаёте путь, предоставленный VibeOS, а не str(Path(...)) из пользовательского ввода.

Странности с кодировкой «на другой машине работает» после git pull. Если вы редактировали конфиг VibeOS или навык в Windows с помощью редактора, не поддерживающего UTF-8 (Блокнот в старых версиях Windows, некоторые китайские IME), файл мог быть сохранён с BOM. VibeOS терпит utf-8-sig при большинстве чтений конфигов, но BOM внутри свёрнутого YAML-скаляра (description: >) молча ломает парсинг YAML. Пересохраните файл как обычный UTF-8 без BOM.

Куда двигаться дальше​