@shoalrun/cli 0.1.0-beta.1 → 1.0.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.
Files changed (119) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/CODE-REFERENCES.md +137 -0
  3. package/README.md +8 -5
  4. package/adapters/python/requirements.txt +1 -0
  5. package/adapters/python/shoalrun_reference.py +234 -0
  6. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +4 -2
  7. package/agent-docs/SNAPSHOT.json +5 -5
  8. package/agent-docs/about.md +3 -3
  9. package/agent-docs/api-docs/code-reference-settings.md +160 -0
  10. package/agent-docs/api-docs/code-reference-settings.sections/catalog-settings.md +50 -0
  11. package/agent-docs/api-docs/code-reference-settings.sections/complete-reference-page.md +46 -0
  12. package/agent-docs/api-docs/code-reference-settings.sections/converter-snapshot.md +58 -0
  13. package/agent-docs/api-docs/code-reference-settings.sections/descriptions-type-links-and-source-links.md +40 -0
  14. package/agent-docs/api-docs/code-reference-settings.sections/html-markdown-and-agents.md +38 -0
  15. package/agent-docs/api-docs/code-reference-settings.sections/metadata-and-selection.md +38 -0
  16. package/agent-docs/api-docs/code-reference-settings.sections/publication-sources.md +54 -0
  17. package/agent-docs/api-docs/code-reference-settings.sections/python-adapter-limits.md +38 -0
  18. package/agent-docs/api-docs/code-reference-settings.sections/related-reading.md +32 -0
  19. package/agent-docs/api-docs/code-reference-settings.sections/symbol-fields.md +56 -0
  20. package/agent-docs/api-docs/code-references.md +143 -0
  21. package/agent-docs/author/agent-overview.md +2 -2
  22. package/agent-docs/changelog/code-api-references.md +44 -0
  23. package/agent-docs/changelog.md +9 -1
  24. package/agent-docs/cli.md +11 -1
  25. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +1 -1
  26. package/agent-docs/cli.sections/author-pages.md +1 -1
  27. package/agent-docs/cli.sections/build-and-serve.md +1 -1
  28. package/agent-docs/cli.sections/inspect-config-and-operations.md +1 -1
  29. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +1 -1
  30. package/agent-docs/cli.sections/related-reading.md +1 -1
  31. package/agent-docs/cli.sections/search-and-chat.md +1 -1
  32. package/agent-docs/cli.sections/start-a-project.md +1 -1
  33. package/agent-docs/cli.sections/validate-code-reference-snapshots.md +41 -0
  34. package/agent-docs/cli.sections/working-tree-authoring-tools.md +1 -1
  35. package/agent-docs/config/apis.md +5 -1
  36. package/agent-docs/config/examples.md +3 -3
  37. package/agent-docs/config/examples.sections/feature-showcase.md +3 -3
  38. package/agent-docs/config/examples.sections/minimal-site.md +2 -2
  39. package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
  40. package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
  41. package/agent-docs/config/examples.sections/related-reading.md +2 -2
  42. package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
  43. package/agent-docs/config.md +2 -2
  44. package/agent-docs/configuration.md +2 -2
  45. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
  46. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +1 -1
  47. package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
  48. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +1 -1
  49. package/agent-docs/configuration.sections/related-reading.md +1 -1
  50. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +1 -1
  51. package/agent-docs/configuration.sections/share-defaults-through-extends.md +1 -1
  52. package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
  53. package/agent-docs/configuration.sections/understand-the-three-stages.md +1 -1
  54. package/agent-docs/configuration.sections/understand-where-paths-point.md +1 -1
  55. package/agent-docs/documents.json +609 -215
  56. package/agent-docs/features.md +3 -2
  57. package/agent-docs/provenance.json +6 -6
  58. package/agent-docs/publish/api-references.md +3 -1
  59. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +3 -1
  60. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -1
  61. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +3 -1
  62. package/agent-docs/publish/api-references.sections/next-steps.md +3 -1
  63. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +3 -1
  64. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +3 -1
  65. package/agent-docs/publish/api-references.sections/register-the-operation.md +3 -1
  66. package/agent-docs/publish/api-references.sections/related-reading.md +3 -1
  67. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -1
  68. package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -1
  69. package/agent-docs/search-index.json +1 -1
  70. package/agent-docs/start.md +3 -3
  71. package/agent-docs/start.sections/add-the-page-to-navigation.md +2 -2
  72. package/agent-docs/start.sections/build-and-check-both-outputs.md +2 -2
  73. package/agent-docs/start.sections/build-this-site.md +2 -2
  74. package/agent-docs/start.sections/check-writing-style.md +2 -2
  75. package/agent-docs/start.sections/create-a-page.md +2 -2
  76. package/agent-docs/start.sections/make-it-yours.md +2 -2
  77. package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
  78. package/agent-docs/start.sections/prerequisites.md +2 -2
  79. package/agent-docs/start.sections/related-reading.md +2 -2
  80. package/agent-docs/start.sections/start-your-own-project.md +3 -3
  81. package/agent-docs/status.md +6 -4
  82. package/agent-docs/styling/themes.md +7 -3
  83. package/agent-docs/what-is-shoalrun.md +2 -2
  84. package/dist/artifact-bundle.d.ts +1 -0
  85. package/dist/artifact-bundle.js +11 -3
  86. package/dist/cli-discovery.d.ts +1 -1
  87. package/dist/cli-discovery.js +1 -0
  88. package/dist/cli.js +7 -0
  89. package/dist/code-reference-model.d.ts +85 -0
  90. package/dist/code-reference-model.js +73 -0
  91. package/dist/code-references.d.ts +23 -0
  92. package/dist/code-references.js +371 -0
  93. package/dist/compiler-config.d.ts +1 -0
  94. package/dist/compiler.js +4 -3
  95. package/dist/config.js +1 -1
  96. package/dist/content-source.d.ts +1 -0
  97. package/dist/content-workspace.d.ts +1 -0
  98. package/dist/content-workspace.js +2 -0
  99. package/dist/fonts.d.ts +9 -0
  100. package/dist/fonts.js +58 -3
  101. package/dist/page-materialization.js +3 -2
  102. package/dist/page-renderer.d.ts +1 -0
  103. package/dist/page-renderer.js +3 -1
  104. package/dist/publication-render.d.ts +2 -1
  105. package/dist/publication-render.js +2 -2
  106. package/dist/representation-tree.js +4 -0
  107. package/examples/code-references/content/start.md +53 -0
  108. package/examples/code-references/docs.config.yaml +262 -0
  109. package/examples/code-references/python/orchard/__init__.py +11 -0
  110. package/examples/code-references/python/orchard/client.py +212 -0
  111. package/examples/code-references/python/orchard/errors.py +31 -0
  112. package/examples/code-references/python/orchard/models.py +69 -0
  113. package/examples/code-references/python/orchard/pagination.py +39 -0
  114. package/examples/code-references/reference.json +1244 -0
  115. package/package.json +8 -1
  116. package/schemas/code-reference.schema.json +306 -0
  117. package/skills/shoalrun-author/SKILL.md +4 -0
  118. package/skills/shoalrun-author/references/code-api-references.md +15 -0
  119. package/styles/site.css +61 -2
@@ -16,11 +16,11 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
22
22
 
23
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
23
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
24
24
 
25
25
  ## Prerequisites
26
26
 
@@ -36,7 +36,7 @@ Install an exact version of the beta and initialize the minimal starter:
36
36
  mkdir my-docs
37
37
  cd my-docs
38
38
  npm init -y
39
- npm install --save-exact @shoalrun/cli@0.1.0-beta.1
39
+ npm install --save-exact @shoalrun/cli@1.0.0
40
40
  npx --no-install shoalrun init .
41
41
  ```
42
42
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Add the page to navigation
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Build and check both outputs
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Build this site
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Check writing style
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Create a page
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Make it yours
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Migrating from GitHub Packages
34
34
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Prerequisites
34
34
 
@@ -16,13 +16,13 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
23
23
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
24
24
 
25
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
25
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
26
26
 
27
27
  ## Related reading
28
28
 
@@ -16,7 +16,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
16
16
 
17
17
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > Getting started
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
21
  Parent page: [Full Markdown page](/start.md)
22
22
 
@@ -28,7 +28,7 @@ Parent page: [Full Markdown page](/start.md)
28
28
 
29
29
  This quickstart takes you from installing Shoalrun to your own working documentation site. You'll scaffold a page from a template, complete its draft, put it in the sidebar, and read its HTML and Markdown output.
30
30
 
31
- > **Beta:** Pin an exact version and review release notes before upgrading. Configuration and output formats may change between beta releases.
31
+ > **Upgrades:** Pin an exact version and review release notes before upgrading. Rebuild and check HTML, Markdown, and any application content consumers before deploying.
32
32
 
33
33
  ## Start your own project
34
34
 
@@ -38,7 +38,7 @@ Install an exact version of the beta and initialize the minimal starter:
38
38
  mkdir my-docs
39
39
  cd my-docs
40
40
  npm init -y
41
- npm install --save-exact @shoalrun/cli@0.1.0-beta.1
41
+ npm install --save-exact @shoalrun/cli@1.0.0
42
42
  npx --no-install shoalrun init .
43
43
  ```
44
44
 
@@ -16,11 +16,11 @@ Navigation section: [Project](https://www.shoalrun.com/.well-known/shoalrun/navi
16
16
 
17
17
  Breadcrumbs: [Project](https://www.shoalrun.com/status.md) > Project > Project status
18
18
 
19
- **Updated: 2026-11-06.**
19
+ **Updated: 2026-11-07.**
20
20
 
21
- Shoalrun is in beta for publishing documentation for people and agents from the same source. This site is built with it. Install the public `@shoalrun/cli` npm package through [Getting started](https://www.shoalrun.com/start.md). No account or package token is needed.
21
+ Shoalrun 1.0 publishes documentation for people and agents from the same source. This site is built with it. Install the public `@shoalrun/cli` npm package through [Getting started](https://www.shoalrun.com/start.md). No account or package token is needed.
22
22
 
23
- The [features overview](https://www.shoalrun.com/features.md) summarizes the platform on one page. The capabilities below include `0.1.0-beta.1`.
23
+ The [features overview](https://www.shoalrun.com/features.md) summarizes the platform on one page. The capabilities below describe `1.0.0`.
24
24
 
25
25
  ## What works today
26
26
 
@@ -38,6 +38,8 @@ The [features overview](https://www.shoalrun.com/features.md) summarizes the pla
38
38
 
39
39
  - **API documentation.** [OpenAPI sources](https://www.shoalrun.com/publish/api-references.md) supply reference pages, named examples, request samples, and contracts for individual operations. Authors can combine generated references with guides and review imported API content before publishing it.
40
40
 
41
+ - **SDK references.** [Code API references](https://www.shoalrun.com/api-docs/code-references.md) use Python source and docstrings or a converter snapshot. Choose separate symbols, inline class/module pages, and an optional complete reference, with linked types and field defaults.
42
+
41
43
  - **Search and documentation tools.** Built-in search works in the browser without a model key. Optional [semantic search and cited answers](https://www.shoalrun.com/search-and-chat.md) use your configured providers. Read-only [Model Context Protocol (MCP) tools](https://www.shoalrun.com/publish/mcp.md) let agents search and read pages or sections. They run through a local stdio process or a public HTTP endpoint on Node or Vercel.
42
44
 
43
45
  - **Publishing and measurement.** Local previews and checks support static publishing, with Node and Vercel serving options. Optional [browser analytics](https://www.shoalrun.com/author/analytics.md) and [HTTP MCP analytics](https://www.shoalrun.com/publish/mcp-analytics.md) send events through adapters to your chosen service. Both are off by default; their guides describe the event fields, filtering, and configuration.
@@ -62,7 +64,7 @@ These are intended additions, without a promised release date.
62
64
 
63
65
  ## Current limits
64
66
 
65
- - **Beta stability.** Configuration, extension points, and output formats can still change. There is no stable release or compatibility promise yet.
67
+ - **Upgrade checks.** Pin exact versions and review release notes before upgrading. Rebuild and verify the site and application content consumers before deploying. Older release lines aren't maintained; experimental features keep their lifecycle labels.
66
68
  - **Component extensibility.** [Trusted custom components](https://www.shoalrun.com/author/components/custom.md) lower into shared content, with a portable authoring skill. Arbitrary executable MDX remains unsupported. Project CSS, browser modules, and configured build extensions are trusted project code.
67
69
  - **API coverage.** OpenAPI and JSON Schema support is partial; check the [support reference](https://www.shoalrun.com/api-docs/support.md) against your source. Request examples are copyable, but Shoalrun doesn't provide a live API explorer that sends requests.
68
70
  - **Private content.** Reader views don't restrict access to published files. Shoalrun has no built-in reader authentication, and its HTTP MCP endpoint currently serves one selected public publication. Host-level authorization is a separate responsibility.
@@ -17,7 +17,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
17
17
 
18
18
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Configure and customize > Themes
19
19
 
20
- **Updated: 2026-11-05.**
20
+ **Updated: 2026-11-07.**
21
21
 
22
22
  The `theme` setting controls how the HTML site looks. It has five keys, and each has a default:
23
23
 
@@ -60,7 +60,7 @@ Each preset ships its own fonts, so the site looks the same on every operating s
60
60
  | `ledger` | Source Serif 4 | JetBrains Mono | JetBrains Mono |
61
61
  | `vice` | Figtree | Jost | System monospace |
62
62
 
63
- The fonts are Latin variable fonts under the SIL Open Font License. The build copies them to `/assets/fonts/` with their license files. A browser downloads only the faces a page uses, and the page preloads its body font. Characters outside the Latin set use the system fallback. Until a font arrives, the page uses a local font resized to match it. Text doesn't shift when the bundled font loads. Agents read the Markdown twins, which load no fonts.
63
+ The fonts are Latin variable fonts under the SIL Open Font License. The build copies them to `/assets/fonts/` with their license files. A browser downloads the faces a page uses; preload hints can start key font downloads earlier. Characters outside the Latin set use the system fallback. Until a font arrives, the page uses a local font resized to match it. A fallback can still look different from the final font, especially when a custom face has different metrics. Agents read the Markdown twins, which load no fonts.
64
64
 
65
65
  To use system fonts only, set `fonts: system`. Each preset then falls back to its system font stack.
66
66
 
@@ -84,9 +84,13 @@ theme:
84
84
  ```
85
85
 
86
86
  - `family` is the name CSS uses. A plain string, such as `headings: Acme Display`, names a font without shipping files. Use it for a font that [project CSS](https://www.shoalrun.com/author/css.md) loads, or one installed on readers' machines.
87
- - `files` lists local `.woff2`, `.woff`, `.ttf`, or `.otf` files, relative to the config file that declares them. The build copies them to `/assets/fonts/project/`. File names can use letters, numbers, dots, dashes, and underscores, and two files can't share a name.
87
+ - `files` lists local `.woff2`, `.woff`, `.ttf`, or `.otf` files, relative to the config file that declares them. The build copies them to content-versioned URLs under `/assets/fonts/project/`. File names can use letters, numbers, dots, dashes, and underscores, and two files can't share a name.
88
88
  - Each file can set `style` (`normal` or `italic`) and `weight`, such as `400` or `"100 900"`. The default weight, `"100 900"`, suits variable fonts; give each static file its own weight.
89
89
 
90
+ Since 1.0.0
91
+
92
+ Local custom body and heading faces are preloaded to start their downloads earlier. Versioned custom-font URLs support long-lived caching; changing a font's bytes changes its URL. Bundled font URLs revalidate so a development browser doesn't keep an older file indefinitely. These settings reduce late font loading, but don't guarantee that every custom font matches its fallback without a visible change. Family names supplied without local files don't create a preload.
93
+
90
94
  A missing file, an unsupported format, or an unknown key fails the build. Check that your font license allows web embedding.
91
95
 
92
96
  Fonts set here become the `--font-body`, `--font-heading`, and `--font-code` [CSS tokens](https://www.shoalrun.com/author/css.md), each followed by a system fallback.
@@ -17,7 +17,7 @@ Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigat
17
17
 
18
18
  Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Get started > What is Shoalrun?
19
19
 
20
- **Updated: 2026-11-06.**
20
+ **Updated: 2026-11-07.**
21
21
 
22
22
  Shoalrun is a documentation compiler for product and API docs. It reads project configuration, Markdown and supported MDX pages, and optional local OpenAPI files. From those sources, it builds a site for people and readable Markdown pages for agents. The normal build is deterministic: it makes no model calls or network requests.
23
23
 
@@ -43,7 +43,7 @@ Optional ingredients, recipes, and cookbooks extend the same idea to tasks. An i
43
43
 
44
44
  ## Where it stands
45
45
 
46
- The public documentation site shows output built by Shoalrun. Install the beta CLI from npm using [Getting started](https://www.shoalrun.com/start.md). The [project status](https://www.shoalrun.com/status.md) lists implemented capabilities and current limits.
46
+ The public documentation site shows output built by Shoalrun. Install the CLI from npm using [Getting started](https://www.shoalrun.com/start.md). The [project status](https://www.shoalrun.com/status.md) lists implemented capabilities and current limits.
47
47
 
48
48
  ## Related reading
49
49
 
@@ -59,6 +59,7 @@ export type ArtifactAssemblyInput = {
59
59
  colorMode: 'light' | 'dark' | 'system';
60
60
  generatedFontsCss?: string;
61
61
  fontFiles: string[];
62
+ projectFontAssets: Map<string, Buffer>;
62
63
  fonts: SiteFonts;
63
64
  shareImages: ShareSettings;
64
65
  shareFor: (doc: Document) => {
@@ -12,6 +12,8 @@ import { fictionalDocument, optionalDocument, resolveLlmsDiscovery } from './llm
12
12
  import { boundedDiscovery } from './compact-discovery.js';
13
13
  import { iconLicenseFile } from './icons.js';
14
14
  import { peleLicenseFile } from './diagrams.js';
15
+ import { fontMediaType } from './fonts.js';
16
+ import { createHash } from 'node:crypto';
15
17
  import { defaultShareSvg, faviconSvg, fillShareTemplate, renderPng, touchIconSvg } from './share-images.js';
16
18
  import { paletteCatalog, paletteCss, presetCatalog, resolvePalette } from './palettes.js';
17
19
  import { heading, link, list, paragraph, renderMarkdown, root, searchIndex, shareCardText, text } from './content.js';
@@ -148,10 +150,16 @@ export async function assembleArtifacts(input) {
148
150
  }
149
151
  if (generatedFontsCss)
150
152
  addPublicArtifact('/assets/fonts.css', generatedFontsCss.replaceAll('url("/assets/', `url("${basePath}/assets/`));
153
+ const addFont = (route, bytes, immutable) => {
154
+ addPublicArtifact(route, bytes);
155
+ const type = fontMediaType(route);
156
+ if (type)
157
+ headers[publicPath(route)] = { 'Content-Type': type, 'Cache-Control': immutable ? 'public, max-age=31536000, immutable' : 'public, max-age=0, must-revalidate', ETag: `"${createHash('sha256').update(bytes).digest('hex')}"` };
158
+ };
151
159
  for (const file of fontFiles)
152
- addPublicArtifact(`/assets/fonts/${path.basename(file)}`, await readFile(file));
153
- for (const route of new Set(fonts.faces.map(face => face.route)))
154
- addPublicArtifact(route, await readFile(fonts.faces.find(face => face.route === route).file));
160
+ addFont(`/assets/fonts/${path.basename(file)}`, await readFile(file), false);
161
+ for (const [route, bytes] of input.projectFontAssets)
162
+ addFont(route, bytes, true);
155
163
  const shareTemplate = shareImages.template ? await readFile(shareImages.template, 'utf8') : undefined;
156
164
  for (const page of rendered) {
157
165
  const share = shareFor(page.doc);
@@ -1,4 +1,4 @@
1
1
  export declare const docsHelp = "Usage: shoalrun docs <command>\n\nRead bundled references (no project or provider key required):\n search <query> [--json]\n read <document-id> [--json]\n outline <document-id> [--json]\n section <document-id> <section-id> [--json]\n\nSearch and reads accept --site DIRECTORY, --max-tokens N, and publication\nselectors --product P --channel C --version V --language L.\n\nInspect a project:\n project [--config FILE] [--profile FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings]\n source FILE [--config FILE] [--profile FILE]\n context <document-id> [--config FILE]\n\nValidate and preview edits:\n baseline --out FILE [--config FILE] [--profile FILE]\n validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n validation-status REPORT\n review REPORT [--format json|markdown]\n preview REPORT [--port PORT]\n\nOther authoring tools: changes, plan, apply, mcp.\nDiscover packaged agent guidance with shoalrun skills list.\n";
2
2
  export declare const skillsHelp = "Usage: shoalrun skills list [--json]\n shoalrun skills read <name> [--json]\n\nList the names, descriptions and local paths of packaged skills, or read a skill.\nThese commands do not install skills or require a project or provider key.\n";
3
- export declare const cliHelp = "Usage: shoalrun <command>\n\nStart and build:\n init [directory] [--starter minimal|api-docs|showcase]\n build [config] [output] [--profile FILE]\n export [config] --out DIRECTORY [--target NAME] [--profile FILE]\n dev [config] [output] [--profile FILE] [--port PORT]\n serve <site-directory> [--host HOST] [--port PORT]\n check [config] [--json]\n audit [config]\n scaffold <template> -n <target> [--config FILE] [--product P]\n\nAgent guidance and offline documentation:\n skills list [--json]\n skills read <name> [--json]\n docs search <query> [--site DIRECTORY] [--product P] [--json]\n docs read <document-id> [--site DIRECTORY] [--product P] [--json]\n docs project [--config FILE] [--profile FILE]\n docs baseline --out FILE [--config FILE] [--profile FILE]\n docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n docs review REPORT [--format json|markdown]\n docs preview REPORT [--port PORT]\n\nOther commands: config, api, operation, ingredient, recipe, search, index,\nask, answers, ask-log, chat, eval, vercel.\nRun shoalrun docs --help or shoalrun skills --help for discovery commands.\n";
3
+ export declare const cliHelp = "Usage: shoalrun <command>\n\nStart and build:\n init [directory] [--starter minimal|api-docs|showcase]\n build [config] [output] [--profile FILE]\n export [config] --out DIRECTORY [--target NAME] [--profile FILE]\n dev [config] [output] [--profile FILE] [--port PORT]\n serve <site-directory> [--host HOST] [--port PORT]\n check [config] [--json]\n references check <snapshot.json>\n audit [config]\n scaffold <template> -n <target> [--config FILE] [--product P]\n\nAgent guidance and offline documentation:\n skills list [--json]\n skills read <name> [--json]\n docs search <query> [--site DIRECTORY] [--product P] [--json]\n docs read <document-id> [--site DIRECTORY] [--product P] [--json]\n docs project [--config FILE] [--profile FILE]\n docs baseline --out FILE [--config FILE] [--profile FILE]\n docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n docs review REPORT [--format json|markdown]\n docs preview REPORT [--port PORT]\n\nOther commands: config, api, operation, ingredient, recipe, search, index,\nask, answers, ask-log, chat, eval, vercel.\nRun shoalrun docs --help or shoalrun skills --help for discovery commands.\n";
4
4
  export declare function runSkillsCommand(args: string[]): Promise<string>;
@@ -43,6 +43,7 @@ Start and build:
43
43
  dev [config] [output] [--profile FILE] [--port PORT]
44
44
  serve <site-directory> [--host HOST] [--port PORT]
45
45
  check [config] [--json]
46
+ references check <snapshot.json>
46
47
  audit [config]
47
48
  scaffold <template> -n <target> [--config FILE] [--product P]
48
49
 
package/dist/cli.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { readCodeReference } from './code-reference-model.js';
2
3
  import { runExportCommand, exportHelp } from './content-export-command.js';
3
4
  import { cliHelp, docsHelp, skillsHelp, runSkillsCommand } from './cli-discovery.js';
4
5
  import { compareDocumentSnapshots } from './document-sync.js';
@@ -99,6 +100,12 @@ try {
99
100
  else if (command === 'skills') {
100
101
  process.stdout.write(await runSkillsCommand([subcommand, ...rest].filter((value) => value !== undefined)));
101
102
  }
103
+ else if (command === 'references') {
104
+ if (subcommand !== 'check' || rest.length !== 1)
105
+ throw new Error('Usage: shoalrun references check <snapshot.json>');
106
+ const snapshot = await readCodeReference(path.resolve(rest[0]));
107
+ process.stdout.write(JSON.stringify({ status: 'ok', programmingLanguage: snapshot.programmingLanguage, symbols: snapshot.symbols.length }) + '\n');
108
+ }
102
109
  else if (command === 'init') {
103
110
  const args = [subcommand, ...rest].filter((item) => item !== undefined);
104
111
  let directory = '.';
@@ -0,0 +1,85 @@
1
+ import { z } from 'zod';
2
+ export declare const codeReferenceSchema: z.ZodObject<{
3
+ schemaVersion: z.ZodLiteral<1>;
4
+ kind: z.ZodLiteral<"shoalrun-code-reference">;
5
+ programmingLanguage: z.ZodString;
6
+ producer: z.ZodObject<{
7
+ name: z.ZodString;
8
+ version: z.ZodString;
9
+ extractorVersion: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strict>;
11
+ sourceDigest: z.ZodOptional<z.ZodString>;
12
+ symbols: z.ZodArray<z.ZodObject<{
13
+ id: z.ZodString;
14
+ name: z.ZodString;
15
+ kind: z.ZodEnum<{
16
+ function: "function";
17
+ constructor: "constructor";
18
+ module: "module";
19
+ type: "type";
20
+ constant: "constant";
21
+ enum: "enum";
22
+ method: "method";
23
+ property: "property";
24
+ namespace: "namespace";
25
+ class: "class";
26
+ interface: "interface";
27
+ attribute: "attribute";
28
+ }>;
29
+ parent: z.ZodOptional<z.ZodString>;
30
+ visibility: z.ZodDefault<z.ZodEnum<{
31
+ public: "public";
32
+ private: "private";
33
+ }>>;
34
+ summary: z.ZodOptional<z.ZodString>;
35
+ description: z.ZodOptional<z.ZodString>;
36
+ annotation: z.ZodOptional<z.ZodString>;
37
+ default: z.ZodOptional<z.ZodString>;
38
+ required: z.ZodOptional<z.ZodBoolean>;
39
+ bases: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ constructorSignature: z.ZodOptional<z.ZodString>;
41
+ typeReferences: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
42
+ signatures: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ parameters: z.ZodOptional<z.ZodArray<z.ZodObject<{
44
+ name: z.ZodString;
45
+ type: z.ZodOptional<z.ZodString>;
46
+ description: z.ZodOptional<z.ZodString>;
47
+ default: z.ZodOptional<z.ZodString>;
48
+ }, z.core.$strict>>>;
49
+ returns: z.ZodOptional<z.ZodObject<{
50
+ type: z.ZodOptional<z.ZodString>;
51
+ description: z.ZodOptional<z.ZodString>;
52
+ }, z.core.$strict>>;
53
+ yields: z.ZodOptional<z.ZodObject<{
54
+ type: z.ZodOptional<z.ZodString>;
55
+ description: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strict>>;
57
+ raises: z.ZodOptional<z.ZodArray<z.ZodObject<{
58
+ name: z.ZodString;
59
+ type: z.ZodOptional<z.ZodString>;
60
+ description: z.ZodOptional<z.ZodString>;
61
+ default: z.ZodOptional<z.ZodString>;
62
+ }, z.core.$strict>>>;
63
+ examples: z.ZodOptional<z.ZodArray<z.ZodObject<{
64
+ title: z.ZodOptional<z.ZodString>;
65
+ code: z.ZodString;
66
+ }, z.core.$strict>>>;
67
+ seeAlso: z.ZodOptional<z.ZodArray<z.ZodString>>;
68
+ source: z.ZodOptional<z.ZodObject<{
69
+ path: z.ZodString;
70
+ line: z.ZodOptional<z.ZodNumber>;
71
+ }, z.core.$strict>>;
72
+ }, z.core.$strict>>;
73
+ }, z.core.$strict>;
74
+ export type CodeReferenceSnapshot = z.infer<typeof codeReferenceSchema>;
75
+ export type CodeSymbol = CodeReferenceSnapshot['symbols'][number];
76
+ export type CodeReference = {
77
+ catalog: string;
78
+ programmingLanguage: string;
79
+ symbol: CodeSymbol;
80
+ sourceUrl?: string;
81
+ layout?: 'symbols' | 'classes' | 'modules';
82
+ complete?: boolean;
83
+ };
84
+ export declare function validateCodeReference(value: unknown): CodeReferenceSnapshot;
85
+ export declare function readCodeReference(file: string, root?: string): Promise<CodeReferenceSnapshot>;
@@ -0,0 +1,73 @@
1
+ import { z } from 'zod';
2
+ import { readFile, realpath, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ const text = z.string().max(100_000);
5
+ const id = z.string().min(1).max(512).regex(/^[^\s\x00-\x1f]+$/, 'Symbol IDs cannot contain whitespace or control characters');
6
+ const detail = z.object({ name: z.string().min(1).max(512), type: text.optional(), description: text.optional(), default: text.optional() }).strict();
7
+ export const codeReferenceSchema = z.object({
8
+ schemaVersion: z.literal(1),
9
+ kind: z.literal('shoalrun-code-reference'),
10
+ programmingLanguage: z.string().regex(/^[a-z][a-z0-9_-]{0,63}$/),
11
+ producer: z.object({ name: z.string().min(1).max(100), version: z.string().min(1).max(100), extractorVersion: z.string().max(100).optional() }).strict(),
12
+ sourceDigest: z.string().regex(/^[a-f0-9]{64}$/).optional(),
13
+ symbols: z.array(z.object({
14
+ id, name: z.string().min(1).max(512),
15
+ kind: z.enum(['module', 'namespace', 'class', 'interface', 'enum', 'type', 'function', 'method', 'constructor', 'property', 'attribute', 'constant']),
16
+ parent: id.optional(), visibility: z.enum(['public', 'private']).default('public'),
17
+ summary: z.string().max(1000).optional(), description: text.optional(),
18
+ annotation: text.optional(), default: text.optional(), required: z.boolean().optional(),
19
+ bases: z.array(text).max(100).optional(), constructorSignature: text.optional(),
20
+ typeReferences: z.record(z.string().min(1).max(512), id).optional(),
21
+ signatures: z.array(text).max(100).optional(),
22
+ parameters: z.array(detail).max(1000).optional(),
23
+ returns: z.object({ type: text.optional(), description: text.optional() }).strict().optional(),
24
+ yields: z.object({ type: text.optional(), description: text.optional() }).strict().optional(),
25
+ raises: z.array(detail).max(1000).optional(),
26
+ examples: z.array(z.object({ title: z.string().max(512).optional(), code: text }).strict()).max(100).optional(),
27
+ seeAlso: z.array(id).max(1000).optional(),
28
+ source: z.object({ path: z.string().min(1).max(1000).regex(/^(?!\/)(?!.*(?:^|\/)\.{1,2}(?:\/|$))[^/\\\x00:]+(?:\/[^/\\\x00:]+)*$/), line: z.number().int().positive().optional() }).strict().optional()
29
+ }).strict()).min(1).max(10_000)
30
+ }).strict();
31
+ export function validateCodeReference(value) {
32
+ const result = codeReferenceSchema.parse(value);
33
+ const symbols = new Map();
34
+ for (const symbol of result.symbols) {
35
+ if (symbols.has(symbol.id))
36
+ throw new Error(`Duplicate code symbol ${symbol.id}`);
37
+ symbols.set(symbol.id, symbol);
38
+ }
39
+ const complete = new Set();
40
+ for (const symbol of result.symbols) {
41
+ for (const target of [symbol.parent, ...symbol.seeAlso ?? [], ...Object.values(symbol.typeReferences ?? {})])
42
+ if (target && !symbols.has(target))
43
+ throw new Error(`${symbol.id}: unknown code symbol ${target}`);
44
+ const seen = new Set([symbol.id]);
45
+ let parent = symbol.parent;
46
+ while (parent && !complete.has(parent)) {
47
+ if (seen.has(parent))
48
+ throw new Error(`${symbol.id}: cyclic symbol ownership`);
49
+ seen.add(parent);
50
+ parent = symbols.get(parent)?.parent;
51
+ }
52
+ for (const id of seen)
53
+ complete.add(id);
54
+ }
55
+ return result;
56
+ }
57
+ export async function readCodeReference(file, root) {
58
+ const canonical = await realpath(file);
59
+ if (root) {
60
+ const base = await realpath(root);
61
+ if (canonical !== base && !canonical.startsWith(base + path.sep))
62
+ throw new Error('Code reference source escapes the project root');
63
+ }
64
+ if (canonical.split(path.sep).some(part => /^\.env(?:\.|$)|^\.git$|\.(?:local|override)\.md$/i.test(part)))
65
+ throw new Error('Private local files cannot be code reference sources');
66
+ const info = await stat(canonical);
67
+ if (!info.isFile() || info.size > 32 * 1024 * 1024)
68
+ throw new Error('Code reference source must be a regular JSON file at most 32 MiB');
69
+ const bytes = await readFile(canonical);
70
+ if (bytes.length > 32 * 1024 * 1024)
71
+ throw new Error('Code reference source exceeds 32 MiB');
72
+ return validateCodeReference(JSON.parse(bytes.toString('utf8')));
73
+ }
@@ -0,0 +1,23 @@
1
+ import { type CodeReference } from './code-reference-model.js';
2
+ import { type loadConfig } from './config.js';
3
+ import { type ReaderFiltersConfig, type ReaderSelection } from './reader-filters.js';
4
+ import { type Document, type Variant } from './content-source.js';
5
+ import type { AuthoredPublicationConfig, AuthoredPublicationPlan } from './publication-plan.js';
6
+ export declare function codeDocumentId(catalog: string, symbol: string): string;
7
+ export declare function materializeCodeReferences(input: {
8
+ config: AuthoredPublicationConfig & {
9
+ codeReferences?: unknown;
10
+ };
11
+ loaded: Awaited<ReturnType<typeof loadConfig>>;
12
+ plan: AuthoredPublicationPlan;
13
+ base: string;
14
+ basePath: string;
15
+ variants: Variant[];
16
+ language: string;
17
+ readerFilters?: ReaderFiltersConfig;
18
+ contentFilter?: ReaderSelection;
19
+ dependencies: Set<string>;
20
+ allowRouteCollisions?: boolean;
21
+ }): Promise<void>;
22
+ /** Imported prose is inert Markdown; it never enters MDX or project directive expansion. */
23
+ export declare function renderCodeReference(reference: CodeReference, doc: Document, documents: Map<string, Document>): any;