@shoalrun/cli 0.0.0-stage → 0.1.0-alpha.12

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 (1012) hide show
  1. package/AUTHORING.md +269 -0
  2. package/CHANGELOG.md +89 -0
  3. package/LICENSE +202 -0
  4. package/README.md +191 -2
  5. package/agent-docs/.well-known/shoalrun/navigation/docs-50f26fe22670.txt +24 -0
  6. package/agent-docs/.well-known/shoalrun/navigation/examples-tab-50f26fe22670.txt +22 -0
  7. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +37 -0
  8. package/agent-docs/.well-known/shoalrun/navigation/reference-tab-50f26fe22670.txt +22 -0
  9. package/agent-docs/SNAPSHOT.json +9 -0
  10. package/agent-docs/about.md +49 -0
  11. package/agent-docs/api-docs/focused-contracts.md +68 -0
  12. package/agent-docs/api-docs/generate.md +189 -0
  13. package/agent-docs/api-docs/generate.sections/add-useful-examples.md +47 -0
  14. package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +50 -0
  15. package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +52 -0
  16. package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +71 -0
  17. package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +48 -0
  18. package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +52 -0
  19. package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +60 -0
  20. package/agent-docs/api-docs/generate.sections/related-reading.md +38 -0
  21. package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +45 -0
  22. package/agent-docs/api-docs/support.md +97 -0
  23. package/agent-docs/author/add-page.md +126 -0
  24. package/agent-docs/author/agent-overview.md +59 -0
  25. package/agent-docs/author/agent-workflow.md +65 -0
  26. package/agent-docs/author/agents.md +53 -0
  27. package/agent-docs/author/analytics.md +286 -0
  28. package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +51 -0
  29. package/agent-docs/author/analytics.sections/built-in-events.md +52 -0
  30. package/agent-docs/author/analytics.sections/configure-an-adapter.md +51 -0
  31. package/agent-docs/author/analytics.sections/custom-interactions.md +57 -0
  32. package/agent-docs/author/analytics.sections/event-format.md +59 -0
  33. package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +42 -0
  34. package/agent-docs/author/analytics.sections/inspect-events-locally.md +36 -0
  35. package/agent-docs/author/analytics.sections/map-events-to-your-service.md +42 -0
  36. package/agent-docs/author/analytics.sections/posthog-example.md +126 -0
  37. package/agent-docs/author/analytics.sections/related-reading.md +42 -0
  38. package/agent-docs/author/authoring-agent.md +102 -0
  39. package/agent-docs/author/coding-agent.md +90 -0
  40. package/agent-docs/author/components/action-link.md +47 -0
  41. package/agent-docs/author/components/api-embeds.md +271 -0
  42. package/agent-docs/author/components/api-embeds.sections/apiexample.md +121 -0
  43. package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +37 -0
  44. package/agent-docs/author/components/api-embeds.sections/related-reading.md +37 -0
  45. package/agent-docs/author/components/badge.md +80 -0
  46. package/agent-docs/author/components/breadcrumbs.md +57 -0
  47. package/agent-docs/author/components/callout.md +135 -0
  48. package/agent-docs/author/components/cards.md +168 -0
  49. package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +50 -0
  50. package/agent-docs/author/components/cards.sections/build-a-collection.md +69 -0
  51. package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +66 -0
  52. package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +37 -0
  53. package/agent-docs/author/components/cards.sections/link-to-one-document.md +45 -0
  54. package/agent-docs/author/components/cards.sections/override-card-text.md +58 -0
  55. package/agent-docs/author/components/cards.sections/related-reading.md +43 -0
  56. package/agent-docs/author/components/code-blocks.md +121 -0
  57. package/agent-docs/author/components/collapsible.md +103 -0
  58. package/agent-docs/author/components/cookbook-chooser.md +90 -0
  59. package/agent-docs/author/components/custom/react.md +190 -0
  60. package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +36 -0
  61. package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +88 -0
  62. package/agent-docs/author/components/custom/react.sections/registration.md +41 -0
  63. package/agent-docs/author/components/custom/react.sections/related-reading.md +30 -0
  64. package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +47 -0
  65. package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +100 -0
  66. package/agent-docs/author/components/custom.md +183 -0
  67. package/agent-docs/author/components/definition-list.md +56 -0
  68. package/agent-docs/author/components/diagrams/d2-gallery.md +861 -0
  69. package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +163 -0
  70. package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +375 -0
  71. package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +33 -0
  72. package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +169 -0
  73. package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +37 -0
  74. package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +123 -0
  75. package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +125 -0
  76. package/agent-docs/author/components/diagrams/pele-gallery.md +1317 -0
  77. package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +341 -0
  78. package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +269 -0
  79. package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +273 -0
  80. package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +31 -0
  81. package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +35 -0
  82. package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +229 -0
  83. package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +291 -0
  84. package/agent-docs/author/components/diagrams.md +163 -0
  85. package/agent-docs/author/components/doc-link.md +62 -0
  86. package/agent-docs/author/components/fields.md +123 -0
  87. package/agent-docs/author/components/file-tree.md +88 -0
  88. package/agent-docs/author/components/images.md +105 -0
  89. package/agent-docs/author/components/info-hint.md +65 -0
  90. package/agent-docs/author/components/kbd.md +47 -0
  91. package/agent-docs/author/components/math.md +43 -0
  92. package/agent-docs/author/components/only.md +69 -0
  93. package/agent-docs/author/components/progress.md +57 -0
  94. package/agent-docs/author/components/related-reading.md +52 -0
  95. package/agent-docs/author/components/steps.md +127 -0
  96. package/agent-docs/author/components/tables.md +68 -0
  97. package/agent-docs/author/components/tabs.md +133 -0
  98. package/agent-docs/author/components/timeline.md +80 -0
  99. package/agent-docs/author/components/tooltips.md +62 -0
  100. package/agent-docs/author/components/walkthroughs.md +392 -0
  101. package/agent-docs/author/components/walkthroughs.sections/attributes.md +45 -0
  102. package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +133 -0
  103. package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +141 -0
  104. package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +126 -0
  105. package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +38 -0
  106. package/agent-docs/author/components/walkthroughs.sections/related-reading.md +36 -0
  107. package/agent-docs/author/components/walkthroughs.sections/syntax.md +51 -0
  108. package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +34 -0
  109. package/agent-docs/author/components.md +81 -0
  110. package/agent-docs/author/content.md +74 -0
  111. package/agent-docs/author/cookbooks.md +119 -0
  112. package/agent-docs/author/css.md +241 -0
  113. package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +70 -0
  114. package/agent-docs/author/css.sections/core-color-tokens.md +71 -0
  115. package/agent-docs/author/css.sections/html-markdown-and-agents.md +54 -0
  116. package/agent-docs/author/css.sections/page-attributes.md +69 -0
  117. package/agent-docs/author/css.sections/page-transitions.md +60 -0
  118. package/agent-docs/author/css.sections/responsive-behavior.md +58 -0
  119. package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +89 -0
  120. package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +71 -0
  121. package/agent-docs/author/custom-metadata.md +177 -0
  122. package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +68 -0
  123. package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +54 -0
  124. package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +33 -0
  125. package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +57 -0
  126. package/agent-docs/author/custom-metadata.sections/related-reading.md +29 -0
  127. package/agent-docs/author/design-templates.md +49 -0
  128. package/agent-docs/author/design-writing-guides.md +73 -0
  129. package/agent-docs/author/frontmatter-reference.md +150 -0
  130. package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +44 -0
  131. package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +41 -0
  132. package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +31 -0
  133. package/agent-docs/author/frontmatter-reference.sections/html-markdown-and-agents.md +31 -0
  134. package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +40 -0
  135. package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +37 -0
  136. package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +41 -0
  137. package/agent-docs/author/frontmatter-reference.sections/related-reading.md +35 -0
  138. package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +33 -0
  139. package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +31 -0
  140. package/agent-docs/author/frontmatter.md +255 -0
  141. package/agent-docs/author/frontmatter.sections/audience-badges.md +66 -0
  142. package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +88 -0
  143. package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +75 -0
  144. package/agent-docs/author/frontmatter.sections/optional-native-fields.md +90 -0
  145. package/agent-docs/author/frontmatter.sections/publication-fields.md +85 -0
  146. package/agent-docs/author/frontmatter.sections/publishing-policy.md +71 -0
  147. package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +72 -0
  148. package/agent-docs/author/frontmatter.sections/related-reading.md +72 -0
  149. package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +84 -0
  150. package/agent-docs/author/frontmatter.sections/seo-fields.md +79 -0
  151. package/agent-docs/author/frontmatter.sections/validation-rules.md +75 -0
  152. package/agent-docs/author/markdown-metadata.md +207 -0
  153. package/agent-docs/author/navigation.md +269 -0
  154. package/agent-docs/author/navigation.sections/arrange-authored-pages.md +58 -0
  155. package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +48 -0
  156. package/agent-docs/author/navigation.sections/hide-group-page-counts.md +45 -0
  157. package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +40 -0
  158. package/agent-docs/author/navigation.sections/local-api-preview.md +47 -0
  159. package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +65 -0
  160. package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +97 -0
  161. package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +38 -0
  162. package/agent-docs/author/navigation.sections/related-reading.md +44 -0
  163. package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +67 -0
  164. package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +42 -0
  165. package/agent-docs/author/reader-views.md +200 -0
  166. package/agent-docs/author/reader-views.sections/configure-the-choices.md +65 -0
  167. package/agent-docs/author/reader-views.sections/connect-your-own-control.md +59 -0
  168. package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +41 -0
  169. package/agent-docs/author/reader-views.sections/mark-pages.md +49 -0
  170. package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +49 -0
  171. package/agent-docs/author/reader-views.sections/place-filter-controls.md +43 -0
  172. package/agent-docs/author/reader-views.sections/try-the-controls-here.md +64 -0
  173. package/agent-docs/author/recipe-drafts.md +181 -0
  174. package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +82 -0
  175. package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +60 -0
  176. package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +55 -0
  177. package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +66 -0
  178. package/agent-docs/author/recipe-drafts.sections/related-reading.md +45 -0
  179. package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +50 -0
  180. package/agent-docs/author/recipes.md +127 -0
  181. package/agent-docs/author/recipes.sections/how-agents-use-this.md +50 -0
  182. package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +64 -0
  183. package/agent-docs/author/recipes.sections/related-reading.md +36 -0
  184. package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +42 -0
  185. package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +52 -0
  186. package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +44 -0
  187. package/agent-docs/author/recipes.sections/what-each-file-does.md +48 -0
  188. package/agent-docs/author/recipes.sections/what-happens-and-when.md +45 -0
  189. package/agent-docs/author/related-reading.md +147 -0
  190. package/agent-docs/author/related-reading.sections/automatic-footers.md +35 -0
  191. package/agent-docs/author/related-reading.sections/declare-relationships.md +68 -0
  192. package/agent-docs/author/related-reading.sections/display-related-documents.md +54 -0
  193. package/agent-docs/author/related-reading.sections/html-markdown-and-agents.md +28 -0
  194. package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +32 -0
  195. package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +32 -0
  196. package/agent-docs/author/related-reading.sections/related-reading.md +34 -0
  197. package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +34 -0
  198. package/agent-docs/author/release-notes.md +153 -0
  199. package/agent-docs/author/search.md +299 -0
  200. package/agent-docs/author/search.sections/choose-a-provider.md +52 -0
  201. package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +49 -0
  202. package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +55 -0
  203. package/agent-docs/author/search.sections/html-markdown-and-agents.md +37 -0
  204. package/agent-docs/author/search.sections/lexical-search.md +78 -0
  205. package/agent-docs/author/search.sections/local-semantic-preview.md +43 -0
  206. package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +41 -0
  207. package/agent-docs/author/search.sections/related-reading.md +45 -0
  208. package/agent-docs/author/search.sections/reuse-the-lexical-index.md +81 -0
  209. package/agent-docs/author/search.sections/turn-search-off.md +46 -0
  210. package/agent-docs/author/search.sections/use-the-search-box.md +39 -0
  211. package/agent-docs/author/search.sections/write-a-custom-provider.md +98 -0
  212. package/agent-docs/author/snippets.md +122 -0
  213. package/agent-docs/author/taxonomy.md +121 -0
  214. package/agent-docs/author/templates.md +231 -0
  215. package/agent-docs/author/templates.sections/built-in-feature-templates.md +52 -0
  216. package/agent-docs/author/templates.sections/built-in-templates.md +48 -0
  217. package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +69 -0
  218. package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +76 -0
  219. package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +46 -0
  220. package/agent-docs/author/templates.sections/project-added-templates.md +39 -0
  221. package/agent-docs/author/templates.sections/related-reading.md +47 -0
  222. package/agent-docs/author/templates.sections/scaffold-a-page.md +53 -0
  223. package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +56 -0
  224. package/agent-docs/author/templates.sections/what-every-template-gives-you.md +44 -0
  225. package/agent-docs/author/workspace/commands.md +92 -0
  226. package/agent-docs/author/workspace.md +104 -0
  227. package/agent-docs/author/writing-style.md +147 -0
  228. package/agent-docs/author/writing-style.sections/adapt-this-example.md +28 -0
  229. package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +44 -0
  230. package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +32 -0
  231. package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +28 -0
  232. package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +36 -0
  233. package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +49 -0
  234. package/agent-docs/author/writing-style.sections/procedures-and-examples.md +32 -0
  235. package/agent-docs/author/writing-style.sections/related-reading.md +32 -0
  236. package/agent-docs/author/writing-style.sections/review-a-draft.md +30 -0
  237. package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +39 -0
  238. package/agent-docs/author/writing-style.sections/voice-and-explanations.md +39 -0
  239. package/agent-docs/changelog/2026-10-14-agent-readiness.md +29 -0
  240. package/agent-docs/changelog/2026-10-15-evaluation-builds.md +84 -0
  241. package/agent-docs/changelog/2026-10-16-navigation-layouts.md +72 -0
  242. package/agent-docs/changelog/2026-10-17-mcp-hosting.md +60 -0
  243. package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +46 -0
  244. package/agent-docs/changelog/2026-10-19-visual-navigation.md +44 -0
  245. package/agent-docs/changelog/2026-10-25.md +45 -0
  246. package/agent-docs/changelog/2026-10-26.md +66 -0
  247. package/agent-docs/changelog/2026-10-27.md +85 -0
  248. package/agent-docs/changelog/authoring-preview.md +40 -0
  249. package/agent-docs/changelog/authoring-search.md +39 -0
  250. package/agent-docs/changelog/authoring-tools.md +34 -0
  251. package/agent-docs/changelog/working-tree-skill.md +38 -0
  252. package/agent-docs/changelog.md +115 -0
  253. package/agent-docs/chat/checks.md +175 -0
  254. package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +38 -0
  255. package/agent-docs/chat/checks.sections/answer-for-one-audience.md +66 -0
  256. package/agent-docs/chat/checks.sections/answer-without-a-model.md +54 -0
  257. package/agent-docs/chat/checks.sections/follow-up-questions.md +54 -0
  258. package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +67 -0
  259. package/agent-docs/chat/checks.sections/questions-with-several-parts.md +44 -0
  260. package/agent-docs/chat/checks.sections/related-reading.md +42 -0
  261. package/agent-docs/chat/checks.sections/reuse-answers.md +50 -0
  262. package/agent-docs/chat/host.md +222 -0
  263. package/agent-docs/chat/host.sections/cap-the-daily-spend.md +78 -0
  264. package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +64 -0
  265. package/agent-docs/chat/host.sections/related-reading.md +43 -0
  266. package/agent-docs/chat/passage-index.md +228 -0
  267. package/agent-docs/chat/passage-index.sections/build-the-index.md +72 -0
  268. package/agent-docs/chat/passage-index.sections/embed-passages.md +103 -0
  269. package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +53 -0
  270. package/agent-docs/chat/passage-index.sections/limits.md +45 -0
  271. package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +52 -0
  272. package/agent-docs/chat/passage-index.sections/related-reading.md +42 -0
  273. package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +91 -0
  274. package/agent-docs/chat/prepared-answers.md +116 -0
  275. package/agent-docs/chat/settings.md +213 -0
  276. package/agent-docs/chat/settings.sections/choose-the-scorer.md +63 -0
  277. package/agent-docs/chat/settings.sections/configure-chat.md +80 -0
  278. package/agent-docs/chat/settings.sections/configure-retrieval.md +62 -0
  279. package/agent-docs/chat/settings.sections/related-reading.md +32 -0
  280. package/agent-docs/chat/settings.sections/send-extra-request-fields.md +42 -0
  281. package/agent-docs/chat/settings.sections/use-more-than-one-model.md +62 -0
  282. package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +42 -0
  283. package/agent-docs/chat/setup.md +97 -0
  284. package/agent-docs/chat.md +102 -0
  285. package/agent-docs/cli.md +445 -0
  286. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +102 -0
  287. package/agent-docs/cli.sections/author-pages.md +94 -0
  288. package/agent-docs/cli.sections/build-and-serve.md +144 -0
  289. package/agent-docs/cli.sections/inspect-config-and-operations.md +41 -0
  290. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +45 -0
  291. package/agent-docs/cli.sections/related-reading.md +33 -0
  292. package/agent-docs/cli.sections/search-and-chat.md +132 -0
  293. package/agent-docs/cli.sections/start-a-project.md +37 -0
  294. package/agent-docs/cli.sections/working-tree-authoring-tools.md +35 -0
  295. package/agent-docs/concepts.md +133 -0
  296. package/agent-docs/config/apis.md +136 -0
  297. package/agent-docs/config/content.md +264 -0
  298. package/agent-docs/config/content.sections/authoring.md +58 -0
  299. package/agent-docs/config/content.sections/badges.md +34 -0
  300. package/agent-docs/config/content.sections/callouts.md +34 -0
  301. package/agent-docs/config/content.sections/cookbooks.md +38 -0
  302. package/agent-docs/config/content.sections/frontmatter.md +75 -0
  303. package/agent-docs/config/content.sections/readerfilters.md +44 -0
  304. package/agent-docs/config/content.sections/related-reading.md +34 -0
  305. package/agent-docs/config/content.sections/relationships.md +76 -0
  306. package/agent-docs/config/content.sections/snippets.md +61 -0
  307. package/agent-docs/config/content.sections/templates.md +57 -0
  308. package/agent-docs/config/content.sections/variables.md +55 -0
  309. package/agent-docs/config/examples.md +362 -0
  310. package/agent-docs/config/examples.sections/feature-showcase.md +63 -0
  311. package/agent-docs/config/examples.sections/minimal-site.md +85 -0
  312. package/agent-docs/config/examples.sections/multilingual-help-center.md +115 -0
  313. package/agent-docs/config/examples.sections/parcel-api-documentation.md +158 -0
  314. package/agent-docs/config/examples.sections/related-reading.md +55 -0
  315. package/agent-docs/config/examples.sections/shared-company-preset.md +123 -0
  316. package/agent-docs/config/integrations.md +76 -0
  317. package/agent-docs/config/outputs.md +160 -0
  318. package/agent-docs/config/outputs.sections/exports.md +57 -0
  319. package/agent-docs/config/outputs.sections/metadata.md +42 -0
  320. package/agent-docs/config/outputs.sections/related-reading.md +34 -0
  321. package/agent-docs/config/publishing.md +219 -0
  322. package/agent-docs/config/publishing.sections/navigation.md +92 -0
  323. package/agent-docs/config/publishing.sections/redirects.md +79 -0
  324. package/agent-docs/config/publishing.sections/related-reading.md +33 -0
  325. package/agent-docs/config/site.md +193 -0
  326. package/agent-docs/config/site.sections/related-reading.md +33 -0
  327. package/agent-docs/config/site.sections/theme.md +74 -0
  328. package/agent-docs/config.md +195 -0
  329. package/agent-docs/configuration.md +386 -0
  330. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +36 -0
  331. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +76 -0
  332. package/agent-docs/configuration.sections/extract-a-section-with-include.md +75 -0
  333. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +77 -0
  334. package/agent-docs/configuration.sections/related-reading.md +42 -0
  335. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +54 -0
  336. package/agent-docs/configuration.sections/share-defaults-through-extends.md +121 -0
  337. package/agent-docs/configuration.sections/start-with-one-working-file.md +83 -0
  338. package/agent-docs/configuration.sections/understand-the-three-stages.md +59 -0
  339. package/agent-docs/configuration.sections/understand-where-paths-point.md +53 -0
  340. package/agent-docs/connect/mcp.md +85 -0
  341. package/agent-docs/contribute/agent-skills.md +72 -0
  342. package/agent-docs/cookbooks/authoring.md +72 -0
  343. package/agent-docs/cookbooks/site-workflows.md +63 -0
  344. package/agent-docs/cookbooks/welcome-email.md +59 -0
  345. package/agent-docs/documents.json +19807 -0
  346. package/agent-docs/example-api/cedar/create-enrollment-7af3e5d2.md +594 -0
  347. package/agent-docs/example-api/cedar/get-legacy-parcel-6758d051.md +122 -0
  348. package/agent-docs/example-api/cedar/get-parcel-edee10e6.md +122 -0
  349. package/agent-docs/example-api/cedar/list-parcels-0345fb5f.md +271 -0
  350. package/agent-docs/example-api/cedar/parcel-delivered-7d1ba6db.md +122 -0
  351. package/agent-docs/example-api/cedar/upload-manifest-1af17891.md +101 -0
  352. package/agent-docs/example-api/cedar.md +39 -0
  353. package/agent-docs/example-api/create-note.md +344 -0
  354. package/agent-docs/example-api/generated/get-note-cbedb319.md +165 -0
  355. package/agent-docs/example-api/write-note.md +55 -0
  356. package/agent-docs/explore.md +54 -0
  357. package/agent-docs/glossary.md +823 -0
  358. package/agent-docs/index.md +249 -0
  359. package/agent-docs/ingredients/audit-site.md +27 -0
  360. package/agent-docs/ingredients/build-site.md +29 -0
  361. package/agent-docs/ingredients/compile-framework.md +28 -0
  362. package/agent-docs/ingredients/complete-page.md +30 -0
  363. package/agent-docs/ingredients/inspect-agent-bundle.md +28 -0
  364. package/agent-docs/ingredients/inspect-build.md +41 -0
  365. package/agent-docs/ingredients/preview-site.md +31 -0
  366. package/agent-docs/ingredients/refresh-agent-bundle.md +29 -0
  367. package/agent-docs/ingredients/scaffold-page.md +28 -0
  368. package/agent-docs/non-goals.md +58 -0
  369. package/agent-docs/provenance.json +10 -0
  370. package/agent-docs/publish/agent-discovery.md +79 -0
  371. package/agent-docs/publish/agent-friendliness.md +201 -0
  372. package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +61 -0
  373. package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +48 -0
  374. package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +46 -0
  375. package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +48 -0
  376. package/agent-docs/publish/agent-friendliness.sections/related-reading.md +52 -0
  377. package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +50 -0
  378. package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +62 -0
  379. package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +50 -0
  380. package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +58 -0
  381. package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +68 -0
  382. package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +60 -0
  383. package/agent-docs/publish/api-references.md +219 -0
  384. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +65 -0
  385. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +48 -0
  386. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +36 -0
  387. package/agent-docs/publish/api-references.sections/next-steps.md +62 -0
  388. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +38 -0
  389. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +62 -0
  390. package/agent-docs/publish/api-references.sections/register-the-operation.md +64 -0
  391. package/agent-docs/publish/api-references.sections/related-reading.md +42 -0
  392. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +54 -0
  393. package/agent-docs/publish/api-references.sections/what-readers-get.md +38 -0
  394. package/agent-docs/publish/audit.md +160 -0
  395. package/agent-docs/publish/audit.sections/add-project-tests.md +57 -0
  396. package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +52 -0
  397. package/agent-docs/publish/audit.sections/check-before-pushing.md +80 -0
  398. package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +54 -0
  399. package/agent-docs/publish/audit.sections/read-the-report.md +67 -0
  400. package/agent-docs/publish/audit.sections/related-reading.md +47 -0
  401. package/agent-docs/publish/content-export.md +208 -0
  402. package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +40 -0
  403. package/agent-docs/publish/content-export.sections/check-the-result.md +27 -0
  404. package/agent-docs/publish/content-export.sections/export-selected-pages.md +113 -0
  405. package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +29 -0
  406. package/agent-docs/publish/content-export.sections/prerequisites.md +29 -0
  407. package/agent-docs/publish/content-export.sections/related-reading.md +35 -0
  408. package/agent-docs/publish/content-export.sections/review-exported-api-material.md +44 -0
  409. package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +34 -0
  410. package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +43 -0
  411. package/agent-docs/publish/content-negotiation.md +121 -0
  412. package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +60 -0
  413. package/agent-docs/publish/content-negotiation.sections/missing-pages.md +51 -0
  414. package/agent-docs/publish/content-negotiation.sections/related-reading.md +45 -0
  415. package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +49 -0
  416. package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +62 -0
  417. package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +47 -0
  418. package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +49 -0
  419. package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +47 -0
  420. package/agent-docs/publish/deployment-check.md +72 -0
  421. package/agent-docs/publish/evals.md +175 -0
  422. package/agent-docs/publish/evals.sections/add-the-audit-hook.md +63 -0
  423. package/agent-docs/publish/evals.sections/check-the-report.md +36 -0
  424. package/agent-docs/publish/evals.sections/define-a-task-file.md +47 -0
  425. package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +42 -0
  426. package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +39 -0
  427. package/agent-docs/publish/evals.sections/related-reading.md +36 -0
  428. package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +54 -0
  429. package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +42 -0
  430. package/agent-docs/publish/host-adapters.md +60 -0
  431. package/agent-docs/publish/manni.md +227 -0
  432. package/agent-docs/publish/manni.sections/check-the-result.md +40 -0
  433. package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +83 -0
  434. package/agent-docs/publish/manni.sections/optional-custom-policies.md +42 -0
  435. package/agent-docs/publish/manni.sections/prerequisites.md +40 -0
  436. package/agent-docs/publish/mcp-analytics.md +356 -0
  437. package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +50 -0
  438. package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +45 -0
  439. package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +53 -0
  440. package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +62 -0
  441. package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +54 -0
  442. package/agent-docs/publish/mcp-analytics.sections/related-reading.md +36 -0
  443. package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +46 -0
  444. package/agent-docs/publish/mcp.md +190 -0
  445. package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +52 -0
  446. package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +51 -0
  447. package/agent-docs/publish/mcp.sections/configure-the-client.md +55 -0
  448. package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +50 -0
  449. package/agent-docs/publish/mcp.sections/related-reading.md +42 -0
  450. package/agent-docs/publish/mcp.sections/search-then-read.md +53 -0
  451. package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +79 -0
  452. package/agent-docs/publish/mcp.sections/verify-the-connection.md +40 -0
  453. package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +42 -0
  454. package/agent-docs/publish/openapi-extension-mappings.md +84 -0
  455. package/agent-docs/publish/output.md +220 -0
  456. package/agent-docs/publish/output.sections/api-contracts.md +48 -0
  457. package/agent-docs/publish/output.sections/code-highlighting.md +38 -0
  458. package/agent-docs/publish/output.sections/current-limits.md +40 -0
  459. package/agent-docs/publish/output.sections/incremental-sync.md +69 -0
  460. package/agent-docs/publish/output.sections/manifest-records-and-sections.md +46 -0
  461. package/agent-docs/publish/output.sections/navigation-section-indexes.md +42 -0
  462. package/agent-docs/publish/output.sections/page-formats.md +46 -0
  463. package/agent-docs/publish/output.sections/published-output-contract.md +58 -0
  464. package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +44 -0
  465. package/agent-docs/publish/output.sections/related-reading.md +34 -0
  466. package/agent-docs/publish/output.sections/response-identity.md +38 -0
  467. package/agent-docs/publish/output.sections/site-files.md +64 -0
  468. package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +48 -0
  469. package/agent-docs/publish/output.sections/where-files-go.md +49 -0
  470. package/agent-docs/publish/publications.md +153 -0
  471. package/agent-docs/publish/revisions.md +104 -0
  472. package/agent-docs/publish/seo.md +119 -0
  473. package/agent-docs/publish/single-source-sites.md +168 -0
  474. package/agent-docs/publish/troubleshooting.md +112 -0
  475. package/agent-docs/publish/vercel.md +130 -0
  476. package/agent-docs/publish/vercel.sections/check-the-deployment.md +54 -0
  477. package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +38 -0
  478. package/agent-docs/publish/vercel.sections/prepare-your-project.md +52 -0
  479. package/agent-docs/publish/vercel.sections/related-reading.md +38 -0
  480. package/agent-docs/publish.md +95 -0
  481. package/agent-docs/recipes/add-page.md +194 -0
  482. package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +40 -0
  483. package/agent-docs/recipes/add-page.sections/before-you-start.md +32 -0
  484. package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +42 -0
  485. package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +42 -0
  486. package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +54 -0
  487. package/agent-docs/recipes/add-page.sections/check-the-outcome.md +28 -0
  488. package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +42 -0
  489. package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +41 -0
  490. package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +43 -0
  491. package/agent-docs/recipes/add-page.sections/related-reading.md +30 -0
  492. package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +42 -0
  493. package/agent-docs/recipes/audit-docs.md +121 -0
  494. package/agent-docs/recipes/build-docs.md +104 -0
  495. package/agent-docs/recipes/preview-hybrid-search.md +84 -0
  496. package/agent-docs/recipes/preview-page.md +123 -0
  497. package/agent-docs/recipes/queue-email.md +49 -0
  498. package/agent-docs/recipes/refresh-agent-docs.md +127 -0
  499. package/agent-docs/recipes/send-welcome-email.md +92 -0
  500. package/agent-docs/reference/agent-skills.md +73 -0
  501. package/agent-docs/search-and-chat.md +87 -0
  502. package/agent-docs/search-index.json +1 -0
  503. package/agent-docs/start.md +201 -0
  504. package/agent-docs/start.sections/add-the-page-to-navigation.md +50 -0
  505. package/agent-docs/start.sections/build-and-check-both-outputs.md +50 -0
  506. package/agent-docs/start.sections/build-this-site.md +35 -0
  507. package/agent-docs/start.sections/check-writing-style.md +35 -0
  508. package/agent-docs/start.sections/create-a-page.md +105 -0
  509. package/agent-docs/start.sections/make-it-yours.md +37 -0
  510. package/agent-docs/start.sections/migrating-from-github-packages.md +35 -0
  511. package/agent-docs/start.sections/prerequisites.md +37 -0
  512. package/agent-docs/start.sections/related-reading.md +45 -0
  513. package/agent-docs/start.sections/start-your-own-project.md +53 -0
  514. package/agent-docs/status.md +75 -0
  515. package/agent-docs/styling/color-modes.md +89 -0
  516. package/agent-docs/styling/footer.md +69 -0
  517. package/agent-docs/styling/header.md +67 -0
  518. package/agent-docs/styling/layouts.md +197 -0
  519. package/agent-docs/styling/layouts.sections/build-a-landing-page.md +61 -0
  520. package/agent-docs/styling/layouts.sections/build-a-splash-page.md +88 -0
  521. package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +51 -0
  522. package/agent-docs/styling/layouts.sections/customize-the-hero.md +50 -0
  523. package/agent-docs/styling/layouts.sections/hero.md +83 -0
  524. package/agent-docs/styling/layouts.sections/html-markdown-and-agents.md +40 -0
  525. package/agent-docs/styling/layouts.sections/related-reading.md +42 -0
  526. package/agent-docs/styling/palettes.md +144 -0
  527. package/agent-docs/styling/share-images.md +109 -0
  528. package/agent-docs/styling/themes.md +128 -0
  529. package/agent-docs/styling/try.md +94 -0
  530. package/agent-docs/what-is-shoalrun.md +56 -0
  531. package/assets/analytics.js +72 -0
  532. package/assets/ask-widget.js +320 -0
  533. package/assets/code-samples.js +28 -0
  534. package/assets/components.js +32 -0
  535. package/assets/cookbook-chooser.js +170 -0
  536. package/assets/copy-markdown.js +24 -0
  537. package/assets/example-panel.js +77 -0
  538. package/assets/file-tree.js +49 -0
  539. package/assets/image-viewer.js +41 -0
  540. package/assets/mode.js +26 -0
  541. package/assets/navigation.js +233 -0
  542. package/assets/reader-filters.js +305 -0
  543. package/assets/reader.js +111 -0
  544. package/assets/search-highlight.js +32 -0
  545. package/assets/search-lexical.js +66 -0
  546. package/assets/search.js +150 -0
  547. package/assets/table-filter.js +63 -0
  548. package/assets/tabs.js +80 -0
  549. package/assets/theme-preview.css +17 -0
  550. package/assets/theme-preview.js +135 -0
  551. package/assets/theme-switcher.js +113 -0
  552. package/assets/tooltips.js +81 -0
  553. package/assets/walkthrough.js +233 -0
  554. package/dist/agent-discovery.d.ts +11 -0
  555. package/dist/agent-discovery.js +37 -0
  556. package/dist/analytics.d.ts +2 -0
  557. package/dist/analytics.js +13 -0
  558. package/dist/answer-cache.d.ts +24 -0
  559. package/dist/answer-cache.js +55 -0
  560. package/dist/answer-cards.d.ts +71 -0
  561. package/dist/answer-cards.js +148 -0
  562. package/dist/api-embeds.d.ts +22 -0
  563. package/dist/api-embeds.js +84 -0
  564. package/dist/api-identity.d.ts +6 -0
  565. package/dist/api-identity.js +7 -0
  566. package/dist/api-materialize.d.ts +12 -0
  567. package/dist/api-materialize.js +120 -0
  568. package/dist/api-publication-plan.d.ts +86 -0
  569. package/dist/api-publication-plan.js +187 -0
  570. package/dist/api-publication-review.d.ts +23 -0
  571. package/dist/api-publication-review.js +58 -0
  572. package/dist/api-selection.d.ts +21 -0
  573. package/dist/api-selection.js +84 -0
  574. package/dist/api.d.ts +74 -0
  575. package/dist/api.js +782 -0
  576. package/dist/artifact-bundle.d.ts +96 -0
  577. package/dist/artifact-bundle.js +306 -0
  578. package/dist/ask-function.d.ts +19 -0
  579. package/dist/ask-function.js +139 -0
  580. package/dist/ask-handler.d.ts +38 -0
  581. package/dist/ask-handler.js +157 -0
  582. package/dist/ask-log-kv.d.ts +14 -0
  583. package/dist/ask-log-kv.js +69 -0
  584. package/dist/ask-log.d.ts +106 -0
  585. package/dist/ask-log.js +159 -0
  586. package/dist/ask-setup.d.ts +43 -0
  587. package/dist/ask-setup.js +99 -0
  588. package/dist/ask.d.ts +152 -0
  589. package/dist/ask.js +532 -0
  590. package/dist/audit.d.ts +29 -0
  591. package/dist/audit.js +171 -0
  592. package/dist/authored-change.d.ts +22 -0
  593. package/dist/authored-change.js +47 -0
  594. package/dist/authoring-api.d.ts +18 -0
  595. package/dist/authoring-api.js +15 -0
  596. package/dist/authoring-findings.d.ts +31 -0
  597. package/dist/authoring-findings.js +104 -0
  598. package/dist/authoring-guidance.d.ts +15 -0
  599. package/dist/authoring-guidance.js +57 -0
  600. package/dist/authoring-preview.d.ts +24 -0
  601. package/dist/authoring-preview.js +160 -0
  602. package/dist/authoring-project-command.d.ts +7 -0
  603. package/dist/authoring-project-command.js +52 -0
  604. package/dist/authoring-project.d.ts +104 -0
  605. package/dist/authoring-project.js +287 -0
  606. package/dist/authoring-review-command.d.ts +1 -0
  607. package/dist/authoring-review-command.js +68 -0
  608. package/dist/authoring-review.d.ts +72 -0
  609. package/dist/authoring-review.js +71 -0
  610. package/dist/authoring-snapshot.d.ts +66 -0
  611. package/dist/authoring-snapshot.js +293 -0
  612. package/dist/authoring-validation-command.d.ts +1 -0
  613. package/dist/authoring-validation-command.js +54 -0
  614. package/dist/authoring-validation.d.ts +101 -0
  615. package/dist/authoring-validation.js +348 -0
  616. package/dist/badges.d.ts +16 -0
  617. package/dist/badges.js +57 -0
  618. package/dist/budget-store.d.ts +21 -0
  619. package/dist/budget-store.js +90 -0
  620. package/dist/budget.d.ts +45 -0
  621. package/dist/budget.js +128 -0
  622. package/dist/build-info.d.ts +10 -0
  623. package/dist/build-info.js +15 -0
  624. package/dist/callouts.d.ts +18 -0
  625. package/dist/callouts.js +63 -0
  626. package/dist/cards.d.ts +35 -0
  627. package/dist/cards.js +237 -0
  628. package/dist/chat-config.d.ts +117 -0
  629. package/dist/chat-config.js +400 -0
  630. package/dist/chat-pause.d.ts +1 -0
  631. package/dist/chat-pause.js +3 -0
  632. package/dist/chat.d.ts +46 -0
  633. package/dist/chat.js +78 -0
  634. package/dist/cli-discovery.d.ts +4 -0
  635. package/dist/cli-discovery.js +86 -0
  636. package/dist/cli.d.ts +2 -0
  637. package/dist/cli.js +750 -0
  638. package/dist/code-samples.d.ts +50 -0
  639. package/dist/code-samples.js +181 -0
  640. package/dist/compact-discovery.d.ts +15 -0
  641. package/dist/compact-discovery.js +78 -0
  642. package/dist/compiler-config.d.ts +67 -0
  643. package/dist/compiler-config.js +66 -0
  644. package/dist/compiler.d.ts +208 -0
  645. package/dist/compiler.js +524 -0
  646. package/dist/component-bundle.d.ts +4 -0
  647. package/dist/component-bundle.js +32 -0
  648. package/dist/component-content.d.ts +78 -0
  649. package/dist/component-content.js +47 -0
  650. package/dist/component-manifest.d.ts +15 -0
  651. package/dist/component-manifest.js +84 -0
  652. package/dist/component-names.d.ts +1 -0
  653. package/dist/component-names.js +1 -0
  654. package/dist/component-plugins.d.ts +28 -0
  655. package/dist/component-plugins.js +141 -0
  656. package/dist/component-transform.d.ts +10 -0
  657. package/dist/component-transform.js +697 -0
  658. package/dist/components.d.ts +2 -0
  659. package/dist/components.js +1 -0
  660. package/dist/config.d.ts +29 -0
  661. package/dist/config.js +149 -0
  662. package/dist/content-export-assets.d.ts +23 -0
  663. package/dist/content-export-assets.js +103 -0
  664. package/dist/content-export-command.d.ts +20 -0
  665. package/dist/content-export-command.js +57 -0
  666. package/dist/content-export-config.d.ts +16 -0
  667. package/dist/content-export-config.js +50 -0
  668. package/dist/content-export-render.d.ts +12 -0
  669. package/dist/content-export-render.js +132 -0
  670. package/dist/content-export.d.ts +30 -0
  671. package/dist/content-export.js +307 -0
  672. package/dist/content-filter.d.ts +4 -0
  673. package/dist/content-filter.js +16 -0
  674. package/dist/content-source.d.ts +100 -0
  675. package/dist/content-source.js +42 -0
  676. package/dist/content-workspace.d.ts +293 -0
  677. package/dist/content-workspace.js +69 -0
  678. package/dist/content.d.ts +41 -0
  679. package/dist/content.js +176 -0
  680. package/dist/cookbook-chooser.d.ts +19 -0
  681. package/dist/cookbook-chooser.js +56 -0
  682. package/dist/dev.d.ts +2 -0
  683. package/dist/dev.js +113 -0
  684. package/dist/diagram-svg.d.ts +1 -0
  685. package/dist/diagram-svg.js +44 -0
  686. package/dist/diagrams.d.ts +7 -0
  687. package/dist/diagrams.js +102 -0
  688. package/dist/docs-author.d.ts +86 -0
  689. package/dist/docs-author.js +380 -0
  690. package/dist/docs-command.d.ts +8 -0
  691. package/dist/docs-command.js +62 -0
  692. package/dist/docs-eval.d.ts +146 -0
  693. package/dist/docs-eval.js +231 -0
  694. package/dist/docs-mcp.d.ts +12 -0
  695. package/dist/docs-mcp.js +82 -0
  696. package/dist/docs-tool.d.ts +81 -0
  697. package/dist/docs-tool.js +7 -0
  698. package/dist/document-sync.d.ts +36 -0
  699. package/dist/document-sync.js +58 -0
  700. package/dist/documentation-core.d.ts +148 -0
  701. package/dist/documentation-core.js +160 -0
  702. package/dist/embeddings.d.ts +68 -0
  703. package/dist/embeddings.js +198 -0
  704. package/dist/focused-audit.d.ts +10 -0
  705. package/dist/focused-audit.js +69 -0
  706. package/dist/focused-openapi.d.ts +2 -0
  707. package/dist/focused-openapi.js +140 -0
  708. package/dist/fonts.d.ts +54 -0
  709. package/dist/fonts.js +92 -0
  710. package/dist/freshness.d.ts +7 -0
  711. package/dist/freshness.js +58 -0
  712. package/dist/frontmatter.d.ts +24 -0
  713. package/dist/frontmatter.js +342 -0
  714. package/dist/function-package.d.ts +1 -0
  715. package/dist/function-package.js +58 -0
  716. package/dist/highlight.d.ts +14 -0
  717. package/dist/highlight.js +114 -0
  718. package/dist/html-renderer.d.ts +10 -0
  719. package/dist/html-renderer.js +63 -0
  720. package/dist/icons.d.ts +8 -0
  721. package/dist/icons.js +40 -0
  722. package/dist/index-build.d.ts +55 -0
  723. package/dist/index-build.js +227 -0
  724. package/dist/ingredient-draft.d.ts +17 -0
  725. package/dist/ingredient-draft.js +94 -0
  726. package/dist/ingredient-workflow.d.ts +8 -0
  727. package/dist/ingredient-workflow.js +25 -0
  728. package/dist/init.d.ts +8 -0
  729. package/dist/init.js +66 -0
  730. package/dist/jev.d.ts +62 -0
  731. package/dist/jev.js +190 -0
  732. package/dist/link-audit.d.ts +12 -0
  733. package/dist/link-audit.js +146 -0
  734. package/dist/llms-discovery.d.ts +11 -0
  735. package/dist/llms-discovery.js +23 -0
  736. package/dist/markdown-sections.d.ts +15 -0
  737. package/dist/markdown-sections.js +60 -0
  738. package/dist/markdown-size.d.ts +7 -0
  739. package/dist/markdown-size.js +6 -0
  740. package/dist/mcp-analytics.d.ts +38 -0
  741. package/dist/mcp-analytics.js +35 -0
  742. package/dist/mcp-artifacts.d.ts +2 -0
  743. package/dist/mcp-artifacts.js +78 -0
  744. package/dist/mcp-client-metadata.d.ts +18 -0
  745. package/dist/mcp-client-metadata.js +69 -0
  746. package/dist/mcp-config.d.ts +23 -0
  747. package/dist/mcp-config.js +56 -0
  748. package/dist/mcp-http.d.ts +19 -0
  749. package/dist/mcp-http.js +157 -0
  750. package/dist/mcp-integrity.d.ts +3 -0
  751. package/dist/mcp-integrity.js +4 -0
  752. package/dist/mcp-node.d.ts +4 -0
  753. package/dist/mcp-node.js +68 -0
  754. package/dist/mcp-vercel-runtime.d.ts +3 -0
  755. package/dist/mcp-vercel-runtime.js +36 -0
  756. package/dist/mcp-vercel.d.ts +15 -0
  757. package/dist/mcp-vercel.js +65 -0
  758. package/dist/metadata-provider.d.ts +19 -0
  759. package/dist/metadata-provider.js +38 -0
  760. package/dist/negotiation.d.ts +10 -0
  761. package/dist/negotiation.js +35 -0
  762. package/dist/not-found.d.ts +16 -0
  763. package/dist/not-found.js +25 -0
  764. package/dist/output-commit.d.ts +1 -0
  765. package/dist/output-commit.js +133 -0
  766. package/dist/output-location.d.ts +3 -0
  767. package/dist/output-location.js +30 -0
  768. package/dist/page-materialization.d.ts +78 -0
  769. package/dist/page-materialization.js +132 -0
  770. package/dist/page-renderer.d.ts +71 -0
  771. package/dist/page-renderer.js +177 -0
  772. package/dist/palettes.d.ts +41 -0
  773. package/dist/palettes.js +160 -0
  774. package/dist/procedure-components.d.ts +2 -0
  775. package/dist/procedure-components.js +94 -0
  776. package/dist/project-navigation.d.ts +41 -0
  777. package/dist/project-navigation.js +190 -0
  778. package/dist/provider-http.d.ts +10 -0
  779. package/dist/provider-http.js +60 -0
  780. package/dist/publication-manifest.d.ts +229 -0
  781. package/dist/publication-manifest.js +53 -0
  782. package/dist/publication-plan.d.ts +34 -0
  783. package/dist/publication-plan.js +85 -0
  784. package/dist/publication-render.d.ts +71 -0
  785. package/dist/publication-render.js +92 -0
  786. package/dist/reader-filters.d.ts +30 -0
  787. package/dist/reader-filters.js +105 -0
  788. package/dist/recipe-draft.d.ts +17 -0
  789. package/dist/recipe-draft.js +147 -0
  790. package/dist/reference-audit.d.ts +18 -0
  791. package/dist/reference-audit.js +169 -0
  792. package/dist/remote-import.d.ts +62 -0
  793. package/dist/remote-import.js +292 -0
  794. package/dist/representation-tree.d.ts +3 -0
  795. package/dist/representation-tree.js +320 -0
  796. package/dist/retrieval-config.d.ts +30 -0
  797. package/dist/retrieval-config.js +83 -0
  798. package/dist/retrieval.d.ts +60 -0
  799. package/dist/retrieval.js +228 -0
  800. package/dist/scaffold.d.ts +39 -0
  801. package/dist/scaffold.js +167 -0
  802. package/dist/search-config.d.ts +8 -0
  803. package/dist/search-config.js +26 -0
  804. package/dist/search-handler.d.ts +16 -0
  805. package/dist/search-handler.js +111 -0
  806. package/dist/search-identifier.d.ts +3 -0
  807. package/dist/search-identifier.js +25 -0
  808. package/dist/search-literal.d.ts +1 -0
  809. package/dist/search-literal.js +28 -0
  810. package/dist/search-query.d.ts +54 -0
  811. package/dist/search-query.js +120 -0
  812. package/dist/search-results.d.ts +6 -0
  813. package/dist/search-results.js +45 -0
  814. package/dist/search-snippet.d.ts +11 -0
  815. package/dist/search-snippet.js +93 -0
  816. package/dist/search-synonyms.d.ts +8 -0
  817. package/dist/search-synonyms.js +46 -0
  818. package/dist/semantic-markdown.d.ts +10 -0
  819. package/dist/semantic-markdown.js +39 -0
  820. package/dist/server.d.ts +10 -0
  821. package/dist/server.js +223 -0
  822. package/dist/share-images.d.ts +24 -0
  823. package/dist/share-images.js +187 -0
  824. package/dist/site-path.d.ts +2 -0
  825. package/dist/site-path.js +15 -0
  826. package/dist/sitemap.d.ts +8 -0
  827. package/dist/sitemap.js +58 -0
  828. package/dist/snippets.d.ts +19 -0
  829. package/dist/snippets.js +84 -0
  830. package/dist/structured-model-output.d.ts +6 -0
  831. package/dist/structured-model-output.js +21 -0
  832. package/dist/subject-deprecation.d.ts +21 -0
  833. package/dist/subject-deprecation.js +57 -0
  834. package/dist/surface-text.d.ts +4 -0
  835. package/dist/surface-text.js +42 -0
  836. package/dist/taxonomy.d.ts +14 -0
  837. package/dist/taxonomy.js +88 -0
  838. package/dist/turnstile.d.ts +21 -0
  839. package/dist/turnstile.js +52 -0
  840. package/dist/vale.d.ts +28 -0
  841. package/dist/vale.js +103 -0
  842. package/dist/vercel-function.d.ts +21 -0
  843. package/dist/vercel-function.js +108 -0
  844. package/dist/vercel.d.ts +11 -0
  845. package/dist/vercel.js +103 -0
  846. package/dist/walkthrough.d.ts +25 -0
  847. package/dist/walkthrough.js +336 -0
  848. package/dist/yaml-value.d.ts +2 -0
  849. package/dist/yaml-value.js +36 -0
  850. package/example-configs/api-docs/README.md +59 -0
  851. package/example-configs/api-docs/apis/cedar-parcel.yaml +413 -0
  852. package/example-configs/api-docs/content/create-enrollment.mdx +11 -0
  853. package/example-configs/api-docs/content/overview.mdx +36 -0
  854. package/example-configs/api-docs/content/quickstart.mdx +52 -0
  855. package/example-configs/api-docs/docs.config.yaml +104 -0
  856. package/example-configs/faceted-sites/README.md +31 -0
  857. package/example-configs/faceted-sites/base.yaml +30 -0
  858. package/example-configs/faceted-sites/content/api.md +12 -0
  859. package/example-configs/faceted-sites/content/home.md +10 -0
  860. package/example-configs/faceted-sites/content/operations.md +12 -0
  861. package/example-configs/faceted-sites/developers.config.yaml +8 -0
  862. package/example-configs/faceted-sites/docs.config.yaml +7 -0
  863. package/example-configs/faceted-sites/europe.config.yaml +9 -0
  864. package/example-configs/minimal/content/install.mdx +12 -0
  865. package/example-configs/minimal/content/welcome.mdx +8 -0
  866. package/example-configs/minimal/docs.config.yaml +31 -0
  867. package/example-configs/multilingual/content/de/home.mdx +9 -0
  868. package/example-configs/multilingual/content/de/reset-password.mdx +9 -0
  869. package/example-configs/multilingual/content/home.mdx +10 -0
  870. package/example-configs/multilingual/content/reset-password.mdx +12 -0
  871. package/example-configs/multilingual/docs.config.yaml +61 -0
  872. package/example-configs/multilingual/snippets/contact.mdx +1 -0
  873. package/example-configs/notifications/apis/notifications.yaml +132 -0
  874. package/example-configs/notifications/content/cookbook.mdx +17 -0
  875. package/example-configs/notifications/content/get-message.mdx +14 -0
  876. package/example-configs/notifications/content/queue-email.mdx +42 -0
  877. package/example-configs/notifications/content/queue-push.mdx +33 -0
  878. package/example-configs/notifications/content/queue-sms.mdx +33 -0
  879. package/example-configs/notifications/content/send-email.mdx +14 -0
  880. package/example-configs/notifications/content/send-push.mdx +14 -0
  881. package/example-configs/notifications/content/send-sms.mdx +14 -0
  882. package/example-configs/notifications/content/start.mdx +13 -0
  883. package/example-configs/notifications/content/welcome-cookbook.mdx +21 -0
  884. package/example-configs/notifications/content/welcome-email.mdx +82 -0
  885. package/example-configs/notifications/demo.mjs +43 -0
  886. package/example-configs/notifications/docs.config.yaml +88 -0
  887. package/example-configs/notifications/ingredient-drafts/README.md +41 -0
  888. package/example-configs/notifications/ingredient-drafts/check-delivery.mdx +13 -0
  889. package/example-configs/notifications/ingredient-drafts/queue-welcome-email.mdx +48 -0
  890. package/example-configs/notifications/ingredient-specs/queue-welcome-email.yaml +7 -0
  891. package/example-configs/notifications/ingredients/check-delivery.mdx +42 -0
  892. package/example-configs/notifications/ingredients/queue-welcome-email.mdx +37 -0
  893. package/example-configs/notifications/recipe-drafts/send-welcome-email.mdx +91 -0
  894. package/example-configs/notifications/recipe-specs/send-welcome-email.yaml +11 -0
  895. package/example-configs/reference-stress/README.md +32 -0
  896. package/example-configs/reference-stress/apis/cedar-parcel.yaml +413 -0
  897. package/example-configs/reference-stress/content/enrollment-shapes.mdx +16 -0
  898. package/example-configs/reference-stress/content/overview.mdx +14 -0
  899. package/example-configs/reference-stress/docs.config.yaml +55 -0
  900. package/example-configs/shared-preset/shared/company-docs.yaml +46 -0
  901. package/example-configs/shared-preset/shared/runbook.mdx +7 -0
  902. package/example-configs/shared-preset/site/content/failed-invoices.mdx +15 -0
  903. package/example-configs/shared-preset/site/content/start.mdx +9 -0
  904. package/example-configs/shared-preset/site/docs.config.yaml +18 -0
  905. package/example-configs/showcase/README.md +20 -0
  906. package/example-configs/showcase/apis/cedar-parcel.yaml +413 -0
  907. package/example-configs/showcase/content/assets/collection.svg +1 -0
  908. package/example-configs/showcase/content/code.mdx +100 -0
  909. package/example-configs/showcase/content/create-enrollment.mdx +11 -0
  910. package/example-configs/showcase/content/features.mdx +39 -0
  911. package/example-configs/showcase/content/landing.mdx +36 -0
  912. package/example-configs/showcase/content/overview.mdx +42 -0
  913. package/example-configs/showcase/content/personalization.mdx +38 -0
  914. package/example-configs/showcase/content/preview.mdx +35 -0
  915. package/example-configs/showcase/content/procedures.mdx +88 -0
  916. package/example-configs/showcase/content/quickstart.mdx +64 -0
  917. package/example-configs/showcase/content/reading.mdx +99 -0
  918. package/example-configs/showcase/content/verify.mdx +27 -0
  919. package/example-configs/showcase/content/visuals.mdx +47 -0
  920. package/example-configs/showcase/content/workflows.mdx +12 -0
  921. package/example-configs/showcase/docs.config.yaml +149 -0
  922. package/example-configs/showcase/snippets/sandbox.mdx +1 -0
  923. package/examples/analytics/README.md +56 -0
  924. package/examples/analytics/inspector.js +25 -0
  925. package/examples/analytics/posthog.js +36 -0
  926. package/examples/components/comparison.mjs +8 -0
  927. package/examples/components/components.json +6 -0
  928. package/examples/components/copy-text/LICENSE.react-dom.txt +21 -0
  929. package/examples/components/copy-text/LICENSE.react.txt +21 -0
  930. package/examples/components/copy-text/LICENSE.scheduler.txt +21 -0
  931. package/examples/components/copy-text/browser.jsx +21 -0
  932. package/examples/components/copy-text/components.json +6 -0
  933. package/examples/components/copy-text/package-lock.json +41 -0
  934. package/examples/components/copy-text/package.json +9 -0
  935. package/examples/components/copy-text/plugin.mjs +5 -0
  936. package/examples/components/retry-budget/LICENSE.react-dom.txt +21 -0
  937. package/examples/components/retry-budget/LICENSE.react.txt +21 -0
  938. package/examples/components/retry-budget/LICENSE.scheduler.txt +21 -0
  939. package/examples/components/retry-budget/browser.jsx +50 -0
  940. package/examples/components/retry-budget/components.json +6 -0
  941. package/examples/components/retry-budget/model.js +22 -0
  942. package/examples/components/retry-budget/package-lock.json +41 -0
  943. package/examples/components/retry-budget/package.json +9 -0
  944. package/examples/components/retry-budget/plugin.mjs +31 -0
  945. package/examples/components/retry-budget/policy.json +9 -0
  946. package/examples/components/retry-budget/style.css +25 -0
  947. package/examples/diagrams/d2-gallery.json +138 -0
  948. package/examples/diagrams/gallery.json +236 -0
  949. package/examples/help-drawer/README.md +44 -0
  950. package/examples/help-drawer/app.js +53 -0
  951. package/examples/help-drawer/components/components.json +1 -0
  952. package/examples/help-drawer/components/support.mjs +10 -0
  953. package/examples/help-drawer/content/account.md +8 -0
  954. package/examples/help-drawer/content/billing.mdx +29 -0
  955. package/examples/help-drawer/content/keys.mdx +46 -0
  956. package/examples/help-drawer/content/settings.svg +1 -0
  957. package/examples/help-drawer/docs.config.yaml +30 -0
  958. package/examples/help-drawer/index.html +26 -0
  959. package/examples/help-drawer/preview.mjs +33 -0
  960. package/examples/mcp-analytics/README.md +59 -0
  961. package/examples/mcp-analytics/posthog.mjs +159 -0
  962. package/package.json +100 -4
  963. package/schemas/content-export.schema.json +55 -0
  964. package/skills/shoalrun-author/SKILL.md +52 -0
  965. package/skills/shoalrun-component-author/SKILL.md +24 -0
  966. package/skills/shoalrun-recipes/SKILL.md +25 -0
  967. package/skills/shoalrun-setup/SKILL.md +34 -0
  968. package/skills/shoalrun-walkthrough/SKILL.md +18 -0
  969. package/styles/fonts/figtree-LICENSE.txt +93 -0
  970. package/styles/fonts/figtree-italic.woff2 +0 -0
  971. package/styles/fonts/figtree.woff2 +0 -0
  972. package/styles/fonts/inter-LICENSE.txt +93 -0
  973. package/styles/fonts/inter-italic.woff2 +0 -0
  974. package/styles/fonts/inter.woff2 +0 -0
  975. package/styles/fonts/jetbrains-mono-LICENSE.txt +93 -0
  976. package/styles/fonts/jetbrains-mono.woff2 +0 -0
  977. package/styles/fonts/jost-LICENSE.txt +93 -0
  978. package/styles/fonts/jost-italic.woff2 +0 -0
  979. package/styles/fonts/jost.woff2 +0 -0
  980. package/styles/fonts/share/figtree-400.ttf +0 -0
  981. package/styles/fonts/share/figtree-700.ttf +0 -0
  982. package/styles/fonts/share/inter-400.ttf +0 -0
  983. package/styles/fonts/share/inter-700.ttf +0 -0
  984. package/styles/fonts/share/jetbrains-mono-700.ttf +0 -0
  985. package/styles/fonts/share/jost-italic-800.ttf +0 -0
  986. package/styles/fonts/share/metrics.json +1 -0
  987. package/styles/fonts/share/source-serif-4-400.ttf +0 -0
  988. package/styles/fonts/source-serif-4-LICENSE.txt +93 -0
  989. package/styles/fonts/source-serif-4-italic.woff2 +0 -0
  990. package/styles/fonts/source-serif-4.woff2 +0 -0
  991. package/styles/header.css +56 -0
  992. package/styles/site.css +825 -0
  993. package/styles/themes/ledger.css +93 -0
  994. package/styles/themes/palettes/amethyst.yaml +127 -0
  995. package/styles/themes/palettes/coral.yaml +127 -0
  996. package/styles/themes/palettes/harbor.yaml +127 -0
  997. package/styles/themes/palettes/ink.yaml +127 -0
  998. package/styles/themes/palettes/kelp.yaml +127 -0
  999. package/styles/themes/palettes/vice.yaml +127 -0
  1000. package/styles/themes/reef.css +68 -0
  1001. package/styles/themes/vice.css +56 -0
  1002. package/styles/tokens.css +91 -0
  1003. package/templates/api-reference.mdx +133 -0
  1004. package/templates/cookbook.mdx +38 -0
  1005. package/templates/explanation.mdx +76 -0
  1006. package/templates/guide.mdx +175 -0
  1007. package/templates/how-to.mdx +171 -0
  1008. package/templates/ingredient.mdx +53 -0
  1009. package/templates/recipe.mdx +76 -0
  1010. package/templates/reference.mdx +171 -0
  1011. package/templates/troubleshooting.mdx +159 -0
  1012. package/templates/tutorial.mdx +165 -0
@@ -0,0 +1,54 @@
1
+ export type FontRole = 'body' | 'headings' | 'code';
2
+ export type FontFace = {
3
+ family: string;
4
+ file: string;
5
+ route: string;
6
+ style: 'normal' | 'italic';
7
+ weight: string;
8
+ };
9
+ export type SiteFonts = {
10
+ bundled: boolean;
11
+ faces: FontFace[];
12
+ tokens: Partial<Record<FontRole, string>>;
13
+ preload?: string;
14
+ };
15
+ export declare const bundledFonts: readonly [{
16
+ readonly family: "Inter";
17
+ readonly file: "inter.woff2";
18
+ readonly style: "normal";
19
+ }, {
20
+ readonly family: "Inter";
21
+ readonly file: "inter-italic.woff2";
22
+ readonly style: "italic";
23
+ }, {
24
+ readonly family: "Figtree";
25
+ readonly file: "figtree.woff2";
26
+ readonly style: "normal";
27
+ }, {
28
+ readonly family: "Figtree";
29
+ readonly file: "figtree-italic.woff2";
30
+ readonly style: "italic";
31
+ }, {
32
+ readonly family: "Source Serif 4";
33
+ readonly file: "source-serif-4.woff2";
34
+ readonly style: "normal";
35
+ }, {
36
+ readonly family: "Source Serif 4";
37
+ readonly file: "source-serif-4-italic.woff2";
38
+ readonly style: "italic";
39
+ }, {
40
+ readonly family: "JetBrains Mono";
41
+ readonly file: "jetbrains-mono.woff2";
42
+ readonly style: "normal";
43
+ }, {
44
+ readonly family: "Jost";
45
+ readonly file: "jost.woff2";
46
+ readonly style: "normal";
47
+ }, {
48
+ readonly family: "Jost";
49
+ readonly file: "jost-italic.woff2";
50
+ readonly style: "italic";
51
+ }];
52
+ export declare const bundledFontLicenses: string[];
53
+ export declare function resolveFonts(value: unknown, preset: string, declaringFile: string): SiteFonts;
54
+ export declare function fontsCss(fonts: SiteFonts): string | undefined;
package/dist/fonts.js ADDED
@@ -0,0 +1,92 @@
1
+ import path from 'node:path';
2
+ // Latin variable fonts from Fontsource, all under the SIL Open Font License. Readers download only the faces a page uses.
3
+ export const bundledFonts = [
4
+ { family: 'Inter', file: 'inter.woff2', style: 'normal' },
5
+ { family: 'Inter', file: 'inter-italic.woff2', style: 'italic' },
6
+ { family: 'Figtree', file: 'figtree.woff2', style: 'normal' },
7
+ { family: 'Figtree', file: 'figtree-italic.woff2', style: 'italic' },
8
+ { family: 'Source Serif 4', file: 'source-serif-4.woff2', style: 'normal' },
9
+ { family: 'Source Serif 4', file: 'source-serif-4-italic.woff2', style: 'italic' },
10
+ { family: 'JetBrains Mono', file: 'jetbrains-mono.woff2', style: 'normal' },
11
+ { family: 'Jost', file: 'jost.woff2', style: 'normal' },
12
+ { family: 'Jost', file: 'jost-italic.woff2', style: 'italic' }
13
+ ];
14
+ // Local fonts resized to each bundled font's metrics, so text keeps its place when the bundled font arrives.
15
+ // Values come from the font files: average glyph width sets size-adjust; hhea ascent, descent, and gap set the overrides.
16
+ const localSans = 'local("Arial"), local("Arimo"), local("Liberation Sans")';
17
+ const fallbackFaces = [
18
+ { family: 'Inter', src: localSans, size: '107.34%', ascent: '90.25%', descent: '22.47%' },
19
+ { family: 'Figtree', src: localSans, size: '99.25%', ascent: '95.71%', descent: '25.19%' },
20
+ { family: 'Source Serif 4', src: 'local("Times New Roman"), local("Tinos"), local("Liberation Serif")', size: '118.84%', ascent: '87.18%', descent: '28.19%' },
21
+ { family: 'JetBrains Mono', src: 'local("Courier New"), local("Cousine"), local("Liberation Mono")', size: '99.98%', ascent: '102.02%', descent: '30.00%' },
22
+ { family: 'Jost', src: localSans, size: '95.84%', ascent: '111.65%', descent: '39.13%' }
23
+ ];
24
+ export const bundledFontLicenses = ['inter', 'figtree', 'source-serif-4', 'jetbrains-mono', 'jost'].map(name => `${name}-LICENSE.txt`);
25
+ // The body font each preset preloads so the first paint uses it.
26
+ const presetBodyFont = { shoal: 'inter.woff2', reef: 'figtree.woff2', ledger: 'source-serif-4.woff2', vice: 'figtree.woff2' };
27
+ const fallbacks = {
28
+ body: 'ui-sans-serif, system-ui, sans-serif',
29
+ headings: 'var(--font-body)',
30
+ code: 'ui-monospace, "SFMono-Regular", Consolas, monospace'
31
+ };
32
+ const roles = ['body', 'headings', 'code'];
33
+ const formats = { '.woff2': 'woff2', '.woff': 'woff', '.ttf': 'truetype', '.otf': 'opentype' };
34
+ const familyName = /^[\p{L}\p{N} _.-]+$/u;
35
+ const weightValue = /^[1-9]\d{0,2}( [1-9]\d{0,2})?$/;
36
+ // theme.fonts: omitted keeps the preset's bundled fonts, `system` turns them off, and body/headings/code bring your own.
37
+ export function resolveFonts(value, preset, declaringFile) {
38
+ if (value === undefined)
39
+ return { bundled: true, faces: [], tokens: {}, preload: presetBodyFont[preset] };
40
+ if (value === 'system')
41
+ return { bundled: false, faces: [], tokens: {} };
42
+ if (!value || typeof value !== 'object' || Array.isArray(value))
43
+ throw new Error('theme.fonts must be system or a mapping of body, headings, and code');
44
+ const unknown = Object.keys(value).filter(key => !roles.includes(key));
45
+ if (unknown.length)
46
+ throw new Error(`theme.fonts accepts only body, headings, and code; remove ${unknown.join(', ')}`);
47
+ const faces = [];
48
+ const tokens = {};
49
+ for (const role of roles) {
50
+ const entry = value[role];
51
+ if (entry === undefined)
52
+ continue;
53
+ const spec = typeof entry === 'string' ? { family: entry } : entry;
54
+ if (!spec || typeof spec !== 'object' || Array.isArray(spec) || Object.keys(spec).some(key => !['family', 'files'].includes(key)))
55
+ throw new Error(`theme.fonts.${role} must be a family name or a mapping with family and files`);
56
+ if (typeof spec.family !== 'string' || !familyName.test(spec.family))
57
+ throw new Error(`theme.fonts.${role}.family must be a font name using letters, numbers, spaces, dots, dashes, or underscores`);
58
+ const files = spec.files ?? [];
59
+ if (!Array.isArray(files))
60
+ throw new Error(`theme.fonts.${role}.files must be a list`);
61
+ for (const [index, item] of files.entries()) {
62
+ const where = `theme.fonts.${role}.files[${index}]`;
63
+ const face = typeof item === 'string' ? { file: item } : item;
64
+ if (!face || typeof face !== 'object' || Array.isArray(face) || Object.keys(face).some(key => !['file', 'style', 'weight'].includes(key)))
65
+ throw new Error(`${where} must be a path or a mapping with file, style, and weight`);
66
+ if (typeof face.file !== 'string' || !formats[path.extname(face.file).toLowerCase()])
67
+ throw new Error(`${where} must be a local .woff2, .woff, .ttf, or .otf file`);
68
+ const style = face.style ?? 'normal';
69
+ if (style !== 'normal' && style !== 'italic')
70
+ throw new Error(`${where}.style must be normal or italic`);
71
+ const weight = String(face.weight ?? '100 900');
72
+ if (!weightValue.test(weight))
73
+ throw new Error(`${where}.weight must be a number such as 400 or a range such as "100 900"`);
74
+ const file = path.resolve(path.dirname(declaringFile), face.file);
75
+ if (!/^[\w.-]+$/.test(path.basename(file)))
76
+ throw new Error(`${where} file name may use only letters, numbers, dots, dashes, and underscores`);
77
+ faces.push({ family: spec.family, file, route: `/assets/fonts/project/${path.basename(file)}`, style, weight });
78
+ }
79
+ tokens[role] = `"${spec.family}", ${fallbacks[role]}`;
80
+ }
81
+ return { bundled: true, faces, tokens, preload: tokens.body ? undefined : presetBodyFont[preset] };
82
+ }
83
+ const face = (family, url, style, weight, format) => `@font-face{font-family:"${family}";src:url("${url}") format("${format}");font-style:${style};font-weight:${weight};font-display:swap}`;
84
+ export function fontsCss(fonts) {
85
+ const rules = [
86
+ ...(fonts.bundled ? bundledFonts.map(font => face(font.family, `/assets/fonts/${font.file}`, font.style, '100 900', 'woff2')) : []),
87
+ ...(fonts.bundled ? fallbackFaces.map(font => `@font-face{font-family:"${font.family} Fallback";src:${font.src};size-adjust:${font.size};ascent-override:${font.ascent};descent-override:${font.descent};line-gap-override:0%}`) : []),
88
+ ...fonts.faces.map(font => face(font.family, font.route, font.style, font.weight, formats[path.extname(font.file).toLowerCase()])),
89
+ ...(Object.keys(fonts.tokens).length ? [`:root{${Object.entries(fonts.tokens).map(([role, stack]) => `--font-${role === 'headings' ? 'heading' : role}:${stack}`).join(';')}}`] : [])
90
+ ];
91
+ return rules.length ? `/* Generated from theme.fonts. */\n${rules.join('\n')}\n` : undefined;
92
+ }
@@ -0,0 +1,7 @@
1
+ import type { Document } from './content-source.js';
2
+ export declare function contentDigest(doc: Document, htmlTree: unknown, markdownTree: unknown): string;
3
+ export declare function loadFreshness(value: unknown, base: string, today?: string): Promise<{
4
+ resolve(doc: Document, digest: string, fallback?: string): string;
5
+ commit(): Promise<void>;
6
+ } | undefined>;
7
+ export type Freshness = Awaited<ReturnType<typeof loadFreshness>>;
@@ -0,0 +1,58 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { readFile, realpath, rename, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ // Position data, section-only annotations, and verification dates do not change the published article content.
5
+ function stable(value) {
6
+ if (Array.isArray(value))
7
+ return value.map(stable);
8
+ if (value && typeof value === 'object')
9
+ return Object.fromEntries(Object.keys(value).filter(key => key !== 'position' && key !== 'sectionReadingPath').sort().map(key => [key, stable(value[key])]));
10
+ return value;
11
+ }
12
+ export function contentDigest(doc, htmlTree, markdownTree) {
13
+ const fields = ['id', 'title', 'summary', 'description', 'type', 'slug', 'date', 'releaseVersion', 'subjectLifecycle', 'audiences', 'readerFilters', 'product', 'area', 'subarea', 'operations', 'displayText'];
14
+ return createHash('sha256').update(JSON.stringify(stable({ metadata: Object.fromEntries(fields.map(key => [key, doc.frontmatter[key]])), html: htmlTree, markdown: markdownTree }))).digest('hex');
15
+ }
16
+ export async function loadFreshness(value, base, today = new Date().toISOString().slice(0, 10)) {
17
+ if (value === undefined)
18
+ return undefined;
19
+ if (!value || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).some(key => key !== 'history') || typeof value.history !== 'string' || !value.history.trim())
20
+ throw new Error('site.freshness must be a mapping with history: <local JSON file>');
21
+ const file = path.resolve(base, value.history);
22
+ const project = await realpath(base);
23
+ const parent = await realpath(path.dirname(file));
24
+ if (parent !== project && !parent.startsWith(`${project}${path.sep}`))
25
+ throw new Error('site.freshness.history must stay inside the project');
26
+ let original;
27
+ try {
28
+ const actual = await realpath(file);
29
+ if (!actual.startsWith(`${project}${path.sep}`))
30
+ throw new Error('site.freshness.history must stay inside the project');
31
+ original = await readFile(file, 'utf8');
32
+ }
33
+ catch (error) {
34
+ if (error.code !== 'ENOENT')
35
+ throw error;
36
+ }
37
+ const history = original ? JSON.parse(original) : { schemaVersion: 1, documents: {} };
38
+ if (history?.schemaVersion !== 1 || !history.documents || typeof history.documents !== 'object' || Array.isArray(history.documents) || Object.values(history.documents).some(entry => !entry || !/^[a-f0-9]{64}$/.test(entry.contentDigest) || typeof entry.updated !== 'string' || Number.isNaN(Date.parse(entry.updated))))
39
+ throw new Error('Invalid content freshness history');
40
+ const current = {};
41
+ return {
42
+ resolve(doc, digest, fallback) {
43
+ const key = JSON.stringify([doc.frontmatter.id, doc.variant.channel, doc.variant.version, doc.variant.language]);
44
+ const previous = history.documents[key];
45
+ const updated = previous ? previous.contentDigest === digest ? previous.updated : today : doc.frontmatter.updated ?? fallback ?? today;
46
+ current[key] = { contentDigest: digest, updated };
47
+ return updated;
48
+ },
49
+ async commit() {
50
+ const output = JSON.stringify({ schemaVersion: 1, documents: Object.fromEntries(Object.entries(current).sort(([a], [b]) => a.localeCompare(b))) }, null, 2) + '\n';
51
+ if (output === original)
52
+ return;
53
+ const temporary = `${file}.${randomUUID()}.tmp`;
54
+ await writeFile(temporary, output, { flag: 'wx' });
55
+ await rename(temporary, file);
56
+ }
57
+ };
58
+ }
@@ -0,0 +1,24 @@
1
+ import type { Frontmatter } from './content.js';
2
+ export declare const nativePublicFields: Set<string>;
3
+ export declare const protectedMetadataRoots: Set<string>;
4
+ type Definition = {
5
+ type: string;
6
+ description?: string;
7
+ public?: boolean;
8
+ required?: boolean;
9
+ items?: string;
10
+ enum?: unknown[];
11
+ };
12
+ export declare function frontmatterLayers(config?: any): {
13
+ defaults: Record<string, any>;
14
+ enforced: Record<string, any>;
15
+ };
16
+ export declare function resolveFrontmatter(page: unknown, config?: any): Frontmatter;
17
+ export declare function defaultLanguage(config: any): string;
18
+ export declare function applyFormattingLocale(frontmatter: Frontmatter, config: any, source?: Record<string, unknown>): void;
19
+ export declare function declaredFrontmatterFields(config: any): Map<string, Definition>;
20
+ export declare function validateFrontmatter(frontmatter: Frontmatter, config: any, file: string, source?: Record<string, unknown>): void;
21
+ export declare function publicFrontmatterPaths(config: any): Set<string>;
22
+ export declare function frontmatterSchema(config: any): any;
23
+ export declare function frontmatterReference(config: any, sectionsOnly?: boolean): string;
24
+ export {};
@@ -0,0 +1,342 @@
1
+ import { validateAuthoredChange, changeKinds } from './authored-change.js';
2
+ import { validateSubjectDeprecation } from './subject-deprecation.js';
3
+ import { validateCardMetadata } from './cards.js';
4
+ import { resolveTaxonomy, validateTaxonomy, taxonomySchema } from './taxonomy.js';
5
+ export const nativePublicFields = new Set(['id', 'title', 'type', 'summary', 'description', 'language', 'locale', 'date', 'updated', 'verified', 'releaseVersion', 'product', 'area', 'subarea', 'operations', 'relatedApiReferences', 'audiences', 'readerFilters', 'tags', 'subjectLifecycle', 'subjectDeprecation', 'change', 'lifecycle']);
6
+ export const protectedMetadataRoots = new Set(['standaloneSections', 'access', 'seo', 'markdownMetadata', 'variables', 'tocDepth', 'layout', 'showNavigationTabs', 'image', 'private', 'internal', 'card', 'displayText', 'publications']);
7
+ const fieldTypes = new Set(['string', 'number', 'integer', 'boolean', 'object', 'array']);
8
+ const safePath = (value) => /^[A-Za-z_][A-Za-z0-9_-]*(?:\.[A-Za-z_][A-Za-z0-9_-]*)*$/.test(value);
9
+ const object = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
10
+ function mergeMetadata(base, overlay) {
11
+ const result = { ...base };
12
+ for (const [key, value] of Object.entries(overlay)) {
13
+ if (['__proto__', 'prototype', 'constructor'].includes(key))
14
+ throw new Error(`Unsafe frontmatter key ${key}`);
15
+ result[key] = object(value) ? mergeMetadata(object(result[key]) ? result[key] : {}, value) : structuredClone(value);
16
+ }
17
+ return result;
18
+ }
19
+ export function frontmatterLayers(config = {}) {
20
+ if (!object(config))
21
+ throw new Error('frontmatter must be a mapping');
22
+ for (const key of Object.keys(config))
23
+ if (!['fields', 'defaults', 'enforced', 'locales', 'changelogIdentifier', 'taxonomy'].includes(key))
24
+ throw new Error(`Unknown frontmatter setting ${key}`);
25
+ resolveTaxonomy(config.taxonomy);
26
+ if (config.locales !== undefined && (!object(config.locales) || Object.entries(config.locales).some(([language, locale]) => !language.trim() || typeof locale !== 'string' || !locale.trim())))
27
+ throw new Error('frontmatter.locales must map languages to nonempty locale values');
28
+ if (config.changelogIdentifier !== undefined && !['date', 'version', 'either'].includes(config.changelogIdentifier))
29
+ throw new Error('frontmatter.changelogIdentifier must be date, version, or either');
30
+ const layers = {};
31
+ for (const name of ['defaults', 'enforced']) {
32
+ const layer = config[name] === undefined ? {} : config[name];
33
+ if (!object(layer))
34
+ throw new Error(`frontmatter.${name} must be a mapping`);
35
+ for (const field of ['id', 'slug', 'publications', 'standaloneSections', 'subjectDeprecation', 'change'])
36
+ if (Object.hasOwn(layer, field))
37
+ throw new Error(`frontmatter.${name}.${field} must stay page-specific`);
38
+ layers[name] = mergeMetadata({}, layer);
39
+ }
40
+ return { defaults: layers.defaults, enforced: layers.enforced };
41
+ }
42
+ export function resolveFrontmatter(page, config) {
43
+ if (!object(page))
44
+ throw new Error('Page frontmatter must be a mapping');
45
+ const { defaults, enforced } = frontmatterLayers(config);
46
+ return mergeMetadata(mergeMetadata(defaults, page), enforced);
47
+ }
48
+ export function defaultLanguage(config) {
49
+ const layers = frontmatterLayers(config.frontmatter);
50
+ const language = layers.enforced.language ?? layers.defaults.language ?? config.publications?.defaults?.language ?? 'en';
51
+ if (typeof language !== 'string' || !language.trim())
52
+ throw new Error('Default language must be nonempty text');
53
+ return language;
54
+ }
55
+ export function applyFormattingLocale(frontmatter, config, source = {}) {
56
+ frontmatterLayers(config);
57
+ if (source.locale !== undefined || config?.enforced?.locale !== undefined)
58
+ return;
59
+ const value = config?.locales?.[frontmatter.language ?? ''];
60
+ if (value !== undefined)
61
+ frontmatter.locale = value;
62
+ }
63
+ export function declaredFrontmatterFields(config) {
64
+ frontmatterLayers(config);
65
+ const fields = config?.fields ?? {};
66
+ if (!fields || typeof fields !== 'object' || Array.isArray(fields))
67
+ throw new Error('frontmatter.fields must be a mapping');
68
+ const result = new Map();
69
+ for (const [name, raw] of Object.entries(fields)) {
70
+ if (!safePath(name) || name.split('.').some(segment => ['__proto__', 'prototype', 'constructor'].includes(segment)))
71
+ throw new Error(`Invalid frontmatter field path ${name}`);
72
+ const root = name.split('.')[0];
73
+ if (nativePublicFields.has(root) || protectedMetadataRoots.has(root) || ['slug', 'channel', 'version'].includes(root))
74
+ throw new Error(`Cannot redefine native or protected frontmatter field ${name}`);
75
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
76
+ throw new Error(`Frontmatter field ${name} needs a declaration`);
77
+ for (const key of Object.keys(raw))
78
+ if (!['type', 'description', 'public', 'required', 'items', 'enum'].includes(key))
79
+ throw new Error(`Unknown frontmatter field setting ${name}.${key}`);
80
+ if (!fieldTypes.has(raw.type))
81
+ throw new Error(`Invalid frontmatter field type ${name}: ${raw.type}`);
82
+ if (raw.description !== undefined && typeof raw.description !== 'string')
83
+ throw new Error(`Frontmatter field description must be text: ${name}`);
84
+ if (raw.public !== undefined && typeof raw.public !== 'boolean')
85
+ throw new Error(`Frontmatter field public must be true or false: ${name}`);
86
+ if (raw.required !== undefined && typeof raw.required !== 'boolean')
87
+ throw new Error(`Frontmatter field required must be true or false: ${name}`);
88
+ if (raw.items !== undefined && (raw.type !== 'array' || !fieldTypes.has(raw.items)))
89
+ throw new Error(`Frontmatter field items needs an array item type: ${name}`);
90
+ if (raw.enum !== undefined && (!Array.isArray(raw.enum) || !raw.enum.length || raw.enum.some((value) => !matchesType(value, raw.type) || typeof value === 'object')))
91
+ throw new Error(`Frontmatter field enum must contain scalar values of the declared type: ${name}`);
92
+ result.set(name, raw);
93
+ }
94
+ for (const name of result.keys()) {
95
+ const parts = name.split('.');
96
+ for (let i = 1; i < parts.length; i++) {
97
+ const parent = result.get(parts.slice(0, i).join('.'));
98
+ if (parent && parent.type !== 'object')
99
+ throw new Error(`Frontmatter parent ${parts.slice(0, i).join('.')} must be an object`);
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ function matchesType(value, type) {
105
+ if (type === 'array')
106
+ return Array.isArray(value);
107
+ if (type === 'object')
108
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
109
+ if (type === 'integer')
110
+ return typeof value === 'number' && Number.isInteger(value);
111
+ return typeof value === type;
112
+ }
113
+ export function validateFrontmatter(frontmatter, config, file, source) {
114
+ const taxonomy = resolveTaxonomy(config?.taxonomy);
115
+ validateTaxonomy(frontmatter, taxonomy, file, source);
116
+ validateCardMetadata(frontmatter.card, file);
117
+ validateSubjectDeprecation(frontmatter.subjectDeprecation, file);
118
+ validateAuthoredChange(frontmatter, file);
119
+ const standalone = frontmatter.standaloneSections;
120
+ if (standalone !== undefined && (!Array.isArray(standalone) || standalone.some(title => typeof title !== 'string' || !title.trim() || title !== title.trim()) || new Set(standalone).size !== standalone.length)) {
121
+ throw new Error(`${file}: standaloneSections must be a unique list of nonempty, trimmed heading titles`);
122
+ }
123
+ const mode = config?.changelogIdentifier ?? 'either';
124
+ if (frontmatter.type === 'changelog-entry' &&
125
+ (mode === 'date' && frontmatter.date === undefined || mode === 'version' && frontmatter.releaseVersion === undefined || mode === 'either' && frontmatter.date === undefined && frontmatter.releaseVersion === undefined))
126
+ throw new Error(`${file}: changelog-entry pages need ${mode === 'either' ? 'date or releaseVersion' : mode === 'version' ? 'releaseVersion' : 'date'}`);
127
+ if (frontmatter.releaseVersion !== undefined && (typeof frontmatter.releaseVersion !== 'string' || !frontmatter.releaseVersion.trim()))
128
+ throw new Error(`${file}: releaseVersion must be nonempty text`);
129
+ for (const field of ['date', 'verified'])
130
+ if (frontmatter[field] !== undefined) {
131
+ const value = frontmatter[field];
132
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value) || Number.isNaN(Date.parse(`${value}T00:00:00Z`)) || new Date(`${value}T00:00:00Z`).toISOString().slice(0, 10) !== value)
133
+ throw new Error(`${file}: ${field} must be a real YYYY-MM-DD calendar date`);
134
+ }
135
+ if (frontmatter.updated !== undefined) {
136
+ const value = frontmatter.updated;
137
+ const dateOnly = typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value);
138
+ const timestamp = typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(value);
139
+ const calendar = typeof value === 'string' ? value.slice(0, 10) : '';
140
+ if ((!dateOnly && !timestamp) || Number.isNaN(Date.parse(value)) || Number.isNaN(Date.parse(`${calendar}T00:00:00Z`)) || new Date(`${calendar}T00:00:00Z`).toISOString().slice(0, 10) !== calendar)
141
+ throw new Error(`${file}: updated must be a real YYYY-MM-DD date or timezone-qualified ISO timestamp`);
142
+ }
143
+ for (const field of ['channel', 'version', 'language', 'locale', 'product', 'area', 'subarea']) {
144
+ const value = frontmatter[field];
145
+ if ((field === 'area' || field === 'subarea') && Array.isArray(value) && taxonomy?.multiple.includes(field))
146
+ continue;
147
+ if (value !== undefined && (typeof value !== 'string' || !value.trim()))
148
+ throw new Error(`${file}: ${field} must be nonempty text`);
149
+ }
150
+ if (frontmatter.publications !== undefined) {
151
+ const publications = frontmatter.publications;
152
+ if (!Array.isArray(publications) || !publications.length || publications.some(item => !object(item) || Object.keys(item).some(key => !['channel', 'version'].includes(key)) || typeof item.channel !== 'string' || !item.channel.trim() || typeof item.version !== 'string' || !item.version.trim())) {
153
+ throw new Error(`${file}: publications must list channel and version pairs`);
154
+ }
155
+ const keys = publications.map(item => `${item.channel}|${item.version}`);
156
+ if (new Set(keys).size !== keys.length)
157
+ throw new Error(`${file}: publications has duplicate channel/version pairs`);
158
+ }
159
+ if (frontmatter.description !== undefined && (typeof frontmatter.description !== 'string' || !frontmatter.description.trim()))
160
+ throw new Error(`${file}: description must be nonempty text`);
161
+ if (frontmatter.lifecycle !== undefined && (typeof frontmatter.lifecycle !== 'string' || !frontmatter.lifecycle.trim()))
162
+ throw new Error(`${file}: lifecycle must be nonempty text`);
163
+ for (const field of ['audiences', 'tags']) {
164
+ const value = frontmatter[field];
165
+ if (value !== undefined && (!Array.isArray(value) || value.some(item => typeof item !== 'string')))
166
+ throw new Error(`${file}: ${field} must be a list of strings`);
167
+ }
168
+ if (frontmatter.readerFilters !== undefined && (!object(frontmatter.readerFilters) || Object.values(frontmatter.readerFilters).some(value => !Array.isArray(value) || value.some(item => typeof item !== 'string')))) {
169
+ throw new Error(`${file}: readerFilters must map filter names to lists of strings`);
170
+ }
171
+ if (frontmatter.relatedApiReferences !== undefined &&
172
+ (!['guide', 'how-to'].includes(frontmatter.type) || !Array.isArray(frontmatter.relatedApiReferences) ||
173
+ frontmatter.relatedApiReferences.some(id => typeof id !== 'string' || !id.trim()) ||
174
+ new Set(frontmatter.relatedApiReferences).size !== frontmatter.relatedApiReferences.length)) {
175
+ throw new Error(`${file}: relatedApiReferences must be a unique list of API reference IDs on a guide or how-to page`);
176
+ }
177
+ if (frontmatter.access !== undefined && (!object(frontmatter.access) || typeof frontmatter.access.policy !== 'string' || !frontmatter.access.policy.trim()))
178
+ throw new Error(`${file}: access needs a nonempty policy`);
179
+ if (frontmatter.tocDepth !== undefined && ![0, 2, 3, 4, 5, 6].includes(frontmatter.tocDepth))
180
+ throw new Error(`${file}: tocDepth must be 0 or an integer from 2 through 6`);
181
+ if (frontmatter.layout !== undefined && !['docs', 'wide', 'landing', 'splash'].includes(frontmatter.layout))
182
+ throw new Error(`${file}: layout must be docs, wide, landing, or splash`);
183
+ if (frontmatter.showNavigationTabs !== undefined && typeof frontmatter.showNavigationTabs !== 'boolean')
184
+ throw new Error(`${file}: showNavigationTabs must be true or false`);
185
+ if (frontmatter.image !== undefined && (typeof frontmatter.image !== 'string' || !/\.(?:png|jpe?g)$/i.test(frontmatter.image) || /^[a-z][a-z0-9+.-]*:/i.test(frontmatter.image)))
186
+ throw new Error(`${file}: image must be a local .png or .jpg file`);
187
+ if (frontmatter.variables !== undefined && (!frontmatter.variables || typeof frontmatter.variables !== 'object' || Array.isArray(frontmatter.variables)))
188
+ throw new Error(`${file}: variables must be a mapping`);
189
+ if (frontmatter.seo !== undefined) {
190
+ if (!frontmatter.seo || typeof frontmatter.seo !== 'object' || Array.isArray(frontmatter.seo))
191
+ throw new Error(`${file}: seo must be a mapping`);
192
+ for (const [name, value] of Object.entries(frontmatter.seo)) {
193
+ if (!['title', 'description', 'noindex'].includes(name))
194
+ throw new Error(`${file}: unsupported SEO field seo.${name}`);
195
+ if (name === 'noindex' ? typeof value !== 'boolean' : typeof value !== 'string')
196
+ throw new Error(`${file}: seo.${name} must be ${name === 'noindex' ? 'true or false' : 'text'}`);
197
+ }
198
+ }
199
+ const fields = declaredFrontmatterFields(config);
200
+ for (const [name, definition] of fields) {
201
+ const segments = name.split('.');
202
+ const value = segments.reduce((at, segment) => at !== null && at !== undefined && Object.prototype.hasOwnProperty.call(at, segment) ? at[segment] : undefined, frontmatter);
203
+ if (value === undefined) {
204
+ if (definition.required)
205
+ throw new Error(`${file}: missing required frontmatter field ${name}`);
206
+ continue;
207
+ }
208
+ if (!matchesType(value, definition.type))
209
+ throw new Error(`${file}: frontmatter ${name} must be ${definition.type}`);
210
+ if (definition.items && Array.isArray(value) && value.some(item => !matchesType(item, definition.items)))
211
+ throw new Error(`${file}: frontmatter ${name} items must be ${definition.items}`);
212
+ if (definition.enum && !definition.enum.some(item => Object.is(item, value)))
213
+ throw new Error(`${file}: frontmatter ${name} is not in its declared enum`);
214
+ }
215
+ }
216
+ export function publicFrontmatterPaths(config) {
217
+ return new Set([...declaredFrontmatterFields(config)].filter(([, definition]) => definition.public === true).map(([name]) => `frontmatter.${name}`));
218
+ }
219
+ export function frontmatterSchema(config) {
220
+ const properties = {
221
+ id: { type: 'string', description: 'Stable page identity used by document links and cards; keep it when the file or URL changes.' },
222
+ title: { type: 'string', description: 'Page heading and default browser title.' },
223
+ summary: { type: 'string', description: 'Short page preview, used by cards and other configured text surfaces.' },
224
+ description: { type: 'string', minLength: 1, description: 'Fuller description of what the page covers; kept distinct from the short summary.' },
225
+ type: { type: 'string', description: 'Document kind, such as guide or api-reference; can select a Markdown metadata profile.' },
226
+ date: { type: 'string', format: 'date', description: 'Publication date in YYYY-MM-DD format; optional for release notes and one possible changelog identifier.' },
227
+ updated: { type: 'string', description: 'Date of the last meaningful page update: YYYY-MM-DD or a timezone-qualified ISO timestamp. Used as sitemap lastmod.' },
228
+ verified: { type: 'string', format: 'date', description: 'Date someone verified the technical claims; independent of content revision and never assigned by the build.' },
229
+ releaseVersion: { type: 'string', minLength: 1, description: 'Release label for a note or changelog entry; separate from the documentation publication version.' },
230
+ slug: { type: 'string', description: 'Page URL path before channel, version, and language prefixes.' },
231
+ channel: { type: 'string', description: 'Publication environment, such as sandbox or production; selects an enabled publication and API source.' },
232
+ version: { type: 'string', description: 'API or documentation edition, such as v1; selects an enabled publication and API source.' },
233
+ publications: { type: 'array', minItems: 1, items: { type: 'object', properties: { channel: { type: 'string' }, version: { type: 'string' } }, required: ['channel', 'version'], additionalProperties: false }, description: 'Publish this one page file in each listed channel/version pair. Use instead of page-level channel and version; language stays the same.' },
234
+ language: { type: 'string', description: 'Content language; uses frontmatter defaults/enforced values, then publications.defaults.language, then en.' },
235
+ locale: { type: 'string', description: 'Formatting conventions used in the content; can inherit a project locale for the page language and can be overridden per page.' },
236
+ product: { type: 'string', minLength: 1, description: 'Optional product category. Also selects the product reader facet when that facet is configured.' },
237
+ area: { type: 'string', minLength: 1, description: 'Optional area category. Also selects the area reader facet when that facet is configured.' },
238
+ subarea: { type: 'string', minLength: 1, description: 'Optional finer category. Also selects the subarea reader facet when that facet is configured.' },
239
+ operations: { type: 'array', items: { type: 'string' }, description: 'Stable API operation IDs that connect this page to endpoint references and related documents.' },
240
+ relatedApiReferences: { type: 'array', items: { type: 'string' }, description: 'API reference page IDs linked automatically from this guide and back from each reference, within the same publication.' },
241
+ audiences: { type: 'array', items: { type: 'string' }, description: 'Readers this page is intended for; does not control who can access it.' },
242
+ readerFilters: { type: 'object', additionalProperties: { type: 'array', items: { type: 'string' } }, description: 'Configured reader filter choices for this page. Missing facets are shared.' },
243
+ tags: { type: 'array', items: { type: 'string' }, description: 'Editorial labels used to select pages in document collections.' },
244
+ change: { type: 'object', additionalProperties: false, required: ['kind', 'affects'], description: 'Page-specific authored change meaning on a changelog-entry: kind, affected document IDs, and optional migration guide ID in the same publication. Omission means unclassified, not nonbreaking.', properties: { kind: { type: 'string', enum: [...changeKinds] }, affects: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1 } }, migration: { type: 'string', minLength: 1 } } },
245
+ subjectDeprecation: { type: 'object', minProperties: 1, additionalProperties: false, description: 'Page-specific subject retirement dates and stable document IDs; requires deprecated subjectLifecycle, including OpenAPI inference. Dates do not change status automatically.', properties: { deprecatedOn: { type: 'string', format: 'date' }, sunsetOn: { type: 'string', format: 'date' }, replacement: { type: 'string', minLength: 1 }, migration: { type: 'string', minLength: 1 } } },
246
+ subjectLifecycle: { type: 'string', enum: ['deprecated', 'in-development', 'beta', 'experimental'], description: 'Displays a content status badge in the page and navigation.' },
247
+ lifecycle: { type: 'string', minLength: 1, description: 'Editorial lifecycle of the document; validated by an opted-in external vocabulary.' },
248
+ standaloneSections: { type: 'array', items: { type: 'string' }, uniqueItems: true, description: 'Page-specific exact level-two heading titles reviewed by the author as self-contained with the page introduction. Allows eligible sections to be recommended alone; omitted means full-page reads.' },
249
+ tocDepth: { type: 'integer', enum: [0, 2, 3, 4, 5, 6], description: 'Deepest heading shown in the page table of contents; 0 hides it. Defaults to 3.' },
250
+ showNavigationTabs: { type: 'boolean', description: 'Show the HTML navigation section bar when tabs are configured. Defaults to true for docs and wide layouts, false for landing and splash. Does not change agent discovery or section membership.' },
251
+ image: { type: 'string', pattern: '\\.(?:png|jpe?g)$', description: 'Local .png or .jpg shown in link previews for this page, relative to the page file; replaces the generated share image. Best at 1200×630.' },
252
+ layout: { type: 'string', enum: ['docs', 'wide', 'landing', 'splash'], description: 'HTML page layout: docs (default), wide (no page outline, full content width), landing (no sidebar or outline; a Hero replaces the page header), or splash (full-bleed marketing page built from Hero and Section blocks).' },
253
+ access: { type: 'object', properties: { policy: { type: 'string', description: 'Use public to publish this page; draft pages are excluded from the built site.' } }, required: ['policy'], additionalProperties: true, description: 'Controls whether the page enters a public build; this object is not exported to Markdown metadata.' },
254
+ card: { type: 'object', properties: { title: { type: 'string', description: 'Card title; defaults to the page title.' }, description: { type: 'string', description: 'Card description; defaults to the page summary.' }, eyebrow: { type: 'string', description: 'Short label above a card title.' }, icon: { type: 'string', description: 'Optional Lucide icon name such as book-open. Decorative in HTML; omitted from Markdown.' } }, additionalProperties: false, description: 'Overrides how this page appears when another page includes a document card; its destination still resolves by page ID.' },
255
+ seo: { type: 'object', properties: {
256
+ title: { type: 'string', description: 'Overrides the HTML title; defaults to page title.' },
257
+ description: { type: 'string', description: 'Overrides the HTML meta description; defaults to page summary.' },
258
+ noindex: { type: 'boolean', description: 'If true, adds a noindex directive and excludes this public page from the XML sitemap.' }
259
+ }, additionalProperties: false, description: 'Page-level HTML title, description, and indexing settings.' },
260
+ variables: { type: 'object', additionalProperties: { type: ['string', 'number', 'boolean'] }, description: 'Page values supplied to registered snippets; expanded snippet text appears in both outputs.' },
261
+ displayText: { type: 'object', properties: Object.fromEntries(['card', 'pageHeader', 'search', 'htmlDescription', 'socialCard'].map(name => [name, { type: 'string', minLength: 1 }])), additionalProperties: false, description: 'Per-page text overrides for configured presentation surfaces; not exported as metadata.' },
262
+ markdownMetadata: { oneOf: [{ type: 'string' }, { type: 'object' }], description: 'Selects a configured profile or overrides this page’s Markdown YAML preamble.' }
263
+ };
264
+ const inherited = resolveFrontmatter({}, config);
265
+ const required = ['id', 'title', 'summary', 'type', 'slug'].filter(name => inherited[name] === undefined);
266
+ for (const [name, definition] of declaredFrontmatterFields(config)) {
267
+ const segments = name.split('.');
268
+ let at = { properties, required };
269
+ for (const segment of segments.slice(0, -1)) {
270
+ const child = (at.properties[segment] ??= { type: 'object', properties: {}, additionalProperties: true });
271
+ if (child.type !== 'object')
272
+ throw new Error(`Frontmatter parent ${segment} must be an object`);
273
+ child.properties ??= {};
274
+ at = child;
275
+ }
276
+ const last = segments.at(-1);
277
+ const existing = at.properties[last];
278
+ at.properties[last] = {
279
+ type: definition.type,
280
+ ...(existing?.properties ? { properties: existing.properties, additionalProperties: true, ...(existing.required ? { required: existing.required } : {}) } : {}),
281
+ ...(definition.description ? { description: definition.description } : {}),
282
+ ...(definition.items ? { items: { type: definition.items } } : {}),
283
+ ...(definition.enum ? { enum: definition.enum } : {}),
284
+ 'x-shoalrun-agent-public': definition.public === true
285
+ };
286
+ if (definition.required && segments.reduce((value, part) => value?.[part], inherited) === undefined)
287
+ (at.required ??= []).push(last);
288
+ }
289
+ const taxonomy = resolveTaxonomy(config?.taxonomy);
290
+ return { $schema: 'https://json-schema.org/draft/2020-12/schema', title: 'Documentation frontmatter', type: 'object', properties, required, additionalProperties: true, ...(taxonomy ? taxonomySchema(taxonomy, properties, required, inherited) : {}) };
291
+ }
292
+ export function frontmatterReference(config, sectionsOnly = false) {
293
+ const schema = frontmatterSchema(config);
294
+ const taxonomy = resolveTaxonomy(config?.taxonomy);
295
+ const cell = (value) => value.replaceAll('|', '\\|').replaceAll('\n', ' ');
296
+ const nativeRows = (names) => names.flatMap(name => {
297
+ const definition = schema.properties[name];
298
+ const requirement = ['id', 'slug'].includes(name) || taxonomy?.requireExplicit.some(field => field === name) ? 'On each page' : schema.required.includes(name) ? 'After inheritance' : ['channel', 'version', 'access'].includes(name) ? 'Public page' : 'Optional';
299
+ const type = definition === false ? 'Not allowed' : definition.type ?? definition.oneOf?.map((option) => option?.type).filter(Boolean).join(' or ') ?? 'string or object';
300
+ return [
301
+ `| \`${name}\` | ${type} | ${requirement} | ${cell(definition.description ?? '')} |`,
302
+ ...(['access', 'card', 'seo'].includes(name) ? Object.entries(definition.properties).map(([childName, child]) => `| \`${name}.${childName}\` | ${child.type} | ${name === 'access' ? 'With access' : 'Optional'} | ${cell(child.description ?? '')} |`) : [])
303
+ ];
304
+ });
305
+ const table = ['| Field | Type | Needed | What it changes |', '| --- | --- | --- | --- |'];
306
+ const project = [...declaredFrontmatterFields(config)];
307
+ const lines = [
308
+ '# Frontmatter reference', '',
309
+ 'This generated file is a project-wide field guide for authors and agents working with the repository. The build writes it to `.shoalrun/frontmatter-reference.md` beside the project config. Link to that local file from repository instructions when agents need it.', '',
310
+ 'Frontmatter is the YAML header between the first pair of `---` lines in a `.md` or `.mdx` source page. It tells the compiler what the page is, where to publish it, and how to connect it to other content. The prose below the second `---` is the page body. This example header illustrates the fields; it is not necessarily the header of the page linking here.', '',
311
+ '```yaml', '---', 'id: guide.create-payment', 'title: Create a payment', 'summary: Submit a payment with the example API.', 'type: how-to', 'slug: /guides/create-payment', 'channel: production', 'version: v1', 'access: { policy: public }', '---', '```', '',
312
+ 'This header describes one page. Its `id` stays stable when `slug` changes; `channel` and `version` select the publication in which that page appears. A **publication** is an enabled combination of channel, version, and language in project config. A public page also needs `access.policy: public`. The “Needed” column below refers to the *resolved* header after project defaults and enforced values are merged. Only `id` and `slug` must be written on each source page.', '',
313
+ '## Identify and route a page', '',
314
+ 'Use the page ID for links and cards that should survive a URL change. The slug supplies the page part of the URL; publication prefixes may be added around it. Summary is short preview text; description is a separate, optional fuller account. Project output rules choose which field supplies each surface.', '',
315
+ ...table, ...nativeRows(['id', 'title', 'summary', 'description', 'type', 'slug']), '',
316
+ '## Choose a publication and visibility', '',
317
+ 'The project enables specific channel/version/language combinations. A page is built only for combinations matching its resolved values. `audiences` and `readerFilters` select reader views when the site config enables them; `access.policy` determines whether the page enters this public build. A draft page is excluded.', '',
318
+ ...table, ...nativeRows(['channel', 'version', 'language', 'locale', 'access', 'audiences', 'readerFilters']), '',
319
+ 'Language is the content language and selects a publication. Locale describes formatting conventions in the content and does not select a publication. `frontmatter.locales` can set a project locale for each language; pages may override it.', '',
320
+ '## Categorize, connect, and present the page', '',
321
+ 'By default, `product`, `area`, and `subarea` are optional, nonempty string categories. They can come from project defaults and appear in the document manifest and search index. A matching configured reader facet makes each category a page filter; without that facet it remains taxonomy only. `operations` links a guide or reference to stable API operation IDs. On a guide or how-to page, `relatedApiReferences` names API reference page IDs to add cross links in both directions within the same publication. Tags help document collections find the page. Card settings change its preview when another page links to it; they do not change the destination. `subjectLifecycle` displays the status of the documented API or feature; `lifecycle` is available for the document\'s editorial state. `tocDepth` limits the HTML page table of contents; use 0 to hide it. `layout` picks the HTML page layout: `docs`, `wide`, `landing`, or `splash`. `showNavigationTabs` overrides the navigation tab bar for this page; landing and splash pages hide it by default. `image` replaces the generated link-preview image. `date` and `releaseVersion` can identify a changelog entry under the project\'s `frontmatter.changelogIdentifier` rule.', '',
322
+ ...table, ...nativeRows(['product', 'area', 'subarea', 'operations', 'relatedApiReferences', 'tags', 'date', 'releaseVersion', 'subjectLifecycle', 'subjectDeprecation', 'change', 'lifecycle', 'card', 'standaloneSections', 'tocDepth', 'layout', 'showNavigationTabs', 'image']), '',
323
+ 'Projects can opt into built-in category enforcement with `frontmatter.taxonomy`. It declares areas and their allowed subareas, optional required fields, and optional explicit-field requirements for authored pages. Its `multiple` list permits arrays for selected category fields; otherwise each field allows one value. Defaults and enforced values still apply; generated API references use resolved categories. Definitions appear in the document manifest and constrain the generated frontmatter schema. Omit taxonomy or set it to false to preserve optional category behavior.', '',
324
+ '## Control output details', '',
325
+ '`seo` changes the browser title or HTML meta description. `displayText` overrides the text chosen for one output surface on this page. `variables` supplies values to registered snippets before they expand into the page body. `markdownMetadata` selects or overrides the YAML preamble of the generated Markdown twin—the machine-readable copy of this page. That generated preamble is separate from the source frontmatter shown above.', '',
326
+ ...table, ...nativeRows(['seo', 'displayText', 'variables', 'markdownMetadata']), '',
327
+ '## Project-defined fields', '',
328
+ 'A project can add page fields by declaring them in `frontmatter.fields`. The declaration gives a field path (such as `agent.intent`), a type, and a description. A dotted path means nested YAML on the page. Undeclared fields are still accepted in source pages, but only declared fields appear in this table and receive type checks.', '',
329
+ ...(project.length ? [
330
+ '| Field | Type | Required | Agent metadata approved | Description |', '| --- | --- | --- | --- | --- |',
331
+ ...project.map(([name, definition]) => `| \`${name}\` | ${definition.type} | ${definition.required ? 'Yes' : 'No'} | ${definition.public ? 'Yes' : 'No'} | ${cell(definition.description ?? '')} |`)
332
+ ] : ['This project has no declared custom fields.']),
333
+ '', '“Required” means the field must exist after defaults and enforced values are applied. “Agent metadata approved” means `public: true` allows that value to be selected for the generated Markdown preamble; it does not publish the field automatically. Select approved fields in `outputs.markdown.metadata.fields`, a `byType` rule, or a page profile. Source page body text is published independently of this selection.',
334
+ '', '## Global defaults and enforced values', '',
335
+ 'These are project config settings, not keys in a page header. `frontmatter.defaults` supplies values when a page omits them; `frontmatter.enforced` replaces page values. Resolution follows defaults → page → enforced. Objects merge recursively and arrays replace. IDs and slugs remain page-specific. Required fields and declared types are checked after resolution. Use an access default if authors need to keep individual pages as drafts.',
336
+ '', '## Machine-readable schema', '',
337
+ '[Open the JSON Schema](./frontmatter.schema.json). Undeclared fields are accepted but cannot enter public Markdown metadata until declared with `public: true`.', ''
338
+ ];
339
+ if (sectionsOnly)
340
+ return lines.slice(lines.indexOf('## Identify and route a page'), lines.indexOf('## Machine-readable schema')).join('\n');
341
+ return lines.join('\n');
342
+ }
@@ -0,0 +1 @@
1
+ export declare function copyFunctionRuntime(dist: string, entry: string, target: string): Promise<void>;