@shoalrun/cli 0.1.0-beta.1 → 1.1.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 (483) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/CODE-REFERENCES.md +156 -0
  3. package/README.md +18 -6
  4. package/adapters/python/requirements.txt +1 -0
  5. package/adapters/python/shoalrun_reference.py +234 -0
  6. package/adapters/typescript/README.md +27 -0
  7. package/adapters/typescript/shoalrun-reference.mjs +260 -0
  8. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +6 -2
  9. package/agent-docs/SNAPSHOT.json +5 -5
  10. package/agent-docs/about.md +3 -3
  11. package/agent-docs/api-docs/code-reference-settings.md +160 -0
  12. package/agent-docs/api-docs/code-reference-settings.sections/catalog-settings.md +50 -0
  13. package/agent-docs/api-docs/code-reference-settings.sections/complete-reference-page.md +46 -0
  14. package/agent-docs/api-docs/code-reference-settings.sections/converter-snapshot.md +58 -0
  15. package/agent-docs/api-docs/code-reference-settings.sections/descriptions-type-links-and-source-links.md +40 -0
  16. package/agent-docs/api-docs/code-reference-settings.sections/html-markdown-and-agents.md +38 -0
  17. package/agent-docs/api-docs/code-reference-settings.sections/metadata-and-selection.md +38 -0
  18. package/agent-docs/api-docs/code-reference-settings.sections/publication-sources.md +54 -0
  19. package/agent-docs/api-docs/code-reference-settings.sections/python-adapter-limits.md +38 -0
  20. package/agent-docs/api-docs/code-reference-settings.sections/related-reading.md +32 -0
  21. package/agent-docs/api-docs/code-reference-settings.sections/symbol-fields.md +56 -0
  22. package/agent-docs/api-docs/code-references.md +151 -0
  23. package/agent-docs/api-docs/code-references.sections/a-real-typescript-example.md +38 -0
  24. package/agent-docs/api-docs/code-references.sections/add-python-source.md +56 -0
  25. package/agent-docs/api-docs/code-references.sections/before-you-start.md +40 -0
  26. package/agent-docs/api-docs/code-references.sections/build-and-verify.md +47 -0
  27. package/agent-docs/api-docs/code-references.sections/choose-the-reading-layout.md +46 -0
  28. package/agent-docs/api-docs/code-references.sections/extract-and-validate-a-snapshot.md +52 -0
  29. package/agent-docs/api-docs/code-references.sections/html-markdown-and-agents.md +42 -0
  30. package/agent-docs/api-docs/code-references.sections/register-the-catalog-and-navigation.md +58 -0
  31. package/agent-docs/api-docs/code-references.sections/related-reading.md +40 -0
  32. package/agent-docs/api-docs/code-references.sections/versions-profiles-and-delivery.md +40 -0
  33. package/agent-docs/api-docs/typescript-references.md +93 -0
  34. package/agent-docs/author/agent-overview.md +2 -2
  35. package/agent-docs/author/components/for-facet.md +127 -0
  36. package/agent-docs/author/components/only.md +3 -1
  37. package/agent-docs/author/components.md +2 -1
  38. package/agent-docs/author/reader-views.md +2 -2
  39. package/agent-docs/author/reader-views.sections/configure-the-choices.md +2 -2
  40. package/agent-docs/author/reader-views.sections/connect-your-own-control.md +2 -2
  41. package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +2 -2
  42. package/agent-docs/author/reader-views.sections/mark-pages.md +2 -2
  43. package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +2 -2
  44. package/agent-docs/author/reader-views.sections/place-filter-controls.md +2 -2
  45. package/agent-docs/author/reader-views.sections/try-the-controls-here.md +2 -2
  46. package/agent-docs/changelog/code-api-references.md +44 -0
  47. package/agent-docs/changelog/facet-typescript.md +54 -0
  48. package/agent-docs/changelog.md +17 -1
  49. package/agent-docs/cli.md +11 -1
  50. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +1 -1
  51. package/agent-docs/cli.sections/author-pages.md +1 -1
  52. package/agent-docs/cli.sections/build-and-serve.md +1 -1
  53. package/agent-docs/cli.sections/inspect-config-and-operations.md +1 -1
  54. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +1 -1
  55. package/agent-docs/cli.sections/related-reading.md +1 -1
  56. package/agent-docs/cli.sections/search-and-chat.md +1 -1
  57. package/agent-docs/cli.sections/start-a-project.md +1 -1
  58. package/agent-docs/cli.sections/validate-code-reference-snapshots.md +41 -0
  59. package/agent-docs/cli.sections/working-tree-authoring-tools.md +1 -1
  60. package/agent-docs/config/apis.md +5 -1
  61. package/agent-docs/config/examples.md +3 -3
  62. package/agent-docs/config/examples.sections/feature-showcase.md +3 -3
  63. package/agent-docs/config/examples.sections/minimal-site.md +2 -2
  64. package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
  65. package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
  66. package/agent-docs/config/examples.sections/related-reading.md +2 -2
  67. package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
  68. package/agent-docs/config/outputs.md +12 -12
  69. package/agent-docs/config/outputs.sections/exports.md +12 -12
  70. package/agent-docs/config/outputs.sections/metadata.md +1 -1
  71. package/agent-docs/config/outputs.sections/pdf-output.md +1 -1
  72. package/agent-docs/config/outputs.sections/related-reading.md +1 -1
  73. package/agent-docs/config/site.md +17 -17
  74. package/agent-docs/config/site.sections/related-reading.md +1 -1
  75. package/agent-docs/config/site.sections/theme.md +1 -1
  76. package/agent-docs/config.md +2 -2
  77. package/agent-docs/configuration.md +2 -2
  78. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
  79. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +1 -1
  80. package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
  81. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +1 -1
  82. package/agent-docs/configuration.sections/related-reading.md +1 -1
  83. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +1 -1
  84. package/agent-docs/configuration.sections/share-defaults-through-extends.md +1 -1
  85. package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
  86. package/agent-docs/configuration.sections/understand-the-three-stages.md +1 -1
  87. package/agent-docs/configuration.sections/understand-where-paths-point.md +1 -1
  88. package/agent-docs/content-delivery/api.md +10 -2
  89. package/agent-docs/content-delivery/api.sections/errors.md +52 -0
  90. package/agent-docs/content-delivery/api.sections/generated-typescript-reference.md +36 -0
  91. package/agent-docs/content-delivery/api.sections/html-markdown-and-agents.md +36 -0
  92. package/agent-docs/content-delivery/api.sections/mount-html.md +42 -0
  93. package/agent-docs/content-delivery/api.sections/open-a-rest-source.md +55 -0
  94. package/agent-docs/content-delivery/api.sections/open-a-source.md +51 -0
  95. package/agent-docs/content-delivery/api.sections/read-a-snapshot.md +55 -0
  96. package/agent-docs/content-delivery/api.sections/related-reading.md +42 -0
  97. package/agent-docs/content-delivery/api.sections/validate-a-manifest.md +40 -0
  98. package/agent-docs/content-delivery/client.md +9 -1
  99. package/agent-docs/content-delivery/sdk/all.md +1772 -0
  100. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-exportedid.md +34 -0
  101. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-id.md +34 -0
  102. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor-title.md +34 -0
  103. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentanchor.md +44 -0
  104. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentasset-mediatype.md +34 -0
  105. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentasset.md +40 -0
  106. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliveryerror-code.md +34 -0
  107. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliveryerror.md +46 -0
  108. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-manifestbytes.md +36 -0
  109. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-resourcebytes.md +36 -0
  110. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits-resources.md +36 -0
  111. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentdeliverylimits.md +44 -0
  112. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contenterrorcode.md +32 -0
  113. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-bytes.md +34 -0
  114. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-digest.md +34 -0
  115. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile-path.md +34 -0
  116. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentfile.md +44 -0
  117. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentformat.md +32 -0
  118. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-asset.md +34 -0
  119. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-fragment.md +34 -0
  120. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-href.md +34 -0
  121. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-key.md +34 -0
  122. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-kind.md +34 -0
  123. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-query.md +34 -0
  124. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink-ref.md +34 -0
  125. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentlink.md +52 -0
  126. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-assets.md +34 -0
  127. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-diagnostics.md +34 -0
  128. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-digest.md +34 -0
  129. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-files.md +34 -0
  130. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-kind.md +34 -0
  131. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-publication.md +34 -0
  132. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-publicbase.md +34 -0
  133. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-resources.md +34 -0
  134. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-review.md +34 -0
  135. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest-schemaversion.md +34 -0
  136. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmanifest.md +68 -0
  137. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-anchors.md +36 -0
  138. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-links.md +36 -0
  139. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount-unmount.md +36 -0
  140. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentmount.md +49 -0
  141. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-channel.md +34 -0
  142. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-language.md +34 -0
  143. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-product.md +34 -0
  144. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication-version.md +34 -0
  145. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentpublication.md +46 -0
  146. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentref.md +43 -0
  147. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrefkey.md +42 -0
  148. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation-anchors.md +34 -0
  149. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation-links.md +34 -0
  150. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrepresentation.md +42 -0
  151. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-assets.md +34 -0
  152. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-canonicalurl.md +34 -0
  153. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-externaldependencies.md +34 -0
  154. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-publication.md +36 -0
  155. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-ref.md +36 -0
  156. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-representations.md +36 -0
  157. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-source.md +34 -0
  158. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-summary.md +36 -0
  159. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-title.md +36 -0
  160. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource-type.md +36 -0
  161. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresource.md +65 -0
  162. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresourcekey.md +42 -0
  163. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry-key.md +34 -0
  164. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry-resource.md +34 -0
  165. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestentry.md +42 -0
  166. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterror-error.md +34 -0
  167. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterror.md +43 -0
  168. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresterrorcode.md +32 -0
  169. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-publication.md +34 -0
  170. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-resources.md +34 -0
  171. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-revision.md +34 -0
  172. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist-schemaversion.md +34 -0
  173. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestlist.md +46 -0
  174. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-key.md +34 -0
  175. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-publication.md +34 -0
  176. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-resource.md +34 -0
  177. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-revision.md +34 -0
  178. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource-schemaversion.md +34 -0
  179. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentrestresource.md +48 -0
  180. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-content.md +36 -0
  181. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-format.md +36 -0
  182. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-representation.md +36 -0
  183. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-resource.md +36 -0
  184. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult-revision.md +36 -0
  185. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentresult.md +48 -0
  186. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-dispose.md +36 -0
  187. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-get.md +45 -0
  188. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-list.md +38 -0
  189. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-publication.md +36 -0
  190. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot-revision.md +36 -0
  191. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-contentsnapshot.md +47 -0
  192. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-fetch.md +36 -0
  193. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-limits.md +36 -0
  194. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-manifesturl.md +36 -0
  195. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions-signal.md +36 -0
  196. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-manifestcontentsourceoptions.md +46 -0
  197. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-mountcontent.md +48 -0
  198. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-openmanifestcontentsource.md +54 -0
  199. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-openrestcontentsource.md +44 -0
  200. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-baseurl.md +36 -0
  201. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-fetch.md +36 -0
  202. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-limits.md +36 -0
  203. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-publication.md +36 -0
  204. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-revision.md +36 -0
  205. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions-signal.md +36 -0
  206. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-restcontentsourceoptions.md +50 -0
  207. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content-validatecontentmanifest.md +45 -0
  208. package/agent-docs/content-delivery/sdk/all.sections/shoalrun-content.md +65 -0
  209. package/agent-docs/content-delivery/sdk/content-anchor/exported-id.md +25 -0
  210. package/agent-docs/content-delivery/sdk/content-anchor/id.md +25 -0
  211. package/agent-docs/content-delivery/sdk/content-anchor/title.md +25 -0
  212. package/agent-docs/content-delivery/sdk/content-anchor.md +71 -0
  213. package/agent-docs/content-delivery/sdk/content-asset/media-type.md +25 -0
  214. package/agent-docs/content-delivery/sdk/content-asset.md +43 -0
  215. package/agent-docs/content-delivery/sdk/content-delivery-error/code.md +25 -0
  216. package/agent-docs/content-delivery/sdk/content-delivery-error.md +53 -0
  217. package/agent-docs/content-delivery/sdk/content-delivery-limits/manifest-bytes.md +27 -0
  218. package/agent-docs/content-delivery/sdk/content-delivery-limits/resource-bytes.md +27 -0
  219. package/agent-docs/content-delivery/sdk/content-delivery-limits/resources.md +27 -0
  220. package/agent-docs/content-delivery/sdk/content-delivery-limits.md +77 -0
  221. package/agent-docs/content-delivery/sdk/content-error-code.md +23 -0
  222. package/agent-docs/content-delivery/sdk/content-file/bytes.md +25 -0
  223. package/agent-docs/content-delivery/sdk/content-file/digest.md +25 -0
  224. package/agent-docs/content-delivery/sdk/content-file/path.md +25 -0
  225. package/agent-docs/content-delivery/sdk/content-file.md +71 -0
  226. package/agent-docs/content-delivery/sdk/content-format.md +23 -0
  227. package/agent-docs/content-delivery/sdk/content-link/asset.md +25 -0
  228. package/agent-docs/content-delivery/sdk/content-link/fragment.md +25 -0
  229. package/agent-docs/content-delivery/sdk/content-link/href.md +25 -0
  230. package/agent-docs/content-delivery/sdk/content-link/key.md +25 -0
  231. package/agent-docs/content-delivery/sdk/content-link/kind.md +25 -0
  232. package/agent-docs/content-delivery/sdk/content-link/query.md +25 -0
  233. package/agent-docs/content-delivery/sdk/content-link/ref.md +25 -0
  234. package/agent-docs/content-delivery/sdk/content-link.md +127 -0
  235. package/agent-docs/content-delivery/sdk/content-manifest/assets.md +25 -0
  236. package/agent-docs/content-delivery/sdk/content-manifest/diagnostics.md +25 -0
  237. package/agent-docs/content-delivery/sdk/content-manifest/digest.md +25 -0
  238. package/agent-docs/content-delivery/sdk/content-manifest/files.md +25 -0
  239. package/agent-docs/content-delivery/sdk/content-manifest/kind.md +25 -0
  240. package/agent-docs/content-delivery/sdk/content-manifest/public-base.md +25 -0
  241. package/agent-docs/content-delivery/sdk/content-manifest/publication.md +25 -0
  242. package/agent-docs/content-delivery/sdk/content-manifest/resources.md +25 -0
  243. package/agent-docs/content-delivery/sdk/content-manifest/review.md +25 -0
  244. package/agent-docs/content-delivery/sdk/content-manifest/schema-version.md +25 -0
  245. package/agent-docs/content-delivery/sdk/content-manifest.md +179 -0
  246. package/agent-docs/content-delivery/sdk/content-mount/anchors.md +27 -0
  247. package/agent-docs/content-delivery/sdk/content-mount/links.md +27 -0
  248. package/agent-docs/content-delivery/sdk/content-mount/unmount.md +27 -0
  249. package/agent-docs/content-delivery/sdk/content-mount.md +82 -0
  250. package/agent-docs/content-delivery/sdk/content-publication/channel.md +25 -0
  251. package/agent-docs/content-delivery/sdk/content-publication/language.md +25 -0
  252. package/agent-docs/content-delivery/sdk/content-publication/product.md +25 -0
  253. package/agent-docs/content-delivery/sdk/content-publication/version.md +25 -0
  254. package/agent-docs/content-delivery/sdk/content-publication.md +85 -0
  255. package/agent-docs/content-delivery/sdk/content-ref-key.md +34 -0
  256. package/agent-docs/content-delivery/sdk/content-ref.md +40 -0
  257. package/agent-docs/content-delivery/sdk/content-representation/anchors.md +25 -0
  258. package/agent-docs/content-delivery/sdk/content-representation/links.md +25 -0
  259. package/agent-docs/content-delivery/sdk/content-representation.md +57 -0
  260. package/agent-docs/content-delivery/sdk/content-resource/assets.md +25 -0
  261. package/agent-docs/content-delivery/sdk/content-resource/canonical-url.md +25 -0
  262. package/agent-docs/content-delivery/sdk/content-resource/external-dependencies.md +25 -0
  263. package/agent-docs/content-delivery/sdk/content-resource/publication.md +27 -0
  264. package/agent-docs/content-delivery/sdk/content-resource/ref.md +27 -0
  265. package/agent-docs/content-delivery/sdk/content-resource/representations.md +27 -0
  266. package/agent-docs/content-delivery/sdk/content-resource/source.md +25 -0
  267. package/agent-docs/content-delivery/sdk/content-resource/summary.md +27 -0
  268. package/agent-docs/content-delivery/sdk/content-resource/title.md +27 -0
  269. package/agent-docs/content-delivery/sdk/content-resource/type.md +27 -0
  270. package/agent-docs/content-delivery/sdk/content-resource-key.md +34 -0
  271. package/agent-docs/content-delivery/sdk/content-resource.md +192 -0
  272. package/agent-docs/content-delivery/sdk/content-rest-entry/key.md +25 -0
  273. package/agent-docs/content-delivery/sdk/content-rest-entry/resource.md +25 -0
  274. package/agent-docs/content-delivery/sdk/content-rest-entry.md +57 -0
  275. package/agent-docs/content-delivery/sdk/content-rest-error/error.md +25 -0
  276. package/agent-docs/content-delivery/sdk/content-rest-error-code.md +23 -0
  277. package/agent-docs/content-delivery/sdk/content-rest-error.md +46 -0
  278. package/agent-docs/content-delivery/sdk/content-rest-list/publication.md +25 -0
  279. package/agent-docs/content-delivery/sdk/content-rest-list/resources.md +25 -0
  280. package/agent-docs/content-delivery/sdk/content-rest-list/revision.md +25 -0
  281. package/agent-docs/content-delivery/sdk/content-rest-list/schema-version.md +25 -0
  282. package/agent-docs/content-delivery/sdk/content-rest-list.md +85 -0
  283. package/agent-docs/content-delivery/sdk/content-rest-resource/key.md +25 -0
  284. package/agent-docs/content-delivery/sdk/content-rest-resource/publication.md +25 -0
  285. package/agent-docs/content-delivery/sdk/content-rest-resource/resource.md +25 -0
  286. package/agent-docs/content-delivery/sdk/content-rest-resource/revision.md +25 -0
  287. package/agent-docs/content-delivery/sdk/content-rest-resource/schema-version.md +25 -0
  288. package/agent-docs/content-delivery/sdk/content-rest-resource.md +99 -0
  289. package/agent-docs/content-delivery/sdk/content-result/content.md +27 -0
  290. package/agent-docs/content-delivery/sdk/content-result/format.md +27 -0
  291. package/agent-docs/content-delivery/sdk/content-result/representation.md +27 -0
  292. package/agent-docs/content-delivery/sdk/content-result/resource.md +27 -0
  293. package/agent-docs/content-delivery/sdk/content-result/revision.md +27 -0
  294. package/agent-docs/content-delivery/sdk/content-result.md +114 -0
  295. package/agent-docs/content-delivery/sdk/content-snapshot/dispose.md +27 -0
  296. package/agent-docs/content-delivery/sdk/content-snapshot/get.md +36 -0
  297. package/agent-docs/content-delivery/sdk/content-snapshot/list.md +29 -0
  298. package/agent-docs/content-delivery/sdk/content-snapshot/publication.md +27 -0
  299. package/agent-docs/content-delivery/sdk/content-snapshot/revision.md +27 -0
  300. package/agent-docs/content-delivery/sdk/content-snapshot.md +123 -0
  301. package/agent-docs/content-delivery/sdk/exports.md +742 -0
  302. package/agent-docs/content-delivery/sdk/exports.sections/functions.md +30 -0
  303. package/agent-docs/content-delivery/sdk/exports.sections/members.md +47 -0
  304. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentanchor.md +41 -0
  305. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentasset.md +37 -0
  306. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentdeliveryerror.md +43 -0
  307. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentdeliverylimits.md +41 -0
  308. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contenterrorcode.md +29 -0
  309. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentfile.md +41 -0
  310. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentformat.md +29 -0
  311. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentlink.md +49 -0
  312. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentmanifest.md +65 -0
  313. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentmount.md +46 -0
  314. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentpublication.md +43 -0
  315. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentref.md +40 -0
  316. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrefkey.md +39 -0
  317. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrepresentation.md +39 -0
  318. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresource.md +62 -0
  319. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresourcekey.md +39 -0
  320. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestentry.md +39 -0
  321. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresterror.md +40 -0
  322. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresterrorcode.md +29 -0
  323. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestlist.md +43 -0
  324. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentrestresource.md +45 -0
  325. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentresult.md +45 -0
  326. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-contentsnapshot.md +44 -0
  327. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-manifestcontentsourceoptions.md +43 -0
  328. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-mountcontent.md +45 -0
  329. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-openmanifestcontentsource.md +51 -0
  330. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-openrestcontentsource.md +41 -0
  331. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-restcontentsourceoptions.md +47 -0
  332. package/agent-docs/content-delivery/sdk/exports.sections/shoalrun-content-validatecontentmanifest.md +42 -0
  333. package/agent-docs/content-delivery/sdk/manifest-content-source-options/fetch.md +27 -0
  334. package/agent-docs/content-delivery/sdk/manifest-content-source-options/limits.md +27 -0
  335. package/agent-docs/content-delivery/sdk/manifest-content-source-options/manifest-url.md +27 -0
  336. package/agent-docs/content-delivery/sdk/manifest-content-source-options/signal.md +27 -0
  337. package/agent-docs/content-delivery/sdk/manifest-content-source-options.md +93 -0
  338. package/agent-docs/content-delivery/sdk/mount-content.md +46 -0
  339. package/agent-docs/content-delivery/sdk/open-manifest-content-source.md +51 -0
  340. package/agent-docs/content-delivery/sdk/open-rest-content-source.md +39 -0
  341. package/agent-docs/content-delivery/sdk/rest-content-source-options/base-url.md +28 -0
  342. package/agent-docs/content-delivery/sdk/rest-content-source-options/fetch.md +27 -0
  343. package/agent-docs/content-delivery/sdk/rest-content-source-options/limits.md +27 -0
  344. package/agent-docs/content-delivery/sdk/rest-content-source-options/publication.md +27 -0
  345. package/agent-docs/content-delivery/sdk/rest-content-source-options/revision.md +27 -0
  346. package/agent-docs/content-delivery/sdk/rest-content-source-options/signal.md +27 -0
  347. package/agent-docs/content-delivery/sdk/rest-content-source-options.md +125 -0
  348. package/agent-docs/content-delivery/sdk/validate-content-manifest.md +38 -0
  349. package/agent-docs/contribute/agent-skills.md +33 -6
  350. package/agent-docs/documents.json +7710 -530
  351. package/agent-docs/features.md +20 -18
  352. package/agent-docs/provenance.json +6 -6
  353. package/agent-docs/publish/api-references.md +3 -1
  354. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +3 -1
  355. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -1
  356. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +3 -1
  357. package/agent-docs/publish/api-references.sections/next-steps.md +3 -1
  358. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +3 -1
  359. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +3 -1
  360. package/agent-docs/publish/api-references.sections/register-the-operation.md +3 -1
  361. package/agent-docs/publish/api-references.sections/related-reading.md +3 -1
  362. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -1
  363. package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -1
  364. package/agent-docs/publish/content-export.md +3 -1
  365. package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +1 -1
  366. package/agent-docs/publish/content-export.sections/check-the-result.md +1 -1
  367. package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +1 -1
  368. package/agent-docs/publish/content-export.sections/prerequisites.md +1 -1
  369. package/agent-docs/publish/content-export.sections/related-reading.md +1 -1
  370. package/agent-docs/publish/content-export.sections/review-exported-api-material.md +1 -1
  371. package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +1 -1
  372. package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +1 -1
  373. package/agent-docs/publish/pdf.md +2 -2
  374. package/agent-docs/publish/pdf.sections/apply-print-styling.md +1 -1
  375. package/agent-docs/publish/pdf.sections/check-the-result.md +1 -1
  376. package/agent-docs/publish/pdf.sections/export-a-page-or-publication.md +2 -2
  377. package/agent-docs/publish/pdf.sections/html-markdown-and-agents.md +1 -1
  378. package/agent-docs/publish/pdf.sections/offer-browser-page-printing.md +1 -1
  379. package/agent-docs/publish/pdf.sections/offer-direct-downloads-through-a-node-server.md +1 -1
  380. package/agent-docs/publish/pdf.sections/prerequisites.md +1 -1
  381. package/agent-docs/publish/pdf.sections/publish-an-optional-manual-download.md +1 -1
  382. package/agent-docs/publish/single-source-sites.md +26 -2
  383. package/agent-docs/publish/single-source-sites.sections/build-and-check-each-output.md +49 -0
  384. package/agent-docs/publish/single-source-sites.sections/html-markdown-and-agents.md +33 -0
  385. package/agent-docs/publish/single-source-sites.sections/include-additional-sections-in-a-build.md +47 -0
  386. package/agent-docs/publish/single-source-sites.sections/related-reading.md +43 -0
  387. package/agent-docs/publish/single-source-sites.sections/select-the-pages-for-each-site.md +74 -0
  388. package/agent-docs/publish/single-source-sites.sections/share-the-base-configuration.md +93 -0
  389. package/agent-docs/reference/agent-skills.md +2 -2
  390. package/agent-docs/search-index.json +1 -1
  391. package/agent-docs/start.md +3 -3
  392. package/agent-docs/start.sections/add-the-page-to-navigation.md +2 -2
  393. package/agent-docs/start.sections/build-and-check-both-outputs.md +2 -2
  394. package/agent-docs/start.sections/build-this-site.md +2 -2
  395. package/agent-docs/start.sections/check-writing-style.md +2 -2
  396. package/agent-docs/start.sections/create-a-page.md +2 -2
  397. package/agent-docs/start.sections/make-it-yours.md +2 -2
  398. package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
  399. package/agent-docs/start.sections/prerequisites.md +2 -2
  400. package/agent-docs/start.sections/related-reading.md +2 -2
  401. package/agent-docs/start.sections/start-your-own-project.md +3 -3
  402. package/agent-docs/status.md +6 -4
  403. package/agent-docs/styling/themes.md +7 -3
  404. package/agent-docs/what-is-shoalrun.md +2 -2
  405. package/assets/search-lexical.js +15 -4
  406. package/dist/artifact-bundle.d.ts +1 -0
  407. package/dist/artifact-bundle.js +11 -3
  408. package/dist/cli-discovery.d.ts +1 -1
  409. package/dist/cli-discovery.js +1 -0
  410. package/dist/cli.js +7 -0
  411. package/dist/code-reference-model.d.ts +85 -0
  412. package/dist/code-reference-model.js +73 -0
  413. package/dist/code-references.d.ts +23 -0
  414. package/dist/code-references.js +371 -0
  415. package/dist/compiler-config.d.ts +1 -0
  416. package/dist/compiler.d.ts +8 -0
  417. package/dist/compiler.js +14 -7
  418. package/dist/component-names.js +1 -1
  419. package/dist/component-transform.js +14 -22
  420. package/dist/conditional-tree.d.ts +2 -0
  421. package/dist/conditional-tree.js +14 -0
  422. package/dist/config.js +1 -1
  423. package/dist/content-delivery-contract.d.ts +39 -0
  424. package/dist/content-delivery-contract.js +2 -0
  425. package/dist/content-delivery-validation.d.ts +6 -0
  426. package/dist/content-delivery-validation.js +6 -0
  427. package/dist/content-delivery.d.ts +19 -1
  428. package/dist/content-delivery.js +10 -1
  429. package/dist/content-export-command.d.ts +42 -3
  430. package/dist/content-export.d.ts +42 -3
  431. package/dist/content-export.js +15 -6
  432. package/dist/content-filter.d.ts +2 -0
  433. package/dist/content-filter.js +4 -0
  434. package/dist/content-mount.d.ts +12 -1
  435. package/dist/content-mount.js +8 -1
  436. package/dist/content-rest-client.d.ts +11 -1
  437. package/dist/content-rest-client.js +4 -1
  438. package/dist/content-rest-contract.d.ts +5 -0
  439. package/dist/content-source.d.ts +2 -0
  440. package/dist/content-workspace.d.ts +5 -1
  441. package/dist/content-workspace.js +7 -2
  442. package/dist/deployment-profile.d.ts +3 -1
  443. package/dist/deployment-profile.js +18 -19
  444. package/dist/fonts.d.ts +9 -0
  445. package/dist/fonts.js +58 -3
  446. package/dist/page-materialization.js +3 -2
  447. package/dist/page-renderer.d.ts +1 -0
  448. package/dist/page-renderer.js +3 -1
  449. package/dist/palettes.d.ts +1 -1
  450. package/dist/publication-manifest.js +1 -1
  451. package/dist/publication-render.d.ts +2 -1
  452. package/dist/publication-render.js +2 -2
  453. package/dist/representation-tree.js +12 -2
  454. package/dist/search-query.js +13 -6
  455. package/dist/section-selection.d.ts +29 -0
  456. package/dist/section-selection.js +92 -0
  457. package/dist/snippets.d.ts +1 -0
  458. package/example-configs/facet-sections/README.md +37 -0
  459. package/example-configs/facet-sections/base.yaml +29 -0
  460. package/example-configs/facet-sections/content/billing.mdx +25 -0
  461. package/example-configs/facet-sections/customer.config.yaml +4 -0
  462. package/example-configs/facet-sections/docs.config.yaml +3 -0
  463. package/example-configs/faceted-sites/README.md +4 -2
  464. package/examples/code-references/content/start.md +53 -0
  465. package/examples/code-references/docs.config.yaml +262 -0
  466. package/examples/code-references/python/orchard/__init__.py +11 -0
  467. package/examples/code-references/python/orchard/client.py +212 -0
  468. package/examples/code-references/python/orchard/errors.py +31 -0
  469. package/examples/code-references/python/orchard/models.py +69 -0
  470. package/examples/code-references/python/orchard/pagination.py +39 -0
  471. package/examples/code-references/reference.json +1244 -0
  472. package/package.json +9 -1
  473. package/schemas/code-reference.schema.json +306 -0
  474. package/skills/shoalrun-author/SKILL.md +17 -0
  475. package/skills/shoalrun-author/references/code-api-references.md +19 -0
  476. package/skills/shoalrun-author/references/facet-selection.md +48 -0
  477. package/skills/shoalrun-brand/SKILL.md +9 -0
  478. package/skills/shoalrun-component-author/SKILL.md +9 -0
  479. package/skills/shoalrun-pdf/SKILL.md +9 -0
  480. package/skills/shoalrun-recipes/SKILL.md +9 -0
  481. package/skills/shoalrun-setup/SKILL.md +9 -0
  482. package/skills/shoalrun-walkthrough/SKILL.md +9 -0
  483. package/styles/site.css +61 -2
@@ -0,0 +1,371 @@
1
+ import path from 'node:path';
2
+ import { createHash } from 'node:crypto';
3
+ import { z } from 'zod';
4
+ import { renderHtmlWithHeadings } from './html-renderer.js';
5
+ import { readCodeReference } from './code-reference-model.js';
6
+ import { explainSegments } from './config.js';
7
+ import { resolvePublication } from './compiler-config.js';
8
+ import { resolveFrontmatter, validateFrontmatter, applyFormattingLocale } from './frontmatter.js';
9
+ import { matchesFeatures, validateFeatureClassification } from './deployment-profile.js';
10
+ import { pageReaderFilters } from './reader-filters.js';
11
+ import { matchesContentFilter } from './content-filter.js';
12
+ import { documentKey } from './publication-identity.js';
13
+ import { routeFor, markdownRoute } from './content-source.js';
14
+ import { heading, paragraph, text, parsePlainMarkdown, root } from './semantic-markdown.js';
15
+ const mapping = z.record(z.string(), z.unknown());
16
+ const source = z.object({ kind: z.literal('file'), path: z.string().min(1) }).strict();
17
+ const override = z.object({ documentId: z.string().min(1).optional(), slug: z.string().startsWith('/').optional(), metadata: mapping.optional() }).strict();
18
+ const catalogSchema = z.object({
19
+ source: source.optional(),
20
+ sourceLink: z.object({ baseUrl: z.string().url().refine(value => { const url = new URL(value); return url.protocol === 'https:' && !url.username && !url.password && !url.search && !url.hash; }, 'Source links need an HTTPS base URL without credentials, query or fragment') }).strict().optional(),
21
+ publications: z.array(z.object({ product: z.string().optional(), channel: z.string(), version: z.string(), language: z.string().optional(), source }).strict()).min(1).optional(),
22
+ layout: z.enum(['symbols', 'classes', 'modules']).default('symbols'),
23
+ singlePage: z.union([z.literal(false), z.object({ documentId: z.string().min(1).optional(), slug: z.string().startsWith('/').optional(), title: z.string().min(1).default('Complete API reference'), summary: z.string().min(1).default('Classes, functions, and fields in this publication.'), metadata: mapping.optional() }).strict()]).optional(),
24
+ pathPrefix: z.string().regex(/^\/[a-zA-Z0-9_/-]+$/).default('/reference/code'),
25
+ metadata: mapping.optional(),
26
+ include: z.array(z.string()).optional(), exclude: z.array(z.string()).optional(),
27
+ symbols: z.record(z.string(), override).optional()
28
+ }).strict().refine(value => !!value.source !== !!value.publications, 'Declare source or publications');
29
+ const hash = (value) => createHash('sha256').update(value).digest('hex').slice(0, 16);
30
+ export function codeDocumentId(catalog, symbol) { return `reference.${catalog}.${/^[A-Za-z0-9_.-]+$/.test(symbol) ? symbol : hash(symbol)}`; }
31
+ export async function materializeCodeReferences(input) {
32
+ const { config, loaded, plan, base, basePath, variants, language, readerFilters, contentFilter, dependencies } = input;
33
+ if (config.codeReferences === undefined)
34
+ return;
35
+ const catalogs = z.record(z.string().regex(/^[a-z][a-z0-9-]*$/), catalogSchema).parse(config.codeReferences);
36
+ const owners = new Map([...plan.knownDocumentIds].map(id => [id, 'authored']));
37
+ for (const [catalogId, catalog] of Object.entries(catalogs)) {
38
+ const bindings = catalog.publications ?? [{ ...resolvePublication(config.publications, config.publications.defaults ?? {}, language), source: catalog.source }];
39
+ const seenPublications = new Set();
40
+ for (const [index, binding] of bindings.entries()) {
41
+ const variant = resolvePublication(config.publications, binding, language);
42
+ const identity = documentKey(catalogId, variant);
43
+ if (seenPublications.has(identity))
44
+ throw new Error(`Duplicate code reference publication ${identity}`);
45
+ seenPublications.add(identity);
46
+ const segments = ['codeReferences', catalogId, ...(catalog.publications ? ['publications', String(index)] : []), 'source', 'path'];
47
+ const owner = explainSegments(loaded, segments).source.file;
48
+ if (path.isAbsolute(binding.source.path) || /^[a-z][a-z0-9+.-]*:/i.test(binding.source.path))
49
+ throw new Error('Code reference sources need local relative paths');
50
+ const file = path.resolve(path.dirname(owner), binding.source.path);
51
+ dependencies.add(file);
52
+ const snapshot = await readCodeReference(file, base);
53
+ const symbols = new Map(snapshot.symbols.map(symbol => [symbol.id, symbol]));
54
+ for (const name of [...catalog.include ?? [], ...catalog.exclude ?? [], ...Object.keys(catalog.symbols ?? {})])
55
+ if (!symbols.has(name))
56
+ throw new Error(`Code reference ${catalogId}: unknown selected symbol ${name}`);
57
+ const visibility = new Map();
58
+ for (const symbol of snapshot.symbols) {
59
+ const chain = [];
60
+ let ancestor = symbol;
61
+ while (ancestor && !visibility.has(ancestor.id)) {
62
+ chain.push(ancestor);
63
+ ancestor = ancestor.parent ? symbols.get(ancestor.parent) : undefined;
64
+ }
65
+ let visible = ancestor ? visibility.get(ancestor.id) : true;
66
+ for (const entry of chain.reverse()) {
67
+ visible = visible && entry.visibility === 'public';
68
+ visibility.set(entry.id, visible);
69
+ }
70
+ }
71
+ for (const symbol of snapshot.symbols) {
72
+ const selected = visibility.get(symbol.id) && (!catalog.include || catalog.include.includes(symbol.id)) && !catalog.exclude?.includes(symbol.id);
73
+ const setting = catalog.symbols?.[symbol.id];
74
+ const inherited = { ...catalog.metadata };
75
+ if (setting?.metadata && (Object.hasOwn(setting.metadata, 'shared') || Object.hasOwn(setting.metadata, 'requires'))) {
76
+ delete inherited.shared;
77
+ delete inherited.requires;
78
+ }
79
+ const metadata = { ...inherited, ...setting?.metadata };
80
+ const id = setting?.documentId ?? codeDocumentId(catalogId, symbol.id);
81
+ const ownerId = `${catalogId}:${symbol.id}`;
82
+ if (owners.has(id) && owners.get(id) !== ownerId)
83
+ throw new Error(`Duplicate code reference document ID ${id}`);
84
+ owners.set(id, ownerId);
85
+ plan.knownDocumentIds.add(id);
86
+ const existing = plan.knownDocumentTypes.get(id);
87
+ if (existing && existing !== 'code-reference')
88
+ throw new Error(`Duplicate code reference document ID ${id}`);
89
+ plan.knownDocumentTypes.set(id, 'code-reference');
90
+ const pageSource = {
91
+ ...metadata, id, title: symbol.name, summary: symbol.summary ?? `${symbol.kind}: ${symbol.id}`,
92
+ type: 'code-reference', slug: setting?.slug ?? `${catalog.pathPrefix}/${symbol.id.toLowerCase().replace(/[^a-z0-9_-]+/g, '-')}-${hash(symbol.id)}`,
93
+ ...variant
94
+ };
95
+ const frontmatter = resolveFrontmatter(pageSource, config.frontmatter);
96
+ frontmatter.access ??= { policy: 'public' };
97
+ if (catalog.layout !== 'symbols')
98
+ frontmatter.tocDepth ??= 2;
99
+ for (const [field, expected] of Object.entries({ id, type: 'code-reference', ...variant }))
100
+ if (frontmatter[field] !== expected)
101
+ throw new Error(`Code reference ${id}: enforced ${field} conflicts with its catalog`);
102
+ applyFormattingLocale(frontmatter, config.frontmatter, pageSource);
103
+ validateFrontmatter(frontmatter, config.frontmatter, file, pageSource);
104
+ const classification = loaded.deployment?.context.classificationPublications ?? variants;
105
+ if (selected && frontmatter.access?.policy === 'public' && classification.some(item => documentKey(catalogId, item) === identity))
106
+ validateFeatureClassification(metadata, loaded.deployment?.context, `${file}: ${symbol.id}`);
107
+ if (!selected || !matchesFeatures(frontmatter.requires, loaded.deployment?.context, `${file}: ${symbol.id}`) || !variants.some(item => documentKey(catalogId, item) === identity))
108
+ continue;
109
+ if (frontmatter.access?.policy !== 'public')
110
+ continue;
111
+ const marks = pageReaderFilters(frontmatter, readerFilters, file);
112
+ if (!matchesContentFilter(marks, contentFilter))
113
+ continue;
114
+ const key = documentKey(id, variant);
115
+ if (plan.docs.has(key))
116
+ throw new Error(`Duplicate code reference document ${id}`);
117
+ const route = routeFor(frontmatter, variant, config);
118
+ const collision = plan.routeOwners.get(route.toLowerCase());
119
+ if (collision && !input.allowRouteCollisions)
120
+ throw new Error(`Code reference route collision ${route}`);
121
+ plan.routeOwners.set(route.toLowerCase(), key);
122
+ plan.docs.set(key, { file, frontmatter, variant, route, markdownRoute: markdownRoute(route, basePath), readerFilters: marks, featureContext: loaded.deployment?.context, body: '', tree: null, codeReference: { catalog: catalogId, programmingLanguage: snapshot.programmingLanguage, symbol, layout: catalog.layout, ...(catalog.sourceLink && symbol.source ? { sourceUrl: catalog.sourceLink.baseUrl.replace(/\/$/, '') + '/' + symbol.source.path.split('/').map(encodeURIComponent).join('/') + (symbol.source.line ? `#L${symbol.source.line}` : '') } : {}) } });
123
+ }
124
+ if (catalog.singlePage) {
125
+ const single = catalog.singlePage;
126
+ const id = single.documentId ?? `reference.${catalogId}.complete`;
127
+ const ownerId = `${catalogId}:complete-page`;
128
+ if (owners.has(id) && owners.get(id) !== ownerId)
129
+ throw new Error(`Duplicate code reference document ID ${id}`);
130
+ owners.set(id, ownerId);
131
+ plan.knownDocumentIds.add(id);
132
+ plan.knownDocumentTypes.set(id, 'code-reference');
133
+ const inherited = { ...catalog.metadata };
134
+ if (single.metadata && (Object.hasOwn(single.metadata, 'shared') || Object.hasOwn(single.metadata, 'requires'))) {
135
+ delete inherited.shared;
136
+ delete inherited.requires;
137
+ }
138
+ const metadata = { ...inherited, ...single.metadata };
139
+ const source = { ...metadata, id, title: single.title, summary: single.summary, type: 'code-reference', slug: single.slug ?? `${catalog.pathPrefix}/all`, ...variant };
140
+ const frontmatter = resolveFrontmatter(source, config.frontmatter);
141
+ frontmatter.access ??= { policy: 'public' };
142
+ for (const [field, expected] of Object.entries({ id, type: 'code-reference', ...variant }))
143
+ if (frontmatter[field] !== expected)
144
+ throw new Error(`Code reference ${id}: enforced ${field} conflicts with its catalog`);
145
+ applyFormattingLocale(frontmatter, config.frontmatter, source);
146
+ validateFrontmatter(frontmatter, config.frontmatter, file, source);
147
+ frontmatter.tocDepth ??= 2;
148
+ const active = variants.some(item => documentKey(catalogId, item) === identity);
149
+ const classification = loaded.deployment?.context.classificationPublications ?? variants;
150
+ if (frontmatter.access?.policy === 'public' && classification.some(item => documentKey(catalogId, item) === identity))
151
+ validateFeatureClassification(metadata, loaded.deployment?.context, `${file}: ${id}`);
152
+ const granted = matchesFeatures(frontmatter.requires, loaded.deployment?.context, `${file}: ${id}`);
153
+ const marks = pageReaderFilters(frontmatter, readerFilters, file);
154
+ const hasContent = [...plan.docs.values()].some(doc => doc.codeReference?.catalog === catalogId && documentKey(catalogId, doc.variant) === identity);
155
+ if (active && granted && hasContent && frontmatter.access.policy === 'public' && matchesContentFilter(marks, contentFilter)) {
156
+ const key = documentKey(id, variant);
157
+ if (plan.docs.has(key))
158
+ throw new Error(`Duplicate code reference document ${id}`);
159
+ const route = routeFor(frontmatter, variant, config);
160
+ if (plan.routeOwners.has(route.toLowerCase()) && !input.allowRouteCollisions)
161
+ throw new Error(`Code reference route collision ${route}`);
162
+ plan.routeOwners.set(route.toLowerCase(), key);
163
+ plan.docs.set(key, { file, frontmatter, variant, route, markdownRoute: markdownRoute(route, basePath), readerFilters: marks, featureContext: loaded.deployment?.context, body: '', tree: null,
164
+ codeReference: { catalog: catalogId, programmingLanguage: snapshot.programmingLanguage, complete: true, symbol: { id, name: single.title, kind: 'module', visibility: 'public' } } });
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ /** Imported prose is inert Markdown; it never enters MDX or project directive expansion. */
171
+ export function renderCodeReference(reference, doc, documents) {
172
+ const eligible = new Map();
173
+ for (const candidate of documents.values())
174
+ if (candidate.codeReference?.catalog === reference.catalog && !candidate.codeReference.complete && documentKey('scope', candidate.variant) === documentKey('scope', doc.variant))
175
+ eligible.set(candidate.codeReference.symbol.id, candidate);
176
+ const owner = (page) => {
177
+ let parent = page.codeReference.symbol.parent;
178
+ while (parent) {
179
+ const candidate = eligible.get(parent);
180
+ if (!candidate)
181
+ return;
182
+ const kind = candidate.codeReference.symbol.kind;
183
+ if (['module', 'namespace'].includes(kind) || reference.layout === 'classes' && ['class', 'interface', 'enum', 'type'].includes(kind))
184
+ return parent;
185
+ parent = candidate.codeReference.symbol.parent;
186
+ }
187
+ };
188
+ const embedded = [...eligible.values()].filter(page => reference.complete || reference.layout !== undefined && reference.layout !== 'symbols' && owner(page) === reference.symbol.id)
189
+ .sort((a, b) => a.codeReference.symbol.id < b.codeReference.symbol.id ? -1 : 1);
190
+ const blocks = reference.complete ? [] : renderCodeSymbol(reference, doc, eligible, false).children;
191
+ const headings = new Map();
192
+ for (const page of embedded) {
193
+ const entry = heading(2, page.codeReference.symbol.id);
194
+ headings.set(entry, page);
195
+ const content = renderCodeSymbol(page.codeReference, page, eligible, true).children;
196
+ const deepen = (node) => { if (node.type === 'heading')
197
+ node.depth = Math.min(6, node.depth + 1); for (const child of node.children ?? [])
198
+ deepen(child); };
199
+ content.forEach(deepen);
200
+ blocks.push(entry, ...content);
201
+ }
202
+ const tree = root(blocks);
203
+ if (embedded.length) {
204
+ // Use the renderer's actual heading allocation, including duplicate headings.
205
+ const reserved = ['main', 'docs-navigation', 'docs-sections', 'documentation-menu', 'page-outline', 'nav-filter', 'examples-title', 'api-view-select'];
206
+ const rendered = renderHtmlWithHeadings(tree, undefined, reserved).headings;
207
+ const targets = new Map();
208
+ let index = 0;
209
+ const collect = (node) => {
210
+ if (node.type === 'heading' && node.depth >= 2 && node.depth <= 6) {
211
+ const target = headings.get(node);
212
+ if (target)
213
+ targets.set(target.frontmatter.id, rendered[index].id);
214
+ index++;
215
+ }
216
+ for (const child of node.children ?? [])
217
+ collect(child);
218
+ };
219
+ collect(tree);
220
+ const relink = (node) => {
221
+ const anchor = targets.get(node.exportDocumentId);
222
+ if (node.type === 'link' && anchor) {
223
+ node.url = `${doc.route}#${anchor}`;
224
+ node.exportDocumentId = doc.frontmatter.id;
225
+ }
226
+ for (const child of node.children ?? [])
227
+ relink(child);
228
+ };
229
+ relink(tree);
230
+ }
231
+ return tree;
232
+ }
233
+ function renderCodeSymbol(reference, doc, eligible, embedded) {
234
+ const prose = (value = '') => {
235
+ const parsed = parsePlainMarkdown(value);
236
+ const definitions = new Map();
237
+ const collect = (node) => { if (node.type === 'definition')
238
+ definitions.set(node.identifier.toLowerCase(), node); for (const child of node.children ?? [])
239
+ collect(child); };
240
+ parsed.forEach(collect);
241
+ const clean = (node) => {
242
+ if (node.type === 'definition')
243
+ return [];
244
+ if (node.type === 'linkReference') {
245
+ const definition = definitions.get(node.identifier.toLowerCase());
246
+ if (!definition)
247
+ return (node.children ?? []).flatMap(clean);
248
+ node = { type: 'link', url: definition.url, title: definition.title, children: node.children };
249
+ }
250
+ if (node.type === 'image' || node.type === 'imageReference')
251
+ throw new Error(`${doc.file}: code reference prose images need explicit asset support`);
252
+ if (typeof node.url === 'string') {
253
+ if (node.url.startsWith('symbol:')) {
254
+ const target = eligible.get(node.url.slice(7));
255
+ if (!target)
256
+ return (node.children ?? []).flatMap(clean);
257
+ node = { ...node, url: target.route, exportDocumentId: target.frontmatter.id };
258
+ }
259
+ else {
260
+ const url = new URL(node.url, 'https://code-reference.invalid');
261
+ if (!['https:', 'mailto:'].includes(url.protocol) || url.username || url.password || url.origin === 'https://code-reference.invalid')
262
+ throw new Error(`${doc.file}: unsupported code reference prose URL ${node.url}`);
263
+ }
264
+ }
265
+ return [{ ...node, ...(node.children ? { children: node.children.flatMap(clean) } : {}) }];
266
+ };
267
+ return parsed.flatMap(clean);
268
+ };
269
+ const symbol = reference.symbol;
270
+ const inlineCode = (value) => ({ type: 'inlineCode', value });
271
+ const code = (value, signature = false) => ({ type: 'code', lang: reference.programmingLanguage, value,
272
+ ...(signature ? { data: { hProperties: { className: [`language-${reference.programmingLanguage}`, 'code-reference-signature'] } } } : {}) });
273
+ const pageLink = (page, label = page.frontmatter.title) => ({ type: 'link', url: page.route, exportDocumentId: page.frontmatter.id, children: [inlineCode(label)] });
274
+ // References are explicit converter data; never guess an ambiguous short name.
275
+ const typeNodes = (value, context = symbol) => {
276
+ const tokens = Object.keys(context.typeReferences ?? {}).sort((a, b) => b.length - a.length);
277
+ if (!tokens.length)
278
+ return [inlineCode(value)];
279
+ const output = [];
280
+ let plain = '';
281
+ for (let offset = 0; offset < value.length;) {
282
+ const match = tokens.find(token => value.startsWith(token, offset) && !/[\p{L}\p{N}_.$]/u.test(value[offset - 1] ?? '') && !/[\p{L}\p{N}_.$]/u.test(value[offset + token.length] ?? ''));
283
+ const page = match ? eligible.get(context.typeReferences[match]) : undefined;
284
+ if (match && page) {
285
+ if (plain)
286
+ output.push(inlineCode(plain));
287
+ plain = '';
288
+ output.push(pageLink(page, match));
289
+ offset += match.length;
290
+ }
291
+ else {
292
+ plain += value[offset];
293
+ offset++;
294
+ }
295
+ }
296
+ if (plain)
297
+ output.push(inlineCode(plain));
298
+ return output;
299
+ };
300
+ const table = (headers, rows, label) => ({ type: 'table', align: headers.map(() => null),
301
+ data: { referenceTableLabel: label, hProperties: { className: ['code-reference-table'] } }, children: [headers.map(value => [text(value)]), ...rows].map(cells => ({ type: 'tableRow', children: cells.map(children => ({ type: 'tableCell', children })) })) });
302
+ const summary = (value) => {
303
+ const nodes = prose(value);
304
+ const paragraph = nodes.find(node => node.type === 'paragraph');
305
+ return paragraph?.children ?? [text('—')];
306
+ };
307
+ const description = prose(symbol.description);
308
+ // Hide the repeated summary only in the website shell; exports retain it.
309
+ if (description[0]?.type === 'paragraph') {
310
+ const plain = (node) => node.value ?? (node.children ?? []).map(plain).join('');
311
+ if (!embedded && plain(description[0]).trim() === doc.frontmatter.summary.trim())
312
+ description[0] = { ...description[0], data: { hProperties: { className: ['code-reference-summary'] } } };
313
+ }
314
+ const identity = paragraph({ type: 'strong', children: [text(symbol.kind.charAt(0).toUpperCase() + symbol.kind.slice(1))] }, text(' '), inlineCode(symbol.id), ...(reference.sourceUrl ? [text(' · '), { type: 'link', url: reference.sourceUrl, children: [text('View source')] }] : []));
315
+ identity.data = { hProperties: { className: ['code-reference-identity'] } };
316
+ const blocks = [identity, ...(symbol.signatures?.length ? [code(symbol.signatures.join('\n\n'), true)] : []), ...description];
317
+ if (symbol.constructorSignature)
318
+ blocks.push(heading(2, 'Constructor'), code(symbol.constructorSignature, true));
319
+ if (symbol.bases?.length)
320
+ blocks.push(paragraph({ type: 'strong', children: [text('Bases: ')] }, ...symbol.bases.flatMap((base, i) => [...(i ? [text(', ')] : []), ...typeNodes(base)])));
321
+ if (symbol.annotation)
322
+ blocks.push(paragraph({ type: 'strong', children: [text('Type: ')] }, ...typeNodes(symbol.annotation)));
323
+ if (symbol.required !== undefined || symbol.default !== undefined)
324
+ blocks.push(paragraph(...(symbol.required === undefined ? [] : [text(symbol.required ? 'Required' : 'Optional')]), ...(symbol.default === undefined ? [] : [text(symbol.required === undefined ? 'Default: ' : ' · Default: '), inlineCode(symbol.default)])));
325
+ const details = (title, items) => {
326
+ if (!items.length)
327
+ return;
328
+ blocks.push(heading(2, title));
329
+ blocks.push(table(title === 'Parameters' ? ['Parameter', 'Type / default', 'Description'] : ['Exception', 'Description'], items.map(item => {
330
+ const kind = [...(item.type ? typeNodes(item.type) : [text('—')]), ...(item.default === undefined ? [] : [text(' = '), inlineCode(item.default)])];
331
+ return title === 'Parameters' ? [[inlineCode(item.name)], kind, summary(item.description)] : [typeNodes(item.name), summary(item.description)];
332
+ }), title));
333
+ // Preserve richer Markdown without forcing block content into a table cell.
334
+ for (const item of items) {
335
+ const content = prose(item.description);
336
+ if (content.length > 1 || content.some(node => node.type !== 'paragraph'))
337
+ blocks.push(heading(3, item.name), ...content);
338
+ }
339
+ };
340
+ details('Parameters', symbol.parameters ?? []);
341
+ for (const [title, result] of [['Returns', symbol.returns], ['Yields', symbol.yields]])
342
+ if (result) {
343
+ blocks.push(heading(2, title));
344
+ if (result.type)
345
+ blocks.push(paragraph(...typeNodes(result.type)));
346
+ blocks.push(...prose(result.description));
347
+ }
348
+ details('Raises', symbol.raises ?? []);
349
+ if (symbol.examples?.length) {
350
+ blocks.push(heading(2, 'Examples'));
351
+ for (const example of symbol.examples)
352
+ blocks.push(...(example.title ? [heading(3, example.title)] : []), code(example.code));
353
+ }
354
+ const members = [...eligible.values()].filter(item => item.codeReference?.symbol.parent === symbol.id).sort((a, b) => a.frontmatter.title < b.frontmatter.title ? -1 : a.frontmatter.title > b.frontmatter.title ? 1 : 0);
355
+ const fields = members.filter(page => ['attribute', 'property', 'constant'].includes(page.codeReference.symbol.kind));
356
+ const callables = members.filter(page => ['function', 'method', 'constructor'].includes(page.codeReference.symbol.kind));
357
+ const types = members.filter(page => !fields.includes(page) && !callables.includes(page));
358
+ for (const [title, pages] of [['Fields', fields], [['module', 'namespace'].includes(symbol.kind) ? 'Functions' : 'Methods', callables], ['Members', types]])
359
+ if (pages.length) {
360
+ blocks.push(heading(2, title), table(title === 'Fields' ? ['Name', 'Type', 'Required / default', 'Description'] : ['Name', 'Kind', 'Description'], pages.map(page => {
361
+ const member = page.codeReference.symbol;
362
+ const declaration = member.signatures?.[0];
363
+ const annotation = declaration?.startsWith(member.name + ': ') ? declaration.slice(member.name.length + 2) : undefined;
364
+ return title === 'Fields' ? [[pageLink(page)], typeNodes(member.annotation ?? annotation ?? member.kind, member), [...(member.required === undefined ? [] : [text(member.required ? 'Required' : 'Optional')]), ...(member.default === undefined ? [] : [text(member.required === undefined ? '' : ' · '), inlineCode(member.default)]), ...(member.required === undefined && member.default === undefined ? [text('—')] : [])], summary(member.summary ?? member.description)] : [[pageLink(page)], [inlineCode(member.kind)], summary(member.summary ?? member.description)];
365
+ }), title));
366
+ }
367
+ const related = (symbol.seeAlso ?? []).flatMap(id => eligible.has(id) ? [eligible.get(id)] : []);
368
+ if (related.length)
369
+ blocks.push(heading(2, 'See also'), { type: 'list', ordered: false, children: related.map(page => ({ type: 'listItem', children: [paragraph(pageLink(page))] })) });
370
+ return root(blocks);
371
+ }
@@ -13,6 +13,7 @@ export interface ResolvedCompilerConfig extends ConfigMapping {
13
13
  navigation?: unknown;
14
14
  redirects?: unknown;
15
15
  apis?: unknown;
16
+ codeReferences?: unknown;
16
17
  relationships?: unknown;
17
18
  variables?: unknown;
18
19
  snippets?: unknown;
@@ -39,6 +39,14 @@ export declare function compile(configFile: string, destination?: string, proven
39
39
  }>;
40
40
  }>;
41
41
  }[];
42
+ contentSelection: {
43
+ selection: import("./reader-filters.js").ReaderSelection | null;
44
+ decisions: Record<string, unknown>[];
45
+ warnings: {
46
+ code: string;
47
+ message: string;
48
+ }[];
49
+ };
42
50
  profileSelection: {
43
51
  schemaVersion: number;
44
52
  profileDigest: string;
package/dist/compiler.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { sectionSelectionReport, writeSectionSelectionReport } from './section-selection.js';
1
2
  import { buildPdfSiteArtifacts } from './pdf-site.js';
2
3
  import { resolvePdfButton, validatePdfButtonStyle } from './pdf-button.js';
3
4
  import { documentKey, publicationKey, samePublication } from './publication-identity.js';
@@ -18,7 +19,7 @@ import { validateAuthoringGuidance } from './authoring-guidance.js';
18
19
  import { loadFreshness } from './freshness.js';
19
20
  import { resolveAgentDiscovery } from './agent-discovery.js';
20
21
  import { iconLicenseFile } from './icons.js';
21
- import { bundledFontLicenses, bundledFonts, fontsCss, resolveFonts } from './fonts.js';
22
+ import { bundledFontLicenses, bundledFonts, fontsCss, resolveFonts, prepareFontAssets, customFontPreloads } from './fonts.js';
22
23
  import { bundledShareFonts, resolveShareImages, shareRoute } from './share-images.js';
23
24
  import { buildInfo } from './build-info.js';
24
25
  import { validateRelationships } from './cards.js';
@@ -175,6 +176,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
175
176
  for (const face of fonts.faces)
176
177
  if (fonts.faces.some(other => other.route === face.route && other.file !== face.file))
177
178
  throw new Error(`theme.fonts: two font files share the name ${path.basename(face.file)}; rename one`);
179
+ const projectFontAssets = await prepareFontAssets(fonts);
178
180
  const generatedFontsCss = fontsCss(fonts);
179
181
  // A temporary preview aid: a floating shape and palette switcher on every page. Remove it before launch.
180
182
  // `demo` ships it hidden until a page is opened with ?theme-switcher.
@@ -305,7 +307,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
305
307
  const varying = (field) => new Set(variants.map(variant => variant[field])).size > 1;
306
308
  const editionLabel = (variant) => editionBadge === 'never' ? '' : ['product', 'channel', 'version', 'language']
307
309
  .filter(field => variant[field] !== undefined && (editionBadge === 'always' || varying(field))).map(field => variant[field]).join(' · ');
308
- const { docs, knownDocumentIds, knownDocumentTypes, routeOwners, contentDir, snippets, apiPlan, api, sourceForVariant, knownOperations, relatedApiTargets, guidesByApi, sourceForOperation } = await prepareContentWorkspace({
310
+ const { sectionSelection, docs, knownDocumentIds, knownDocumentTypes, routeOwners, contentDir, snippets, apiPlan, api, sourceForVariant, knownOperations, relatedApiTargets, guidesByApi, sourceForOperation } = await prepareContentWorkspace({
309
311
  base, basePath, config, loaded, variants, language, readerFilters, contentFilter, metadataProvider, metadataDependencies,
310
312
  sourceOverrides: options.sourceOverrides, authoringFiles: options.authoringFiles
311
313
  });
@@ -397,7 +399,7 @@ async function compileProject(configFile, destination, provenance, options, ownH
397
399
  freshness,
398
400
  rendered, docs, relationships, knownOperations, cardUses, publishedRelationships, cookbooks, documentRoutes,
399
401
  basePath, siteOrigin, colorMode, config: options.authoringFiles ? { ...config, outputs: { ...config.outputs, html: { ...htmlOptions, pdf: false } } } : config, highlighter, editionLabel, customStyleFile, themePreset, palette,
400
- themeStyleFile, generatedPaletteCss, generatedBadgeCss, themeSwitcherData, generatedFontsCss, fontsPreload: fonts.preload,
402
+ themeStyleFile, generatedPaletteCss, generatedBadgeCss, themeSwitcherData, generatedFontsCss, fontsPreload: fonts.preload, customFontPreloads: customFontPreloads(fonts),
401
403
  shareFor, faviconRoute, logoRoute, modeToggle, header, footer, search, readerFilters, variants, externalDocuments,
402
404
  externalSiteLinks, navigationSpec, navigationEntries, navigationTagOrder
403
405
  });
@@ -480,12 +482,15 @@ async function compileProject(configFile, destination, provenance, options, ownH
480
482
  const { artifacts, buildId } = await assembleArtifacts({
481
483
  extraArtifacts: sitePdfs.artifacts,
482
484
  base, basePath, publicPath, canonical, siteOrigin, manifest, provenanceRecord, rendered, sitemaps,
483
- privateDependencies: new Set([...(loaded.deployment?.file ? [loaded.deployment.file] : []), ...(loaded.deployment?.assetFiles ?? [])]),
485
+ privateDependencies: new Set([
486
+ ...[...snippets.values()].filter(snippet => !snippetUses.some(use => use.file === snippet.file)).map(snippet => snippet.file),
487
+ ...(sectionSelection.hasConditions || contentFilter ? componentPlugins.dependencies : []), ...(loaded.deployment?.file ? [loaded.deployment.file] : []), ...(loaded.deployment?.assetFiles ?? [])
488
+ ]),
484
489
  diagramAssets, heroImages, focusedContracts, styleFiles, themeStyleFile, generatedPaletteCss,
485
490
  generatedBadgeCss, search, synonyms, config: artifactConfig, builtInSearchProvider, customReaderModule, analyticsModule, mcpAnalyticsModule,
486
491
  previewFiles, assetDirectory, themeSwitcher, themeDirectory, palette, colorMode, generatedFontsCss,
487
- fontFiles, fonts, shareImages, shareFor, themePreset, shareFontFiles, shareCache, faviconFile,
488
- faviconRoute, customStyleFile, scriptFiles, componentAssets: loaded.deployment?.context.grants ? componentPlugins.assets.filter(asset => usedComponentAssets.has(asset.route)) : componentPlugins.assets, redirects, apiPublications, api, catalog, headers,
492
+ fontFiles, projectFontAssets, fonts, shareImages, shareFor, themePreset, shareFontFiles, shareCache, faviconFile,
493
+ faviconRoute, customStyleFile, scriptFiles, componentAssets: loaded.deployment?.context.grants || sectionSelection.hasConditions || contentFilter ? componentPlugins.assets.filter(asset => usedComponentAssets.has(asset.route)) : componentPlugins.assets, redirects, apiPublications, api, catalog, headers,
489
494
  documentRoutes, readerFilters, apiSources
490
495
  });
491
496
  if (destination) {
@@ -499,9 +504,11 @@ async function compileProject(configFile, destination, provenance, options, ownH
499
504
  if (loaded.deployment?.context.grants && !options.authoringFiles)
500
505
  await writeFile(path.join(localGuide, 'profile-selection.json'), JSON.stringify({ ...profileSelection(loaded.deployment), buildId, configDigest: loaded.digest }, null, 2) + '\n');
501
506
  });
507
+ if (!options.authoringFiles)
508
+ await writeSectionSelectionReport(base, sectionSelection, { target: { kind: 'site', output: target }, buildId, configDigest: loaded.digest, filterOrigin: 'site.contentFilter' });
502
509
  // Authoring captures resolve revision dates without changing captured inputs.
503
510
  if (!options.authoringFiles)
504
511
  await freshness?.commit();
505
512
  }
506
- return { ...manifest, buildId, apiPublicationReview, profileSelection: profileSelection(loaded.deployment), ...(options.authoringFiles ? { authoringSources: rendered.map(({ doc }) => ({ id: doc.frontmatter.id, file: doc.file, url: doc.route, markdownUrl: doc.markdownRoute })) } : {}) };
513
+ return { ...manifest, buildId, apiPublicationReview, contentSelection: sectionSelectionReport(sectionSelection), profileSelection: profileSelection(loaded.deployment), ...(options.authoringFiles ? { authoringSources: rendered.map(({ doc }) => ({ id: doc.frontmatter.id, file: doc.file, url: doc.route, markdownUrl: doc.markdownRoute })) } : {}) };
507
514
  }
@@ -1 +1 @@
1
- export const builtinComponentNames = new Set('Anchor FrontmatterReference ForFeature ForPublication ReaderSection ReaderChoice ReaderFilter Only Badge Kbd Tooltip InfoHint Progress Math ActionLink Button DefinitionList Term Definition Steps Timeline Milestone FileTree Tree Folder File Table CollapsibleGroup Collapsible Section Hero ThemePreview Diagram Image Tabs Walkthrough Step Tab Fields Field CookbookChooser DocCard DocCards DocCollection RelatedReading ApiExample ApiSchema Snippet Var DocLink Callout'.split(' '));
1
+ export const builtinComponentNames = new Set('Anchor FrontmatterReference ForFeature ForFacet ForPublication ReaderSection ReaderChoice ReaderFilter Only Badge Kbd Tooltip InfoHint Progress Math ActionLink Button DefinitionList Term Definition Steps Timeline Milestone FileTree Tree Folder File Table CollapsibleGroup Collapsible Section Hero ThemePreview Diagram Image Tabs Walkthrough Step Tab Fields Field CookbookChooser DocCard DocCards DocCollection RelatedReading ApiExample ApiSchema Snippet Var DocLink Callout'.split(' '));
@@ -1,5 +1,5 @@
1
1
  import { documentKey } from './publication-identity.js';
2
- import { pruneFeatureTree } from './deployment-profile.js';
2
+ import { createSectionSelection, evaluatePublicationGuard, pruneSelectedTree, warnReaderSection } from './section-selection.js';
3
3
  import { lowerComponent } from './component-plugins.js';
4
4
  import { cardComponent } from './cards.js';
5
5
  import { cookbookChooserComponent } from './cookbook-chooser.js';
@@ -61,8 +61,10 @@ function literalAttributes(attributes) {
61
61
  export function transformMdx(tree, current, registry, snippets = new Map(), projectValues = {}, uses = [], calloutTypes = resolveCalloutTypes(undefined, current.file), projectRoot, readerConfig, frontmatterConfig = {}, publicationConfig, badgeVariants = resolveBadgeVariants(undefined, current.file), componentPlugins = new Map(), publicationRegistry) {
62
62
  if (!isMdxRoot(tree))
63
63
  throw new Error(`${current.file}: parsed content must be a root with children`);
64
- tree = lowerSectionMarkers(pruneFeatureTree(tree, current.featureContext, current.file), current.file);
65
- snippets = new Map([...snippets].map(([id, definition]) => [id, { ...definition, tree: pruneFeatureTree(definition.tree, current.featureContext, definition.file) }]));
64
+ current.sectionSelection ??= createSectionSelection(readerConfig, undefined, publicationConfig);
65
+ const originalSnippets = snippets;
66
+ tree = lowerSectionMarkers(pruneSelectedTree(tree, current), current.file);
67
+ snippets = new Map([...snippets].map(([id, definition]) => [id, { ...definition, tree: pruneSelectedTree(definition.tree, current, definition.file, false) }]));
66
68
  let pluginDepth = 0;
67
69
  let tabsIndex = 0;
68
70
  let walkthroughIndex = 0;
@@ -133,27 +135,14 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
133
135
  throw new Error(`${sourceFile}: <FrontmatterReference> must be an empty block`);
134
136
  return childrenOf(parsePlainMarkdown(frontmatterReference(frontmatterConfig, true)), scope, stack, sourceFile);
135
137
  }
136
- if (node.name === 'ForFeature') {
137
- const selected = pruneFeatureTree({ type: 'root', children: [node] }, current.featureContext, sourceFile);
138
+ if (node.name === 'ForFeature' || node.name === 'ForFacet') {
139
+ const selected = pruneSelectedTree({ type: 'root', children: [node] }, current, sourceFile);
138
140
  return childrenOf(selected.children, scope, stack, sourceFile);
139
141
  }
140
142
  if (node.name === 'ForPublication') {
141
- const attributes = node.attributes ?? [];
142
- const allowed = ['product', 'channel', 'version', 'language'];
143
- if (node.type !== 'mdxJsxFlowElement' || !node.children?.length || !attributes.length || !literalAttributes(attributes) || attributes.some((item) => !allowed.includes(item.name) || !item.value.trim()) || new Set(attributes.map((item) => item.name)).size !== attributes.length) {
144
- throw new Error(`${sourceFile}: <ForPublication> needs block content and distinct literal channel, version, or language attributes`);
145
- }
146
- const product = attributes.find(item => item.name === 'product')?.value ?? current.variant.product;
147
- for (const item of attributes) {
148
- const catalog = item.name === 'product' ? publicationConfig?.products
149
- : item.name === 'channel' ? publicationConfig?.channels
150
- : item.name === 'version' ? (product ? publicationConfig?.products?.[product]?.versions : publicationConfig?.versions) : undefined;
151
- if (publicationConfig && item.name !== 'language' && (!catalog || !Object.hasOwn(catalog, item.value)))
152
- throw new Error(`${sourceFile}: <ForPublication> names unknown ${item.name} ${item.value}`);
153
- }
154
- if (attributes.some((item) => current.variant[item.name] !== item.value))
143
+ if (!evaluatePublicationGuard(node, current, sourceFile, publicationConfig))
155
144
  return [];
156
- return childrenOf(node.children, scope, stack, sourceFile);
145
+ return childrenOf(node.children ?? [], scope, stack, sourceFile);
157
146
  }
158
147
  if (node.name === 'ReaderSection' || node.name === 'ReaderChoice' || node.name === 'ReaderFilter') {
159
148
  if (!readerConfig || node.type !== 'mdxJsxFlowElement')
@@ -179,6 +168,8 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
179
168
  const selection = validateReaderSelection(choices, readerConfig, `${sourceFile}: <${node.name}>`);
180
169
  if (!Object.keys(selection).length)
181
170
  throw new Error(`${sourceFile}: <${node.name}> needs at least one filter choice`);
171
+ if (node.name === 'ReaderSection')
172
+ warnReaderSection(current, sourceFile, node.position?.start?.line ?? 1, selection);
182
173
  const description = Object.entries(selection).map(([facet, values]) => `${readerConfig.facets[facet].label}: ${values.map(value => readerConfig.facets[facet].options[value]).join(' or ')}`).join('; ');
183
174
  const children = node.name === 'ReaderSection' ? childrenOf(node.children ?? [], scope, stack, sourceFile) : [];
184
175
  const containsSection = (item) => item.type === 'docReaderSection' || (item.children ?? []).some(containsSection);
@@ -628,8 +619,9 @@ export function transformMdx(tree, current, registry, snippets = new Map(), proj
628
619
  if (!invocation || typeof invocation !== 'object' || Array.isArray(invocation))
629
620
  throw new Error(`${sourceFile}: snippet values must be a literal mapping`);
630
621
  const values = resolveSnippetValues(id, definition, projectValues, { ...(current.frontmatter.variables ?? {}), ...scope }, invocation);
631
- uses.push({ id, file: definition.file, documentId: current.frontmatter.id });
632
- return childrenOf(definition.tree.children, values, [...stack, id], definition.file);
622
+ uses.push({ id, file: definition.file, documentId: current.frontmatter.id, documentKey: documentKey(current.frontmatter.id, current.variant) });
623
+ const selectedTree = pruneSelectedTree(originalSnippets.get(id).tree, current, definition.file);
624
+ return childrenOf(selectedTree.children, values, [...stack, id], definition.file);
633
625
  }
634
626
  if (node.name === 'Var') {
635
627
  if (!stack.length || node.type !== 'mdxJsxTextElement' || node.children?.length)
@@ -0,0 +1,2 @@
1
+ /** Validate every guard, including excluded descendants, without expanding dependencies. */
2
+ export declare function pruneConditionalTree(tree: any, evaluate: (node: any, ancestorIncluded: boolean) => boolean | undefined): any;
@@ -0,0 +1,14 @@
1
+ /** Validate every guard, including excluded descendants, without expanding dependencies. */
2
+ export function pruneConditionalTree(tree, evaluate) {
3
+ const walk = (node, ancestorIncluded = true) => {
4
+ if (!node || typeof node !== 'object')
5
+ return [node];
6
+ const match = evaluate(node, ancestorIncluded);
7
+ if (match !== undefined) {
8
+ const children = (node.children ?? []).flatMap((child) => walk(child, ancestorIncluded && match));
9
+ return ancestorIncluded && match ? children : [];
10
+ }
11
+ return [{ ...node, ...(node.children ? { children: node.children.flatMap((child) => walk(child, ancestorIncluded)) } : {}) }];
12
+ };
13
+ return walk(tree)[0];
14
+ }
package/dist/config.js CHANGED
@@ -9,7 +9,7 @@ import { parseYaml } from './yaml-value.js';
9
9
  import { validateSearch } from './search-config.js';
10
10
  import { resolveTaxonomy } from './taxonomy.js';
11
11
  import { validateCookbooks } from './cookbook-chooser.js';
12
- const allowed = new Set(['profiles', 'exports', 'schemaVersion', 'site', 'navigation', 'redirects', 'apis', 'relationships', 'variables', 'snippets', 'callouts', 'badges', 'publications', 'outputs', 'templates', 'theme', 'frontmatter', 'metadata', 'audit', 'readerFilters', 'retrieval', 'chat', 'authoring', 'search', 'cookbooks', 'analytics', 'mcp', 'components']);
12
+ const allowed = new Set(['profiles', 'exports', 'schemaVersion', 'site', 'navigation', 'redirects', 'apis', 'codeReferences', 'relationships', 'variables', 'snippets', 'callouts', 'badges', 'publications', 'outputs', 'templates', 'theme', 'frontmatter', 'metadata', 'audit', 'readerFilters', 'retrieval', 'chat', 'authoring', 'search', 'cookbooks', 'analytics', 'mcp', 'components']);
13
13
  const object = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
14
14
  const treeObject = (v) => object(v) && !('kind' in v && 'items' in v);
15
15
  export class ConfigError extends Error {