From 498b7e24c7e2f72af94f47e26008527d97cbdc71 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Thu, 23 Jul 2026 09:55:19 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BA=D1=80=D0=B5=D0=B9=D1=82=20mt-pro?= =?UTF-8?q?tocol=20=E2=80=94=20=D0=B2=D0=B1=D1=83=D0=B4=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BF=D0=B5=D1=86=D0=B8=D1=84=D1=96=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D1=96=D1=8F=20=D0=B4=D0=BB=D1=8F=20Rust-=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D1=96=D0=B7=D0=B0=D1=86=D1=96=D1=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root-level Rust-крейт mt-protocol вшиває docs/ через include_dir і надає mt_protocol::get(path) для доступу до контенту специфікації без ручного копіювання. Споживається nitra/mt-rust як git-залежність. npm-пакет @7n/mt лишається docs-only — Rust-файли в тарбол не входять. Co-Authored-By: Claude Fable 5 --- .github/workflows/lint-rust.yml | 42 +++++++++++++++++++++++ .gitignore | 1 + .n-rules.json | 1 + Cargo.lock | 60 +++++++++++++++++++++++++++++++++ Cargo.toml | 11 ++++++ README.md | 4 +++ src/lib.rs | 46 +++++++++++++++++++++++++ 7 files changed, 165 insertions(+) create mode 100644 .github/workflows/lint-rust.yml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/lib.rs diff --git a/.github/workflows/lint-rust.yml b/.github/workflows/lint-rust.yml new file mode 100644 index 0000000..d4ef4fc --- /dev/null +++ b/.github/workflows/lint-rust.yml @@ -0,0 +1,42 @@ +name: Lint Rust + +on: + push: + branches: + - dev + - main + paths: + - '**/*.rs' + - '**/Cargo.toml' + - '**/Cargo.lock' + + pull_request: + branches: + - dev + - main + +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + with: + persist-credentials: false + + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - uses: Swatinem/rust-cache@v2 + + - name: Rustfmt + run: cargo fmt --all -- --check + + - name: Clippy + run: cargo clippy --all-targets --all-features -- -D warnings diff --git a/.gitignore b/.gitignore index 3fc1def..a92300f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +/target *.secret diff --git a/.n-rules.json b/.n-rules.json index 0649dcb..0fb001b 100644 --- a/.n-rules.json +++ b/.n-rules.json @@ -6,6 +6,7 @@ "ci4", "feedback", "ga", + "rust", "security", "text" ], diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c95bbf1 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,60 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "glob", + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "mt-protocol" +version = "0.1.0" +dependencies = [ + "include_dir", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ea9549a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "mt-protocol" +version = "0.1.0" +edition = "2021" +description = "Специфікація протоколу MT, вбудована як Rust-крейт — docs/ корпус доступний без ручного копіювання" +license = "ISC" +repository = "https://github.com/nitra/mt" +keywords = ["mt", "protocol", "spec", "docs", "agent"] + +[dependencies] +include_dir = { version = "0.7.4", features = ["glob"] } diff --git a/README.md b/README.md index ac0889f..ad94eff 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,7 @@ npm i @7n/mt ## Генерація шарів `docs/layers.json` — конфіг і CRC-маркери (``) для рушія шарової документації (подвійний CRC суть/файл, LLM-генерація верхніх шарів, derived-переклади). Сам рушій живе в [nitra/mt-rust](https://github.com/nitra/mt-rust) і запускається звідти проти цього репозиторію. + +## Крейт `mt-protocol` (Rust) + +Поряд із `docs/` у цьому репозиторії живе невеликий Rust-крейт **`mt-protocol`** ([`Cargo.toml`](Cargo.toml), [`src/lib.rs`](src/lib.rs)): він вшиває каталог `docs/` у бінарник через [`include_dir`](https://docs.rs/include_dir) й дає доступ до вмісту специфікації без ручного копіювання файлів. Споживається як git-залежність у [nitra/mt-rust](https://github.com/nitra/mt-rust) — крейт наразі **не публікується в crates.io**, лише через `git`-dependency. npm-пакет `@7n/mt` лишається суто docs-only — Rust-файли в його публікований архів не входять. diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..4959461 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,46 @@ +//! Специфікація протоколу MT, вбудована в бінарник як Rust-крейт. +//! +//! Каталог `docs/` цього репозиторію (`nitra/mt`) вшивається на етапі +//! компіляції через [`include_dir`], тож споживачі (наприклад, +//! `nitra/mt-rust`) отримують корпус специфікації без ручного копіювання +//! чи мережевого доступу під час білду. + +use include_dir::{include_dir, Dir}; + +/// Вшитий у бінарник каталог `docs/` — корпус специфікації протоколу MT. +pub static DOCS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/docs"); + +/// Повертає вміст файлу специфікації за відносним шляхом (наприклад, +/// `"index.md"` або `"architecture/overview.md"`), якщо він існує у +/// вшитому корпусі `docs/` і є коректним UTF-8. +pub fn get(path: &str) -> Option<&'static str> { + DOCS.get_file(path)?.contents_utf8() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn index_md_is_present_and_non_empty() { + let content = get("index.md").expect("index.md має бути у вшитому docs/ корпусі"); + assert!(!content.is_empty(), "index.md не має бути порожнім"); + } + + #[test] + fn missing_file_returns_none() { + assert!(get("no-such-file.md").is_none()); + } + + #[test] + fn corpus_contains_more_than_a_handful_of_files() { + let count = DOCS + .find("**/*.md") + .expect("glob має бути валідним") + .count(); + assert!( + count > 5, + "очікували більше 5 md-файлів у docs/, знайдено {count}" + ); + } +}