# Navi Code CLI

Терминальный клиент для общения с Navi через WebSocket.

## Установка

CLI устанавливается вместе с пакетом `navi`:

```bash
pip install -e .
```

После установки доступна команда `navi-code`. Внутри репозитория можно запускать без установки:

```bash
python -m clients.terminal
```

## Использование

### Интерактивный режим

```bash
navi-code
```

Клиент подключается к `http://localhost:8000`, создаёт или восстанавливает сессию и запускает чат.

### One-shot режим

```bash
navi-code "объясни, что делает этот файл"
navi-code --new-session "напиши pytest-тест для функции foo"
```

### Параметры

| Флаг | Описание |
|---|---|
| `--base-url URL` | Базовый URL сервера Navi. |
| `--ws-url URL` | URL WebSocket (по умолчанию производный от `--base-url`). |
| `--profile-id ID` | Профиль для новой сессии. |
| `--new-session` | Создать новую сессию, даже если сохранена старая. |
| `--show-thinking` | Показывать блоки рассуждений модели. |
| `--no-events` | Скрывать события `tool_started` / `tool_call`. |
| `--version` | Версия клиента. |

## Команды в интерактивном режиме

| Команда | Описание |
|---|---|
| `/help` | Список команд. |
| `/new` | Создать новую сессию. |
| `/sessions` | Список сессий на сервере. |
| `/switch <id>` | Переключиться на другую сессию (можно по префиксу id). |
| `/profile` | Показать текущий профиль и id сессии. |
| `/clear` | Очистить локально сохранённый `session_id`. |
| `/quit` | Выйти. |

## Состояние

Клиент сохраняет `session_id` в `~/.navi_code/state.json`, чтобы восстановить диалог при следующем запуске. Удалите файл или используйте `/clear`, чтобы начать с чистого листа.

## Рендеринг событий

- `stream_delta` — печатается inline, как в обычном чате.
- `tool_started` / `tool_call` — показываются имена инструментов и краткий результат (если включено `--show-events`).
- `thinking_delta` / `thinking_end` — показываются только с `--show-thinking`.
- `error` — красным цветом.

## Пример сессии

```bash
$ navi-code
Created session a1b2c3d4 (profile navi_code)
Navi Code interactive mode. Type /quit to exit, /help for commands.
You: напиши скрипт, который считает строки в текущей директории
[tool: terminal]
{'cmd': 'find . -type f | wc -l'}
[tool result: terminal success=True]
42

Я насчитал 42 файла в текущей директории и её поддиректориях.
You: /quit
```

## Разработка

Код CLI находится в `clients/terminal/`:

- `cli.py` — точка входа и интерактивный цикл.
- `ws_client.py` — WebSocket-клиент.
- `api.py` — REST-запросы к серверу.
- `render.py` — рендеринг событий в терминал.
- `state.py` — сохранение `session_id` в `~/.navi_code/state.json`.
- `config.py` — настройки из переменных окружения `NAVI_CODE_*`.

Тесты: `tests/clients/test_terminal_client.py` и `tests/clients/test_terminal_ws.py`.
