Нода протокола Underline: ядро
underline-core и терминальный клиент underline. По DEC-0003 это первый
исполняемый клиент; по DEC-0022 здесь живёт единственное ядро, которое встраивают
и CLI, и desktop-приложение underline-chat.
До 2026-09-14 репозиторий назывался underline-cli; GitHub сохраняет редирект.
Это каркас, а не работающий клиент. Командная поверхность первого среза существует целиком, локальное состояние ноды создаётся по-настоящему, а протокольный слой — конверт события, MLS-группы, транспорт — ещё не реализован. Команды, которым он нужен, завершаются кодом
3и называют принятое решение реестра, которое определяет недостающую работу. Успеха они не имитируют.
| Путь | Роль |
|---|---|
crates/underline-core |
ядро: константы конверта события (DEC-0019), параметры личности (DEC-0021), локальное состояние ноды |
crates/underline-cli |
бинарь underline: headless-нода и инструмент разработчика |
Один каталог состояния на машину (DEC-0022): CLI и Chat встраивают одно ядро и открывают одно состояние. Эксклюзивная блокировка каталога — следующая задача.
cargo build --workspace
cargo run -p underline-cli -- --help| Команда | Поведение |
|---|---|
underline init [--name NAME] [--force] |
создаёт каталог состояния с правами 0700 и запись node.toml с правами 0600; повторный запуск без --force отказывает и не трогает существующую запись |
underline status |
печатает каталог состояния, запись ноды и решения, определяющие недостающее; секретов не выводит |
Идентичность не создаётся: её формат принят решением DEC-0021 (seed 32 байта
→ Ed25519, учётка leaf'а с ключом личности), реализация — BL-0001. Сценарий
SCN-001 пока не выполнен, и init говорит об этом прямо.
Вступление в пространство — два шага (DEC-0024): вступающий отдаёт KeyPackage, admin возвращает Welcome.
| Команда | Сценарий | Определяет |
|---|---|---|
space create NAME |
SCN-002 | DEC-0020 — создатель становится admin и единственным коммиттером |
space list |
SCN-002 | DEC-0019 — конверт события |
invite request --out FILE |
SCN-002 | DEC-0024 — шаг 1, экспорт KeyPackage |
invite export --space S --for FILE --out FILE |
SCN-002 | DEC-0024 — шаг 2, Welcome по KeyPackage |
invite accept FILE |
SCN-003 | DEC-0024 — шаг 3, вступление |
send, read |
SCN-003 | DEC-0019 |
sync, peer list |
SCN-004, SCN-005 | DEC-0018 — loopback, локальная сеть, явные адреса |
| Код | Значение |
|---|---|
| 0 | команда выполнила ровно то, что описала |
| 1 | ошибка выполнения: ввод-вывод, повреждённое состояние, отказ ОС |
| 2 | ошибка употребления команды (выдаёт clap) |
| 3 | команде нужен протокольный слой, которого в этом срезе ещё нет |
В stdout попадает только результат. Сообщение о невозможности выполнить
команду уходит в stderr; пустой stdout однозначно означает «результата нет».
В режиме --json ошибка кода 3 несёт поля command, scenario, specified_by,
missing. Инвариант сторожат тесты unimplemented_commands_never_write_to_stdout,
unimplemented_commands_never_claim_success и
unimplemented_commands_cite_only_accepted_decisions.
Порядок определения: --state-dir, затем UNDERLINE_STATE_DIR, затем каталог
данных пользователя по правилам крейта directories. На macOS это
~/Library/Application Support/me.Underline.underline — измерено командой
underline status --json; на Linux крейт даёт $XDG_DATA_HOME/underline.
Точный путь всегда печатает underline status.
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspaceТе же команды выполняет CI на Linux, macOS и Windows —
.github/workflows/ci.yml. Clippy настроен на
clippy::all и clippy::pedantic уровня deny.
Архитектура · сценарии · решения · модель угроз.
MIT © ssheleg