---
name: investpilot-cli
description: Терминальный доступ к сервису КодИнвест (investpilot, @InvestCodoCeh_bot — owner-only советник по Мосбирже на mini) через единый CLI `investpilot`, минуя Telegram. Брать когда владелец просит «спроси у КодИнвеста / посоветуй во что вложиться», «прогони анализ SBER/GAZP», «покажи песочницу / портфель бота», «что в базе знаний / добавь источник KB», «какие уроки накопил», «покажи вселенную», «ручной скан рынка из терминала» — то есть выполнить любую боевую функцию бота из консоли для быстрой проверки или ответа. НЕ для e2e-смоука бота (→ investpilot-e2e) и НЕ для калибровки/бэктеста стратегии с гейтами (→ investpilot-calibrate, хотя `investpilot backtest` тут есть как быстрый PF-гейт). Не для других ботов.
---

# investpilot-cli

Единый терминальный вход в КодИнвест — тонкая обёртка (`src/investpilot/cli.py`)
поверх боевого `build_app()`: те же методы, что у бота, без Telegram. Быстрая
проверка (Правило 7) и способ ответить владельцу, не открывая бота.

Запуск С МАКБУКА (раннер сам идёт на mini и ставит боевой env):

```
bash tools/ip.sh advise "во что вложиться на месяц при ставке 21%"
bash tools/ip.sh analyze SBER GAZP        # --raw = только досье, без LLM
bash tools/ip.sh portfolio                # песочница mark-to-market
bash tools/ip.sh portfolio 150000         # превью портфеля под сумму
bash tools/ip.sh universe                 # вселенная и сегменты
bash tools/ip.sh lessons SBER             # уроки (по умолч. __GLOBAL__)
bash tools/ip.sh kb status|list           # база знаний
bash tools/ip.sh kb add youtube @канал    # + kb run — инжест+дистилляция
bash tools/ip.sh scan                     # ТЯЖЁЛЫЙ: 460+ тикеров × LLM, минуты
bash tools/ip.sh backtest                 # быстрый PF-гейт (=investpilot-calibrate backtest)
```

Прямо на mini доступен короткий вход `investpilot <cmd>` (`pip install -e .`),
но ему всё равно нужны env-переменные — раннер `tools/ip.sh` их и подставляет.

## Что под капотом (не дублирует логику)

`cli.py` зовёт ровно те же функции, что и хендлеры бота:
- `analyze` → `app.analyze` (analyzer → досье → LLM-вердикт; при плане NONE
  ядро не зовёт LLM — это норма, а не сбой).
- `advise` → `advisor.answer_question` (макро + KB + уроки → честный ответ с
  дисклеймером, `_strip_markdown`).
- `portfolio` → `PaperBroker.get_sandbox_portfolio` (mark-to-market) или
  `build_portfolio` при указанной сумме.
- `scan` → `Scheduler._scan` с заглушкой бота (текст перехватывается, HTML
  снимается) — без отправки в Telegram.
- `lessons`/`kb` → `db.lessons_for` / `kb_store`.
- `backtest` → канонический `scripts/backtest_detail.py`.

## Грабли (проверено вживую 2026-07-14)

- **Песочница считает ОФЗ в рублях верно** (SU26242 ≈ 866.84 ₽/шт, портфель
  ~500k ≈ flat) — фейкового «−90% на облигации» из старого ad-hoc скрипта нет.
- `scan` реально сканирует 460+ инструментов (вкл. сотни облигаций) × LLM —
  это минуты и расход; для быстрой проверки бери `analyze`/`advise`.
- Правил cli.py — синкни на mini (`rsync ... src/investpilot/cli.py` или
  `investpilot-e2e --sync`), иначе там старая версия. Менял pyproject/entry —
  `pip install -e . --force-reinstall --no-deps`.
- `timeout` на macOS mini нет (zsh) — не заворачивать команды в `timeout`.

Полные доки: Obsidian `Projects/investpilot/`. Связанные скиллы:
[[investpilot-e2e]] (смоук бота), [[investpilot-calibrate]] (калибровка стратегии).
