Skip to main content
Glama

venv-manager

CI Go Reference License: MIT Release Website jacopobonomi/venv-manager MCP server

Один уровень управления Python-окружениями для разработчиков и каждого AI-кодинг-агента.

Написан на Go. Один статический бинарник, без зависимостей во время выполнения, кроме python3 (или uv, если доступен).

demo

GIF выше — настоящий: venv-manager watch app.py --venv X отслеживает файл, сканирует его импорты с помощью крошечного AST-подобного парсера и pip-устанавливает всё недостающее — при каждом изменении файла. Укажите его на скрипт, над которым итерирует LLM, и venv сходится вместе с кодом.


Зачем

Claude, Codex, Cursor и другие кодинг-агенты уже умеют выполнять shell-команды, создавать .venv и запрашивать разрешение на чувствительные операции. Чего у них нет — так это долговременного состояния Python-окружения.

Песочница защищает машину. venv-manager защищает рабочий процесс: он даёт каждому агенту одни и те же окружения, метаданные, историю пакетов и путь восстановления, независимо от того, какой клиент запущен.

Два сценария отказа привели к созданию этого инструмента:

  1. Человеческий хаос. Venv размножаются по ~, кэш-каталоги съедают гигабайты, синтаксис активации различается в зависимости от оболочки, а клонирование «того самого окружения» означает копирование pip freeze между терминалами.

  2. Агентный хаос. AI-агенты могут устанавливать в неправильный интерпретатор, оставлять частичные изменения и терять контекст окружения при переключении клиента или начале новой сессии.

venv-manager решает (1) с помощью чистого CLI и (2) с помощью общего Model Context Protocol сервера, постоянного реестра, типизированных снимков и различий, обратимых изменений пакетов, временных venv с песочницей на уровне ОС и наблюдателя за файлами, который поддерживает venv в синхронизации с развивающимся кодом.

Что песочница агента не решает

Возможность агента

Общий контроль окружения

Одобряет или блокирует shell-команду

Записывает, какое окружение принадлежит какому проекту

Ограничивает доступ к файловой системе и сети

Сохраняет состояние между Claude, Codex и другими клиентами

Создаёт venv по запросу

Отслеживает метаданные создания и реального последнего использования

Запускает pip, Poetry или uv

Показывает изменения на уровне пакетов между снимками

Останавливает опасное действие

Откатывает повреждённое окружение к известному состоянию

Два уровня дополняют друг друга: разрешения агента контролируют что может произойти сейчас; venv-manager записывает что существует, что изменилось и как восстановить.


Related MCP server: Sympathy-MCP

Установка

Homebrew (macOS, Linux):

brew install jacopobonomi/tap/venv-manager

Однострочный скрипт установки (macOS, Linux):

curl -sSL https://raw.githubusercontent.com/jacopobonomi/venv_manager/main/install.sh | bash

Из исходников:

git clone https://github.com/jacopobonomi/venv_manager && cd venv_manager
make install

Требуется Go 1.24+ для сборки, Python 3.x во время выполнения.


Интеграция с AI

MCP-сервер

Предоставляет операции с venv как нативные инструменты Model Context Protocol. Claude, Codex, Cursor, Zed и другие MCP-клиенты вызывают одни и те же типизированные инструменты и работают с одним и тем же постоянным состоянием окружения, а не угадывают вызовы оболочки независимо.

Подключите его в Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "venv-manager": {
      "command": "venv-manager",
      "args": ["mcp", "--policy", "safe"]
    }
  }
}

Предоставляемые инструменты (JSON-RPC 2.0 через stdio):

Инструмент

Назначение

list_venvs

Имена всех управляемых venv.

create_venv

{name, python_version?} → новый venv, использует uv, если настроен.

remove_venv

{name} → рекурсивное удаление.

describe_venv

{name} → полный снимок: версия Python, пакеты, размер, хэш freeze, команды активации для каждой оболочки.

install_packages

`{name, packages[]

requirements_file}` → pip install с объединённым stdout+stderr.

run_in_venv

{name, command[]} → выполнение в venv с установленным VIRTUAL_ENV и добавленным PATH. Захваченный вывод.

exec_ephemeral

{packages[], python_version?, command[]} → создать-установить-запустить-уничтожить одним вызовом.

snapshot_venv

{name, label?} → захват pip freeze; включает rollback_venv.

list_snapshots

{name} → сначала новые.

rollback_venv

{name, snapshot_id?} → установить состояние снимка, затем удалить пакеты, отсутствующие в нём.

diff_snapshots

{name, from_snapshot_id, to_snapshot_id?} → различия на уровне пакетов; опустите to_snapshot_id для текущего состояния.

scan_imports

{path, venv?} → найденные сторонние импорты; при передаче venv сообщает, какие отсутствуют.

list_registry

Постоянные метаданные проекта, тегов, создания и последнего использования.

set_registry_metadata

{name, project?, tags[]?, confirm?} → обновить метаданные реестра.

doctor

Версии Python на PATH, доступность uv, повреждённые venv.

Сервер по умолчанию использует политику safe. Установка, откат, удаление и произвольное выполнение требуют confirm: true. Используйте --policy read-only для клиентов только для просмотра, --policy full для неограниченной совместимости и повторяйте --allow-tool NAME, чтобы открыть только явный поднабор. Эти политики — защита в глубину: они остаются согласованными, даже когда разные клиенты имеют разные настройки одобрения.

Реализация использует ноль сторонних MCP-зависимостей. JSON-RPC 2.0 с разделителями строк на stdin/stdout.

Временное выполнение (в стиле uvx, с песочницей)

# create → install → run → destroy, all in one call
venv-manager exec --with requests -- python -c "import requests; print(requests.__version__)"

# with an OS sandbox: no network, no writes outside /tmp + the ephemeral venv
venv-manager exec --sandbox --with pandas -- python untrusted.py

--sandbox использует sandbox-exec на macOS и bwrap на Linux. Профиль «запрещено по умолчанию» с явными списками разрешений для пути venv, /tmp и управления процессами. Сеть не разделяется.

Наблюдатель за файлами

venv-manager watch app.py --venv myenv

fsnotify на родительском каталоге (переживает атомарные перезаписи редактора), задержка 500 мс, затем:

  1. AST-подобное регулярное сканирование .py-файлов (пропускает docstring'и, относительные импорты, локальные модули/пакеты и вендорные каталоги, такие как .venv, .git, __pycache__, node_modules)

  2. Фильтрация по набору модулей стандартной библиотеки

  3. Разрешение импорт-имени → псевдонимов pip-пакетов (cv2 → opencv-python, sklearn → scikit-learn, PIL → Pillow, bs4 → beautifulsoup4, yaml → PyYAML, ...)

  4. Сравнение с установленными пакетами

  5. pip install разницы

Venv всегда является надмножеством требований текущего файла. Это цикл, который демонстрирует GIF выше.

Постоянный реестр

Каждое окружение отслеживается в ~/.venvs/.venv-manager/registry.json с временными метками создания и последнего использования, необязательным путём проекта и тегами. Записи атомарны, и реестр самосогласуется с живыми каталогами venv.

venv-manager registry
venv-manager registry set research --project ~/work/paper --tag data,ai
venv-manager registry research

prune использует last_used_at из реестра, а не время модификации каталога, когда метаданные доступны.

JSON-снимок как однократный контекстный праймер

venv-manager describe myenv
{
  "name": "myenv",
  "path": "/Users/me/.venvs/myenv",
  "python_version": "3.12.6",
  "python_path": "/Users/me/.venvs/myenv/bin/python",
  "pip_path": "/Users/me/.venvs/myenv/bin/pip",
  "packages": ["requests==2.34.2", "rich==15.0.0", ...],
  "package_count": 12,
  "size_bytes": 45123456,
  "size_human": "43.03 MB",
  "modified_at": "2026-07-20T15:41:35Z",
  "freeze_hash": "sha256:2c58d830...",
  "activation": {
    "bash": "source '/Users/me/.venvs/myenv/bin/activate'",
    "zsh":  "source '/Users/me/.venvs/myenv/bin/activate'",
    "fish": "source '/Users/me/.venvs/myenv/bin/activate.fish'"
  }
}

Один вызов инструмента — всё, что нужно агенту для рассуждения об окружении. freeze_hash позволяет агенту обнаружить расхождение между двумя вызовами describe за O(1), а не сравнивать списки пакетов.


Команды

Command

Description

create <name> [--python VER]

Создать venv. Использует uv, если в конфиге use_uv: true.

list [--json]

Список venv.

remove <name>

Удалить venv.

rename <old> <new>

Переименовать и перегенерировать скрипты активации через python -m venv --upgrade.

clone <src> <dst>

Новый venv, наполненный pip freeze исходного.

packages <name> [--json]

Установленные пакеты.

install <name> <requirements>

pip install -r.

upgrade [name] [--global]

Обновить устаревшие пакеты (для конкретного venv или всех).

clean [name] [--global]

Очистить кэш pip и каталоги __pycache__.

size [name] [--global] [--json]

Использование диска.

activate <name>

Вывести shell-команду для eval $(...).

deactivate

Вывести deactivate.

run <name> -- <cmd>

Выполнить в venv без активации; наследует stdio.

exec [--with pkgs] [-r req] [--python V] [--sandbox] [--keep] -- <cmd>

Запуск во временном venv.

describe <name>

Полный JSON-снимок (см. выше).

scan <path> [--venv N] [--json]

Извлечь сторонние импорты; проверить относительно venv.

watch <path> --venv N

Автоустановка отсутствующих импортов при изменении файла.

snapshot <name> [-l LABEL]

Захватить состояние pip freeze.

snapshots <name> [--json]

Список снимков (сначала новые).

rollback <name> [snapshot-id]

Сначала установить состояние снимка, затем удалить пакеты, отсутствующие в нём.

snapshot-diff <name> <from> [to]

Сравнить снимки или сравнить один снимок с текущим состоянием.

export <name>

Вывести переносимый манифест (имя + версия python + freeze) в формате JSON.

import <manifest.json>

Воссоздать venv из манифеста.

prune [--days N] [--dry-run] [--yes] [--json]

Сообщить об устаревших venv; требует --yes перед удалением.

registry [name]

Показать постоянные метаданные создания, использования, проекта и тегов.

registry set <name> [--project PATH] [--tag TAGS]

Обновить привязку к проекту и теги.

doctor [--json]

Диагностика версий python, uv, повреждённых venv.

`config show

path

init`

Показать / найти / инициализировать конфиг.

mcp [--policy MODE] [--allow-tool NAME]

MCP-сервер с политикой авторизации «только чтение», безопасной или полной.

tui

TUI-браузер на Bubble Tea.

`completion [bash

zsh

fish

powershell]`

Скрипты автодополнения для shell.

Большинство команд чтения также принимают --json для стабильного, машиночитаемого вывода.


Конфигурация

~/.config/venv-manager/config.json (учитывает $XDG_CONFIG_HOME и $VENV_MANAGER_CONFIG):

{
  "base_dir": "/custom/path/to/venvs",
  "default_python": "3.12",
  "use_uv": true,
  "prune_after_days": 90
}

Инициализация: venv-manager config init.

Бэкенд uv

Если uv находится в PATH и use_uv: true, команда create выполняет uv venv. Обычно в 10–100 раз быстрее, чем python -m venv при холодном кэше.


Разработка

make build            # go build -o bin/venv-manager
make test             # unit tests
make demo             # regenerate scripts/demo/demo.gif via VHS
go test -tags=integration ./internal/manager/...   # integration tests (real pip, real PyPI)

CI запускает go vet, go test -race на Ubuntu + macOS и интеграционные тесты на Ubuntu с Python 3.12.

Архитектура:

cmd/venv-manager/           cobra CLI
internal/manager/           core operations (create, install, snapshot, scan, watch, exec, describe, ...)
internal/config/            XDG-aware JSON config
internal/mcp/               JSON-RPC 2.0 MCP server (stdio)
internal/tui/               Bubble Tea browser
internal/utils/             platform helpers, size formatting

Лицензия

MIT.

Автор

Jacopo Bonomi

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    An MCP server for managing Incus virtual machines through structured tools for command execution, file management, and snapshot operations. It enables AI agents to puppeteer VMs on a masternode by wrapping the Incus CLI.
    9
    -
  • A
    license
    B
    quality
    D
    maintenance
    Production-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.
    15
    33 npm
    3
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    An MCP server that manages Python virtual environments using uv, allowing LLMs to reliably resolve dependencies and update virtual environments.
    6
    7
    -