@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
package/dist/vercel.js ADDED
@@ -0,0 +1,103 @@
1
+ import { addMcpFunction, removeStaleMcpFunctions } from './mcp-vercel.js';
2
+ import { mcpDataPath, mcpRuntimePath } from './mcp-integrity.js';
3
+ import { mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { compile } from './compiler.js';
6
+ import { homeUrl } from './negotiation.js';
7
+ import { addAskFunction } from './vercel-function.js';
8
+ function exact(route) {
9
+ return route.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
10
+ }
11
+ async function removeStaleFunctions(directory, keep = new Set()) {
12
+ const visit = async (folder) => {
13
+ for (const entry of await readdir(folder, { withFileTypes: true }).catch(() => [])) {
14
+ if (!entry.isDirectory() || entry.name.endsWith('.func'))
15
+ continue;
16
+ const child = path.join(folder, entry.name);
17
+ if (entry.name === '__shoalrun') {
18
+ for (const name of ['ask.func', 'search.func']) {
19
+ const generated = path.join(child, name);
20
+ if (!keep.has(generated))
21
+ await rm(generated, { recursive: true, force: true });
22
+ }
23
+ }
24
+ else
25
+ await visit(child);
26
+ }
27
+ };
28
+ await visit(directory);
29
+ }
30
+ export async function buildVercel(configFile, outputDirectory, provenance = {}, options = {}) {
31
+ const output = path.resolve(outputDirectory);
32
+ const staticDirectory = path.join(output, 'static');
33
+ const manifest = await compile(configFile, staticDirectory, provenance);
34
+ const basePath = manifest.basePath;
35
+ const functionsDirectory = path.join(output, 'functions');
36
+ const mcp = await addMcpFunction({ staticDirectory, functionsDirectory });
37
+ if (mcp.added) {
38
+ // Runtime data belongs to the function, never the public static filesystem.
39
+ await rm(path.join(staticDirectory, mcpRuntimePath), { force: true });
40
+ await rm(path.join(staticDirectory, mcpDataPath), { recursive: true, force: true });
41
+ }
42
+ const resourceHeaders = JSON.parse(await readFile(path.join(staticDirectory, 'resource-headers.json'), 'utf8'));
43
+ const routes = [
44
+ { src: '^/.*$', headers: { 'X-Content-Type-Options': 'nosniff' }, continue: true },
45
+ { src: '^/.*\\.svg$', headers: { 'Content-Security-Policy': 'sandbox' }, continue: true }
46
+ ];
47
+ if (mcp.added) {
48
+ routes.push({ src: '^/(?:mcp-runtime\\.json|__shoalrun/mcp-data(?:/.*)?)$', status: 404 });
49
+ routes.push({ src: `^${exact(mcp.path)}$`, dest: mcp.path });
50
+ }
51
+ const markdownRequest = { type: 'header', key: 'Accept', value: { re: '(?i)(?:^|,)\\s*text/markdown(?![^,]*;\\s*q=0(?:\\.0+)?(?:,|$))' } };
52
+ // The Node server serves Markdown only when its weight is at least HTML's (negotiation.ts). A header rule cannot
53
+ // compare two numbers, so this rule keeps HTML in the common case where HTML clearly wins: Markdown with a
54
+ // fractional weight beside text/html at full weight or, when text/html is absent, beside a full-weight wildcard.
55
+ const fullWeight = String.raw `\s*(?:,|$|;(?![^,]*\bq=)|;[^,]*\bq=1(?:\.0{0,3})?\s*(?:[,;]|$))`;
56
+ const markdownOutranked = { type: 'header', key: 'Accept', value: { re: String.raw `(?i)^(?=(?:.*,)?\s*text/markdown\s*;[^,]*\bq=0\.)(?:(?=(?:.*,)?\s*text/html${fullWeight})|(?!(?:.*,)?\s*text/html\s*(?:[,;]|$))(?=(?:.*,)?\s*(?:text|\*)/\*${fullWeight}))` } };
57
+ for (const document of manifest.documents) {
58
+ const src = document.url === '/' ? '^/$' : `^${exact(document.url)}/?$`;
59
+ const alternate = `<${document.markdownUrl}>; rel="alternate"; type="text/markdown"`;
60
+ routes.push({ src, dest: document.markdownUrl, has: [markdownRequest], missing: [markdownOutranked], headers: { 'Content-Type': 'text/markdown; charset=utf-8', Vary: 'Accept', 'Content-Location': document.markdownUrl, Link: `${alternate}, ${resourceHeaders[document.markdownUrl].Link}` } });
61
+ routes.push({ src, dest: document.url === '/' ? '/index.html' : `${document.url}/index.html`, headers: { 'Content-Type': 'text/html; charset=utf-8', Vary: 'Accept', Link: alternate } });
62
+ }
63
+ const home = manifest.documents.find(item => item.url === basePath)?.url ?? homeUrl(manifest.documents);
64
+ if (!manifest.documents.some(item => item.url === '/') && home)
65
+ routes.push({ src: '^/$', status: 302, headers: { Location: `${home}/` } });
66
+ if (basePath && !manifest.documents.some(item => item.url === basePath) && home)
67
+ routes.push({ src: `^${exact(basePath)}/?$`, status: 302, headers: { Location: `${home}/` } });
68
+ for (const redirect of manifest.redirects) {
69
+ routes.push({ src: `^${exact(redirect.from)}/?$`, status: redirect.status, headers: { Location: redirect.to } });
70
+ routes.push({ src: `^${exact(redirect.markdownFrom)}$`, status: redirect.status, headers: { Location: redirect.markdownTo } });
71
+ }
72
+ for (const document of manifest.documents) {
73
+ routes.push({ src: `^${exact(document.markdownUrl)}$`, headers: resourceHeaders[document.markdownUrl], continue: true });
74
+ }
75
+ for (const [url, headers] of Object.entries(resourceHeaders)) {
76
+ if (headers['Cache-Control'] && !manifest.documents.some(document => document.markdownUrl === url))
77
+ routes.push({ src: `^${exact(url)}$`, headers, continue: true });
78
+ }
79
+ for (const extension of ['html', 'md']) {
80
+ const route = `${basePath}/404.${extension}`;
81
+ routes.push({ src: `^${exact(route)}$`, headers: resourceHeaders[route], continue: true });
82
+ }
83
+ const overrides = Object.fromEntries(Object.entries(resourceHeaders).filter(([route, value]) => value['Content-Type'] && !manifest.documents.some(document => document.url === route)).map(([route, value]) => [route.slice(1), { contentType: value['Content-Type'] }]));
84
+ await mkdir(output, { recursive: true });
85
+ const recoveryHeaders = { 'X-Robots-Tag': 'noindex' };
86
+ const fallbacks = [
87
+ ...manifest.documents.map(document => ({
88
+ src: `^${exact(document.markdownUrl)}$`, dest: `${basePath}/404.md`, status: 404,
89
+ headers: { ...recoveryHeaders, 'Content-Type': 'text/markdown; charset=utf-8', Link: `<${document.url}>; rel="alternate"; type="text/html"` }
90
+ })),
91
+ { src: '^/.*\\.md$', dest: `${basePath}/404.md`, status: 404, headers: { ...recoveryHeaders, 'Content-Type': 'text/markdown; charset=utf-8' } },
92
+ { src: '^/.*$', dest: `${basePath}/404.md`, status: 404, has: [markdownRequest], missing: [markdownOutranked], headers: { ...recoveryHeaders, 'Content-Type': 'text/markdown; charset=utf-8', Vary: 'Accept' } },
93
+ { src: '^/.*$', dest: `${basePath}/404.html`, status: 404, headers: { ...recoveryHeaders, 'Content-Type': 'text/html; charset=utf-8', Vary: 'Accept' } }
94
+ ];
95
+ await writeFile(path.join(output, 'config.json'), JSON.stringify({ version: 3, routes: [...routes, { handle: 'filesystem' }, ...fallbacks], overrides }, null, 2) + '\n');
96
+ // The optional answer function. It goes in only when asked for, and a site that cannot support it still builds.
97
+ const chat = options.chat ? await addAskFunction({ configFile, staticDirectory, functionsDirectory, basePath }) : undefined;
98
+ const currentFunctions = path.join(functionsDirectory, basePath.slice(1), '__shoalrun');
99
+ const keep = chat?.added ? new Set(['ask.func', 'search.func'].map(name => path.join(currentFunctions, name))) : undefined;
100
+ await removeStaleFunctions(functionsDirectory, keep);
101
+ await removeStaleMcpFunctions(functionsDirectory, mcp.added ? mcp.directory : undefined);
102
+ return { documents: manifest.documents.length, output, ...(chat ? { chat } : {}), ...(mcp.added ? { mcp } : {}) };
103
+ }
@@ -0,0 +1,25 @@
1
+ export type WalkthroughStep = {
2
+ type: 'docWalkthroughStep';
3
+ title: string;
4
+ highlight: number[];
5
+ children: any[];
6
+ };
7
+ export type WalkthroughNode = {
8
+ type: 'docWalkthrough';
9
+ id: string;
10
+ title: string;
11
+ mode: 'separate' | 'unified';
12
+ layout: 'scroll' | 'spotlight';
13
+ code?: any;
14
+ sources: string[];
15
+ children: WalkthroughStep[];
16
+ };
17
+ export declare function parseLineRanges(value: string, lines: number, where: string): number[];
18
+ export declare function walkthroughComponent(node: any, sourceFile: string, documentId: string, index: number, childrenOf: (nodes: any[]) => any[], projectRoot?: string): WalkthroughNode;
19
+ export declare function walkthroughMarkdown(node: WalkthroughNode, walk: (node: any) => any[], helpers: {
20
+ heading: (depth: number, value: string) => any;
21
+ paragraph: (...children: any[]) => any;
22
+ text: (value: string) => any;
23
+ }): any[];
24
+ export declare function walkthroughHtml(node: WalkthroughNode, walk: (node: any) => any[], element: (name: string, properties: Record<string, unknown>, children: any[]) => any, text: (value: string) => any): any[];
25
+ export declare function walkthroughCode(): (tree: any) => void;
@@ -0,0 +1,336 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ const stepCode = (step) => step.children.at(-1)?.type === 'code' ? step.children.at(-1) : undefined;
5
+ const stepBody = (step) => stepCode(step) ? step.children.slice(0, -1) : step.children;
6
+ const lineCount = (value) => value.split(/\r\n|\r|\n/).length;
7
+ // "1-3,5" becomes [1, 2, 3, 5].
8
+ export function parseLineRanges(value, lines, where) {
9
+ const result = new Set();
10
+ for (const part of value.split(',').map(item => item.trim())) {
11
+ const match = /^(\d+)(?:-(\d+))?$/.exec(part);
12
+ if (!match)
13
+ throw new Error(`${where}: highlight must list lines or ranges, such as 1-3,5`);
14
+ const start = Number(match[1]);
15
+ const end = Number(match[2] ?? match[1]);
16
+ if (start < 1 || end < start)
17
+ throw new Error(`${where}: highlight range ${part} is reversed or starts before line 1`);
18
+ if (end > lines)
19
+ throw new Error(`${where}: highlight range ${part} is past the end of the ${lines}-line code`);
20
+ for (let line = start; line <= end; line++)
21
+ result.add(line);
22
+ }
23
+ return [...result].sort((a, b) => a - b);
24
+ }
25
+ const languages = {
26
+ ts: 'typescript', mts: 'typescript', cts: 'typescript', tsx: 'typescript', js: 'javascript', mjs: 'javascript', cjs: 'javascript', jsx: 'javascript',
27
+ py: 'python', rb: 'ruby', go: 'go', rs: 'rust', java: 'java', cs: 'csharp', php: 'php', sh: 'bash', bash: 'bash', zsh: 'bash',
28
+ yaml: 'yaml', yml: 'yaml', json: 'json', html: 'html', css: 'css', sql: 'sql', xml: 'xml', md: 'markdown', mdx: 'mdx', http: 'http'
29
+ };
30
+ // Code can come from a project file instead of a fence, so a walkthrough shows the same code the project tests.
31
+ // `region` takes the lines between `#region name` and `#endregion` comments; `lines` takes a fixed range.
32
+ function sourceCode(attributes, sourceFile, where, projectRoot) {
33
+ const { file: source, lines, region, lang } = attributes;
34
+ if (source === undefined) {
35
+ if (lines !== undefined || region !== undefined || lang !== undefined)
36
+ throw new Error(`${where}: lines, region, and lang need a file attribute`);
37
+ return undefined;
38
+ }
39
+ if (!source || path.isAbsolute(source) || /^[a-z][a-z0-9+.-]*:/i.test(source))
40
+ throw new Error(`${where}: file must be a path relative to the page`);
41
+ if (lines !== undefined && region !== undefined)
42
+ throw new Error(`${where}: use lines or region, not both`);
43
+ const file = path.resolve(path.dirname(sourceFile), source);
44
+ let real;
45
+ try {
46
+ real = realpathSync(file);
47
+ }
48
+ catch {
49
+ throw new Error(`${where}: code file not found: ${file}`);
50
+ }
51
+ const boundary = sourceBoundary(sourceFile, projectRoot);
52
+ const relative = path.relative(boundary, real);
53
+ if (relative.startsWith('..') || path.isAbsolute(relative))
54
+ throw new Error(`${where}: file ${source} is outside ${boundary}; code files must be in the page's Git repository or project directory`);
55
+ let text;
56
+ try {
57
+ text = readFileSync(real, 'utf8');
58
+ }
59
+ catch {
60
+ throw new Error(`${where}: code file not readable: ${file}`);
61
+ }
62
+ let all = text.replace(/\r\n?/g, '\n').replace(/\n$/, '').split('\n');
63
+ if (lines !== undefined) {
64
+ const match = /^(\d+)-(\d+)$/.exec(lines);
65
+ if (!match || Number(match[1]) < 1 || Number(match[2]) < Number(match[1]))
66
+ throw new Error(`${where}: lines must be one range, such as 12-30`);
67
+ if (Number(match[2]) > all.length)
68
+ throw new Error(`${where}: lines ${lines} is past the end of the ${all.length}-line file ${source}`);
69
+ all = all.slice(Number(match[1]) - 1, Number(match[2]));
70
+ }
71
+ if (region !== undefined) {
72
+ if (!region)
73
+ throw new Error(`${where}: region needs a name`);
74
+ const found = regions(all, source, where).get(region);
75
+ if (!found)
76
+ throw new Error(`${where}: no "#region ${region}" comment in ${source}`);
77
+ all = all.slice(found.start + 1, found.end).filter(line => !marker(line));
78
+ const indent = Math.min(...all.filter(line => line.trim()).map(line => /^\s*/.exec(line)[0].length));
79
+ if (Number.isFinite(indent))
80
+ all = all.map(line => line.slice(indent));
81
+ }
82
+ if (!all.some(line => line.trim()))
83
+ throw new Error(`${where}: the code taken from ${source} is empty`);
84
+ const language = lang ?? languages[path.extname(file).slice(1).toLowerCase()];
85
+ if (!language)
86
+ throw new Error(`${where}: set lang for ${source}; its extension doesn't name a language`);
87
+ return { code: { type: 'code', lang: language, meta: `filename="${path.basename(file)}"`, value: all.join('\n') }, file };
88
+ }
89
+ // Region comments such as `// #region name`, `# region name`, or `<!-- #endregion name -->` start their line,
90
+ // after an optional comment opener, so a `#region` inside code or a URL is not a marker. The name is the first
91
+ // word; text after it, such as `: what this does`, is a description. An end marker may repeat its region's name.
92
+ const marker = (line) => {
93
+ const match = /^\s*(?:\/\/+|\/\*+|<!--|--|;+|')?\s*#\s?(end)?region\b\s*([^\s:]*)/.exec(line);
94
+ return match ? { end: !!match[1], name: match[2].replace(/(?:-->|\*\/)$/, '') || undefined } : undefined;
95
+ };
96
+ // Pair every region marker in the file, so a stray or mismatched marker fails the build instead of cutting a
97
+ // region short.
98
+ function regions(lines, source, where) {
99
+ const found = new Map();
100
+ const open = [];
101
+ lines.forEach((line, at) => {
102
+ const item = marker(line);
103
+ if (!item)
104
+ return;
105
+ const number = at + 1;
106
+ if (!item.end) {
107
+ if (!item.name)
108
+ throw new Error(`${where}: #region at line ${number} of ${source} needs a name`);
109
+ if (found.has(item.name) || open.some(entry => entry.name === item.name))
110
+ throw new Error(`${where}: region ${item.name} appears twice in ${source}; give each region its own name`);
111
+ open.push({ name: item.name, start: at });
112
+ return;
113
+ }
114
+ const current = open.pop();
115
+ if (!current)
116
+ throw new Error(`${where}: #endregion at line ${number} of ${source} has no matching #region`);
117
+ if (item.name && item.name !== current.name)
118
+ throw new Error(`${where}: #endregion ${item.name} at line ${number} of ${source} closes region ${current.name}`);
119
+ found.set(current.name, { start: current.start, end: at });
120
+ });
121
+ const unclosed = open.pop();
122
+ if (unclosed)
123
+ throw new Error(`${where}: region ${unclosed.name} at line ${unclosed.start + 1} of ${source} has no #endregion`);
124
+ return found;
125
+ }
126
+ // A page may read code from anywhere in its Git repository, so docs can show code that lives beside them, but
127
+ // never from outside it: a docs change must not publish other files from the build machine. Outside a
128
+ // repository, the project directory is the limit.
129
+ function sourceBoundary(sourceFile, projectRoot) {
130
+ for (let directory = path.dirname(sourceFile);; directory = path.dirname(directory)) {
131
+ if (existsSync(path.join(directory, '.git')))
132
+ return realpathSync(directory);
133
+ if (path.dirname(directory) === directory)
134
+ return realpathSync(projectRoot ?? path.dirname(sourceFile));
135
+ }
136
+ }
137
+ const formatRanges = (lines) => {
138
+ const label = lines.length === 1 ? 'Line' : 'Lines';
139
+ const parts = [];
140
+ for (let index = 0; index < lines.length; index++) {
141
+ const start = lines[index];
142
+ while (lines[index + 1] === lines[index] + 1)
143
+ index++;
144
+ parts.push(start === lines[index] ? String(start) : `${start}–${lines[index]}`);
145
+ }
146
+ return `${label} ${parts.join(', ')}`;
147
+ };
148
+ export function walkthroughComponent(node, sourceFile, documentId, index, childrenOf, projectRoot) {
149
+ const literal = (element, allowed) => {
150
+ const attributes = element.attributes ?? [];
151
+ if (attributes.some((item) => item.type !== 'mdxJsxAttribute' || !allowed.includes(item.name) || typeof item.value !== 'string') || new Set(attributes.map((item) => item.name)).size !== attributes.length)
152
+ throw new Error(`${sourceFile}: <${element.name}> only accepts literal ${allowed.join(' and ')} attributes`);
153
+ return Object.fromEntries(attributes.map((item) => [item.name, item.value.trim()]));
154
+ };
155
+ if (node.type !== 'mdxJsxFlowElement')
156
+ throw new Error(`${sourceFile}: <Walkthrough> must be a block on its own lines`);
157
+ const settings = literal(node, ['title', 'layout', 'file', 'lines', 'region', 'lang']);
158
+ const { title } = settings;
159
+ if (!title)
160
+ throw new Error(`${sourceFile}: <Walkthrough> needs a nonempty title`);
161
+ const layout = settings.layout ?? 'scroll';
162
+ if (layout !== 'scroll' && layout !== 'spotlight')
163
+ throw new Error(`${sourceFile}: <Walkthrough> layout must be scroll or spotlight`);
164
+ const sources = [];
165
+ const children = node.children ?? [];
166
+ const fence = children[0]?.type === 'code' ? children[0] : undefined;
167
+ const shared = sourceCode(settings, sourceFile, `${sourceFile}: <Walkthrough>`, projectRoot);
168
+ if (shared && fence)
169
+ throw new Error(`${sourceFile}: <Walkthrough> takes its shared code from a file or a code fence, not both`);
170
+ if (shared)
171
+ sources.push(shared.file);
172
+ const code = shared?.code ?? fence;
173
+ const stepNodes = fence ? children.slice(1) : children;
174
+ if (stepNodes.some((child) => child.type !== 'mdxJsxFlowElement' || child.name !== 'Step'))
175
+ throw new Error(`${sourceFile}: <Walkthrough> accepts one optional code fence followed by <Step> children`);
176
+ if (stepNodes.length < 2)
177
+ throw new Error(`${sourceFile}: <Walkthrough> needs at least two steps`);
178
+ const steps = stepNodes.map((step, at) => {
179
+ const where = `${sourceFile}: <Step> ${at + 1}`;
180
+ const attributes = literal(step, ['title', 'highlight', 'file', 'lines', 'region', 'lang']);
181
+ if (!attributes.title)
182
+ throw new Error(`${where} needs a nonempty title`);
183
+ const body = childrenOf(step.children ?? []);
184
+ const included = sourceCode(attributes, sourceFile, where, projectRoot);
185
+ if (included && body.some(child => child.type === 'code'))
186
+ throw new Error(`${where} takes its code from a file or a code fence, not both`);
187
+ if (included) {
188
+ sources.push(included.file);
189
+ body.push(included.code);
190
+ }
191
+ const codes = body.filter(child => child.type === 'code');
192
+ if (code && codes.length)
193
+ throw new Error(`${where}: steps cannot add code when the walkthrough shares one code fence`);
194
+ if (codes.length > 1)
195
+ throw new Error(`${where} can contain one code fence`);
196
+ if (codes.length && body.at(-1) !== codes[0])
197
+ throw new Error(`${where}: put the code fence after the step's explanation`);
198
+ const shown = code ?? codes[0];
199
+ if (attributes.highlight !== undefined && !shown)
200
+ throw new Error(`${where}: highlight needs code to highlight`);
201
+ const highlight = attributes.highlight === undefined ? [] : parseLineRanges(attributes.highlight, lineCount(shown.value), where);
202
+ if (!body.some(child => child.type !== 'code'))
203
+ throw new Error(`${where} needs an explanation`);
204
+ return { type: 'docWalkthroughStep', title: attributes.title, highlight, children: body };
205
+ });
206
+ const id = `walk-${createHash('sha256').update(`${documentId}|${index}`).digest('hex').slice(0, 10)}`;
207
+ return { type: 'docWalkthrough', id, title, mode: code ? 'unified' : 'separate', layout, code, sources, children: steps };
208
+ }
209
+ // Markdown keeps every step as a section; unified steps repeat the lines they explain so an agent can quote them.
210
+ export function walkthroughMarkdown(node, walk, helpers) {
211
+ const { heading, paragraph, text } = helpers;
212
+ const lines = node.code?.value.split(/\r\n|\r|\n/) ?? [];
213
+ return [
214
+ paragraph({ type: 'strong', children: [text(`Walkthrough: ${node.title}`)] }),
215
+ ...(node.code ? [node.code] : []),
216
+ ...node.children.flatMap((step, index) => [
217
+ heading(3, `Step ${index + 1}: ${step.title}`),
218
+ ...stepBody(step).flatMap(walk),
219
+ ...(node.code && step.highlight.length ? [
220
+ paragraph(text(`${formatRanges(step.highlight)}:`)),
221
+ { type: 'code', lang: node.code.lang, value: step.highlight.map(line => lines[line - 1]).join('\n') }
222
+ ] : []),
223
+ ...(stepCode(step) ? [stepCode(step)] : [])
224
+ ])
225
+ ];
226
+ }
227
+ export function walkthroughHtml(node, walk, element, text) {
228
+ const codeBox = (code, highlight) => element('div', { className: ['walkthrough-code'], ...(highlight.length ? { 'data-highlight': highlight.join(' ') } : {}) }, [code]);
229
+ const steps = node.children.map((step, index) => element('li', {
230
+ id: `${node.id}-step-${index + 1}`, className: ['walkthrough-step'],
231
+ ...(node.mode === 'unified' && step.highlight.length ? { 'data-highlight': step.highlight.join(' ') } : {})
232
+ }, [
233
+ element('h3', { className: ['walkthrough-step-title'] }, [element('span', { className: ['walkthrough-step-number'] }, [text(`Step ${index + 1}`)]), text(' '), text(step.title)]),
234
+ ...stepBody(step).flatMap(walk),
235
+ ...(node.mode === 'unified' && step.highlight.length ? [element('p', { className: ['walkthrough-lines'] }, [text(formatRanges(step.highlight))])] : []),
236
+ ...(stepCode(step) ? [codeBox(stepCode(step), step.highlight)] : [])
237
+ ]));
238
+ return [element('section', { className: ['walkthrough'], id: node.id, 'data-walkthrough': '', 'data-mode': node.mode, 'data-layout': node.layout, 'aria-label': node.title }, [
239
+ element('p', { className: ['walkthrough-title'] }, [text(node.title)]),
240
+ ...(node.code ? [codeBox(node.code, [])] : []),
241
+ element('ol', { className: ['walkthrough-steps'] }, steps)
242
+ ])];
243
+ }
244
+ const hasClass = (node, name) => [node.properties?.className].flat().includes(name);
245
+ const textOf = (node) => node.type === 'text' ? node.value : (node.children ?? []).map(textOf).join('');
246
+ function pieces(code) {
247
+ const result = [];
248
+ for (const child of code.children ?? []) {
249
+ const style = child.type === 'element' ? child.properties?.style : undefined;
250
+ // Finer pieces make movement read as code shifting rather than whole lines fading.
251
+ for (const part of textOf(child).match(/\r\n|\r|\n|[^\S\r\n]+|\w+|[^\w\s]/g) ?? [])
252
+ result.push({ text: part, style });
253
+ }
254
+ return result;
255
+ }
256
+ // Longest common subsequence of token text; returns pairs of matching indexes.
257
+ function matches(before, after) {
258
+ if (before.length * after.length > 2_000_000)
259
+ return [];
260
+ const table = Array.from({ length: before.length + 1 }, () => new Uint32Array(after.length + 1));
261
+ for (let i = before.length - 1; i >= 0; i--)
262
+ for (let j = after.length - 1; j >= 0; j--) {
263
+ table[i][j] = before[i] === after[j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1]);
264
+ }
265
+ const pairs = [];
266
+ for (let i = 0, j = 0; i < before.length && j < after.length;) {
267
+ if (before[i] === after[j]) {
268
+ pairs.push([i, j]);
269
+ i++;
270
+ j++;
271
+ }
272
+ else if (table[i + 1][j] >= table[i][j + 1])
273
+ i++;
274
+ else
275
+ j++;
276
+ }
277
+ return pairs;
278
+ }
279
+ export function walkthroughCode() {
280
+ return (tree) => {
281
+ const visit = (node) => {
282
+ if (node.type === 'element' && hasClass(node, 'walkthrough'))
283
+ return keyWalkthrough(node);
284
+ node.children?.forEach(visit);
285
+ };
286
+ visit(tree);
287
+ };
288
+ }
289
+ function keyWalkthrough(root) {
290
+ const boxes = [];
291
+ const collect = (node) => {
292
+ if (node.type === 'element' && hasClass(node, 'walkthrough-code'))
293
+ boxes.push(node);
294
+ else
295
+ node.children?.forEach(collect);
296
+ };
297
+ collect(root);
298
+ let next = 0;
299
+ let previous;
300
+ for (const box of boxes) {
301
+ const pre = (function find(node) { return node.tagName === 'pre' ? node : (node.children ?? []).map(find).find(Boolean); })(box);
302
+ const code = pre?.children?.find((child) => child.tagName === 'code');
303
+ if (!code)
304
+ continue;
305
+ const highlighted = new Set(String(box.properties?.dataHighlight ?? box.properties?.['data-highlight'] ?? '').split(' ').filter(Boolean).map(Number));
306
+ const all = pieces(code);
307
+ const visible = all.filter(piece => piece.text.trim());
308
+ const texts = visible.map(piece => piece.text);
309
+ const keys = new Array(texts.length);
310
+ if (previous)
311
+ for (const [from, to] of matches(previous.texts, texts))
312
+ keys[to] = previous.keys[from];
313
+ for (let index = 0; index < keys.length; index++)
314
+ keys[index] ??= `k${(next++).toString(36)}`;
315
+ previous = { texts, keys };
316
+ let visibleIndex = 0;
317
+ const lines = [[]];
318
+ for (const piece of all) {
319
+ if (/^(?:\r\n|\r|\n)$/.test(piece.text)) {
320
+ lines.push([]);
321
+ continue;
322
+ }
323
+ if (!piece.text.trim()) {
324
+ lines.at(-1).push({ type: 'text', value: piece.text });
325
+ continue;
326
+ }
327
+ lines.at(-1).push({ type: 'element', tagName: 'span', properties: { ...(piece.style ? { style: piece.style } : {}), dataK: keys[visibleIndex++] }, children: [{ type: 'text', value: piece.text }] });
328
+ }
329
+ code.children = lines.flatMap((line, index) => [
330
+ ...(index ? [{ type: 'text', value: '\n' }] : []),
331
+ { type: 'element', tagName: 'span', properties: { className: ['line', ...(highlighted.has(index + 1) ? ['is-highlighted'] : [])] }, children: line }
332
+ ]);
333
+ if (highlighted.size)
334
+ pre.properties = { ...pre.properties, dataFocus: '' };
335
+ }
336
+ }
@@ -0,0 +1,2 @@
1
+ /** YAML inputs must represent finite data; recursive OpenAPI schemas use $ref. */
2
+ export declare function parseYaml(source: string, file: string): any;
@@ -0,0 +1,36 @@
1
+ import YAML from 'yaml';
2
+ /** YAML inputs must represent finite data; recursive OpenAPI schemas use $ref. */
3
+ export function parseYaml(source, file) {
4
+ const document = YAML.parseDocument(source, { uniqueKeys: true, strict: true });
5
+ if (document.errors.length)
6
+ throw new Error(`${file}: ${document.errors.map(error => error.message).join('; ')}`);
7
+ let value;
8
+ try {
9
+ value = document.toJS();
10
+ }
11
+ catch (error) {
12
+ throw new Error(`${file}: ${error.message}`);
13
+ }
14
+ const active = new WeakSet();
15
+ const finished = new WeakSet();
16
+ const pending = [{ value, at: '#' }];
17
+ while (pending.length) {
18
+ const item = pending.pop();
19
+ if (!item.value || typeof item.value !== 'object')
20
+ continue;
21
+ if (item.exit) {
22
+ active.delete(item.value);
23
+ finished.add(item.value);
24
+ continue;
25
+ }
26
+ if (active.has(item.value))
27
+ throw new Error(`${file}: Cyclic YAML alias at ${item.at}. Replace the cycle with finite values; recursive OpenAPI schemas should use $ref.`);
28
+ if (finished.has(item.value))
29
+ continue;
30
+ active.add(item.value);
31
+ pending.push({ ...item, exit: true });
32
+ for (const [key, child] of Object.entries(item.value))
33
+ pending.push({ value: child, at: `${item.at}/${key.replaceAll('~', '~0').replaceAll('/', '~1')}` });
34
+ }
35
+ return value;
36
+ }
@@ -0,0 +1,59 @@
1
+ # Cedar Parcel API documentation starter
2
+
3
+ This fictional parcel API uses the same OpenAPI source as the Shoalrun docs site's reference styling lab. It includes an overview, enrollment quickstart, generated references, search, system color mode, and linked reading paths.
4
+
5
+ ## Preview your site
6
+
7
+ With the Shoalrun CLI installed, run these commands from this directory:
8
+
9
+ ```sh
10
+ shoalrun config validate docs.config.yaml
11
+ shoalrun dev docs.config.yaml site-dist --port 8772
12
+ ```
13
+
14
+ Open `http://127.0.0.1:8772/`. Editing a page or config rebuilds the preview. The CLI retains the last successful build if a change fails.
15
+
16
+ The development server builds the site before serving it. To inspect a fixed build instead, run `shoalrun build docs.config.yaml site-dist`, then `shoalrun serve site-dist --port 8772`.
17
+
18
+ ## Make it yours
19
+
20
+ 1. Change the title, header, footer, and `site.origin` in `docs.config.yaml`. Set the origin to the site's public URL before deployment.
21
+ 2. If you keep the Cedar example, customize its descriptions and examples together with the authored pages. Replace the fictional server URLs before sending requests. To use a different API, follow **Bring your own API** below; replacing the file alone is not enough.
22
+ 3. Update the authored pages in `content/`. Stable document IDs connect cards, navigation, and related reading. Keep their operation bindings consistent with `apis.cedar.operations`.
23
+ 4. Review the API content for public release. Run `shoalrun api review docs.config.yaml --output review`, inspect the candidate, and update `apis.cedar.publicReview.digest` with the reported digest when API content changes.
24
+ 5. Build again and inspect the overview, quickstart, and generated reference pages. Search for a field and try the color-mode toggle.
25
+
26
+ ## Bring your own API
27
+
28
+ For a first import, start with `shoalrun init my-api-docs --starter minimal` and follow [Add an OpenAPI API](https://www.shoalrun.com/publish/api-references). That guide supplies a complete small example: a local spec, operation registration, an authored reference, navigation, source review, and checks for both outputs. You can read the version bundled with your CLI using `shoalrun docs read guide.api-references`.
29
+
30
+ To adapt this Cedar demo instead, update these connected parts before running the review:
31
+
32
+ - Replace the source file and update its `source.path` if the filename changes. Remove the old `publicReview.digest`; it approves the Cedar source, not your replacement.
33
+ - Replace `apis.cedar.operations` entries with operations from your spec. Each `sourceOperationId` must exist in that spec. Update the corresponding page's `operations` list and the registry's `reference` page ID together.
34
+ - Update navigation operation IDs, authored API embeds, document links, related-reading relationships, header links, and footer links. Rewrite or remove the Cedar-specific guides and reference page as a connected set.
35
+ - Update or remove `mappings`, `querySyntax`, and `discovery.endpoint` when they do not describe your API. Review `generateReferences` and whether publishing the complete source with `source.publish: true` is appropriate.
36
+
37
+ Then run `shoalrun api review docs.config.yaml --output review`, inspect the candidate's HTML, Markdown, and contracts, and record the new digest. Rebuild and run `shoalrun api focused-audit site-dist`. A `Missing OpenAPI operationId createEnrollment` error means a Cedar operation binding still points into your replacement spec.
38
+
39
+ ## Explore the reference features
40
+
41
+ The enrollment reference includes four request shapes, shared nested objects, required fields, nullable values, and four named examples. Parcel search includes direct field/operator filters and JSON, CSV, and spreadsheet responses. Other operations demonstrate a separate lookup server, binary manifest uploads, a deprecated route, and a delivery webhook with alternative proof shapes.
42
+
43
+ The config maps OpenAPI lifecycle extensions to status badges and defines the direct-query syntax used by parcel search. Enrollment uses an application key; the parcel lookup has no authentication. The generated references describe the security rules for each operation.
44
+
45
+ ## Agent discovery
46
+
47
+ Every page has a Markdown twin and a **Read as Markdown** link. `/llms.txt` indexes the site, and `/documents.json` provides the document inventory. API references link to focused contracts containing one operation. The complete OpenAPI source and API catalog are also published.
48
+
49
+ `site.agentDiscovery` configures the early HTML instruction. `mode: focus` visually reveals it on keyboard focus; `visible` always shows it; `off` omits the block. Raw HTML agents and screen readers can encounter it in both `focus` and `visible` modes. The standard accessibility skip link and discovery files remain available in every mode.
50
+
51
+ ## Deploy
52
+
53
+ Build Vercel routing and headers with:
54
+
55
+ ```sh
56
+ shoalrun vercel build docs.config.yaml .vercel/output
57
+ ```
58
+
59
+ Deploy the complete Build Output API directory using your Vercel project. A plain static folder upload does not apply the Markdown negotiation rules. See [Vercel hosting](https://www.shoalrun.com/publish/vercel/) for deployment instructions.