Valca
ИИ-помощник по безопасности кода — блокирует небезопасный код в момент его создания.
Ранее пакет публиковался под названием
vigilsec. Теперь он называетсяvalca. Командыvalcaиvigilработают, поэтому существующие хуки и скрипты продолжат запускаться без изменений.
Valca перехватывает каждый файл, созданный ИИ-помощником по программированию, и блокирует его, если обнаружены критические уязвимости уровня CRITICAL или HIGH, — ещё до записи файла на диск. Это единственный инструмент, который проверяет код в момент генерации, а не после коммита.
AI writes file → valca scan → exit 2 → Claude Code blocks the write
Проблема
ИИ-помощники по программированию воспроизводят самые распространённые шаблоны из обучающих данных. А самые распространённые шаблоны часто содержат небезопасные настройки по умолчанию.
Самый наглядный пример: все существующие сканеры IaC (Checkov, Trivy, Snyk, Semgrep) не обнаруживают привязку порта в docker-compose, которая открывает вашу базу данных для доступа из интернета:
ports:
- "5432:5432" # ← binds to 0.0.0.0, bypasses UFW, reachable from anywhere
Правильный вариант — "127.0.0.1:5432:5432". Valca обнаруживает эту проблему. Остальные инструменты — нет.
Установка
pip install valca
Настройте хук Claude Code (один раз):
valca init --global # `valca init --global` also works
Готово. Теперь каждый файл, который создаёт Claude Code, проверяется до сохранения. Перезапустите Claude Code, чтобы активировать хук.
Доступ к сети
Основное сканирование Valca полностью выполняется офлайн: у пакета нет зависимостей времени выполнения, а движок никогда не отправляет ваш код, пути к файлам и результаты проверок куда-либо.
Три правила обращаются к сети, поскольку проверить, уязвима ли зависимость или существует ли она вообще, в офлайн-режиме невозможно. При сканировании манифеста (requirements.txt, package.json, lockfiles) эти правила отправляют только названия пакетов и строки версий на следующие адреса:
| Хост | Используется правилом | Передаваемые данные |
|---|---|---|
api.osv.dev | VGL-PKG001 (известная CVE для зафиксированной версии) | название пакета + версия |
pypi.org | VGL-PKG002/003/004 (несуществующий, устаревший или подозрительный пакет) | название пакета |
registry.npmjs.org | VGL-PKG002/003/004 | название пакета |
Исходный код, содержимое файлов, пути к файлам и результаты сканирования никогда не передаются. Если даже список используемых зависимостей представляет для вас чувствительную информацию, отключите эти правила в .valcarc. Тогда Valca будет полностью работать офлайн:
disabled_rules = ["VGL-PKG001", "VGL-PKG002", "VGL-PKG003", "VGL-PKG004"]
Использование
results.sarif
Only report HIGH and above
valca scan ./my-project/ --severity HIGH
Open feedback & waitlist form
valca feedback">
# Scan a single file
valca scan docker-compose.yml
# Scan a directory
valca scan ./my-project/
# JSON output (for CI / dashboards)
valca scan ./my-project/ --format json
# SARIF output (for GitHub Advanced Security)
valca scan ./my-project/ --format sarif > results.sarif
# Only report HIGH and above
valca scan ./my-project/ --severity HIGH
# Open feedback & waitlist form
valca feedback
Просматривайте, что обнаружил сканер за всё время. Обе команды используют локальную историю проверок — данные не покидают ваш компьютер.
# Findings log — what was caught, where, and when
valca log # 20 most recent findings
valca log --severity CRITICAL # only criticals
valca log --project api --since 2026-09-01
valca log --limit 100 --format json # for dashboards
# Aggregate stats — rule frequency, severity mix, precision per rule
valca stats
valca stats --format json
Команда valca stats показывает, как часто срабатывает каждое правило и как часто вы его подавляли. Благодаря этому можно увидеть, какие правила дают низкую точность именно в вашей кодовой базе, вместо того чтобы строить предположения.
Коды завершения:
| Код | Значение |
|---|---|
0 | Уязвимости не обнаружены — запись продолжается |
1 | Обнаружены только замечания (MEDIUM / LOW / INFO) |
2 | Обнаружена уязвимость уровня CRITICAL или HIGH — Claude Code блокирует запись |
Пример работы
Блокировка уязвимого workflow GitHub Actions в момент записи:
В апреле 2026 года исследователи обнаружили, что все три основных ИИ-помощника по программированию (Claude Code, Gemini CLI, Copilot) можно было взломать, чтобы похитить ANTHROPIC_API_KEY и GITHUB_TOKEN с помощью скрытого HTML-комментария в issue на GitHub. CVSS 9.4. Специальный доступ не требовался.
Valca обнаруживает уязвимый workflow (триггер issues: + ИИ-агент + API-ключ в env) до того, как он попадёт в git. Это единственный инструмент, который это делает.
→ Полный разбор: атака, которая крадёт ваши API-ключи через комментарий к issue на GitHub
Правила
116 правил в 27 категориях. Все встроены, используют только стандартную библиотеку и не имеют зависимостей времени выполнения.
Этот каталог формируется на основе реестра правил, поэтому он всегда соответствует правилам, включённым в движок.
Секреты и раскрытие учётных данных (14 правил)
| Правило | Уровень серьёзности | Что обнаруживает |
|---|---|---|
| VGL-I001 | CRITICAL | eval() или exec() — риск внедрения кода |
| VGL-I002 | HIGH | subprocess с shell=True |
| VGL-I003 | HIGH | вызов os.system() |
| VGL-S001 | CRITICAL | жёстко заданный ключ доступа AWS |
| VGL-S002 | CRITICAL | жёстко заданный пароль |
| VGL-S003 | CRITICAL | жёстко заданный API-ключ |
| VGL-S004 | CRITICAL | жёстко заданный bearer-токен |
| VGL-S005 | CRITICAL | жёстко заданный секрет JWT |
| VGL-S006 | CRITICAL | закрытый ключ PEM в исходном коде |
| VGL-S007 | CRITICAL | URL базы данных со встроенными учётными данными |
| VGL-S008 | CRITICAL | секретный ключ Stripe для рабочей среды |
| VGL-S009 | CRITICAL | жёстко заданный токен Slack |
| VGL-S010 | CRITICAL | жёстко заданный API-ключ провайдера (OpenAI / GitHub / GitLab / Google) |
| VGL-S012 | HIGH | небезопасное значение-заглушка для критически важной конфигурации безопасности |
GitHub Actions — поверхность атак на ИИ-агентов (13 правил)
| Правило | Уровень серьёзности | Что обнаруживает |
|---|---|---|
| VGL-GHA001 | CRITICAL | Pwn Request — pull_request_target с ref для checkout, контролируемым злоумышленником |
| VGL-GHA002 | CRITICAL | внедрение скрипта — выражение контекста, контролируемое пользователем, в шаге run: |
| VGL-GHA004 | HIGH | секрет напрямую подставляется в шаг run: и становится виден в таблице процессов |
| VGL-GHA005 | MEDIUM | в workflow отсутствует явный блок permissions (неявная область разрешений GITHUB_TOKEN) |
| VGL-GHA006 | HIGH | использование кэша в workflow pull_request (вектор атаки с отравлением кэша) |
| VGL-GHA007 | HIGH | self-hosted runner с триггером pull_request (риск сохранения доступа к runner) |
| VGL-GHA008 | HIGH | триггер workflow_run без проверки ref и репозитория |
| VGL-GHA009 | CRITICAL | ИИ-агент подключён к триггеру с недоверенными данными (issues/pull_request_target), API-ключ передаётся через env |
| VGL-GHA010 | HIGH | ИИ-агент запускается по pull_request_target без проверки, что запрос пришёл из fork |
| VGL-GHA011 | CRITICAL | недоверенные данные события GitHub подставляются в prompt ИИ-агента |
| VGL-GHA012 | HIGH | ИИ-агент запускается по триггеру с недоверенными данными без ограничения --allowedTools |
| VGL-GHA013 | MEDIUM | ИИ-агент запускается по триггеру с недоверенными данными без ограничения --max-turns |
| VGL-GHA014 | HIGH | разрешение contents: write предоставлено ИИ-агенту, работающему по триггеру с недоверенными данными |
ИИ-агенты — внедрение prompt (9 правил)
| Правило | Уровень серьёзности | Что обнаруживает |
|---|---|---|
| VGL-PI001 | CRITICAL | пользовательский ввод подставляется в системный prompt LLM |
| VGL-PI002 | HIGH | исходное тело HTTP-запроса используется как содержимое сообщения LLM |
| VGL-PI003 | HIGH | для формирования prompt используются строки с пользовательскими данными |
| VGL-PI004 | MEDIUM | результат работы инструмента добавляется в диалог без очистки |
| VGL-PI005 | CRITICAL | данные HTTP-запроса попадают в prompt LLM без очистки |
| VGL-PI006 | CRITICAL | ответ LLM передаётся в subprocess, exec или eval |
| VGL-PI007 | HIGH | данные webhook напрямую передаются ИИ-агенту |
| VGL-PI008 | HIGH | содержимое базы данных подставляется в prompt — внедрение второго порядка |
| VGL-PI009 | HIGH | пользовательский ввод записывается в векторное хранилище — отравление памяти |
Усиление защиты Dockerfile (8 правил)
| Правило | Уровень серьёзности | Что обнаруживает |
|---|---|---|
| VGL-DF001 | HIGH | Dockerfile запускается от root — директива USER отсутствует |
| VGL-DF002 | MEDIUM | в Dockerfile используется незакреплённый базовый образ :latest |
| VGL-DF003 | HIGH | секрет включён в слой ENV или ARG Dockerfile |
| VGL-DF004 | HIGH | curl |
| VGL-DF005 | HIGH | в команде загрузки Dockerfile RUN отключена проверка TLS |
| VGL-DF006 | MEDIUM | для локальных файлов используется ADD — следует применять COPY |
| VGL-DF007 | HIGH | используется COPY . без .dockerignore — возможна утечка .git, .env и учётных данных |
| VGL-DF008 | MEDIUM | в Dockerfile установлены права на запись для всех пользователей (chmod 777) |
Docker Compose (7 правил)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-D001 | CRITICAL | Публичная привязка порта Docker: обходит UFW и открывает сервис для доступа из интернета |
| VGL-D002 | HIGH | В блоке environment файла docker-compose указан секрет в открытом виде |
| VGL-D003 | CRITICAL | Контейнер Docker запущен в привилегированном режиме |
| VGL-D004 | HIGH | Контейнер Docker использует сетевой режим хоста |
| VGL-D005 | CRITICAL | Сокет Docker подключён к контейнеру — это позволяет полностью выйти за его пределы |
| VGL-D006 | HIGH | К контейнеру подключён путь хоста, содержащий конфиденциальные данные |
| VGL-D007 | HIGH | К контейнеру подключена директория с учётными данными AWS (~/.aws), что открывает доступ ко всем профилям |
Terraform (7 правил)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-TF001 | CRITICAL | Секретное значение жёстко задано в Terraform |
| VGL-TF002 | HIGH | Для ресурса Terraform включён публичный доступ |
| VGL-TF003 | HIGH | Шифрование явно отключено в Terraform |
| VGL-TF004 | CRITICAL | На инстансе EC2 включён IMDSv1 — уязвимость позволяет похищать метаданные через SSRF |
| VGL-TF005 | HIGH | Файл состояния S3 backend для Terraform хранится без шифрования |
| VGL-TF006 | MEDIUM | Для управляемого ресурса отключена защита от удаления |
| VGL-TF007 | MEDIUM | Для управляемого через Terraform ресурса отключено журналирование аудита |
Десериализация и обход путей (5 правил)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-DESER001 | CRITICAL | Небезопасная десериализация: pickle.loads / pickle.load |
| VGL-DESER002 | HIGH | Небезопасная десериализация YAML: yaml.load() без SafeLoader |
| VGL-DESER003 | HIGH | Небезопасная десериализация: marshal.loads получает недоверенные данные |
| VGL-PATH001 | HIGH | Обход путей: пользовательский ввод передаётся в file open или path join без проверки |
| VGL-SSTI001 | CRITICAL | Внедрение шаблона на стороне сервера: пользовательский ввод обрабатывается как шаблон Jinja2 |
Безопасность MCP Server (5 правил)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-MCP001 | CRITICAL | В описание инструмента MCP встроена prompt injection |
| VGL-MCP002 | HIGH | Описание инструмента MCP формируется на основе данных, контролируемых пользователем |
| VGL-MCP003 | HIGH | Обработчик инструмента MCP выполняет команды оболочки без изолированной среды |
| VGL-MCP004 | HIGH | В конфигурации MCP server используется пакет без фиксированной версии или конечная точка с обычным HTTP |
| VGL-MCP005 | HIGH | Инструмент MCP для получения данных принимает URL, контролируемый агентом, без списка разрешённых адресов |
Безопасность веб-приложений (5 правил)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-CORS001 | HIGH | Подстановочный символ в CORS: allow_origins=['*'] |
| VGL-SQL001 | CRITICAL | SQL-инъекция: запрос формируется с помощью f-строки или конкатенации строк |
| VGL-SQL002 | CRITICAL | SQL-инъекция: в ORM используется raw query с f-строкой |
| VGL-SSL001 | HIGH | Проверка SSL отключена |
| VGL-SSRF001 | CRITICAL | SSRF: HTTP-запрос выполняется по URL, контролируемому пользователем |
AI Agent — чрезмерная автономность (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-A001 | CRITICAL | Вывод LLM передаётся на выполнение в оболочку |
| VGL-A002 | HIGH | Жёстко заданное автоматическое подтверждение отключает участие человека в процессе |
| VGL-A003 | HIGH | Цикл агента не ограничен и не имеет лимита итераций |
| VGL-A004 | HIGH | Ответ LLM записывается на диск без проверки |
Аутентификация и сессии (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-AUTH001 | CRITICAL | В JWT указан algorithm=none — проверка подписи обходится |
| VGL-AUTH002 | CRITICAL | В JWT отключён verify_signature — принимаются любые токены |
| VGL-AUTH003 | HIGH | Слабый или жёстко заданный секретный ключ веб-фреймворка |
| VGL-AUTH004 | HIGH | В коде фреймворка включён режим отладки |
Целостность зависимостей (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-PKG001 | CRITICAL | Аудит пакетов: CVE, галлюцинации, устаревшие версии и риски цепочки поставок |
| VGL-PKG002 | CRITICAL | Пакет не найден в реестре: возможно, это галлюцинация или цель slopsquatting |
| VGL-PKG003 | HIGH | Версия пакета значительно отстаёт от последней — возможны устаревшие данные обучения AI |
| VGL-PKG004 | HIGH | Пакет недавно добавлен в реестр и имеет мало выпусков — риск для цепочки поставок |
Kubernetes (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-K001 | CRITICAL | Привилегированный контейнер или доступ к пространству имён хоста |
| VGL-K002 | CRITICAL | В securityContext Kubernetes включён allowPrivilegeEscalation |
| VGL-K003 | HIGH | В securityContext Kubernetes добавлены опасные возможности Linux |
| VGL-K004 | HIGH | В манифесте Kubernetes указан том hostPath с конфиденциальными данными |
Журналирование и раскрытие данных (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-LOG001 | HIGH | Конфиденциальные данные записываются в журналы (CWE-532) |
| VGL-LOG002 | HIGH | Подробности ошибки раскрываются в теле HTTP-ответа (CWE-209) |
| VGL-LOG003 | MEDIUM | Исключение незаметно игнорируется в контексте аутентификации или безопасности |
| VGL-LOG004 | MEDIUM | Риск CRLF-инъекции: пользовательский ввод записывается в журнал без очистки символов перевода строки |
Swift / iOS (4 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-SW001 | CRITICAL | Секрет жёстко задан в строковом литерале Swift |
| VGL-SW002 | HIGH | В сетевом коде Swift используется URL с обычным HTTP |
| VGL-SW003 | HIGH | Конфиденциальное значение записывается в UserDefaults без шифрования |
| VGL-SW004 | CRITICAL | В делегате URLSession обходится проверка сертификата SSL |
Сканеры CVE зависимостей (3 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-DEP001 | HIGH | Уязвимые пакеты Python (pip-audit) |
| VGL-DEP002 | HIGH | Критическая уязвимость npm (npm audit) |
| VGL-DEP003 | HIGH | Уязвимый пакет в lockfile (osv-scanner) |
GitHub Actions — рекомендации по настройке workflow (3 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-GH001 | HIGH | Секрет GitHub Actions выводится в шаге run и попадает в журнал |
| VGL-GH002 | HIGH | Workflow GitHub Actions запрашивает избыточные разрешения |
| VGL-GH003 | HIGH | В GitHub Actions используется изменяемая ссылка на действие (тег или ветка) |
AI Agent — файлы конфигурации (2 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-AGENT001 | CRITICAL | В файле конфигурации AI Agent содержатся инструкции по выполнению команд оболочки или извлечению данных |
| VGL-AGENT002 | HIGH | Учётные данные раскрываются через обработчик исключений в коде агента |
JavaScript / TypeScript (2 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-JS001 | HIGH | Для секрета из process.env задана жёстко прописанная строка в качестве резервного значения |
| VGL-JS004 | HIGH | eval() или new Function() вызывается с динамическим аргументом (CWE-95) |
Безопасность на уровне строк (2 правила)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-RLS001 | CRITICAL | Row-Level Security в PostgreSQL явно отключена |
| VGL-RLS002 | HIGH | В запросе multi-tenant ORM отсутствует фильтр по пользователю или арендатору |
Межсайтовый скриптинг (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-XSS001 | HIGH | Межсайтовый скриптинг: небезопасная вставка HTML (CWE-79) |
Криптография (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-RAND001 | HIGH | Для значения, критичного с точки зрения безопасности, используется слабый генератор случайных чисел (CWE-330) |
Политики IAM (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-IAM001 | CRITICAL | В политике IAM в поле Action или Resource используется подстановочный символ |
Python (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-PY001 | HIGH | Обходная проверка отладки не защищена проверкой переменной окружения — аутентификация или проверка безопасности отключается при определённых условиях |
Скрипты оболочки (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-S011 | HIGH | Секрет передаётся в subprocess/SSH как аргумент командной строки и может утечь через ps aux |
Глубокое сканирование IaC с помощью Trivy (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-T001 | HIGH | Глубокое сканирование IaC с помощью Trivy: неправильные настройки в Dockerfile / Terraform |
nginx (1 правило)
| Правило | Уровень критичности | Что обнаруживает |
|---|---|---|
| VGL-N001 | HIGH | В конфигурации nginx отсутствуют заголовки безопасности или используются слабые настройки TLS |
Конфигурация
Поместите файл .valcarc в корневую директорию проекта или в любую из родительских директорий:
# .valcarc
disabled_rules = ["VGL-T001"] # skip trivy scan for this project
min_severity = "HIGH" # only report HIGH and above
exclude_paths = ["vendor", "legacy"]
telemetry = false # opt out of anonymous local telemetry
Valca поднимается по дереву директорий в поисках ближайшего файла .valcarc (также поддерживается прежнее имя .vigilrc). Конфигурация дочерней директории всегда имеет приоритет над родительской. В монорепозиториях можно задавать переопределения для отдельных проектов, сохраняя общие настройки по умолчанию для рабочего пространства.
Подавление предупреждения в строке — используйте для конкретной строки, которую вы проверили и решили принять:
auto_approve = True # vigil: ignore
Принцип тот же, что у # noqa (flake8) и # nosec (bandit).
Отказ от телеметрии
Valca собирает анонимные данные об использовании только локально: идентификатор правила, уровень серьёзности и расширение файла. Пути к файлам, код и идентифицирующие данные не собираются. Данные хранятся в ~/.valca/events.jsonl и никуда не отправляются. История из прежнего расположения ~/.vigil/ переносится автоматически.
Чтобы отключить телеметрию навсегда:
export VALCA_NO_TELEMETRY=1 # VIGIL_NO_TELEMETRY still works
Или добавьте в .valcarc:
telemetry = false
Добавление правила
# src/valca/rules/my_category.py
from pathlib import Path
from .base import Finding, Rule, Severity
class MyRule(Rule):
id = "VGL-X001"
name = "Descriptive rule name"
severity = Severity.HIGH
def applies_to(self, path: Path) -> bool:
return path.suffix == ".yml"
def check(self, path: Path) -> list[Finding]:
findings = []
for i, line in enumerate(path.read_text().splitlines(), 1):
if "bad_pattern" in line:
findings.append(Finding(
rule_id=self.id,
severity=self.severity,
message="Found bad pattern",
file_path=path,
line=i,
snippet=line.strip(),
fix="Do this instead.",
))
return findings
Добавьте правило в DEFAULT_RULES в src/valca/rules/__init__.py и напишите тесты. Готово.
GitHub Actions
Используйте action — PranLabs/valca-action:
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v7
- uses: PranLabs/valca-action@v1
with:
severity: HIGH
version: "0.6.0" # pin for reproducible CI
- uses: github/codeql-action/upload-sarif@v4
if: always()
with:
sarif_file: valca-results.sarif
category: valca
Можно также запускать Valca напрямую, без action:
- run: pip install valca --quiet
- run: valca scan . --no-color
- run: valca scan . --format sarif > valca-results.sarif
Результаты проверки появятся в виде встроенных комментариев в изменённых строках PR, а также на вкладке Security репозитория.
Сервер MCP
Hook блокирует действия агента, а сервер MCP позволяет агенту запрашивать информацию.
pip install "valca[mcp]"
valca-mcp
Зарегистрируйте сервер в любом MCP-клиенте. Например, для Claude Code используйте claude mcp add valca -- valca-mcp.
Сервер предоставляет два инструмента, оба доступны только для чтения:
| Инструмент | Что возвращает |
|---|---|
scan(path) | Найденные проблемы в файле или каталоге: правило, уровень серьёзности, описание, файл, строка и предлагаемое исправление |
list_rules() | Полный перечень правил: идентификатор каждого правила, уровень серьёзности и тип выявляемых проблем |
Инструментов для редактирования, исправления или записи данных нет. Сканер, способный изменять код, создаёт новую поверхность атаки — именно от таких случаев защищают правила VGL-MCP003 и VGL-MCP005.
В сервере предусмотрены три ограничения, которые нельзя изменить:
-
Сканирование не выходит за пределы корневого каталога. Корневым считается каталог, из которого запущен
valca-mcp, или значениеVALCA_MCP_ROOT, если оно задано. Агент сам выбирает аргумент дляscan, поэтому без такого ограничения он мог бы перейти в~/.sshи исследовать файловую систему, доступ к которой ему не предоставляли. -
Пути возвращаются относительно корневого каталога. Абсолютный путь может раскрыть имя пользователя и структуру каталогов.
-
Совпавшие строки исходного кода не возвращаются. Для правил поиска секретов такая строка и есть секрет.
Телеметрия при работе через сервер MCP отключена независимо от настроек. При этом параметры .valcarc продолжают применяться: disabled_rules, exclude_paths и min_severity.
mcp — необязательный дополнительный компонент, поэтому обычная установка Valca по-прежнему не требует никаких зависимостей во время выполнения.
Hook остаётся механизмом принудительного контроля: он запускается при каждой записи независимо от желания модели. MCP включается агентом по его выбору, а проверка, от которой агент может отказаться, не является принудительным контролем.
Разработка
git clone https://github.com/PranLabs/valca.git
cd vigil
python3 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest tests/ -v
Лицензия
Лицензия Business Source License 1.1 — бесплатна для некоммерческого использования. Для коммерческого использования требуется лицензионное соглашение. 26 июня 2030 года лицензия автоматически сменится на MIT.
Обратная связь
Нашли ложное срабатывание? Хотите предложить новое правило? Разрабатываете с AI-агентами и сталкиваетесь с ситуациями, которые Valca должна выявлять?
Создайте задачу → github.com/PranLabs/valca/issues
Или выполните команду valca feedback.