01. Repository・crate・依存方向いぞんほうこう
方針ほうしん
初期しょきrepositoryは NEPL3 のmonorepoとする。意味上いみじょうの境界きょうかいとcrateの依存方向いぞんほうこうconsumerからdependencyへの向むきを一致いっちさせ、言語げんごと出力しゅつりょくbackendを分離ぶんりする。crateの全一覧ぜんいちらんと、直接依存ちょくせついぞんの許可集合きょかしゅうごうは design/dependencies.json に記しるす。
1. 配置はいち
NEPL3/
Cargo.toml
Cargo.lock
rust-toolchain.toml
AGENTS.md
doc/
spec/
decisions/
history/
design/
interfaces/
languages/
grammar/ syntax.neplg package.ndf
doc/ syntax.neplg package.ndf
math/ syntax.neplg package.ndf
circuit/ syntax.neplg package.ndf
crates/
foundation/
core/src/ source/ schema/ value/ syntax/ origin/ diagnostic/ budget/
reader/src/ plan/ combinator/ execution/ extension/
engine/src/ parse/ binding/ index/ query/ recovery/
wire/src/ cbor/ schema/ protocol/
languages/
grammar/core/src/ bootstrap/ model/ check/ compile/
doc/core/src/ model/ sentence/ lower/ check/ facts/
doc/html/src/ render/ style/
math/core/src/ model/ number/ lower/ check/ evaluate/ facts/
math/mathml/src/ render/ precedence/
circuit/core/src/ model/ lower/ check/ elaborate/ simulate/ nor/ facts/
circuit/svg/src/ layout/ render/
output/markup/src/ model/ validate/ serialize/
integration/suite/src/ profile/ bridge/ operation/ workspace/
ui/core/src/ model/ message/ update/ command/ subscription/ view/
apps/ cli/ lsp/ web/ provider/
web/src/ shell/ editor/ worker/ preview/ storage/ bindings/
site/
editors/ vscode/ neovim/
tools/src/ generate/ contract/ dependency/ task/
examples/
conformance/
tasks/
ファイル名めいの階層かいそうは、ディレクトリで表あらわす。例たとえば source_span_map.rs を階層かいそうの代かわりに使つかわず、source/map.rs とする。各かく src の直下ちょっかには、lib.rs または main.rs を置おく。
2. 主おもな依存方向いぞんほうこう
依存いぞんの向むきは consumer -> dependency と表あらわす。
reader -> core
engine -> core, reader
grammar-core -> core, reader, engine
doc-core -> core
math-core -> core
circuit-core -> core
markup -> core
doc-html -> doc-core, markup, core
math-tex -> math-core, core
math-mathml -> math-core, markup, core
circuit-svg -> circuit-core, markup, core
suite -> engine, reader, grammar-core, domain cores, output backends, core
wire -> core
ui-core -> core (公開操作のデータ契約のみ)
apps -> suite, core (+ wire where required, web -> ui-core)
tools -> grammar-core, suite, foundation
core は、すべてのdomainのenumを持もつものではない。typed schema、位置いち、診断しんだん、公開値こうかいちを所有しょゆうする。domain coreは共通きょうつうのParsed treeを受うけ取とり、そのdomainのモデルへlowerする。engineはDocやRubyなどの意味いみを知しらない。
Doc内ないのMathとMath内ないのDocは、suiteのbridgeが処理しょりする。doc-coreはmath-coreをimportしない。出力しゅつりょくbackend同士どうしも、相互そうごにimportしない。suiteが依存関係いぞんかんけいに従したがって埋うめ込こみを準備じゅんびし、backendsへ型付かたつきの解決済かいけつずみfragmentを渡わたす。
ui-coreは、純粋じゅんすいなModel・Msg・update・viewと、commandおよびsubscriptionの記述きじゅつを所有しょゆうする。suiteやDOMを実行じっこうしてはならない。実行じっこう・Worker・editor widgetは、host adapterが担当たんとうする。目標もくひょうは20 crateで、そのうち15 crateが no_std + alloc である。この目標もくひょうを、実装済じっそうずみmemberの数かずと同一視どういつししてはならない。文書ぶんしょとsiteの生成せいせいは、toolsの明示的めいじてきな段階だんかいで行おこなう。build.rs を通とおして、compilerと文書ぶんしょrendererを循環依存じゅんかんいぞんさせてはならない。
3. surface descriptorとGrammarのbootstrap
languages/*/syntax.neplg は、各言語かくげんごのsurface定義ていぎである。Grammar compilerがpackageを生成せいせいし、その生成済せいせいずみpackageもcommitする。通常つうじょうのbuildで、toolsやgrammar compilerをbuild dependencyにしてはならない。cargo run -p nepl3-tools -- generate --check により、sourceとの一致いっちを検査けんさする。
Grammar自身じしんの初期しょきpackageは、同一どういつのGrammar syntaxを表あらわす検査済けんさずみseedとする。別べつの小ちいさなGrammar dialectは作つくらない。seedで自身じしんのsourceを読よみ、compileしたdescriptorの意味正規形いみせいきけいとseedを比較ひかくする。これは自己じこホスト前まえの永続的えいぞくてきなbootstrap契約けいやくであり、将来しょうらいの実装じっそうでも同おなじseedを使つかえる。
4. Rust設定せってい
workspaceはedition 2024、resolver 3とする。MSRVは1.85.0以上いじょうとし、実装開始時じっそうかいしじに使つかう一ひとつのstable toolchainを rust-toolchain.toml に完全かんぜんな版番号はんばんごうで固定こていする。MSRVと開発かいはつtoolchainは同一視どういつししない。外部依存がいぶいぞんはworkspace.dependenciesで集中管理しゅうちゅうかんりし、Cargo.lockをcommitする。
core系けいcrateは常つねに #![no_std] とし、allocを使つかう。coreをstd化かするfeatureは設もうけない。標準ひょうじゅんライブラリが必要ひつようなアダプタはappsへ置おく。native-only crateがcoreに入はいり込こむことを、cargo metadataとtarget buildによって検出けんしゅつする。
math-coreは num-bigint / num-rational / num-integer / num-traits を、default-features=falseで利用りようしてよい。対応たいおうする互換ごかんversion集合しゅうごうを一度いちどresolveし、lockする。異ことなるBigIntの版はんを、言語間げんごかんで露出ろしゅつさせてはならない。公開こうかいする意味値いみちには、この仕様しようのcanonical integer・rational型がたを使つかう。
安全あんぜんなRustを原則げんそくとする。FFIや高速化こうそくかのためにunsafeが必要ひつようなら、該当がいとうadapterの内部ないぶへ局在きょくざいさせ、unsafe契約けいやくと試験しけんを添そえる。domainからpointerを外部がいぶへ公開こうかいしてはならない。
5. 許可集合きょかしゅうごうの検査けんさ
dependency checkerはproduction依存いぞんとbuild依存いぞんを検査けんさし、dev依存いぞんを別べつの集合しゅうごうとして出力しゅつりょくする。productionからappsやtoolsへの経路けいろ、domain core同士どうしの経路けいろ、閉路へいろ、std依存いぞんを検出けんしゅつする。外部がいぶcrateの採用さいようによって、coreへOS機能きのうが混入こんにゅうしないことを確認かくにんする。
単一たんいつrepositoryであっても、各かくcoreは独立どくりつして check --no-default-features できるものとする。将来しょうらいのrepository分割ぶんかつを、現在げんざいの依存環境いぞんかんきょうへ強制きょうせいしない。公開こうかいschemaと操作そうさの単位たんいで、実装じっそうを交換こうかんできるようにする。
外部言語がいぶげんごの追加ついかでfoundation sourceを変更へんこうしない条件じょうけんと、repository分離前ぶんりまえの実証じっしょうは 外部拡張契約がいぶかくちょうけいやく に従したがう。現時点げんじてんではmonorepoを維持いじし、独立どくりつworkspaceの公開こうかいAPI利用りようから、配布はいふ・provider・互換性試験ごかんせいしけんへ進すすむ。
現在げんざいの作業段階さぎょうだんかい
以上いじょうは、目標もくひょうとする構成こうせいである。現在げんざいのworkspace memberはルートCargo.tomlを、実装状態じっそうじょうたいはimplementation-status.jsonを正本せいほんとする。crateは、その責務せきむを実装じっそうする段階だんかいで追加ついかする。開発かいはつtoolchainとMSRVの選定理由せんていりゆうはdoc/development.mdを、リポジトリ整備せいびの判断はんだんはdoc/decisions/0001-repository-foundation.mdを参照さんしょうする。