What this plugin is
Data Modelling is a reusable, plugin-based data-model browser. It blends the platform's own data-model views with a minimalistic Plugin › Type navigation so you can walk the data model of any installed plugin without writing a page for it.
It ships one NodeType — DataModelling/DataModelExplorer — and one instance of it,
DataModelling/Explorer, which is the browser.
The three areas
| Area | What it shows | How it's built |
|---|---|---|
Overview |
The plugin picker / node-type browser — every space that defines NodeType nodes, grouped by plugin, with a search bar — plus a plugin-dependency panel (a live table of who depends on whom). |
A single Controls.MeshSearch (nodeType:NodeType, namespace-tree render) and a markdown table built from a live nodeType:Store/Plugin query. The platform does the querying, grouping and search; a clicked type opens its own page. |
Plugin |
One plugin's dependency navigation — its Depends on (drill INTO a sub-plugin) and Required by (its dependents) — and a MeshSearch scoped to that plugin's own NodeTypes. |
Reactive over the same Store/Plugin graph; the dependsOn list is read generically off each plugin root's content JSON (round-trips through PluginContent's JsonExtensionData), normalized once in DataModelExplorerLogic. |
Type |
The curated three-view switcher for one type — UML / JSON Schema / Table — plus a click-through to the type's instance Search. |
A Controls.Tabs that embeds the framework's own live $Model and $Schema areas via Controls.LayoutArea — never a re-implementation. |
Open a plugin's dependency view directly at /DataModelling/Explorer/Plugin/{root} (e.g.
…/Plugin/Reinsurance), or a type's switcher at
/DataModelling/Explorer/Type/{typePath} with / written as ~ — e.g.
…/Type/UWDeepfield~Cedent.
Declaring a dependency
A plugin declares the partition roots it builds on with a dependsOn string array on its
index.json PluginContent — e.g. "dependsOn": ["Reinsurance", "LossModelling"] on Pricing.
It rides in PluginContent's round-trip buffer, so no compiled type changes; the browser reads it
live and renders both the forward edges (Depends on) and the reverse edges (Required by).
The three views — composed, never re-implemented
The whole point is reuse. The three views are the framework's own per-NodeType areas:
- UML → the type's
$Modelarea —DataModelLayoutArea.BuildMermaidDiagramrenders the live Mermaid class diagram (with its own JSON sub-tab). - JSON Schema → the type's
$Schemaarea — the commented JSON schema, per-property descriptions drawn from the C# XML-doc summaries. - Table → the type's
$Modelarea with the type name as the areaId—DataModelLayoutArea.RenderTypeDetailsrenders the properties table (name · type · origin · summary).
Design note (reachability, not reachability of code): those builders are public, but the
ITypeDefinitions they need live in the target type's own hub (its compiled instance model,
resolved by the internal probe-hub machinery in NodeTypeDataModelAreas). A plugin hub cannot see
another partition's compiled types, so we embed the target type's areas (which run in the target
hub) rather than call the builders from here. That keeps this plugin fully self-contained and
compiling live on any mesh.
House rules this plugin follows
- 100% reactive — no
async/await. Every area returnsIObservable<UiControl?>; the one mesh query goes throughControls.MeshSearch. - Framework controls + data binding — no hand-rolled HTML.
Controls.Stack/Markdown/Tabs/LayoutArea/MeshSearch. Navigation is markdown links, not<a>blobs. - DRY. All URL/query logic lives once in
DataModelExplorerLogic; the areas never re-implement it. - Tested.
DataModelExplorerTestscovers every logic method; theTestslayout area runs them and renders a pass/fail table (asserted green in CI).
See the /plugin skill for how to build a plugin like this from scratch.
The modelling skills
Beside the browser, this plugin ships four Skill nodes that teach how to model data on
MeshWeaver — procedures an agent can follow, every claim grounded in the framework source
(MeshWeaver.Domain) and the worked domains (Reinsurance/, UWDeepfield/Source):
| Skill | What it covers |
|---|---|
| /discover-cube | Recognizing a dimensional scenario and proposing facts / measures / dimensions from a domain description — grain statement, field classification, anti-signals. |
| /model-cube | Modelling dimensions and fact records with the right attributes — node-per-member vs CLR-typed members, the [Dimension]/[IdentityProperty]/[NotVisible] coordinate triple, money and sign-convention guards. |
| /model-foreign-keys | FK relationships — [MeshNode("query")] node-path pickers, [MeshNodeCollection], self-referential hierarchies, [MeshNodeProperty] sync, and what draws a UML edge. |
| /domain-attributes | The reference tour of every data-modelling attribute in MeshWeaver.Domain, one line + real example each. |
They cross-link the free Data Modeling Masterclass course, whose lessons 16–18 drill the same ground hands-on.