umberto 10.7.5 → 10.8.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/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [10.8.0](https://github.com/cksource/umberto/compare/v10.7.5...v10.8.0) (September 7, 2026)
5
+
6
+ ### Features
7
+
8
+ * Added support for the `llmsTxtProjects` configuration option, which lists the projects that publish an `llms.txt` index. Documentation pages in the Gloria theme now emit `<link rel="alternate" type="text/markdown">` for their own `.md` counterpart, and pages of a listed project also emit `<link rel="describedby">` for that project's index. The documentation landing page points at the `llms.txt` file of the website instead.
9
+
10
+
4
11
  ## [10.7.5](https://github.com/cksource/umberto/compare/v10.7.4...v10.7.5) (August 13, 2026)
5
12
 
6
13
  ### Bug fixes
@@ -32,17 +39,6 @@ Changelog
32
39
 
33
40
  * Replaced webpack with Rolldown for building theme scripts. The theme bundles are now built as ES modules with code splitting and loaded via `<script type="module">`, keeping dynamically imported dependencies (such as the shiki grammars in the Gloria theme) in separate, lazily loaded chunks. The output targets ES2022 instead of the Babel-transpiled ES5, and `webpack`, `babel-loader`, `@babel/core`, and `@babel/preset-env` are no longer dependencies of the package.
34
41
 
35
-
36
- ## [10.7.1](https://github.com/cksource/umberto/compare/v10.7.0...v10.7.1) (July 15, 2026)
37
-
38
- ### Bug fixes
39
-
40
- * Fixed source links for CKEditor 5 packages in API documentation so they now point to the public repository. Links for the latest documentation point to the `master` branch, and links for LTS documentation point to the matching `release-v*` branch.
41
-
42
- ### Other changes
43
-
44
- * Improved the performance of the documentation build. Pug templates of XML components used in Markdown are now compiled once and reused across pages, instead of being recompiled for every component occurrence. This shortens the page generation phase by about 20%.
45
-
46
42
  ---
47
43
 
48
44
  To see all releases, visit the [release page](https://github.com/cksource/umberto/releases).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "umberto",
3
- "version": "10.7.5",
3
+ "version": "10.8.0",
4
4
  "description": "CKSource Documentation builder",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -107,6 +107,7 @@ export const projectLocals = ( ctx, {
107
107
  disableSearch,
108
108
  shouldInjectNoIndexMeta,
109
109
  og,
110
+ llmsTxtProjects,
110
111
  quickNavigationProjects,
111
112
  navigationShowEmptyCategories
112
113
  } = {} ) => {
@@ -197,5 +198,6 @@ export const projectLocals = ( ctx, {
197
198
  locals.isLts = /\/ckeditor5\/(lts-v\d+)(?:\/|$)/.test( `/${ locals.path }` );
198
199
 
199
200
  locals.mainOg = og || {};
201
+ locals.llmsTxtProjects = llmsTxtProjects || [];
200
202
  } );
201
203
  };
@@ -156,6 +156,7 @@ export const buildDocumentation = options => {
156
156
  extraStyles,
157
157
  extraScripts,
158
158
  og: mainConfig.og,
159
+ llmsTxtProjects: mainConfig.llmsTxtProjects || [],
159
160
  additionalDocumentation: mainConfig.additionalDocumentation,
160
161
  canonicalUrlBeginning: mainConfig.canonicalUrlBeginning,
161
162
  macrosVariables: mainConfig.variables,
@@ -321,6 +322,7 @@ async function buildProjects( rootPath, projectPaths, options = {} ) {
321
322
  vwo: options.vwo,
322
323
  feedbackWidget: options.feedbackWidget,
323
324
  og: options.og,
325
+ llmsTxtProjects: options.llmsTxtProjects,
324
326
  canonicalUrlBeginning: options.canonicalUrlBeginning,
325
327
  macrosVariables: options.macrosVariables,
326
328
  quickNavigationProjects: options.quickNavigationProjects
@@ -343,6 +345,7 @@ async function buildProjects( rootPath, projectPaths, options = {} ) {
343
345
  vwo: options.vwo,
344
346
  feedbackWidget: options.feedbackWidget,
345
347
  og: options.og,
348
+ llmsTxtProjects: options.llmsTxtProjects,
346
349
  canonicalUrlBeginning: options.canonicalUrlBeginning,
347
350
  macrosVariables: options.macrosVariables,
348
351
  quickNavigationProjects: options.quickNavigationProjects
@@ -405,6 +408,7 @@ async function buildProjects( rootPath, projectPaths, options = {} ) {
405
408
  extraScriptsPaths: extraScripts,
406
409
  disableSearch: options.disableSearch,
407
410
  og: options.og,
411
+ llmsTxtProjects: options.llmsTxtProjects,
408
412
  // Force displaying empty categories in the navigation tree when the documentation is being built partially.
409
413
  navigationShowEmptyCategories: Array.isArray( guidesToProcess )
410
414
  } );
@@ -515,6 +519,7 @@ async function buildApis( projectConfigs, options = {} ) {
515
519
  feedbackWidget: options.feedbackWidget,
516
520
  pathJoin: upath.join,
517
521
  mainOg: options.og || {},
522
+ llmsTxtProjects: options.llmsTxtProjects || [],
518
523
  isNightly: options.docSearch?.indexName?.includes( 'nightly' ) || false,
519
524
  isLts: /\/ckeditor5\/(lts-v\d+)(?:\/|$)/.test( `/${ BASE_PATH }` )
520
525
  },
@@ -596,7 +601,9 @@ function buildSdks( projectConfigs, options = {} ) {
596
601
  vwo: options.vwo,
597
602
  feedbackWidget: options.feedbackWidget,
598
603
  pathJoin: upath.join,
599
- mainOg: options.og || {}
604
+ mainOg: options.og || {},
605
+ llmsTxtProjects: options.llmsTxtProjects || [],
606
+ isLts: /\/ckeditor5\/(lts-v\d+)(?:\/|$)/.test( `/${ BASE_PATH }` )
600
607
  },
601
608
  projectConfig: config,
602
609
  canonicalUrlBeginning: getCanonicalBeginning( { config, options, hexoManager } )
@@ -49,6 +49,26 @@ if ( page[ 'dc-description' ] || ogConfig.description )
49
49
  if page.BASE_PATH && page.BASE_PATH !== '.' && !page.BASE_PATH.includes( 'latest' )
50
50
  link( rel = 'canonical' href = page.canonicalUrlBeginning + page.path.replace( page.BASE_PATH, projectLocals.latestBasePath ) )
51
51
 
52
+ //- The `docs` build writes a Markdown counterpart for `*/latest/**` pages only. That rules out the LTS output,
53
+ //- and it is why these relations cannot sit inside the `canonical` guard above, which skips `latest` projects.
54
+ - const projects = llmsTxtProjects || [];
55
+ - const buildGeneratesMarkdown = projects.length > 0 && !isLts;
56
+ - const markdownProjectKey = page.BASE_PATH && page.BASE_PATH !== '.' ? page.BASE_PATH.split( '/' )[ 0 ] : null;
57
+ - const hasMarkdownVersion = markdownProjectKey && buildGeneratesMarkdown && !page.path.includes( '/getting-started/legacy/' );
58
+
59
+ if hasMarkdownVersion
60
+ link( rel = 'alternate' type = 'text/markdown' href = relative_url( page.path, page.path.replace( /\.html$/, '.md' ) ) )
61
+
62
+ if projects.includes( markdownProjectKey )
63
+ if page.groupId === 'api-reference'
64
+ link( rel = 'describedby' href = 'llms.txt' )
65
+ else
66
+ link( rel = 'describedby' href = relative_url( page.path, markdownProjectKey + '/llms.txt' ) )
67
+
68
+ //- The way in for an agent that arrives from the website rather than from an article.
69
+ else if !markdownProjectKey && mainOg && mainOg.hostname
70
+ link( rel = 'describedby' href = mainOg.hostname + '/llms.txt' )
71
+
52
72
  if page.isSnippetPage
53
73
  //UMBERTO: SNIPPET: HEAD
54
74