@mat3ra/esse 2026.8.27-0 → 2026.8.31-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ The latest variants of schemas and examples are available at [schemas.mat3ra.com
12
12
 
13
13
  - **[Documentation](https://schemas.mat3ra.com/docs/)** — how ESSE is put together and why: the schema layering, entity anatomy, categorization, conventions and the build pipeline. Start here if you are new.
14
14
  - **[Explorer](https://schemas.mat3ra.com/)** — a file browser over every resolved schema and example.
15
- - **[Entity Map](https://schemas.mat3ra.com/map/)** — an interactive map of all schemas and the references between them, laid out by architectural layer: primitives at the centre, root entities around them, catalogues on the rim. Search for a schema, fly to it, and follow what it extends, contains and is used by.
15
+ - **[Ontology](https://schemas.mat3ra.com/map/)** — an interactive map of the ontology: every entity type and every relationship the schemas declare between them (`extends`, `contains`, `variant`), laid out by architectural layer — primitives at the centre, root entities around them, catalogues on the rim. Search for a schema, fly to it, and follow what it extends, contains and is used by.
16
16
 
17
17
  The map is built from `graph.json`, an extracted reference graph that is also published at [schemas.mat3ra.com/graph.json](https://schemas.mat3ra.com/graph.json) and doubles as a lint over the corpus.
18
18
 
@@ -160,7 +160,7 @@ The following outlines the development process workflow:
160
160
  2. Edit code and commit changes.
161
161
  3. Pre commit is used to regenerate the modules.
162
162
  4. Push the changes to GitHub.
163
- 5. GH workflow is used to generate the fully resolved file (without "$ref"s and "$allOf" etc.) and examples, render the documentation and the Entity Map, and publish them to [schemas.mat3ra.com](http://schemas.mat3ra.com/). The site is assembled in a gitignored `site/` staging directory; internal links are checked before it deploys.
163
+ 5. GH workflow is used to generate the fully resolved file (without "$ref"s and "$allOf" etc.) and examples, render the documentation and the ontology map, and publish them to [schemas.mat3ra.com](http://schemas.mat3ra.com/). The site is assembled in a gitignored `site/` staging directory; internal links are checked before it deploys.
164
164
  6. Publish the new version of the package to PyPI and npm.
165
165
 
166
166
  The [pre-commit](.husky/pre-commit) is using both JS and PY runtime(s) to regenerate the schemas and examples.
@@ -157,6 +157,28 @@ function categorizationSchemesFragment(graph) {
157
157
 
158
158
  Entities carrying a tiered \`categories\` field: ${carrierList || "_none_"}.`;
159
159
  }
160
+ /**
161
+ * The three relation kinds, with their ontological reading alongside the JSON Schema
162
+ * keyword that expresses each. Counts come from the graph, so the prose calling these
163
+ * "the familiar ontological relations" cannot drift from what the corpus declares.
164
+ */
165
+ function ontologyRelationsFragment(graph) {
166
+ const kinds = [
167
+ ["`extends`", "`allOf`", "**is a** (subsumption)", "extends"],
168
+ ["`contains`", "`properties` / `items`", "**has a** (composition)", "contains"],
169
+ ["`variant`", "`oneOf` / `anyOf`", "**is one of** (disjunction)", "variant"],
170
+ ];
171
+ const counts = graph.meta.edgeCountsByKind;
172
+ const rows = kinds.map(([relation, keyword, reading, key]) => [
173
+ relation,
174
+ keyword,
175
+ reading,
176
+ String(counts[key]),
177
+ ]);
178
+ return `${table(["Relation", "Declared by", "Reads as", "Edges"], rows)}
179
+
180
+ Across ${graph.meta.nodeCount} entity types, ${graph.meta.edgeCount} declared relationships.`;
181
+ }
160
182
  function layerInventoryFragment(graph) {
161
183
  const rows = Object.entries(graph.meta.layerCounts)
162
184
  .sort((a, b) => b[1] - a[1])
@@ -186,6 +208,8 @@ function expandFragments(body, graph) {
186
208
  ]);
187
209
  case "layer-inventory":
188
210
  return layerInventoryFragment(graph);
211
+ case "ontology-relations":
212
+ return ontologyRelationsFragment(graph);
189
213
  case "categorization-schemes":
190
214
  return categorizationSchemesFragment(graph);
191
215
  case "hub-table":
@@ -215,18 +239,19 @@ function renderPage(page, pages, html) {
215
239
  <head>
216
240
  <meta charset="UTF-8">
217
241
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
218
- <title>${escapeHtml(page.title)} — ESSE</title>
242
+ <title>${escapeHtml(page.title)} — AI4Materials</title>
219
243
  <meta name="description" content="${escapeHtml(page.summary)}">
220
244
  <link rel="stylesheet" href="docs.css">
221
245
  </head>
222
246
  <body>
223
247
  <div id="titlebar">
224
- <span class="app-name">ESSE</span>
248
+ <span class="app-name">AI4Materials<span class="app-name-suffix">: data standards</span></span>
225
249
  <nav id="surfaces">
226
250
  <a href="index.html" class="current">Docs</a>
227
251
  <a href="../index.html">Explorer</a>
228
- <a href="../map/index.html">Map</a>
252
+ <a href="../map/index.html">Ontology</a>
229
253
  </nav>
254
+ <span id="titlebar-tagline">ESSE &middot; materials science ontology</span>
230
255
  </div>
231
256
  <div id="workspace">
232
257
  <aside id="docs-nav">
@@ -283,10 +308,15 @@ body {
283
308
  z-index: 5;
284
309
  }
285
310
  #titlebar .app-name { color: var(--text-primary); font-weight: 600; }
311
+ /* Completes the wordmark so the name never reads as a dangling fragment. */
312
+ #titlebar .app-name-suffix { color: var(--text-muted); font-weight: 400; }
313
+ @media (max-width: 700px) { #titlebar .app-name-suffix { display: none; } }
286
314
  #surfaces { display: flex; gap: 14px; }
287
315
  #surfaces a { color: var(--text-muted); text-decoration: none; }
288
316
  #surfaces a:hover { color: var(--text-primary); }
289
317
  #surfaces a.current { color: var(--text-primary); border-bottom: 2px solid var(--accent); }
318
+ #titlebar-tagline { margin-left: auto; color: var(--text-muted); }
319
+ @media (max-width: 640px) { #titlebar-tagline { display: none; } }
290
320
  #workspace { display: flex; flex: 1; align-items: flex-start; }
291
321
  #docs-nav {
292
322
  width: 250px;
@@ -8,7 +8,7 @@ exports.checkSiteLinks = checkSiteLinks;
8
8
  * Verifies that every internal link in the assembled site resolves.
9
9
  *
10
10
  * The site is stitched together from four sources — resolved schemas, the concept docs, the
11
- * explorer and the Entity Map — each of which links into the others. Nothing else checks that
11
+ * explorer and the ontology map — each of which links into the others. Nothing else checks that
12
12
  * those links land anywhere, and a stale href is invisible until someone clicks it.
13
13
  *
14
14
  * External URLs are not fetched; this is a build step, not a crawler.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mat3ra/esse",
3
- "version": "2026.8.27-0",
3
+ "version": "2026.8.31-0",
4
4
  "description": "Mat3ra's Excellent Source of Schemas and Examples (ESSE) for Digital Materials R&D",
5
5
  "scripts": {
6
6
  "transpile": "tsc -p tsconfig-transpile.json",