@shoalrun/cli 0.1.0-alpha.16 → 0.1.0-alpha.18

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 (703) hide show
  1. package/AUTHORING.md +29 -0
  2. package/CHANGELOG.md +40 -0
  3. package/DEPLOYMENT-PROFILES.md +96 -5
  4. package/README.md +59 -3
  5. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +21 -17
  6. package/agent-docs/SNAPSHOT.json +5 -5
  7. package/agent-docs/api-docs/focused-contracts.md +4 -4
  8. package/agent-docs/api-docs/generate.md +11 -11
  9. package/agent-docs/api-docs/generate.sections/add-useful-examples.md +3 -3
  10. package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +4 -4
  11. package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +1 -1
  12. package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +2 -2
  13. package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +1 -1
  14. package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +1 -1
  15. package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +4 -4
  16. package/agent-docs/api-docs/generate.sections/related-reading.md +1 -1
  17. package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +2 -2
  18. package/agent-docs/api-docs/support.md +7 -7
  19. package/agent-docs/author/add-page.md +3 -3
  20. package/agent-docs/author/agent-overview.md +3 -3
  21. package/agent-docs/author/agent-workflow.md +7 -7
  22. package/agent-docs/author/analytics.md +27 -27
  23. package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +3 -3
  24. package/agent-docs/author/analytics.sections/built-in-events.md +15 -15
  25. package/agent-docs/author/analytics.sections/configure-an-adapter.md +1 -1
  26. package/agent-docs/author/analytics.sections/custom-interactions.md +2 -2
  27. package/agent-docs/author/analytics.sections/event-format.md +2 -2
  28. package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +4 -4
  29. package/agent-docs/author/analytics.sections/inspect-events-locally.md +2 -2
  30. package/agent-docs/author/analytics.sections/map-events-to-your-service.md +3 -3
  31. package/agent-docs/author/analytics.sections/posthog-example.md +3 -3
  32. package/agent-docs/author/analytics.sections/related-reading.md +1 -1
  33. package/agent-docs/author/authoring-agent.md +3 -3
  34. package/agent-docs/author/coding-agent.md +4 -4
  35. package/agent-docs/author/components/api-embeds.md +6 -6
  36. package/agent-docs/author/components/api-embeds.sections/apiexample.md +3 -3
  37. package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +1 -1
  38. package/agent-docs/author/components/api-embeds.sections/related-reading.md +1 -1
  39. package/agent-docs/author/components/badge.md +2 -2
  40. package/agent-docs/author/components/callout.md +2 -2
  41. package/agent-docs/author/components/cards.md +16 -16
  42. package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +4 -4
  43. package/agent-docs/author/components/cards.sections/build-a-collection.md +7 -7
  44. package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +9 -9
  45. package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +3 -3
  46. package/agent-docs/author/components/cards.sections/link-to-one-document.md +3 -3
  47. package/agent-docs/author/components/cards.sections/override-card-text.md +5 -5
  48. package/agent-docs/author/components/cards.sections/related-reading.md +3 -3
  49. package/agent-docs/author/components/code-blocks.md +2 -2
  50. package/agent-docs/author/components/collapsible.md +3 -3
  51. package/agent-docs/author/components/cookbook-chooser.md +5 -5
  52. package/agent-docs/author/components/custom/react.md +8 -8
  53. package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +3 -3
  54. package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +2 -2
  55. package/agent-docs/author/components/custom/react.sections/registration.md +1 -1
  56. package/agent-docs/author/components/custom/react.sections/related-reading.md +1 -1
  57. package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +3 -3
  58. package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +3 -3
  59. package/agent-docs/author/components/custom.md +7 -7
  60. package/agent-docs/author/components/definition-list.md +2 -2
  61. package/agent-docs/author/components/diagrams/d2-gallery.md +2 -2
  62. package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +2 -2
  63. package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +2 -2
  64. package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +2 -2
  65. package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +2 -2
  66. package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +2 -2
  67. package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +2 -2
  68. package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +2 -2
  69. package/agent-docs/author/components/diagrams/pele-gallery.md +3 -3
  70. package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +2 -2
  71. package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +2 -2
  72. package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +2 -2
  73. package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +3 -3
  74. package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +2 -2
  75. package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +2 -2
  76. package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +2 -2
  77. package/agent-docs/author/components/diagrams.md +8 -8
  78. package/agent-docs/author/components/doc-link.md +3 -3
  79. package/agent-docs/author/components/fields.md +18 -18
  80. package/agent-docs/author/components/file-tree.md +2 -2
  81. package/agent-docs/author/components/images.md +5 -5
  82. package/agent-docs/author/components/info-hint.md +3 -3
  83. package/agent-docs/author/components/kbd.md +2 -2
  84. package/agent-docs/author/components/math.md +2 -2
  85. package/agent-docs/author/components/only.md +3 -3
  86. package/agent-docs/author/components/progress.md +3 -3
  87. package/agent-docs/author/components/steps.md +2 -2
  88. package/agent-docs/author/components/tables.md +2 -2
  89. package/agent-docs/author/components/tabs.md +5 -5
  90. package/agent-docs/author/components/timeline.md +2 -2
  91. package/agent-docs/author/components/tooltips.md +2 -2
  92. package/agent-docs/author/components/walkthroughs.md +2 -2
  93. package/agent-docs/author/components/walkthroughs.sections/attributes.md +1 -1
  94. package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +1 -1
  95. package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +2 -2
  96. package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +1 -1
  97. package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +1 -1
  98. package/agent-docs/author/components/walkthroughs.sections/related-reading.md +1 -1
  99. package/agent-docs/author/components/walkthroughs.sections/syntax.md +1 -1
  100. package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +1 -1
  101. package/agent-docs/author/components.md +2 -2
  102. package/agent-docs/author/content.md +3 -3
  103. package/agent-docs/author/cookbooks.md +9 -9
  104. package/agent-docs/author/css.md +4 -4
  105. package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +3 -3
  106. package/agent-docs/author/css.sections/core-color-tokens.md +3 -3
  107. package/agent-docs/author/css.sections/html-markdown-and-agents.md +4 -4
  108. package/agent-docs/author/css.sections/page-attributes.md +3 -3
  109. package/agent-docs/author/css.sections/page-transitions.md +3 -3
  110. package/agent-docs/author/css.sections/responsive-behavior.md +3 -3
  111. package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +3 -3
  112. package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +3 -3
  113. package/agent-docs/author/custom-metadata.md +13 -13
  114. package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +4 -4
  115. package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +3 -3
  116. package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +2 -2
  117. package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +3 -3
  118. package/agent-docs/author/custom-metadata.sections/related-reading.md +1 -1
  119. package/agent-docs/author/design-templates.md +3 -3
  120. package/agent-docs/author/design-writing-guides.md +3 -3
  121. package/agent-docs/author/frontmatter-reference.md +59 -16
  122. package/agent-docs/author/frontmatter-reference.sections/categorize-connect-and-present-the-page.md +64 -0
  123. package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +14 -12
  124. package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +2 -2
  125. package/agent-docs/author/frontmatter-reference.sections/feature-availability.md +59 -0
  126. package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +2 -2
  127. package/agent-docs/author/frontmatter-reference.sections/html-markdown-and-agents.md +3 -3
  128. package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +2 -2
  129. package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +2 -2
  130. package/agent-docs/author/frontmatter-reference.sections/product-publication-fields.md +37 -0
  131. package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +2 -2
  132. package/agent-docs/author/frontmatter-reference.sections/related-reading.md +2 -2
  133. package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +4 -4
  134. package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +2 -2
  135. package/agent-docs/author/frontmatter.md +13 -13
  136. package/agent-docs/author/frontmatter.sections/audience-badges.md +3 -3
  137. package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +4 -4
  138. package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +1 -1
  139. package/agent-docs/author/frontmatter.sections/optional-native-fields.md +4 -4
  140. package/agent-docs/author/frontmatter.sections/publication-fields.md +2 -2
  141. package/agent-docs/author/frontmatter.sections/publishing-policy.md +1 -1
  142. package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +1 -1
  143. package/agent-docs/author/frontmatter.sections/related-reading.md +1 -1
  144. package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +1 -1
  145. package/agent-docs/author/frontmatter.sections/seo-fields.md +2 -2
  146. package/agent-docs/author/frontmatter.sections/validation-rules.md +3 -3
  147. package/agent-docs/author/markdown-metadata.md +20 -20
  148. package/agent-docs/author/navigation.md +12 -12
  149. package/agent-docs/author/navigation.sections/arrange-authored-pages.md +4 -4
  150. package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +2 -2
  151. package/agent-docs/author/navigation.sections/hide-group-page-counts.md +4 -4
  152. package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +4 -4
  153. package/agent-docs/author/navigation.sections/local-api-preview.md +2 -2
  154. package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +3 -3
  155. package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +2 -2
  156. package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +2 -2
  157. package/agent-docs/author/navigation.sections/related-reading.md +2 -2
  158. package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +4 -4
  159. package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +3 -3
  160. package/agent-docs/author/reader-views.md +9 -9
  161. package/agent-docs/author/reader-views.sections/configure-the-choices.md +2 -2
  162. package/agent-docs/author/reader-views.sections/connect-your-own-control.md +1 -1
  163. package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +3 -3
  164. package/agent-docs/author/reader-views.sections/mark-pages.md +3 -3
  165. package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +2 -2
  166. package/agent-docs/author/reader-views.sections/place-filter-controls.md +2 -2
  167. package/agent-docs/author/reader-views.sections/try-the-controls-here.md +2 -2
  168. package/agent-docs/author/recipe-drafts.md +5 -5
  169. package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +2 -2
  170. package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +2 -2
  171. package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +1 -1
  172. package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +2 -2
  173. package/agent-docs/author/recipe-drafts.sections/related-reading.md +1 -1
  174. package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +2 -2
  175. package/agent-docs/author/recipes.md +9 -9
  176. package/agent-docs/author/recipes.sections/how-agents-use-this.md +3 -3
  177. package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +3 -3
  178. package/agent-docs/author/recipes.sections/related-reading.md +2 -2
  179. package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +3 -3
  180. package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +4 -4
  181. package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +3 -3
  182. package/agent-docs/author/recipes.sections/what-each-file-does.md +2 -2
  183. package/agent-docs/author/recipes.sections/what-happens-and-when.md +3 -3
  184. package/agent-docs/author/related-reading.md +11 -11
  185. package/agent-docs/author/related-reading.sections/automatic-footers.md +3 -3
  186. package/agent-docs/author/related-reading.sections/declare-relationships.md +3 -3
  187. package/agent-docs/author/related-reading.sections/display-related-documents.md +3 -3
  188. package/agent-docs/author/related-reading.sections/html-markdown-and-agents.md +1 -1
  189. package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +2 -2
  190. package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +3 -3
  191. package/agent-docs/author/related-reading.sections/related-reading.md +1 -1
  192. package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +2 -2
  193. package/agent-docs/author/release-notes.md +8 -8
  194. package/agent-docs/author/search.md +82 -29
  195. package/agent-docs/author/search.sections/agent-and-mcp-search-scope.md +52 -0
  196. package/agent-docs/author/search.sections/choose-a-provider.md +8 -7
  197. package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +4 -4
  198. package/agent-docs/author/search.sections/enable-included-semantic-search.md +66 -0
  199. package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +3 -3
  200. package/agent-docs/author/search.sections/html-markdown-and-agents.md +3 -3
  201. package/agent-docs/author/search.sections/lexical-search.md +6 -6
  202. package/agent-docs/author/search.sections/local-semantic-preview.md +3 -3
  203. package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +2 -2
  204. package/agent-docs/author/search.sections/related-reading.md +2 -2
  205. package/agent-docs/author/search.sections/reuse-the-lexical-index.md +5 -5
  206. package/agent-docs/author/search.sections/turn-search-off.md +3 -3
  207. package/agent-docs/author/search.sections/use-the-search-box.md +2 -2
  208. package/agent-docs/author/search.sections/write-a-custom-provider.md +11 -11
  209. package/agent-docs/author/snippets.md +3 -3
  210. package/agent-docs/author/taxonomy.md +3 -3
  211. package/agent-docs/author/templates.md +16 -14
  212. package/agent-docs/author/templates.sections/built-in-feature-templates.md +2 -2
  213. package/agent-docs/author/templates.sections/built-in-templates.md +2 -2
  214. package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +7 -7
  215. package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +8 -6
  216. package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +2 -2
  217. package/agent-docs/author/templates.sections/project-added-templates.md +3 -3
  218. package/agent-docs/author/templates.sections/related-reading.md +2 -2
  219. package/agent-docs/author/templates.sections/scaffold-a-page.md +2 -2
  220. package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +3 -3
  221. package/agent-docs/author/templates.sections/what-every-template-gives-you.md +3 -3
  222. package/agent-docs/author/workspace/commands.md +4 -4
  223. package/agent-docs/author/workspace.md +7 -7
  224. package/agent-docs/author/writing-style.md +33 -18
  225. package/agent-docs/author/writing-style.sections/adapt-this-example.md +2 -2
  226. package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +3 -3
  227. package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +4 -4
  228. package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +2 -2
  229. package/agent-docs/author/writing-style.sections/feature-availability.md +20 -7
  230. package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +5 -5
  231. package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +4 -4
  232. package/agent-docs/author/writing-style.sections/procedures-and-examples.md +4 -4
  233. package/agent-docs/author/writing-style.sections/related-reading.md +2 -2
  234. package/agent-docs/author/writing-style.sections/review-a-draft.md +3 -3
  235. package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +2 -2
  236. package/agent-docs/author/writing-style.sections/voice-and-explanations.md +4 -2
  237. package/agent-docs/changelog/2026-10-14-agent-readiness.md +2 -2
  238. package/agent-docs/changelog/2026-10-15-evaluation-builds.md +9 -9
  239. package/agent-docs/changelog/2026-10-16-navigation-layouts.md +4 -4
  240. package/agent-docs/changelog/2026-10-17-mcp-hosting.md +2 -2
  241. package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +3 -3
  242. package/agent-docs/changelog/2026-10-19-visual-navigation.md +3 -3
  243. package/agent-docs/changelog/2026-10-25.md +2 -2
  244. package/agent-docs/changelog/2026-10-26.md +4 -4
  245. package/agent-docs/changelog/2026-10-27.md +1 -1
  246. package/agent-docs/changelog/2026-10-28.md +3 -3
  247. package/agent-docs/changelog/2026-10-30.md +1 -1
  248. package/agent-docs/changelog/2026-11-03.md +5 -5
  249. package/agent-docs/changelog/2026-11-04-runtime-packaging.md +46 -0
  250. package/agent-docs/changelog/authoring-preview.md +3 -3
  251. package/agent-docs/changelog/authoring-search.md +1 -1
  252. package/agent-docs/changelog/authoring-tools.md +2 -2
  253. package/agent-docs/changelog/product-publications.md +60 -0
  254. package/agent-docs/changelog/working-tree-skill.md +1 -1
  255. package/agent-docs/changelog.md +17 -1
  256. package/agent-docs/chat/checks.md +11 -11
  257. package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +1 -1
  258. package/agent-docs/chat/checks.sections/answer-for-one-audience.md +2 -2
  259. package/agent-docs/chat/checks.sections/answer-without-a-model.md +2 -2
  260. package/agent-docs/chat/checks.sections/follow-up-questions.md +2 -2
  261. package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +3 -3
  262. package/agent-docs/chat/checks.sections/questions-with-several-parts.md +3 -3
  263. package/agent-docs/chat/checks.sections/related-reading.md +1 -1
  264. package/agent-docs/chat/checks.sections/reuse-answers.md +4 -4
  265. package/agent-docs/chat/host.md +8 -8
  266. package/agent-docs/chat/host.sections/cap-the-daily-spend.md +2 -2
  267. package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +3 -3
  268. package/agent-docs/chat/host.sections/related-reading.md +2 -2
  269. package/agent-docs/chat/passage-index.md +31 -27
  270. package/agent-docs/chat/passage-index.sections/build-the-index.md +3 -3
  271. package/agent-docs/chat/passage-index.sections/embed-passages.md +4 -4
  272. package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +3 -3
  273. package/agent-docs/chat/passage-index.sections/limits.md +3 -3
  274. package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +14 -10
  275. package/agent-docs/chat/passage-index.sections/related-reading.md +3 -3
  276. package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +19 -19
  277. package/agent-docs/chat/prepared-answers.md +4 -4
  278. package/agent-docs/chat/settings.md +3 -3
  279. package/agent-docs/chat/settings.sections/choose-the-scorer.md +1 -1
  280. package/agent-docs/chat/settings.sections/configure-chat.md +1 -1
  281. package/agent-docs/chat/settings.sections/configure-retrieval.md +1 -1
  282. package/agent-docs/chat/settings.sections/related-reading.md +1 -1
  283. package/agent-docs/chat/settings.sections/send-extra-request-fields.md +2 -2
  284. package/agent-docs/chat/settings.sections/use-more-than-one-model.md +2 -2
  285. package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +1 -1
  286. package/agent-docs/chat/setup.md +2 -2
  287. package/agent-docs/chat.md +3 -3
  288. package/agent-docs/cli.md +73 -59
  289. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +11 -7
  290. package/agent-docs/cli.sections/author-pages.md +16 -12
  291. package/agent-docs/cli.sections/build-and-serve.md +30 -18
  292. package/agent-docs/cli.sections/inspect-config-and-operations.md +13 -9
  293. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +7 -3
  294. package/agent-docs/cli.sections/related-reading.md +6 -2
  295. package/agent-docs/cli.sections/search-and-chat.md +24 -18
  296. package/agent-docs/cli.sections/start-a-project.md +7 -3
  297. package/agent-docs/cli.sections/working-tree-authoring-tools.md +7 -3
  298. package/agent-docs/concepts.md +2 -2
  299. package/agent-docs/config/apis.md +2 -2
  300. package/agent-docs/config/content.md +3 -3
  301. package/agent-docs/config/content.sections/authoring.md +3 -3
  302. package/agent-docs/config/content.sections/badges.md +1 -1
  303. package/agent-docs/config/content.sections/callouts.md +1 -1
  304. package/agent-docs/config/content.sections/cookbooks.md +1 -1
  305. package/agent-docs/config/content.sections/frontmatter.md +1 -1
  306. package/agent-docs/config/content.sections/readerfilters.md +1 -1
  307. package/agent-docs/config/content.sections/related-reading.md +1 -1
  308. package/agent-docs/config/content.sections/relationships.md +1 -1
  309. package/agent-docs/config/content.sections/snippets.md +1 -1
  310. package/agent-docs/config/content.sections/templates.md +1 -1
  311. package/agent-docs/config/content.sections/variables.md +1 -1
  312. package/agent-docs/config/examples.md +4 -4
  313. package/agent-docs/config/examples.sections/feature-showcase.md +4 -4
  314. package/agent-docs/config/examples.sections/minimal-site.md +2 -2
  315. package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
  316. package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
  317. package/agent-docs/config/examples.sections/related-reading.md +2 -2
  318. package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
  319. package/agent-docs/config/integrations.md +4 -4
  320. package/agent-docs/config/outputs.md +22 -16
  321. package/agent-docs/config/outputs.sections/exports.md +19 -13
  322. package/agent-docs/config/outputs.sections/metadata.md +2 -2
  323. package/agent-docs/config/outputs.sections/related-reading.md +1 -1
  324. package/agent-docs/config/publishing.md +29 -19
  325. package/agent-docs/config/publishing.sections/navigation.md +2 -2
  326. package/agent-docs/config/publishing.sections/redirects.md +8 -8
  327. package/agent-docs/config/publishing.sections/related-reading.md +2 -2
  328. package/agent-docs/config/site.md +42 -18
  329. package/agent-docs/config/site.sections/related-reading.md +1 -1
  330. package/agent-docs/config/site.sections/theme.md +1 -1
  331. package/agent-docs/config.md +2 -2
  332. package/agent-docs/configuration.md +19 -19
  333. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
  334. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +5 -5
  335. package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
  336. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +5 -5
  337. package/agent-docs/configuration.sections/related-reading.md +1 -1
  338. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +5 -5
  339. package/agent-docs/configuration.sections/share-defaults-through-extends.md +3 -3
  340. package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
  341. package/agent-docs/configuration.sections/understand-the-three-stages.md +3 -3
  342. package/agent-docs/configuration.sections/understand-where-paths-point.md +2 -2
  343. package/agent-docs/connect/mcp.md +24 -15
  344. package/agent-docs/content-delivery/agents.md +6 -6
  345. package/agent-docs/content-delivery/api.md +29 -16
  346. package/agent-docs/content-delivery/client.md +14 -8
  347. package/agent-docs/content-delivery/http-api/operations/get-content-representation-fa1d2e3f.md +10 -2
  348. package/agent-docs/content-delivery/http-api/operations/get-content-representation-head-4052375c.md +10 -2
  349. package/agent-docs/content-delivery/http-api/operations/get-content-resource-849f1c49.md +537 -3
  350. package/agent-docs/content-delivery/http-api/operations/get-content-resource-head-0a352acd.md +10 -2
  351. package/agent-docs/content-delivery/http-api/operations/list-content-resources-8e977ec7.md +545 -3
  352. package/agent-docs/content-delivery/http-api/operations/list-content-resources-head-b67cbad9.md +10 -2
  353. package/agent-docs/content-delivery/http-api.md +21 -7
  354. package/agent-docs/content-delivery/manifest.md +30 -8
  355. package/agent-docs/content-delivery/publish.md +5 -5
  356. package/agent-docs/content-delivery/render.md +6 -6
  357. package/agent-docs/content-delivery/rest.md +16 -8
  358. package/agent-docs/content-delivery/sections.md +11 -11
  359. package/agent-docs/content-delivery/select.md +6 -6
  360. package/agent-docs/content-delivery.md +4 -4
  361. package/agent-docs/contribute/agent-skills.md +3 -3
  362. package/agent-docs/cookbooks/authoring.md +3 -3
  363. package/agent-docs/cookbooks/site-workflows.md +2 -2
  364. package/agent-docs/cookbooks/welcome-email.md +14 -11
  365. package/agent-docs/documents.json +2445 -1942
  366. package/agent-docs/example-api/cedar.md +4 -4
  367. package/agent-docs/features.md +49 -0
  368. package/agent-docs/glossary.md +22 -22
  369. package/agent-docs/index.md +5 -5
  370. package/agent-docs/ingredients/audit-site.md +2 -2
  371. package/agent-docs/ingredients/build-site.md +2 -2
  372. package/agent-docs/ingredients/complete-page.md +2 -2
  373. package/agent-docs/ingredients/refresh-agent-bundle.md +2 -2
  374. package/agent-docs/non-goals.md +4 -4
  375. package/agent-docs/provenance.json +10 -4
  376. package/agent-docs/publish/agent-discovery.md +8 -2
  377. package/agent-docs/publish/agent-friendliness.md +21 -21
  378. package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +5 -5
  379. package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +5 -5
  380. package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +5 -5
  381. package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +5 -5
  382. package/agent-docs/publish/agent-friendliness.sections/related-reading.md +3 -3
  383. package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +3 -3
  384. package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +3 -3
  385. package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +4 -4
  386. package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +9 -9
  387. package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +5 -5
  388. package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +4 -4
  389. package/agent-docs/publish/api-references.md +5 -5
  390. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +2 -2
  391. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -3
  392. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +2 -2
  393. package/agent-docs/publish/api-references.sections/next-steps.md +2 -2
  394. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +2 -2
  395. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +2 -2
  396. package/agent-docs/publish/api-references.sections/register-the-operation.md +2 -2
  397. package/agent-docs/publish/api-references.sections/related-reading.md +2 -2
  398. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -3
  399. package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -3
  400. package/agent-docs/publish/audit.md +8 -8
  401. package/agent-docs/publish/audit.sections/add-project-tests.md +2 -2
  402. package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +2 -2
  403. package/agent-docs/publish/audit.sections/check-before-pushing.md +3 -3
  404. package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +2 -2
  405. package/agent-docs/publish/audit.sections/read-the-report.md +3 -3
  406. package/agent-docs/publish/audit.sections/related-reading.md +1 -1
  407. package/agent-docs/publish/content-export.md +37 -15
  408. package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +4 -4
  409. package/agent-docs/publish/content-export.sections/check-the-result.md +2 -2
  410. package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +3 -3
  411. package/agent-docs/publish/content-export.sections/prerequisites.md +4 -4
  412. package/agent-docs/publish/content-export.sections/related-reading.md +2 -2
  413. package/agent-docs/publish/content-export.sections/review-exported-api-material.md +3 -3
  414. package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +2 -2
  415. package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +4 -4
  416. package/agent-docs/publish/content-negotiation.md +10 -10
  417. package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +2 -2
  418. package/agent-docs/publish/content-negotiation.sections/missing-pages.md +3 -3
  419. package/agent-docs/publish/content-negotiation.sections/related-reading.md +1 -1
  420. package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +2 -2
  421. package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +2 -2
  422. package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +3 -3
  423. package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +2 -2
  424. package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +2 -2
  425. package/agent-docs/publish/deployment-check.md +6 -6
  426. package/agent-docs/publish/deployment-profiles.md +60 -26
  427. package/agent-docs/publish/deployment-profiles.sections/before-you-begin.md +5 -5
  428. package/agent-docs/publish/deployment-profiles.sections/build-and-inspect-the-edition.md +9 -9
  429. package/agent-docs/publish/deployment-profiles.sections/check-the-result.md +7 -7
  430. package/agent-docs/publish/deployment-profiles.sections/choose-navigation-labels.md +6 -6
  431. package/agent-docs/publish/deployment-profiles.sections/current-limits.md +7 -7
  432. package/agent-docs/publish/deployment-profiles.sections/define-the-shared-sku-manifest.md +6 -6
  433. package/agent-docs/publish/deployment-profiles.sections/html-markdown-and-agents.md +7 -7
  434. package/agent-docs/publish/deployment-profiles.sections/mark-pages-and-shared-sections.md +13 -13
  435. package/agent-docs/publish/deployment-profiles.sections/preview-and-edit-a-customer-edition.md +55 -0
  436. package/agent-docs/publish/deployment-profiles.sections/related-reading.md +6 -6
  437. package/agent-docs/publish/deployment-profiles.sections/select-each-product-release.md +55 -0
  438. package/agent-docs/publish/deployment-profiles.sections/supply-the-profile-from-the-deployment.md +6 -6
  439. package/agent-docs/publish/evals.md +16 -16
  440. package/agent-docs/publish/evals.sections/add-the-audit-hook.md +5 -5
  441. package/agent-docs/publish/evals.sections/check-the-report.md +4 -4
  442. package/agent-docs/publish/evals.sections/define-a-task-file.md +5 -5
  443. package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +5 -5
  444. package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +5 -5
  445. package/agent-docs/publish/evals.sections/related-reading.md +3 -3
  446. package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +4 -4
  447. package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +6 -6
  448. package/agent-docs/publish/host-adapters.md +6 -6
  449. package/agent-docs/publish/manni.md +16 -16
  450. package/agent-docs/publish/manni.sections/check-the-result.md +3 -3
  451. package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +6 -6
  452. package/agent-docs/publish/manni.sections/optional-custom-policies.md +4 -4
  453. package/agent-docs/publish/manni.sections/prerequisites.md +2 -2
  454. package/agent-docs/publish/mcp-analytics.md +12 -12
  455. package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +4 -4
  456. package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +4 -4
  457. package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +4 -4
  458. package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +4 -4
  459. package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +5 -5
  460. package/agent-docs/publish/mcp-analytics.sections/related-reading.md +3 -3
  461. package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +5 -5
  462. package/agent-docs/publish/mcp.md +56 -29
  463. package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +8 -8
  464. package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +4 -4
  465. package/agent-docs/publish/mcp.sections/configure-the-client.md +4 -4
  466. package/agent-docs/publish/mcp.sections/discover-product-releases-before-searching.md +52 -0
  467. package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +6 -6
  468. package/agent-docs/publish/mcp.sections/html-markdown-and-agents.md +38 -0
  469. package/agent-docs/publish/mcp.sections/related-reading.md +3 -3
  470. package/agent-docs/publish/mcp.sections/search-then-read.md +13 -12
  471. package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +12 -8
  472. package/agent-docs/publish/mcp.sections/verify-the-connection.md +4 -4
  473. package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +4 -4
  474. package/agent-docs/publish/openapi-extension-mappings.md +12 -12
  475. package/agent-docs/publish/output.md +20 -20
  476. package/agent-docs/publish/output.sections/api-contracts.md +1 -1
  477. package/agent-docs/publish/output.sections/code-highlighting.md +1 -1
  478. package/agent-docs/publish/output.sections/current-limits.md +1 -1
  479. package/agent-docs/publish/output.sections/incremental-sync.md +4 -4
  480. package/agent-docs/publish/output.sections/manifest-records-and-sections.md +3 -3
  481. package/agent-docs/publish/output.sections/navigation-section-indexes.md +1 -1
  482. package/agent-docs/publish/output.sections/page-formats.md +2 -2
  483. package/agent-docs/publish/output.sections/published-output-contract.md +5 -5
  484. package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +1 -1
  485. package/agent-docs/publish/output.sections/related-reading.md +1 -1
  486. package/agent-docs/publish/output.sections/response-identity.md +1 -1
  487. package/agent-docs/publish/output.sections/site-files.md +6 -6
  488. package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +3 -3
  489. package/agent-docs/publish/output.sections/where-files-go.md +3 -3
  490. package/agent-docs/publish/publications.md +108 -19
  491. package/agent-docs/publish/publications.sections/add-a-language.md +60 -0
  492. package/agent-docs/publish/publications.sections/change-just-one-part-of-a-shared-page.md +63 -0
  493. package/agent-docs/publish/publications.sections/give-each-api-version-its-own-contract.md +34 -0
  494. package/agent-docs/publish/publications.sections/keep-an-unchanged-page-in-one-file.md +53 -0
  495. package/agent-docs/publish/publications.sections/publish-versions-without-a-product-catalog.md +49 -0
  496. package/agent-docs/publish/publications.sections/related-reading.md +42 -0
  497. package/agent-docs/publish/publications.sections/version-products-independently.md +115 -0
  498. package/agent-docs/publish/publications.sections/what-agents-receive.md +38 -0
  499. package/agent-docs/publish/revisions.md +4 -4
  500. package/agent-docs/publish/seo.md +10 -10
  501. package/agent-docs/publish/seo.sections/related-reading.md +2 -2
  502. package/agent-docs/publish/seo.sections/set-the-public-address.md +3 -3
  503. package/agent-docs/publish/seo.sections/what-agents-receive.md +3 -3
  504. package/agent-docs/publish/seo.sections/what-the-build-adds.md +2 -2
  505. package/agent-docs/publish/seo.sections/write-the-page-title-and-summary.md +2 -2
  506. package/agent-docs/publish/single-source-sites.md +5 -5
  507. package/agent-docs/publish/troubleshooting.md +10 -10
  508. package/agent-docs/publish/vercel.md +5 -5
  509. package/agent-docs/publish/vercel.sections/check-the-deployment.md +1 -1
  510. package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +2 -2
  511. package/agent-docs/publish/vercel.sections/prepare-your-project.md +2 -2
  512. package/agent-docs/publish/vercel.sections/related-reading.md +1 -1
  513. package/agent-docs/publish.md +2 -2
  514. package/agent-docs/recipes/add-page.md +5 -5
  515. package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +2 -2
  516. package/agent-docs/recipes/add-page.sections/before-you-start.md +1 -1
  517. package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +2 -2
  518. package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +1 -1
  519. package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +1 -1
  520. package/agent-docs/recipes/add-page.sections/check-the-outcome.md +1 -1
  521. package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +2 -2
  522. package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +1 -1
  523. package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +2 -2
  524. package/agent-docs/recipes/add-page.sections/related-reading.md +1 -1
  525. package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +1 -1
  526. package/agent-docs/recipes/audit-docs.md +4 -4
  527. package/agent-docs/recipes/build-docs.md +2 -2
  528. package/agent-docs/recipes/preview-hybrid-search.md +5 -5
  529. package/agent-docs/recipes/preview-page.md +2 -2
  530. package/agent-docs/recipes/queue-email.md +3 -3
  531. package/agent-docs/recipes/refresh-agent-docs.md +4 -4
  532. package/agent-docs/recipes/send-welcome-email.md +15 -15
  533. package/agent-docs/reference/agent-skills.md +7 -7
  534. package/agent-docs/search-and-chat.md +4 -4
  535. package/agent-docs/search-index.json +1 -1
  536. package/agent-docs/start.md +5 -5
  537. package/agent-docs/start.sections/add-the-page-to-navigation.md +3 -3
  538. package/agent-docs/start.sections/build-and-check-both-outputs.md +3 -3
  539. package/agent-docs/start.sections/build-this-site.md +2 -2
  540. package/agent-docs/start.sections/check-writing-style.md +2 -2
  541. package/agent-docs/start.sections/create-a-page.md +2 -2
  542. package/agent-docs/start.sections/make-it-yours.md +2 -2
  543. package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
  544. package/agent-docs/start.sections/prerequisites.md +2 -2
  545. package/agent-docs/start.sections/related-reading.md +2 -2
  546. package/agent-docs/start.sections/start-your-own-project.md +3 -3
  547. package/agent-docs/status.md +14 -4
  548. package/agent-docs/styling/color-modes.md +2 -2
  549. package/agent-docs/styling/footer.md +2 -2
  550. package/agent-docs/styling/header.md +2 -2
  551. package/agent-docs/styling/layouts.md +3 -3
  552. package/agent-docs/styling/layouts.sections/build-a-landing-page.md +1 -1
  553. package/agent-docs/styling/layouts.sections/build-a-splash-page.md +1 -1
  554. package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +2 -2
  555. package/agent-docs/styling/layouts.sections/customize-the-hero.md +1 -1
  556. package/agent-docs/styling/layouts.sections/hero.md +1 -1
  557. package/agent-docs/styling/layouts.sections/hide-the-table-of-contents-or-give-content-more-room.md +1 -1
  558. package/agent-docs/styling/layouts.sections/html-markdown-and-agents.md +2 -2
  559. package/agent-docs/styling/layouts.sections/related-reading.md +1 -1
  560. package/agent-docs/styling/palettes.md +3 -3
  561. package/agent-docs/styling/share-images.md +3 -3
  562. package/agent-docs/styling/themes.md +2 -2
  563. package/agent-docs/styling/try.md +2 -2
  564. package/agent-docs/what-is-shoalrun.md +7 -3
  565. package/assets/ask-widget.js +20 -6
  566. package/assets/navigation.js +5 -0
  567. package/dist/ai-directory.d.ts +1 -0
  568. package/dist/ai-directory.js +12 -0
  569. package/dist/answer-cards.js +1 -1
  570. package/dist/api-materialize.d.ts +2 -1
  571. package/dist/api-materialize.js +21 -9
  572. package/dist/api-publication-plan.d.ts +2 -0
  573. package/dist/api-publication-plan.js +23 -7
  574. package/dist/api-publication-review.js +4 -3
  575. package/dist/api-selection.d.ts +5 -2
  576. package/dist/api-selection.js +18 -11
  577. package/dist/artifact-bundle.js +9 -6
  578. package/dist/ask-function.d.ts +4 -18
  579. package/dist/ask-function.js +12 -71
  580. package/dist/ask-runtime.d.ts +46 -0
  581. package/dist/ask-runtime.js +101 -0
  582. package/dist/ask-setup.d.ts +3 -42
  583. package/dist/ask-setup.js +5 -93
  584. package/dist/authored-change.js +2 -1
  585. package/dist/authoring-project.js +1 -1
  586. package/dist/cards.js +2 -1
  587. package/dist/cli-discovery.d.ts +2 -2
  588. package/dist/cli-discovery.js +9 -4
  589. package/dist/cli.js +48 -23
  590. package/dist/compiler-config.d.ts +17 -0
  591. package/dist/compiler-config.js +43 -2
  592. package/dist/compiler.d.ts +21 -0
  593. package/dist/compiler.js +16 -12
  594. package/dist/component-transform.d.ts +2 -4
  595. package/dist/component-transform.js +20 -7
  596. package/dist/config.d.ts +1 -0
  597. package/dist/config.js +2 -1
  598. package/dist/content-delivery-contract.d.ts +2 -1
  599. package/dist/content-delivery-validation.d.ts +2 -2
  600. package/dist/content-delivery-validation.js +6 -4
  601. package/dist/content-export-command.d.ts +1 -1
  602. package/dist/content-export-command.js +4 -4
  603. package/dist/content-export-comparison.js +6 -5
  604. package/dist/content-export-config.js +3 -1
  605. package/dist/content-export.js +9 -8
  606. package/dist/content-rest-client.js +4 -2
  607. package/dist/content-rest-contract.d.ts +2 -2
  608. package/dist/content-rest-server.js +11 -6
  609. package/dist/content-source.d.ts +13 -0
  610. package/dist/content-source.js +5 -2
  611. package/dist/content-workspace.d.ts +12 -0
  612. package/dist/content-workspace.js +2 -1
  613. package/dist/content.js +3 -2
  614. package/dist/cookbook-chooser.js +2 -1
  615. package/dist/deployment-profile.d.ts +2 -1
  616. package/dist/deployment-profile.js +38 -8
  617. package/dist/dev.d.ts +3 -1
  618. package/dist/dev.js +99 -12
  619. package/dist/docs-author.js +2 -1
  620. package/dist/docs-command.js +2 -2
  621. package/dist/docs-eval.d.ts +1 -0
  622. package/dist/docs-eval.js +2 -2
  623. package/dist/docs-mcp.d.ts +1 -0
  624. package/dist/docs-mcp.js +10 -5
  625. package/dist/docs-tool.d.ts +4 -10
  626. package/dist/document-sync.d.ts +1 -0
  627. package/dist/document-sync.js +2 -2
  628. package/dist/documentation-core.d.ts +29 -10
  629. package/dist/documentation-core.js +38 -4
  630. package/dist/embeddings.d.ts +1 -1
  631. package/dist/embeddings.js +1 -1
  632. package/dist/freshness.js +2 -2
  633. package/dist/frontmatter.js +13 -7
  634. package/dist/function-package.js +5 -0
  635. package/dist/function-runtime.d.ts +24 -0
  636. package/dist/function-runtime.js +45 -0
  637. package/dist/index-build.d.ts +2 -2
  638. package/dist/index-build.js +5 -13
  639. package/dist/ingredient-draft.js +20 -10
  640. package/dist/mcp-analytics.d.ts +1 -0
  641. package/dist/mcp-artifacts.js +13 -4
  642. package/dist/mcp-config.d.ts +1 -0
  643. package/dist/mcp-config.js +3 -1
  644. package/dist/mcp-http.js +1 -1
  645. package/dist/page-materialization.d.ts +3 -4
  646. package/dist/page-materialization.js +15 -8
  647. package/dist/page-renderer.d.ts +6 -0
  648. package/dist/page-renderer.js +16 -5
  649. package/dist/project-navigation.js +2 -1
  650. package/dist/publication-identity.d.ts +12 -0
  651. package/dist/publication-identity.js +17 -0
  652. package/dist/publication-manifest.d.ts +24 -1
  653. package/dist/publication-manifest.js +14 -6
  654. package/dist/publication-plan.js +21 -9
  655. package/dist/publication-render.js +24 -8
  656. package/dist/recipe-draft.js +9 -6
  657. package/dist/retrieval-runtime.d.ts +5 -0
  658. package/dist/retrieval-runtime.js +21 -0
  659. package/dist/scaffold.d.ts +7 -4
  660. package/dist/scaffold.js +16 -16
  661. package/dist/search-function.d.ts +2 -0
  662. package/dist/search-function.js +30 -0
  663. package/dist/search-handler.js +2 -2
  664. package/dist/search-identifier-core.d.ts +4 -0
  665. package/dist/search-identifier-core.js +30 -0
  666. package/dist/search-identifier.d.ts +3 -3
  667. package/dist/search-identifier.js +7 -30
  668. package/dist/search-literal.js +1 -1
  669. package/dist/search-query.d.ts +4 -10
  670. package/dist/search-query.js +10 -9
  671. package/dist/search-results.js +1 -1
  672. package/dist/search-snippet.d.ts +1 -1
  673. package/dist/search-snippet.js +2 -14
  674. package/dist/search-text.d.ts +1 -0
  675. package/dist/search-text.js +14 -0
  676. package/dist/server.d.ts +8 -0
  677. package/dist/server.js +14 -3
  678. package/dist/subject-deprecation.js +2 -1
  679. package/dist/vercel-function.js +11 -3
  680. package/example-configs/products/README.md +37 -0
  681. package/example-configs/products/content/operations.mdx +50 -0
  682. package/example-configs/products/content/payments-v2.mdx +30 -0
  683. package/example-configs/products/content/payments-v3.mdx +38 -0
  684. package/example-configs/products/content/priority-settlement.mdx +23 -0
  685. package/example-configs/products/content/reporting-v1.mdx +36 -0
  686. package/example-configs/products/content/scheduled-exports.mdx +23 -0
  687. package/example-configs/products/docs.config.yaml +56 -0
  688. package/example-configs/products/profiles/all-releases.yaml +9 -0
  689. package/example-configs/products/profiles/customer-a.yaml +13 -0
  690. package/example-configs/products/profiles/customer-b.yaml +13 -0
  691. package/example-configs/products/skus.yaml +11 -0
  692. package/examples/content-delivery/preview.mjs +1 -1
  693. package/package.json +1 -1
  694. package/schemas/content-export.schema.json +41 -3
  695. package/schemas/content-rest.openapi.json +184 -37
  696. package/skills/shoalrun-author/SKILL.md +6 -2
  697. package/skills/shoalrun-author/references/customer-editions.md +34 -4
  698. package/skills/shoalrun-author/references/publications.md +60 -0
  699. package/skills/shoalrun-recipes/SKILL.md +2 -0
  700. package/skills/shoalrun-setup/SKILL.md +3 -1
  701. package/styles/header.css +3 -0
  702. package/styles/site.css +3 -0
  703. package/agent-docs/publish/content-export.sections/export-selected-pages.md +0 -116
@@ -0,0 +1,101 @@
1
+ import { parsePublicationKey } from './publication-identity.js';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { AnswerCache } from './answer-cache.js';
5
+ import { CardIndex, readCards } from './answer-cards.js';
6
+ import { chatProviderConfig, chatRoutes, validateChat } from './chat-config.js';
7
+ import { createChatProvider, fallbackChat } from './chat.js';
8
+ import { validateReaderFilters, validateReaderSelection } from './reader-filters.js';
9
+ import { createProvider, readEmbeddings } from './embeddings.js';
10
+ import { DailyBudget, memoryBudgetStore } from './budget.js';
11
+ import { envBudgetStore } from './budget-store.js';
12
+ import { jevAvailable, jevEndpoint } from './jev.js';
13
+ import { queryProviderConfig, validateRetrieval } from './retrieval-config.js';
14
+ import { Retriever } from './retrieval.js';
15
+ // `--reader-view audience=authors,maintainers`, repeatable for more than one filter.
16
+ export function parseReaderView(specs) {
17
+ if (!specs.length)
18
+ return undefined;
19
+ const selection = {};
20
+ for (const spec of specs) {
21
+ const match = /^([a-z][a-z0-9-]*)=(.+)$/.exec(spec);
22
+ if (!match)
23
+ throw new Error(`--reader-view needs facet=choice[,choice], such as audience=authors; got ${JSON.stringify(spec)}`);
24
+ if (selection[match[1]])
25
+ throw new Error(`--reader-view names ${match[1]} twice`);
26
+ selection[match[1]] = match[2].split(',').map(choice => choice.trim()).filter(Boolean);
27
+ }
28
+ return selection;
29
+ }
30
+ // Everything `shoalrun ask` and the answer eval share: read the project's chat and retrieval settings, load the passages and any
31
+ // vectors, and wire up the optional layers. A layer that isn't configured is left out, and one that is configured but can't run
32
+ // (Jev without a key) is left out with a note.
33
+ export async function prepareAskRuntime(input) {
34
+ const settings = input.settings;
35
+ const readerFilters = validateReaderFilters(settings.readerFilters);
36
+ const chatConfig = validateChat(settings.chat, readerFilters);
37
+ const retrieval = validateRetrieval(settings.retrieval);
38
+ // --model replaces the main model only. Fallback and escalation models still inherit the config's settings.
39
+ const mainConfig = chatProviderConfig(chatConfig, { model: input.model });
40
+ const routes = chatRoutes(chatConfig, chatProviderConfig(chatConfig));
41
+ const chat = fallbackChat([createChatProvider(mainConfig), ...routes.fallbacks.map(createChatProvider)]);
42
+ let chunks;
43
+ try {
44
+ chunks = JSON.parse(await readFile(path.join(input.siteDirectory, 'ai', 'chunks.json'), 'utf8'));
45
+ }
46
+ catch (error) {
47
+ throw error.code === 'ENOENT' ? new Error(`No ai/chunks.json in ${input.siteDirectory}; run shoalrun index first`) : error;
48
+ }
49
+ const embeddings = await readEmbeddings(input.siteDirectory);
50
+ const retriever = new Retriever(chunks, embeddings);
51
+ const variants = retriever.variants();
52
+ const matchingVariants = variants.filter(key => {
53
+ const coordinate = parsePublicationKey(key);
54
+ return ['product', 'channel', 'version', 'language'].every(field => input[field] === undefined || coordinate[field] === input[field]);
55
+ });
56
+ const variant = matchingVariants.length === 1 ? matchingVariants[0] : undefined;
57
+ if (!variant)
58
+ throw new Error(`Select one publication from (${matchingVariants.join(', ')}); pass --product where applicable, --channel, --version, and --language`);
59
+ let embedQuery;
60
+ let embedTexts;
61
+ let embedding;
62
+ if (embeddings) {
63
+ const queryProvider = createProvider(queryProviderConfig(retrieval, embeddings.meta));
64
+ if (queryProvider.space !== embeddings.meta.space || (embeddings.meta.backend && queryProvider.backend !== embeddings.meta.backend))
65
+ throw new Error(`${queryProvider.model} is not in the embedding space or backend of ${embeddings.meta.model}; set retrieval.embeddings.queryModel and baseUrl to compatible values`);
66
+ embedQuery = async (text, signal) => (await queryProvider.embed([text], 'query', signal))[0];
67
+ embedTexts = texts => queryProvider.embed(texts, 'query');
68
+ embedding = { provider: queryProvider.name, model: queryProvider.model, space: queryProvider.space, dimension: queryProvider.dimension };
69
+ }
70
+ // A reader view on the command line replaces the config's, so one run can answer for a different audience.
71
+ if (input.readerView && !readerFilters)
72
+ throw new Error('--reader-view needs readerFilters.facets in the site config');
73
+ const readerSelection = input.readerView ? validateReaderSelection(input.readerView, readerFilters, '--reader-view') : chatConfig?.readerView;
74
+ const notes = [];
75
+ const rerank = Boolean(chatConfig?.rerank) && !input.noRerank;
76
+ const scoring = chatConfig?.rerank;
77
+ const scorer = { ...(scoring?.endpoint ? { endpoint: jevEndpoint(scoring.endpoint) } : {}), ...(scoring?.model ? { model: scoring.model } : {}), ...(scoring?.keyEnv ? { keyEnv: scoring.keyEnv } : {}), ...(scoring?.stateFormat ? { stateFormat: scoring.stateFormat } : {}), ...(input.jevCacheDir ? { cacheDir: input.jevCacheDir } : {}) };
78
+ const scoringReady = jevAvailable(scoring?.keyEnv);
79
+ // A scorer that is configured but has no key counts as down, not as absent: it is what keeps off-topic questions from the model.
80
+ if (rerank && !scoringReady)
81
+ notes.push(`The relevance scorer has no key: set ${scoring?.keyEnv ?? 'JEV_API_KEY'}. Until then it counts as down, so ${scoring?.onError === 'answer' ? 'the model answers without the gate and the claim check' : 'questions get the closest pages and no model call'}`);
82
+ // Answer cards need semantic search and Jev. A configured but missing card file is a note, not an error, so the chat still answers.
83
+ let cards;
84
+ if (chatConfig?.cards && !input.noCards && rerank && scoringReady) {
85
+ const file = await readCards(input.siteDirectory);
86
+ if (!file)
87
+ notes.push('chat.cards is set but there is no ai/answers.json; run shoalrun answers to make it');
88
+ else if (!embedding || file.embedding.space !== embedding.space || file.embedding.dimension !== embedding.dimension)
89
+ notes.push('The answer cards were made with a different embedding model, so they are not used; run shoalrun answers again');
90
+ else
91
+ cards = { index: new CardIndex(file), threshold: chatConfig.cards.threshold, confirm: chatConfig.cards.confirm, jev: { ...scorer, maxCalls: 1 } };
92
+ }
93
+ // The shared store is for a hosted function. A local run keeps its counters in memory, so it never needs the store's keys.
94
+ const store = input.sharedStore && chatConfig?.budget?.store ? envBudgetStore(chatConfig.budget.store) : memoryBudgetStore();
95
+ const reported = new Set();
96
+ const onBudgetError = (error) => { if (!reported.has(error.message)) {
97
+ reported.add(error.message);
98
+ process.stderr.write(`Budget: ${error.message}. Questions get the closest pages, with no model call, until it works.\n`);
99
+ } };
100
+ return { ...(chatConfig?.budget ? { budget: new DailyBudget(store, chatConfig.budget, Date.now, onBudgetError), budgetStore: store } : {}), chat, notes, embedTexts, embedding, options: { ...(scoring?.onError ? { onScorerError: scoring.onError } : {}), retriever, chat, variant, readerSelection, embedQuery, passages: input.passages ?? chatConfig?.passages, gate: chatConfig?.gate, ...(input.maxTokens ? { maxTokens: input.maxTokens } : {}), ...(rerank ? { jev: { ...scorer, top: 24, maxCalls: 2 } } : {}), ...(cards ? { cards } : {}), ...(input.cache && chatConfig?.cache ? { cache: new AnswerCache({ maxEntries: chatConfig.cache.maxEntries, ttlMs: chatConfig.cache.ttlMinutes * 60_000 }) } : {}), ...(routes.escalate && !input.noEscalate ? { escalate: { chat: createChatProvider(routes.escalate.config), when: routes.escalate.when } } : {}), ...(rerank && scoringReady && !input.noDirect && (input.direct || chatConfig?.direct) ? { direct: { threshold: input.direct?.threshold ?? chatConfig.direct.threshold, maxChars: input.direct?.maxChars ?? chatConfig?.direct?.maxChars ?? 1200, margin: chatConfig?.direct?.margin ?? 0.1, others: chatConfig?.direct?.others ?? 1, jev: { ...scorer, maxCalls: 2 } } } : {}), ...(rerank && scoringReady && chatConfig?.verify ? { verify: { ...chatConfig.verify, jev: { ...scorer, maxCalls: 3 } } } : {}) } };
101
+ }
@@ -1,43 +1,4 @@
1
- import type { AskOptions } from './ask.js';
2
- import { type ChatProvider } from './chat.js';
3
- import { type ReaderSelection } from './reader-filters.js';
4
- import { DailyBudget, type BudgetStore } from './budget.js';
5
- export declare function parseReaderView(specs: string[]): ReaderSelection | undefined;
6
- export type AskSetupInput = {
7
- sharedStore?: boolean;
8
- siteDirectory: string;
9
- configFile?: string;
10
- settings?: Record<string, unknown>;
11
- model?: string;
12
- passages?: number;
13
- channel?: string;
14
- version?: string;
15
- language?: string;
16
- noRerank?: boolean;
17
- noDirect?: boolean;
18
- noEscalate?: boolean;
19
- noCards?: boolean;
20
- cache?: boolean;
21
- direct?: {
22
- threshold: number;
23
- maxChars?: number;
24
- };
25
- jevCacheDir?: string;
26
- readerView?: ReaderSelection;
27
- maxTokens?: number;
28
- };
29
- export type AskSetup = {
30
- budget?: DailyBudget;
31
- budgetStore?: BudgetStore;
32
- chat: ChatProvider;
33
- options: Omit<AskOptions, 'question'>;
34
- notes: string[];
35
- embedTexts?: (texts: string[]) => Promise<Float32Array[]>;
36
- embedding?: {
37
- provider: string;
38
- model: string;
39
- space: string;
40
- dimension: number;
41
- };
42
- };
1
+ import { type AskSetup, type AskSetupInput } from './ask-runtime.js';
2
+ export { parseReaderView } from './ask-runtime.js';
3
+ export type { AskSetup, AskSetupInput } from './ask-runtime.js';
43
4
  export declare function prepareAsk(input: AskSetupInput): Promise<AskSetup>;
package/dist/ask-setup.js CHANGED
@@ -1,99 +1,11 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { AnswerCache } from './answer-cache.js';
4
- import { CardIndex, readCards } from './answer-cards.js';
5
- import { chatProviderConfig, chatRoutes, validateChat } from './chat-config.js';
6
- import { createChatProvider, fallbackChat } from './chat.js';
7
1
  import { loadConfig } from './config.js';
8
- import { validateReaderFilters, validateReaderSelection } from './reader-filters.js';
9
- import { createProvider, readEmbeddings } from './embeddings.js';
10
- import { DailyBudget, memoryBudgetStore } from './budget.js';
11
- import { envBudgetStore } from './budget-store.js';
12
- import { jevAvailable, jevEndpoint } from './jev.js';
13
- import { queryProviderConfig, validateRetrieval } from './retrieval-config.js';
14
- import { Retriever } from './retrieval.js';
15
- // `--reader-view audience=authors,maintainers`, repeatable for more than one filter.
16
- export function parseReaderView(specs) {
17
- if (!specs.length)
18
- return undefined;
19
- const selection = {};
20
- for (const spec of specs) {
21
- const match = /^([a-z][a-z0-9-]*)=(.+)$/.exec(spec);
22
- if (!match)
23
- throw new Error(`--reader-view needs facet=choice[,choice], such as audience=authors; got ${JSON.stringify(spec)}`);
24
- if (selection[match[1]])
25
- throw new Error(`--reader-view names ${match[1]} twice`);
26
- selection[match[1]] = match[2].split(',').map(choice => choice.trim()).filter(Boolean);
27
- }
28
- return selection;
29
- }
30
- // Everything `shoalrun ask` and the answer eval share: read the project's chat and retrieval settings, load the passages and any
31
- // vectors, and wire up the optional layers. A layer that isn't configured is left out, and one that is configured but can't run
32
- // (Jev without a key) is left out with a note.
2
+ import { prepareAskRuntime } from './ask-runtime.js';
3
+ export { parseReaderView } from './ask-runtime.js';
4
+ // Local authoring/evaluation accepts a source config. Hosted functions import
5
+ // ask-runtime directly and receive already-resolved settings instead.
33
6
  export async function prepareAsk(input) {
34
7
  if (!input.settings && !input.configFile)
35
8
  throw new Error('prepareAsk needs a config file or settings');
36
9
  const settings = input.settings ?? (await loadConfig(input.configFile)).value;
37
- const readerFilters = validateReaderFilters(settings.readerFilters);
38
- const chatConfig = validateChat(settings.chat, readerFilters);
39
- const retrieval = validateRetrieval(settings.retrieval);
40
- // --model replaces the main model only. Fallback and escalation models still inherit the config's settings.
41
- const mainConfig = chatProviderConfig(chatConfig, { model: input.model });
42
- const routes = chatRoutes(chatConfig, chatProviderConfig(chatConfig));
43
- const chat = fallbackChat([createChatProvider(mainConfig), ...routes.fallbacks.map(createChatProvider)]);
44
- let chunks;
45
- try {
46
- chunks = JSON.parse(await readFile(path.join(input.siteDirectory, 'ai', 'chunks.json'), 'utf8'));
47
- }
48
- catch (error) {
49
- throw error.code === 'ENOENT' ? new Error(`No ai/chunks.json in ${input.siteDirectory}; run shoalrun index first`) : error;
50
- }
51
- const embeddings = await readEmbeddings(input.siteDirectory);
52
- const retriever = new Retriever(chunks, embeddings);
53
- const variants = retriever.variants();
54
- const variant = input.channel && input.version && input.language ? `${input.channel}|${input.version}|${input.language}` : variants.length === 1 ? variants[0] : undefined;
55
- if (!variant)
56
- throw new Error(`The site has several publications (${variants.join(', ')}); pass --channel, --version, and --language`);
57
- let embedQuery;
58
- let embedTexts;
59
- let embedding;
60
- if (embeddings) {
61
- const queryProvider = createProvider(queryProviderConfig(retrieval, embeddings.meta));
62
- if (queryProvider.space !== embeddings.meta.space || (embeddings.meta.backend && queryProvider.backend !== embeddings.meta.backend))
63
- throw new Error(`${queryProvider.model} is not in the embedding space or backend of ${embeddings.meta.model}; set retrieval.embeddings.queryModel and baseUrl to compatible values`);
64
- embedQuery = async (text, signal) => (await queryProvider.embed([text], 'query', signal))[0];
65
- embedTexts = texts => queryProvider.embed(texts, 'query');
66
- embedding = { provider: queryProvider.name, model: queryProvider.model, space: queryProvider.space, dimension: queryProvider.dimension };
67
- }
68
- // A reader view on the command line replaces the config's, so one run can answer for a different audience.
69
- if (input.readerView && !readerFilters)
70
- throw new Error('--reader-view needs readerFilters.facets in the site config');
71
- const readerSelection = input.readerView ? validateReaderSelection(input.readerView, readerFilters, '--reader-view') : chatConfig?.readerView;
72
- const notes = [];
73
- const rerank = Boolean(chatConfig?.rerank) && !input.noRerank;
74
- const scoring = chatConfig?.rerank;
75
- const scorer = { ...(scoring?.endpoint ? { endpoint: jevEndpoint(scoring.endpoint) } : {}), ...(scoring?.model ? { model: scoring.model } : {}), ...(scoring?.keyEnv ? { keyEnv: scoring.keyEnv } : {}), ...(scoring?.stateFormat ? { stateFormat: scoring.stateFormat } : {}), ...(input.jevCacheDir ? { cacheDir: input.jevCacheDir } : {}) };
76
- const scoringReady = jevAvailable(scoring?.keyEnv);
77
- // A scorer that is configured but has no key counts as down, not as absent: it is what keeps off-topic questions from the model.
78
- if (rerank && !scoringReady)
79
- notes.push(`The relevance scorer has no key: set ${scoring?.keyEnv ?? 'JEV_API_KEY'}. Until then it counts as down, so ${scoring?.onError === 'answer' ? 'the model answers without the gate and the claim check' : 'questions get the closest pages and no model call'}`);
80
- // Answer cards need semantic search and Jev. A configured but missing card file is a note, not an error, so the chat still answers.
81
- let cards;
82
- if (chatConfig?.cards && !input.noCards && rerank && scoringReady) {
83
- const file = await readCards(input.siteDirectory);
84
- if (!file)
85
- notes.push('chat.cards is set but there is no ai/answers.json; run shoalrun answers to make it');
86
- else if (!embedding || file.embedding.space !== embedding.space || file.embedding.dimension !== embedding.dimension)
87
- notes.push('The answer cards were made with a different embedding model, so they are not used; run shoalrun answers again');
88
- else
89
- cards = { index: new CardIndex(file), threshold: chatConfig.cards.threshold, confirm: chatConfig.cards.confirm, jev: { ...scorer, maxCalls: 1 } };
90
- }
91
- // The shared store is for a hosted function. A local run keeps its counters in memory, so it never needs the store's keys.
92
- const store = input.sharedStore && chatConfig?.budget?.store ? envBudgetStore(chatConfig.budget.store) : memoryBudgetStore();
93
- const reported = new Set();
94
- const onBudgetError = (error) => { if (!reported.has(error.message)) {
95
- reported.add(error.message);
96
- process.stderr.write(`Budget: ${error.message}. Questions get the closest pages, with no model call, until it works.\n`);
97
- } };
98
- return { ...(chatConfig?.budget ? { budget: new DailyBudget(store, chatConfig.budget, Date.now, onBudgetError), budgetStore: store } : {}), chat, notes, embedTexts, embedding, options: { ...(scoring?.onError ? { onScorerError: scoring.onError } : {}), retriever, chat, variant, readerSelection, embedQuery, passages: input.passages ?? chatConfig?.passages, gate: chatConfig?.gate, ...(input.maxTokens ? { maxTokens: input.maxTokens } : {}), ...(rerank ? { jev: { ...scorer, top: 24, maxCalls: 2 } } : {}), ...(cards ? { cards } : {}), ...(input.cache && chatConfig?.cache ? { cache: new AnswerCache({ maxEntries: chatConfig.cache.maxEntries, ttlMs: chatConfig.cache.ttlMinutes * 60_000 }) } : {}), ...(routes.escalate && !input.noEscalate ? { escalate: { chat: createChatProvider(routes.escalate.config), when: routes.escalate.when } } : {}), ...(rerank && scoringReady && !input.noDirect && (input.direct || chatConfig?.direct) ? { direct: { threshold: input.direct?.threshold ?? chatConfig.direct.threshold, maxChars: input.direct?.maxChars ?? chatConfig?.direct?.maxChars ?? 1200, margin: chatConfig?.direct?.margin ?? 0.1, others: chatConfig?.direct?.others ?? 1, jev: { ...scorer, maxCalls: 2 } } } : {}), ...(rerank && scoringReady && chatConfig?.verify ? { verify: { ...chatConfig.verify, jev: { ...scorer, maxCalls: 3 } } } : {}) } };
10
+ return prepareAskRuntime({ ...input, settings });
99
11
  }
@@ -1,3 +1,4 @@
1
+ import { documentKey } from './publication-identity.js';
1
2
  import { link, list, paragraph, root, text } from './semantic-markdown.js';
2
3
  export const changeKinds = ['editorial', 'procedure', 'behavior', 'breaking'];
3
4
  const labels = { editorial: 'Editorial correction', procedure: 'Procedure change', behavior: 'Behavior change', breaking: 'Breaking change' };
@@ -26,7 +27,7 @@ export function resolveAuthoredChange(doc, docs) {
26
27
  if (!value)
27
28
  return;
28
29
  const target = (id, field) => {
29
- const found = docs.get(`${id}|${doc.variant.channel}|${doc.variant.version}|${doc.variant.language}`);
30
+ const found = docs.get(documentKey(id, doc.variant));
30
31
  if (id === doc.frontmatter.id || !found || found.frontmatter.access?.policy !== 'public')
31
32
  throw new Error(`${doc.file}: change.${field} must name another public document in the same publication: ${id}`);
32
33
  return { id, title: found.frontmatter.title, url: found.route, markdownUrl: found.markdownRoute };
@@ -119,7 +119,7 @@ export async function inspectAuthoringProject(configFile, options = {}) {
119
119
  const doc = await readDocument(file, value.frontmatter, undefined, raw);
120
120
  const fm = doc.frontmatter;
121
121
  pages.push({ id: fm.id, file: relative(file), digest: digest(raw), title: fm.title, summary: fm.summary, type: fm.type, slug: fm.slug,
122
- publication: { channel: fm.channel ?? value.publications?.defaults?.channel, version: fm.version ?? value.publications?.defaults?.version, language: fm.language ?? defaultLanguage(value), ...(fm.publications ? { publications: fm.publications } : {}) },
122
+ publication: { ...(value.publications?.products && fm.product ? { product: fm.product } : {}), channel: fm.channel ?? value.publications?.defaults?.channel, version: value.publications?.products && fm.product && doc.sourceFrontmatter.version === undefined && value.frontmatter?.enforced?.version === undefined ? value.publications.products[fm.product]?.defaultVersion : fm.version ?? value.publications?.defaults?.version, language: fm.language ?? defaultLanguage(value), ...(fm.publications ? { publications: fm.publications } : {}) },
123
123
  access: fm.access ?? null, aliases: [] });
124
124
  bodies.set(relative(file), doc.body);
125
125
  findings.push(...authoringHints(doc.body, relative(file)).map(({ location, ...hint }) => hint));
package/dist/cards.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { samePublication } from './publication-identity.js';
1
2
  import { cardIcon, validateCardIcon } from './icons.js';
2
3
  import { surfaceText } from './surface-text.js';
3
4
  import { heading, link, list, paragraph, text } from './content.js';
@@ -7,7 +8,7 @@ const compare = (a, b) => a < b ? -1 : a > b ? 1 : 0;
7
8
  const relationLabels = { prerequisite: 'Read first', 'next-step': 'Next steps', reference: 'Reference while working', advanced: 'Go deeper', 'see-also': 'Related topics', 'not-confused-with': 'Often confused with' };
8
9
  const relationTypes = new Set(Object.keys(relationLabels));
9
10
  const symmetric = (type) => type === 'see-also' || type === 'not-confused-with';
10
- const sameVariant = (a, b) => a.channel === b.channel && a.version === b.version && a.language === b.language;
11
+ const sameVariant = (a, b) => samePublication(a, b);
11
12
  export function validateCardMetadata(value, file) {
12
13
  if (value === undefined)
13
14
  return;
@@ -1,4 +1,4 @@
1
- export declare const docsHelp = "Usage: shoalrun docs <command>\n\nRead bundled references (no project or provider key required):\n search <query> [--json]\n read <document-id> [--json]\n\nInspect a project:\n project [--config FILE] [--profile FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings]\n source FILE [--config FILE] [--profile FILE]\n context <document-id> [--config FILE]\n\nValidate and preview edits:\n baseline --out FILE [--config FILE] [--profile FILE]\n validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n validation-status REPORT\n review REPORT [--format json|markdown]\n preview REPORT [--port PORT]\n\nOther authoring tools: changes, plan, apply, mcp.\nDiscover packaged agent guidance with shoalrun skills list.\n";
1
+ export declare const docsHelp = "Usage: shoalrun docs <command>\n\nRead bundled references (no project or provider key required):\n search <query> [--json]\n read <document-id> [--json]\n outline <document-id> [--json]\n section <document-id> <section-id> [--json]\n\nSearch and reads accept --site DIRECTORY, --max-tokens N, and publication\nselectors --product P --channel C --version V --language L.\n\nInspect a project:\n project [--config FILE] [--profile FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings]\n source FILE [--config FILE] [--profile FILE]\n context <document-id> [--config FILE]\n\nValidate and preview edits:\n baseline --out FILE [--config FILE] [--profile FILE]\n validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n validation-status REPORT\n review REPORT [--format json|markdown]\n preview REPORT [--port PORT]\n\nOther authoring tools: changes, plan, apply, mcp.\nDiscover packaged agent guidance with shoalrun skills list.\n";
2
2
  export declare const skillsHelp = "Usage: shoalrun skills list [--json]\n shoalrun skills read <name> [--json]\n\nList the names, descriptions and local paths of packaged skills, or read a skill.\nThese commands do not install skills or require a project or provider key.\n";
3
- export declare const cliHelp = "Usage: shoalrun <command>\n\nStart and build:\n init [directory] [--starter minimal|api-docs|showcase]\n build [config] [output] [--profile FILE]\n export [config] --out DIRECTORY [--target NAME] [--profile FILE]\n dev [config] [output] [--port PORT]\n serve <site-directory> [--host HOST] [--port PORT]\n check [config] [--json]\n audit [config]\n scaffold <template> -n <target> [--config FILE]\n\nAgent guidance and offline documentation:\n skills list [--json]\n skills read <name> [--json]\n docs search <query> [--json]\n docs read <document-id> [--json]\n docs project [--config FILE] [--profile FILE]\n docs baseline --out FILE [--config FILE] [--profile FILE]\n docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n docs review REPORT [--format json|markdown]\n docs preview REPORT [--port PORT]\n\nOther commands: config, api, operation, ingredient, recipe, search, index,\nask, answers, ask-log, chat, eval, vercel.\nRun shoalrun docs --help or shoalrun skills --help for discovery commands.\n";
3
+ export declare const cliHelp = "Usage: shoalrun <command>\n\nStart and build:\n init [directory] [--starter minimal|api-docs|showcase]\n build [config] [output] [--profile FILE]\n export [config] --out DIRECTORY [--target NAME] [--profile FILE]\n dev [config] [output] [--profile FILE] [--port PORT]\n serve <site-directory> [--host HOST] [--port PORT]\n check [config] [--json]\n audit [config]\n scaffold <template> -n <target> [--config FILE] [--product P]\n\nAgent guidance and offline documentation:\n skills list [--json]\n skills read <name> [--json]\n docs search <query> [--site DIRECTORY] [--product P] [--json]\n docs read <document-id> [--site DIRECTORY] [--product P] [--json]\n docs project [--config FILE] [--profile FILE]\n docs baseline --out FILE [--config FILE] [--profile FILE]\n docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]\n docs review REPORT [--format json|markdown]\n docs preview REPORT [--port PORT]\n\nOther commands: config, api, operation, ingredient, recipe, search, index,\nask, answers, ask-log, chat, eval, vercel.\nRun shoalrun docs --help or shoalrun skills --help for discovery commands.\n";
4
4
  export declare function runSkillsCommand(args: string[]): Promise<string>;
@@ -7,6 +7,11 @@ export const docsHelp = `Usage: shoalrun docs <command>
7
7
  Read bundled references (no project or provider key required):
8
8
  search <query> [--json]
9
9
  read <document-id> [--json]
10
+ outline <document-id> [--json]
11
+ section <document-id> <section-id> [--json]
12
+
13
+ Search and reads accept --site DIRECTORY, --max-tokens N, and publication
14
+ selectors --product P --channel C --version V --language L.
10
15
 
11
16
  Inspect a project:
12
17
  project [--config FILE] [--profile FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings]
@@ -35,17 +40,17 @@ Start and build:
35
40
  init [directory] [--starter minimal|api-docs|showcase]
36
41
  build [config] [output] [--profile FILE]
37
42
  export [config] --out DIRECTORY [--target NAME] [--profile FILE]
38
- dev [config] [output] [--port PORT]
43
+ dev [config] [output] [--profile FILE] [--port PORT]
39
44
  serve <site-directory> [--host HOST] [--port PORT]
40
45
  check [config] [--json]
41
46
  audit [config]
42
- scaffold <template> -n <target> [--config FILE]
47
+ scaffold <template> -n <target> [--config FILE] [--product P]
43
48
 
44
49
  Agent guidance and offline documentation:
45
50
  skills list [--json]
46
51
  skills read <name> [--json]
47
- docs search <query> [--json]
48
- docs read <document-id> [--json]
52
+ docs search <query> [--site DIRECTORY] [--product P] [--json]
53
+ docs read <document-id> [--site DIRECTORY] [--product P] [--json]
49
54
  docs project [--config FILE] [--profile FILE]
50
55
  docs baseline --out FILE [--config FILE] [--profile FILE]
51
56
  docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] [--profile FILE]
package/dist/cli.js CHANGED
@@ -142,11 +142,19 @@ try {
142
142
  const args = [subcommand, ...rest].filter((item) => item !== undefined);
143
143
  const positional = [];
144
144
  let port = defaultPort();
145
+ let profile;
145
146
  for (let index = 0; index < args.length; index++) {
146
- if (args[index] === '--port') {
147
+ if (args[index] === '--port' || args[index] === '--profile') {
148
+ const option = args[index];
147
149
  if (!args[index + 1] || args[index + 1].startsWith('--'))
148
- throw new Error('Usage: shoalrun dev [config] [output] [--port PORT]');
149
- port = Number(args[++index]);
150
+ throw new Error('Usage: shoalrun dev [config] [output] [--port PORT] [--profile FILE]');
151
+ if (option === '--profile') {
152
+ if (profile !== undefined)
153
+ throw new Error('Duplicate dev option --profile');
154
+ profile = args[++index];
155
+ }
156
+ else
157
+ port = Number(args[++index]);
150
158
  }
151
159
  else if (args[index].startsWith('--'))
152
160
  throw new Error(`Unknown dev option ${args[index]}`);
@@ -154,8 +162,8 @@ try {
154
162
  positional.push(args[index]);
155
163
  }
156
164
  if (positional.length > 2)
157
- throw new Error('Usage: shoalrun dev [config] [output] [--port PORT]');
158
- await startDev(positional[0] ?? 'docs.config.yaml', positional[1] ?? 'site-dist', '127.0.0.1', port);
165
+ throw new Error('Usage: shoalrun dev [config] [output] [--port PORT] [--profile FILE]');
166
+ await startDev(positional[0] ?? 'docs.config.yaml', positional[1] ?? 'site-dist', '127.0.0.1', port, { profile });
159
167
  }
160
168
  else if (command === 'vercel' && subcommand === 'build') {
161
169
  // --chat adds the optional answer function: it needs chat and retrieval settings and the embedding key at build time.
@@ -372,9 +380,9 @@ try {
372
380
  }
373
381
  else if (command === 'search') {
374
382
  if (!subcommand || !rest[0] || rest[0].startsWith('--'))
375
- throw new Error('Usage: shoalrun search <site-directory> <query> [--channel C] [--version V] [--language L] [--limit N]');
383
+ throw new Error('Usage: shoalrun search <site-directory> <query> [--product P] [--channel C] [--version V] [--language L] [--limit N]');
376
384
  const options = {};
377
- const names = { '--channel': 'channel', '--version': 'version', '--language': 'language', '--limit': 'limit' };
385
+ const names = { '--product': 'product', '--channel': 'channel', '--version': 'version', '--language': 'language', '--limit': 'limit' };
378
386
  for (let index = 1; index < rest.length; index += 2) {
379
387
  const flag = rest[index];
380
388
  const value = rest[index + 1];
@@ -432,7 +440,7 @@ try {
432
440
  process.stdout.write(JSON.stringify({ status: 'ok', documents: result.documents, chunks: result.index.chunks.length, sourceDigest: result.index.sourceDigest, publications, output: result.output, ...(embeddings ? { embeddings } : {}) }, null, 2) + '\n');
433
441
  }
434
442
  else if (command === 'ask') {
435
- const usage = 'Usage: shoalrun ask <site-directory> "<question>" [--config FILE] [--model MODEL] [--passages N] [--reader-view FACET=CHOICE[,CHOICE]]... [--channel C --version V --language L] [--no-rerank] [--no-direct] [--no-escalate] [--no-cards] [--json]';
443
+ const usage = 'Usage: shoalrun ask <site-directory> "<question>" [--config FILE] [--model MODEL] [--passages N] [--reader-view FACET=CHOICE[,CHOICE]]... [--product P] [--channel C --version V --language L] [--no-rerank] [--no-direct] [--no-escalate] [--no-cards] [--json]';
436
444
  if (!subcommand || subcommand.startsWith('--') || !rest[0] || rest[0].startsWith('--'))
437
445
  throw new Error(usage);
438
446
  const values = {};
@@ -449,14 +457,14 @@ try {
449
457
  views.push(value);
450
458
  continue;
451
459
  }
452
- if (!['--config', '--model', '--passages', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--'))
460
+ if (!['--config', '--model', '--passages', '--product', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--'))
453
461
  throw new Error(usage);
454
462
  if (values[flag] !== undefined)
455
463
  throw new Error(`Duplicate ask option ${flag}`);
456
464
  values[flag] = value;
457
465
  }
458
466
  const configFile = values['--config'] ?? await discoverConfig(process.cwd()).catch(() => { throw new Error('No docs.config.yaml found; pass --config FILE. `ask` reads its chat provider and model from the config'); });
459
- const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: values['--model'], passages: values['--passages'] === undefined ? undefined : Number(values['--passages']), channel: values['--channel'], version: values['--version'], language: values['--language'], noRerank: switches.has('--no-rerank'), noDirect: switches.has('--no-direct'), noEscalate: switches.has('--no-escalate'), noCards: switches.has('--no-cards'), readerView: parseReaderView(views) });
467
+ const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: values['--model'], passages: values['--passages'] === undefined ? undefined : Number(values['--passages']), product: values['--product'], channel: values['--channel'], version: values['--version'], language: values['--language'], noRerank: switches.has('--no-rerank'), noDirect: switches.has('--no-direct'), noEscalate: switches.has('--no-escalate'), noCards: switches.has('--no-cards'), readerView: parseReaderView(views) });
460
468
  for (const note of setup.notes)
461
469
  process.stderr.write(`${note}\n`);
462
470
  const chat = setup.chat;
@@ -544,7 +552,7 @@ try {
544
552
  }
545
553
  }
546
554
  else if (command === 'answers') {
547
- const usage = 'Usage: shoalrun answers <site-directory> --questions FILE [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]...';
555
+ const usage = 'Usage: shoalrun answers <site-directory> --questions FILE [--config FILE] [--model MODEL] [--product P --channel C --version V --language L] [--reader-view FACET=CHOICE[,CHOICE]]...';
548
556
  if (!subcommand || subcommand.startsWith('--'))
549
557
  throw new Error(usage);
550
558
  const values = {};
@@ -556,7 +564,7 @@ try {
556
564
  views.push(value);
557
565
  continue;
558
566
  }
559
- if (!['--questions', '--config', '--model'].includes(flag) || !value || value.startsWith('--'))
567
+ if (!['--questions', '--config', '--model', '--product', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--'))
560
568
  throw new Error(usage);
561
569
  if (values[flag] !== undefined)
562
570
  throw new Error(`Duplicate answers option ${flag}`);
@@ -567,7 +575,7 @@ try {
567
575
  const configFile = values['--config'] ?? await discoverConfig(process.cwd()).catch(() => { throw new Error('No docs.config.yaml found; pass --config FILE. `answers` reads its chat provider and model from the config'); });
568
576
  const questions = parseCardQuestions(await readFile(values['--questions'], 'utf8'));
569
577
  // Cards are polished answers, so they come from the model, not from a direct excerpt, and never from another card.
570
- const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: values['--model'], noCards: true, noDirect: true, readerView: parseReaderView(views) });
578
+ const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: values['--model'], product: values['--product'], channel: values['--channel'], version: values['--version'], language: values['--language'], noCards: true, noDirect: true, readerView: parseReaderView(views) });
571
579
  for (const note of setup.notes)
572
580
  process.stderr.write(`${note}\n`);
573
581
  if (!setup.embedTexts || !setup.embedding)
@@ -620,7 +628,7 @@ try {
620
628
  if ((!flag?.startsWith('--') && flag !== '-n') || !value || value.startsWith('--'))
621
629
  throw new Error(`Scaffold option ${flag ?? ''} needs a value`);
622
630
  const name = flag === '-n' ? 'new' : flag.slice(2);
623
- if (!['new', 'config', 'id', 'title', 'summary', 'slug', 'channel', 'version', 'language', 'operation'].includes(name))
631
+ if (!['new', 'config', 'id', 'title', 'summary', 'slug', 'product', 'channel', 'version', 'language', 'operation'].includes(name))
624
632
  throw new Error(`Unknown scaffold option ${flag}`);
625
633
  if (name === 'operation')
626
634
  operations.push(value);
@@ -631,7 +639,7 @@ try {
631
639
  }
632
640
  if (shortForm && !options.new)
633
641
  throw new Error('Scaffold needs -n or --new with a target file');
634
- const overrides = { id: options.id, title: options.title, summary: options.summary, slug: options.slug, channel: options.channel, version: options.version, language: options.language, ...(operations.length ? { operations } : {}) };
642
+ const overrides = { id: options.id, title: options.title, summary: options.summary, slug: options.slug, product: options.product, channel: options.channel, version: options.version, language: options.language, ...(operations.length ? { operations } : {}) };
635
643
  const result = shortForm
636
644
  ? await scaffoldFromPath(options.config ?? await discoverConfig(process.cwd()), subcommand, options.new, Object.fromEntries(Object.entries(overrides).filter(([, value]) => value !== undefined)))
637
645
  : await scaffold(rest[0], subcommand, rest[1], overrides);
@@ -691,9 +699,20 @@ try {
691
699
  process.exitCode = 1;
692
700
  }
693
701
  else if (command === 'api' && subcommand === 'select') {
694
- if (!rest[0] || !rest[1] || rest[2] !== '--output' || !rest[3] || rest.length !== 4)
695
- throw new Error('Usage: shoalrun api select <api-id> <config> --output <selection.yaml>');
696
- const result = await selectApiReferences(rest[1], rest[0], rest[3]);
702
+ const usage = 'Usage: shoalrun api select <api-id> <config> --output FILE [--product P --channel C --version V --language L]';
703
+ if (!rest[0] || !rest[1])
704
+ throw new Error(usage);
705
+ const flags = {};
706
+ for (let i = 2; i < rest.length; i += 2) {
707
+ const flag = rest[i];
708
+ const value = rest[i + 1];
709
+ if (!['--output', '--product', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--') || flags[flag])
710
+ throw new Error(usage);
711
+ flags[flag] = value;
712
+ }
713
+ if (!flags['--output'])
714
+ throw new Error(usage);
715
+ const result = await selectApiReferences(rest[1], rest[0], flags['--output'], { product: flags['--product'], channel: flags['--channel'], version: flags['--version'], language: flags['--language'] });
697
716
  process.stdout.write(JSON.stringify({ status: 'ok', ...result }, null, 2) + '\n');
698
717
  }
699
718
  else if (command === 'api' && subcommand === 'materialize') {
@@ -710,12 +729,18 @@ try {
710
729
  continue;
711
730
  }
712
731
  const value = rest[++index];
713
- if (!['--operation', '--route', '--output'].includes(flag) || !value || value.startsWith('--'))
732
+ if (!['--operation', '--route', '--output', '--product', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--'))
714
733
  throw new Error(usage);
715
734
  if (flag === '--operation')
716
735
  options.operations.push(value);
717
736
  else if (flag === '--route')
718
737
  options.routes.push(value);
738
+ else if (flag !== '--output') {
739
+ const key = flag.slice(2);
740
+ if (options[key])
741
+ throw new Error(`Duplicate ${flag}`);
742
+ options[key] = value;
743
+ }
719
744
  else if (options.output)
720
745
  throw new Error('Duplicate --output');
721
746
  else
@@ -725,7 +750,7 @@ try {
725
750
  process.stdout.write(JSON.stringify({ status: 'ok', ...result }, null, 2) + '\n');
726
751
  }
727
752
  else if (command === 'operation' && subcommand === 'inspect') {
728
- const usage = 'Usage: shoalrun operation inspect <id> [config] [--channel C] [--version V] [--language L]';
753
+ const usage = 'Usage: shoalrun operation inspect <id> [config] [--product P] [--channel C] [--version V] [--language L]';
729
754
  if (!rest[0] || rest[0].startsWith('--'))
730
755
  throw new Error(usage);
731
756
  const hasConfig = rest[1] !== undefined && !rest[1].startsWith('--');
@@ -734,7 +759,7 @@ try {
734
759
  const flag = rest[index];
735
760
  const value = rest[index + 1];
736
761
  const name = flag.slice(2);
737
- if (!['--channel', '--version', '--language'].includes(flag))
762
+ if (!['--product', '--channel', '--version', '--language'].includes(flag))
738
763
  throw new Error(`Unknown operation inspect option ${flag}`);
739
764
  if (!value || value.startsWith('--'))
740
765
  throw new Error(`Operation inspect option ${flag} needs a value`);
@@ -743,11 +768,11 @@ try {
743
768
  filters[name] = value;
744
769
  }
745
770
  const manifest = await compile(hasConfig ? rest[1] : 'docs.config.yaml');
746
- const matches = (manifest.operations[rest[0]] ?? []).filter(item => (!filters.channel || item.channel === filters.channel) && (!filters.version || item.version === filters.version) && (!filters.language || item.language === filters.language));
771
+ const matches = (manifest.operations[rest[0]] ?? []).filter(item => (!filters.product || item.product === filters.product) && (!filters.channel || item.channel === filters.channel) && (!filters.version || item.version === filters.version) && (!filters.language || item.language === filters.language));
747
772
  process.stdout.write(JSON.stringify({ status: matches.length ? 'ok' : 'missing-variant', operationId: rest[0], bindings: matches }, null, 2) + '\n');
748
773
  }
749
774
  else {
750
- throw new Error('Usage: shoalrun init [directory] [--starter minimal|api-docs|showcase] | build [config] [output] [--source-commit SHA] [--release-label LABEL] | check [config] [--json] | audit [config] | vercel build [config] [output] [--source-commit SHA] [--release-label LABEL] [--chat] | serve <site-directory> [--host HOST] [--port PORT] [--search [--config FILE]] [--ask [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]...] | search <site-directory> <query> [--channel C --version V --language L --limit N] | answers <site-directory> --questions FILE [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]... | chat pause|resume|status --config FILE | ask-log <log-file> [--min-repeats N] [--limit N] [--cards-out FILE] [--json] | ask <site-directory> "<question>" [--config FILE] [--model MODEL] [--passages N] [--reader-view FACET=CHOICE[,CHOICE]]... [--channel C --version V --language L] [--no-rerank] [--no-direct] [--no-escalate] [--no-cards] [--json] | eval prepare <site-directory> --tasks FILE --out REPORT | eval check <site-directory> --tasks FILE --report REPORT | index <site-directory> [--embed [--config FILE] [--provider voyage|openai] [--model MODEL] [--dimension N] [--base-url URL] [--key-env NAME]] | ingredient draft --spec FILE --out FILE [--config FILE] [--check] | recipe draft --spec FILE --out FILE [--config FILE] [--check] | scaffold <template> -n <target> [--config FILE] [--id ID] [--title TITLE] [--summary SUMMARY] [--slug SLUG] [--channel C] [--version V] [--language L] [--operation ID]... | scaffold <template> <config> <target> --id ID --title TITLE --summary SUMMARY --slug SLUG | config validate|resolve|graph <config> | config explain <key> <config> | operation inspect <id> <config> [--channel C --version V --language L] | api audit <openapi-file> | api focused-audit <site-directory> | api review <config-file> --output <local-directory> | api select <api-id> <config> --output <selection.yaml> | api materialize <api-id> <config> (--all | --operation ID | --route "METHOD /path")... [--output content/subdirectory]');
775
+ throw new Error('Usage: shoalrun init [directory] [--starter minimal|api-docs|showcase] | build [config] [output] [--source-commit SHA] [--release-label LABEL] | check [config] [--json] | audit [config] | vercel build [config] [output] [--source-commit SHA] [--release-label LABEL] [--chat] | serve <site-directory> [--host HOST] [--port PORT] [--search [--config FILE]] [--ask [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]...] | search <site-directory> <query> [--product P] [--channel C --version V --language L --limit N] | answers <site-directory> --questions FILE [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]... | chat pause|resume|status --config FILE | ask-log <log-file> [--min-repeats N] [--limit N] [--cards-out FILE] [--json] | ask <site-directory> "<question>" [--config FILE] [--model MODEL] [--passages N] [--reader-view FACET=CHOICE[,CHOICE]]... [--product P] [--channel C --version V --language L] [--no-rerank] [--no-direct] [--no-escalate] [--no-cards] [--json] | eval prepare <site-directory> --tasks FILE --out REPORT | eval check <site-directory> --tasks FILE --report REPORT | index <site-directory> [--embed [--config FILE] [--provider voyage|openai] [--model MODEL] [--dimension N] [--base-url URL] [--key-env NAME]] | ingredient draft --spec FILE --out FILE [--config FILE] [--check] | recipe draft --spec FILE --out FILE [--config FILE] [--check] | scaffold <template> -n <target> [--config FILE] [--id ID] [--title TITLE] [--summary SUMMARY] [--slug SLUG] [--product P] [--channel C] [--version V] [--language L] [--operation ID]... | scaffold <template> <config> <target> --id ID --title TITLE --summary SUMMARY --slug SLUG | config validate|resolve|graph <config> | config explain <key> <config> | operation inspect <id> <config> [--product P] [--channel C --version V --language L] | api audit <openapi-file> | api focused-audit <site-directory> | api review <config-file> --output <local-directory> | api select <api-id> <config> --output <selection.yaml> | api materialize <api-id> <config> (--all | --operation ID | --route "METHOD /path")... [--output content/subdirectory]');
751
776
  }
752
777
  }
753
778
  catch (error) {
@@ -39,6 +39,14 @@ export interface CompilerSiteConfig extends ConfigMapping {
39
39
  basePath?: unknown;
40
40
  contentDir?: string;
41
41
  }
42
+ export type ProductPublicationConfig = {
43
+ label?: string;
44
+ pathPrefix: string;
45
+ defaultVersion: string;
46
+ versions: Record<string, {
47
+ pathPrefix?: string;
48
+ }>;
49
+ };
42
50
  export interface CompilerPublicationsConfig extends ConfigMapping {
43
51
  channels: Record<string, {
44
52
  pathPrefix?: string;
@@ -46,7 +54,9 @@ export interface CompilerPublicationsConfig extends ConfigMapping {
46
54
  versions: Record<string, {
47
55
  pathPrefix?: string;
48
56
  }>;
57
+ products?: Record<string, ProductPublicationConfig>;
49
58
  defaults?: {
59
+ product?: string;
50
60
  channel?: string;
51
61
  version?: string;
52
62
  language?: string;
@@ -66,3 +76,10 @@ export declare function navigationCounts(outputs: unknown): boolean;
66
76
  */
67
77
  export declare function requireSiteSection(config: ResolvedCompilerConfig): CompilerSiteConfig;
68
78
  export declare function requirePublicationsSection(config: ResolvedCompilerConfig): CompilerPublicationsConfig;
79
+ /** Resolve product-local defaults without borrowing another product's catalog. */
80
+ export declare function resolvePublication(publications: CompilerPublicationsConfig, value: Record<string, unknown>, language?: string): {
81
+ product?: string;
82
+ channel: string;
83
+ version: string;
84
+ language: string;
85
+ };