Module anatomy
Elke feature leeft in een eigen SwiftPM-target onder tools/native-app/Sources/FeatureX/. Een module mag afhangen van kernelpakketten zoals NoviNativeCore,NoviNativeDesignSystem, NoviNativeAPI,NoviNativeSync en NoviNativeModuleKit. Een feature target importeert geen NoviNativeFeaturesen hangt niet zomaar af van andere feature targets.
- FeatureXView.swift
- FeatureXClient.swift
- FeatureXViewModel.swift
- XModule.swift
- Tests voor view model, descriptor en niet-triviale modulelogica
Descriptor contract
NoviModuleDescriptor is het enige shell-facing contract. De catalogus bezit canonieke label-, icoon-, slug- en categoriedata; concrete descriptors voegen root views, sidebar items en v2 metadata toe.
public enum XModule: NoviModule {
public static var descriptor: NoviModuleDescriptor {
NoviModuleDescriptor(
id: "x-registry-id",
version: "1.0.0",
author: "Manyvere",
minHostVersion: noviModuleProtocolVersion,
permissions: [],
topLevelId: "module-N",
topLevelSlug: "x",
displayName: "X",
menuLabel: "X",
systemImage: "square.grid.2x2",
architectureNodeId: "modules.x",
extraArchitectureNodeIds: [],
category: .other,
makeRootView: { context in
AnyView(
FeatureXView(
config: context.config,
selectedSidebarItemID: context.selectedSidebarItemID,
onSelectSidebarItem: context.onSelectSidebarItem
)
)
},
sidebarItems: [
NoviModuleSidebarItem(
id: "overview",
label: "Overview",
systemImage: "square.grid.2x2"
),
],
isTopLevelSidebarEntry: false
)
}
}| Veld | Rol |
|---|---|
| id | Unieke registry-id. Moet overeenkomen met docs/module-index.json. |
| version | Implementatieversie van de module, standaard 1.0.0. |
| author | Persoon of organisatie achter de module, standaard Manyvere. |
| permissions | Verklaarde permissies. In protocol v2 documenterend, nog niet door de host afgedwongen. |
| minHostVersion | Minimaal ondersteunde host/protocolversie, meestal noviModuleProtocolVersion. |
| makeRootView | Root view factory voor renderbare modules. |
| sidebarItems | Subnavigatie-items die de shell kan selecteren en terugkoppelen. |
Build-then-couple workflow
- Kopieer
Sources/FeatureTemplatenaarSources/FeatureX. - Hernoem types, bestanden, accessibility identifiers en tests.
- Voeg de library product, target en test target toe in
Package.swift. - Werk
docs/module-index.jsonendocs/menu-readiness.jsonbij. - Genereer de native catalogus opnieuw en vervang placeholder ids.
- Registreer de descriptor in
NoviFeatureModuleBootstrap. - Draai de verificatiepoorten.
# From the repository root
node scripts/gen-native-module-catalog.mjs
# Then verify from tools/native-app
swift test
# Then run the repository checks
npm run checkCoupling
Registratie is single-threaded via de module registry. Voor een bestaande sidebarsectie match je op catalogus-id; voor een nieuwe top-level entry zet je isTopLevelSidebarEntry op true, voeg je readiness metadata toe en laat je de registry de sidebar aansturen.
NoviModuleRegistry.shared.register(XModule.descriptor)Verification gates
- Descriptor-id bestaat in
docs/module-index.json. - Readiness-id bestaat wanneer de module in menu of sidebar staat.
makeRootViewgebruiktNoviModuleRootViewContext.- Sub-sidebar modules koppelen
selectedSidebarItemIDenonSelectSidebarItem. - Elke macOS sheet gebruikt
.noviDismissibleSheet(). - Tests dekken descriptor metadata en view-model gedrag.
swift test,npm run checken de mac build/launch gate slagen.