Co to znamená
Spustitelný soubor v Rustu nekompiluje nic o druzích ani klíčích. Při každém startu najde sdílený adresář distribuce nástroje a přečte kinds.yaml (pro každý druh: formát, pravidlo front-matteru, identitu, pole titulku a popisu, pole verze a jeho podporované hodnoty, schéma, které musí splnit) a schemas/<name>.schema.json, jedno JSON Schema na kontrakt, validované validátorem JSON Schema. Repozitář přidává druhy pod .ai/repo/knowledge/kinds.yaml a schémata pod .ai/repo/knowledge/schemas/, deklaruje pro ně třídu v sources.yaml a objekty jsou poskytovány; druh nebo schéma, které distribuce už deklaruje, nelze předefinovat.
Princip
share.rs najde adresář (--share, MAJORDOMUS_SHARE, share/ repozitáře, instalace spustitelného souboru); metadata/mod.rs parsuje soubory druhů v pořadí, odmítne druh deklarovaný dvakrát se jmenováním obou souborů, zkompiluje každé schéma a index.rs validuje metadata každého souboru proti schématu jeho druhu dřív, než se stane objektem: klíč, který schéma nepovoluje, je unknown_key, jakékoli jiné porušené omezení je schema_violation. Seznamy povolených shellového nástroje pod share/allow/ se generují ze stejných schémat.
Jak to vidět
mkdir -p .ai/repo/knowledge/schemas .ai/repo/notes
printf 'schema: majordomus-kinds/v1\nkinds:\n note:\n format: markdown\n front_matter: required\n schema: note\n identity: [id]\n title: title\n' > .ai/repo/knowledge/kinds.yaml
printf '{ "type": "object", "additionalProperties": false, "required": ["id", "title"], "properties": { "id": { "type": "string" }, "title": { "type": "string" } } }\n' > .ai/repo/knowledge/schemas/note.schema.json
# add to sources.yaml: - id: note / kind: note / discovery: vcs / pathspec: ':(glob).ai/repo/notes/*.md' / required: false
printf -- '---\nid: first\ntitle: The first note\n---\n' > .ai/repo/notes/first.md
git add -A
apps/majordomus-cli/target/debug/majordomus capabilities describe note.firstCo nepokrývá
Druh, který potřebuje formát, jejž čtečka nemá (něco jiného než Markdown s front matter, YAML, kolekce YAML nebo prostý text), nebo pravidlo identity jiné než pojmenovaná pole či cesta, je změna v index.rs; data popisují objekty, nedefinují, jak se formát čte. Shellový nástroj čte své seznamy povolených hodnot, ne schémata, takže druh definovaný repozitářem vidí jen spustitelný soubor v Rustu.
Proč existuje
Požadavek provozovatele, aby bylo rozšiřování za běhu řízené daty, s typovaným a standardním kontraktem místo seznamů regulárních výrazů. apps/majordomus-cli/tests/external_extension.rs přidá do testovacího repozitáře druh se schématem, přečte objekt zpět, uvidí vynucení schématu na chybném objektu a uvidí odmítnutí předefinování; test/cases/76_capabilities_projections.sh dokazuje, že druhy distribuce obsluhují vrstvu, kterou init zapisuje se stavem ok.