---
name: vakhunter-cli
description: Терминальный read-only доступ к движку VakHunter (@VakHunter_bot, агрегатор вакансий на mac mini) через единый CLI `cli.py`, минуя Telegram и БЕЗ ad-hoc `python -c` по SSH. Брать когда нужно быстро проверить боевую механику: живой вызов одного парсера (`parser hh python Москва`), прогон всех парсеров (`smoke`), снапшот здоровья (`health`), AI-функцию через реальную LLM-цепочку (`ai parse/query/score/cover/career`), реальный путь фильтра+релевантности для профиля на свежих вакансиях (`feed официант --employment part_time --why`), single-check релевантности+оси занятости одной вакансии (`match официант "Python разработчик" hh.ru`), частые SQL-пресеты (`db sources-7d/employment-dist/users/subs`). Триггеры: «проверь парсер hh / почему 0 вакансий», «что видит официант в ленте», «матчится ли эта вакансия профилю», «прогони AI-функцию из терминала», «распределение источников/занятости», «почему юзеру прилетает не то». Это CLI-скилл по методу «CLI вместо MCP» (как avtero-tecdoc, delor-sport-cli, investpilot-cli) — обёртка над существующим кодом (parsers/*, bot/ai_assistant, bot/vacancy_filters, scripts/parsers_smoke), НИЧЕГО не дублирует и НЕ пишет в прод. НЕ для полного e2e-прогона бота (→ vakhunter-e2e), не для правки логики (это правки в самом репо), не для других ботов.
user-invocable: true
allowed-tools:
  - Bash
  - Read
---

# /vakhunter-cli — read-only диагностика VakHunter из терминала

> **ТОЛЬКО ДЛЯ ВЛАДЕЛЬЦА/НАС.** Админ-инструмент, запускается вручную по SSH на
> mini. НЕ импортировать в bot/*/web/*, НЕ регистрировать командой бота, НЕ
> выставлять конечному пользователю VakHunter. «user-invocable: true» здесь =
> оператор/владелец может вызвать `/vakhunter-cli`, а НЕ юзер бота.

Убивает ad-hoc `python -c` по SSH: стабильный протестированный путь, 0 токенов на
регенерацию скрипта, отказоустойчиво. Обёртка над боевым кодом — что показывает
CLI, то видит и бот.

**Где:** `~/Services/VakHunter/cli.py` на mini. **Запуск:** `./venv/bin/python cli.py <cmd>`.
**SSH:** `ssh -i ~/.ssh/id_ed25519 cebers_mini@Cebers-mini.local`

## Команды

| Команда | Что делает | Пример |
|---|---|---|
| `parser <имя> <запрос> [город]` | живой `search()` одного парсера | `parser hh python Москва --show 3` |
| `smoke` | прогон всех 20 парсеров (parsers_smoke.py) | `smoke` |
| `health` | launchd/scheduler-тик/источники 7д/sent 24h | `health` |
| `ai <fn> <args...>` | AI-функция через реальную LLM-цепочку | `ai parse "Повар, 5 лет, СПб, подработка"` |
| `feed <спец> [--skills --city --employment --why]` | реальный `filter_vacancies`+релевантность на свежих вакансиях | `feed официант --employment part_time --why` |
| `match <спец> "<заголовок>" [source] [--skills]` | single-check: домены/термы/релевантность/ось занятости | `match официант "Python разработчик" hh.ru` |
| `db <пресет>` | SQL read-only: `sources-7d` `employment-dist` `users` `subs` `sent-24h` | `db employment-dist` |

`ai` fn: `parse` (текст→профиль), `query` (спец+навыки+город→строка поиска),
`score` (спец, заголовок, компания, описание→score+reason), `cover` (спец,
заголовок, компания→письмо), `career` (спец, вопрос→ответ).

## Готовый однострочник

```bash
ssh -i ~/.ssh/id_ed25519 cebers_mini@Cebers-mini.local \
  "cd ~/Services/VakHunter && ./venv/bin/python cli.py <cmd> <args>"
```

## Как читать вывод

- **`match` relevance=false** для чужого домена (официант×IT) = защита работает.
  title_hits показывает, какие термы профиля зацепились за заголовок.
- **`feed --why`** печатает и прошедшие (✓), и отвергнутые (✗ с rel=/emp=) —
  быстро видно ложные срабатывания. Реальный кейс: `feed официант part_time`
  вскрыл фриланс-гиги «создание сайта»/«дизайн меню», прошедшие по фриланс-оси —
  вектор релевантности мимо job-board фазза (см. [[vakhunter_hh_lux_format]] сосед).
- **`detected_employment`** учитывает source-prior: джоб-борд без явной оси =
  permanent (Decisions D20). Поэтому gorodrabot-вакансия без метки не пройдёт
  подписчику на part_time — это by-design, не баг.
- **`parser hh` = 0** → НЕ сразу IP-бан: см. skill vakhunter-e2e / Decisions D21
  (HH-Lux формат). `db sources-7d` покажет, доходит ли источник до БД.

## Границы

Только чтение. Мутации (выдать тариф/бан/промокод, триггер тика) СОЗНАТЕЛЬНО не
включены (scope-решение владельца 2026-07-14) — для них правь через админ-бота
или прямой SQL с бэкапом. Не путать с `vakhunter-e2e` (тот гоняет живой Telegram
через Playwright — полный e2e; этот — быстрые точечные проверки движка).
