Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

underline-node

Нода протокола 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 говорит об этом прямо.

Что пока отвечает кодом 3 — и какое решение это определяет

Вступление в пространство — два шага (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

About

Терминальный клиент протокола Underline на Rust — каркас команд первого вертикального среза

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages