Skip to main content
Glama
jacopobonomi

venv-manager

by jacopobonomi

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-пакетов (cv2opencv-python, sklearnscikit-learn, PILPillow, bs4beautifulsoup4, yamlPyYAML, ...)

  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

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jacopobonomi/venv_manager'

If you have feedback or need assistance with the MCP directory API, please join our Discord server