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

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 (1011) hide show
  1. package/AUTHORING.md +269 -0
  2. package/CHANGELOG.md +82 -0
  3. package/LICENSE +202 -0
  4. package/README.md +189 -2
  5. package/agent-docs/.well-known/shoalrun/navigation/changelog-tab-50f26fe22670.txt +33 -0
  6. package/agent-docs/.well-known/shoalrun/navigation/docs-50f26fe22670.txt +24 -0
  7. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +9 -0
  8. package/agent-docs/SNAPSHOT.json +9 -0
  9. package/agent-docs/about.md +49 -0
  10. package/agent-docs/api-docs/focused-contracts.md +68 -0
  11. package/agent-docs/api-docs/generate.md +189 -0
  12. package/agent-docs/api-docs/generate.sections/add-useful-examples.md +47 -0
  13. package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +50 -0
  14. package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +52 -0
  15. package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +71 -0
  16. package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +48 -0
  17. package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +52 -0
  18. package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +60 -0
  19. package/agent-docs/api-docs/generate.sections/related-reading.md +38 -0
  20. package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +45 -0
  21. package/agent-docs/api-docs/support.md +97 -0
  22. package/agent-docs/author/add-page.md +124 -0
  23. package/agent-docs/author/agent-overview.md +59 -0
  24. package/agent-docs/author/agent-workflow.md +65 -0
  25. package/agent-docs/author/agents.md +53 -0
  26. package/agent-docs/author/analytics.md +286 -0
  27. package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +51 -0
  28. package/agent-docs/author/analytics.sections/built-in-events.md +52 -0
  29. package/agent-docs/author/analytics.sections/configure-an-adapter.md +51 -0
  30. package/agent-docs/author/analytics.sections/custom-interactions.md +57 -0
  31. package/agent-docs/author/analytics.sections/event-format.md +59 -0
  32. package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +42 -0
  33. package/agent-docs/author/analytics.sections/inspect-events-locally.md +36 -0
  34. package/agent-docs/author/analytics.sections/map-events-to-your-service.md +42 -0
  35. package/agent-docs/author/analytics.sections/posthog-example.md +126 -0
  36. package/agent-docs/author/analytics.sections/related-reading.md +42 -0
  37. package/agent-docs/author/authoring-agent.md +102 -0
  38. package/agent-docs/author/coding-agent.md +90 -0
  39. package/agent-docs/author/components/action-link.md +41 -0
  40. package/agent-docs/author/components/api-embeds.md +263 -0
  41. package/agent-docs/author/components/api-embeds.sections/apiexample.md +117 -0
  42. package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +37 -0
  43. package/agent-docs/author/components/api-embeds.sections/related-reading.md +37 -0
  44. package/agent-docs/author/components/badge.md +76 -0
  45. package/agent-docs/author/components/breadcrumbs.md +57 -0
  46. package/agent-docs/author/components/callout.md +131 -0
  47. package/agent-docs/author/components/cards.md +168 -0
  48. package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +50 -0
  49. package/agent-docs/author/components/cards.sections/build-a-collection.md +69 -0
  50. package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +66 -0
  51. package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +37 -0
  52. package/agent-docs/author/components/cards.sections/link-to-one-document.md +45 -0
  53. package/agent-docs/author/components/cards.sections/override-card-text.md +58 -0
  54. package/agent-docs/author/components/cards.sections/related-reading.md +43 -0
  55. package/agent-docs/author/components/code-blocks.md +117 -0
  56. package/agent-docs/author/components/collapsible.md +99 -0
  57. package/agent-docs/author/components/cookbook-chooser.md +86 -0
  58. package/agent-docs/author/components/custom/react.md +190 -0
  59. package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +36 -0
  60. package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +88 -0
  61. package/agent-docs/author/components/custom/react.sections/registration.md +41 -0
  62. package/agent-docs/author/components/custom/react.sections/related-reading.md +30 -0
  63. package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +47 -0
  64. package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +100 -0
  65. package/agent-docs/author/components/custom.md +183 -0
  66. package/agent-docs/author/components/definition-list.md +54 -0
  67. package/agent-docs/author/components/diagrams/d2-gallery.md +861 -0
  68. package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +163 -0
  69. package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +375 -0
  70. package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +33 -0
  71. package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +169 -0
  72. package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +37 -0
  73. package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +123 -0
  74. package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +125 -0
  75. package/agent-docs/author/components/diagrams/pele-gallery.md +1317 -0
  76. package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +341 -0
  77. package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +269 -0
  78. package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +273 -0
  79. package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +31 -0
  80. package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +35 -0
  81. package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +229 -0
  82. package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +291 -0
  83. package/agent-docs/author/components/diagrams.md +155 -0
  84. package/agent-docs/author/components/doc-link.md +58 -0
  85. package/agent-docs/author/components/fields.md +121 -0
  86. package/agent-docs/author/components/file-tree.md +84 -0
  87. package/agent-docs/author/components/images.md +103 -0
  88. package/agent-docs/author/components/info-hint.md +61 -0
  89. package/agent-docs/author/components/kbd.md +45 -0
  90. package/agent-docs/author/components/math.md +39 -0
  91. package/agent-docs/author/components/only.md +65 -0
  92. package/agent-docs/author/components/progress.md +53 -0
  93. package/agent-docs/author/components/related-reading.md +48 -0
  94. package/agent-docs/author/components/steps.md +121 -0
  95. package/agent-docs/author/components/tables.md +64 -0
  96. package/agent-docs/author/components/tabs.md +129 -0
  97. package/agent-docs/author/components/timeline.md +74 -0
  98. package/agent-docs/author/components/tooltips.md +58 -0
  99. package/agent-docs/author/components/walkthroughs.md +390 -0
  100. package/agent-docs/author/components/walkthroughs.sections/attributes.md +45 -0
  101. package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +133 -0
  102. package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +141 -0
  103. package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +126 -0
  104. package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +38 -0
  105. package/agent-docs/author/components/walkthroughs.sections/related-reading.md +36 -0
  106. package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +53 -0
  107. package/agent-docs/author/components.md +78 -0
  108. package/agent-docs/author/content.md +74 -0
  109. package/agent-docs/author/cookbooks.md +119 -0
  110. package/agent-docs/author/css.md +238 -0
  111. package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +70 -0
  112. package/agent-docs/author/css.sections/core-color-tokens.md +71 -0
  113. package/agent-docs/author/css.sections/page-attributes.md +69 -0
  114. package/agent-docs/author/css.sections/page-transitions.md +60 -0
  115. package/agent-docs/author/css.sections/responsive-behavior.md +58 -0
  116. package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +89 -0
  117. package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +71 -0
  118. package/agent-docs/author/custom-metadata.md +177 -0
  119. package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +68 -0
  120. package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +54 -0
  121. package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +33 -0
  122. package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +57 -0
  123. package/agent-docs/author/custom-metadata.sections/related-reading.md +29 -0
  124. package/agent-docs/author/design-templates.md +49 -0
  125. package/agent-docs/author/design-writing-guides.md +73 -0
  126. package/agent-docs/author/frontmatter-reference.md +146 -0
  127. package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +44 -0
  128. package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +41 -0
  129. package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +31 -0
  130. package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +40 -0
  131. package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +37 -0
  132. package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +41 -0
  133. package/agent-docs/author/frontmatter-reference.sections/related-reading.md +35 -0
  134. package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +33 -0
  135. package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +31 -0
  136. package/agent-docs/author/frontmatter.md +255 -0
  137. package/agent-docs/author/frontmatter.sections/audience-badges.md +66 -0
  138. package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +88 -0
  139. package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +75 -0
  140. package/agent-docs/author/frontmatter.sections/optional-native-fields.md +90 -0
  141. package/agent-docs/author/frontmatter.sections/publication-fields.md +85 -0
  142. package/agent-docs/author/frontmatter.sections/publishing-policy.md +71 -0
  143. package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +72 -0
  144. package/agent-docs/author/frontmatter.sections/related-reading.md +72 -0
  145. package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +84 -0
  146. package/agent-docs/author/frontmatter.sections/seo-fields.md +79 -0
  147. package/agent-docs/author/frontmatter.sections/validation-rules.md +75 -0
  148. package/agent-docs/author/markdown-metadata.md +207 -0
  149. package/agent-docs/author/navigation.md +269 -0
  150. package/agent-docs/author/navigation.sections/arrange-authored-pages.md +58 -0
  151. package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +48 -0
  152. package/agent-docs/author/navigation.sections/hide-group-page-counts.md +45 -0
  153. package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +40 -0
  154. package/agent-docs/author/navigation.sections/local-api-preview.md +47 -0
  155. package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +65 -0
  156. package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +97 -0
  157. package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +38 -0
  158. package/agent-docs/author/navigation.sections/related-reading.md +44 -0
  159. package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +67 -0
  160. package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +42 -0
  161. package/agent-docs/author/reader-views.md +200 -0
  162. package/agent-docs/author/reader-views.sections/configure-the-choices.md +65 -0
  163. package/agent-docs/author/reader-views.sections/connect-your-own-control.md +59 -0
  164. package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +41 -0
  165. package/agent-docs/author/reader-views.sections/mark-pages.md +49 -0
  166. package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +49 -0
  167. package/agent-docs/author/reader-views.sections/place-filter-controls.md +43 -0
  168. package/agent-docs/author/reader-views.sections/try-the-controls-here.md +64 -0
  169. package/agent-docs/author/recipe-drafts.md +181 -0
  170. package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +82 -0
  171. package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +60 -0
  172. package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +55 -0
  173. package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +66 -0
  174. package/agent-docs/author/recipe-drafts.sections/related-reading.md +45 -0
  175. package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +50 -0
  176. package/agent-docs/author/recipes.md +127 -0
  177. package/agent-docs/author/recipes.sections/how-agents-use-this.md +50 -0
  178. package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +64 -0
  179. package/agent-docs/author/recipes.sections/related-reading.md +36 -0
  180. package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +42 -0
  181. package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +52 -0
  182. package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +44 -0
  183. package/agent-docs/author/recipes.sections/what-each-file-does.md +48 -0
  184. package/agent-docs/author/recipes.sections/what-happens-and-when.md +45 -0
  185. package/agent-docs/author/related-reading.md +143 -0
  186. package/agent-docs/author/related-reading.sections/automatic-footers.md +35 -0
  187. package/agent-docs/author/related-reading.sections/declare-relationships.md +68 -0
  188. package/agent-docs/author/related-reading.sections/display-related-documents.md +54 -0
  189. package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +32 -0
  190. package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +32 -0
  191. package/agent-docs/author/related-reading.sections/related-reading.md +34 -0
  192. package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +34 -0
  193. package/agent-docs/author/release-notes.md +153 -0
  194. package/agent-docs/author/search.md +299 -0
  195. package/agent-docs/author/search.sections/choose-a-provider.md +52 -0
  196. package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +49 -0
  197. package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +55 -0
  198. package/agent-docs/author/search.sections/html-markdown-and-agents.md +37 -0
  199. package/agent-docs/author/search.sections/lexical-search.md +78 -0
  200. package/agent-docs/author/search.sections/local-semantic-preview.md +43 -0
  201. package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +41 -0
  202. package/agent-docs/author/search.sections/related-reading.md +45 -0
  203. package/agent-docs/author/search.sections/reuse-the-lexical-index.md +81 -0
  204. package/agent-docs/author/search.sections/turn-search-off.md +46 -0
  205. package/agent-docs/author/search.sections/use-the-search-box.md +39 -0
  206. package/agent-docs/author/search.sections/write-a-custom-provider.md +98 -0
  207. package/agent-docs/author/snippets.md +118 -0
  208. package/agent-docs/author/taxonomy.md +121 -0
  209. package/agent-docs/author/templates.md +231 -0
  210. package/agent-docs/author/templates.sections/built-in-feature-templates.md +52 -0
  211. package/agent-docs/author/templates.sections/built-in-templates.md +48 -0
  212. package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +69 -0
  213. package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +76 -0
  214. package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +46 -0
  215. package/agent-docs/author/templates.sections/project-added-templates.md +39 -0
  216. package/agent-docs/author/templates.sections/related-reading.md +47 -0
  217. package/agent-docs/author/templates.sections/scaffold-a-page.md +53 -0
  218. package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +56 -0
  219. package/agent-docs/author/templates.sections/what-every-template-gives-you.md +44 -0
  220. package/agent-docs/author/workspace/commands.md +92 -0
  221. package/agent-docs/author/workspace.md +104 -0
  222. package/agent-docs/author/writing-style.md +137 -0
  223. package/agent-docs/author/writing-style.sections/adapt-this-example.md +28 -0
  224. package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +42 -0
  225. package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +32 -0
  226. package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +28 -0
  227. package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +36 -0
  228. package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +41 -0
  229. package/agent-docs/author/writing-style.sections/procedures-and-examples.md +32 -0
  230. package/agent-docs/author/writing-style.sections/related-reading.md +32 -0
  231. package/agent-docs/author/writing-style.sections/review-a-draft.md +30 -0
  232. package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +39 -0
  233. package/agent-docs/author/writing-style.sections/voice-and-explanations.md +39 -0
  234. package/agent-docs/changelog/2026-10-14-agent-readiness.md +29 -0
  235. package/agent-docs/changelog/2026-10-15-evaluation-builds.md +84 -0
  236. package/agent-docs/changelog/2026-10-16-navigation-layouts.md +72 -0
  237. package/agent-docs/changelog/2026-10-17-mcp-hosting.md +60 -0
  238. package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +46 -0
  239. package/agent-docs/changelog/2026-10-19-visual-navigation.md +44 -0
  240. package/agent-docs/changelog/2026-10-25.md +45 -0
  241. package/agent-docs/changelog/2026-10-26.md +66 -0
  242. package/agent-docs/changelog/2026-10-27.md +85 -0
  243. package/agent-docs/changelog/authoring-preview.md +40 -0
  244. package/agent-docs/changelog/authoring-search.md +39 -0
  245. package/agent-docs/changelog/authoring-tools.md +34 -0
  246. package/agent-docs/changelog/working-tree-skill.md +38 -0
  247. package/agent-docs/changelog.md +115 -0
  248. package/agent-docs/chat/checks.md +175 -0
  249. package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +38 -0
  250. package/agent-docs/chat/checks.sections/answer-for-one-audience.md +66 -0
  251. package/agent-docs/chat/checks.sections/answer-without-a-model.md +54 -0
  252. package/agent-docs/chat/checks.sections/follow-up-questions.md +54 -0
  253. package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +67 -0
  254. package/agent-docs/chat/checks.sections/questions-with-several-parts.md +44 -0
  255. package/agent-docs/chat/checks.sections/related-reading.md +42 -0
  256. package/agent-docs/chat/checks.sections/reuse-answers.md +50 -0
  257. package/agent-docs/chat/host.md +222 -0
  258. package/agent-docs/chat/host.sections/cap-the-daily-spend.md +78 -0
  259. package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +64 -0
  260. package/agent-docs/chat/host.sections/related-reading.md +43 -0
  261. package/agent-docs/chat/passage-index.md +228 -0
  262. package/agent-docs/chat/passage-index.sections/build-the-index.md +72 -0
  263. package/agent-docs/chat/passage-index.sections/embed-passages.md +103 -0
  264. package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +53 -0
  265. package/agent-docs/chat/passage-index.sections/limits.md +45 -0
  266. package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +52 -0
  267. package/agent-docs/chat/passage-index.sections/related-reading.md +42 -0
  268. package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +91 -0
  269. package/agent-docs/chat/prepared-answers.md +116 -0
  270. package/agent-docs/chat/settings.md +213 -0
  271. package/agent-docs/chat/settings.sections/choose-the-scorer.md +63 -0
  272. package/agent-docs/chat/settings.sections/configure-chat.md +80 -0
  273. package/agent-docs/chat/settings.sections/configure-retrieval.md +62 -0
  274. package/agent-docs/chat/settings.sections/related-reading.md +32 -0
  275. package/agent-docs/chat/settings.sections/send-extra-request-fields.md +42 -0
  276. package/agent-docs/chat/settings.sections/use-more-than-one-model.md +62 -0
  277. package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +42 -0
  278. package/agent-docs/chat/setup.md +97 -0
  279. package/agent-docs/chat.md +102 -0
  280. package/agent-docs/cli.md +445 -0
  281. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +102 -0
  282. package/agent-docs/cli.sections/author-pages.md +94 -0
  283. package/agent-docs/cli.sections/build-and-serve.md +144 -0
  284. package/agent-docs/cli.sections/inspect-config-and-operations.md +41 -0
  285. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +45 -0
  286. package/agent-docs/cli.sections/related-reading.md +33 -0
  287. package/agent-docs/cli.sections/search-and-chat.md +132 -0
  288. package/agent-docs/cli.sections/start-a-project.md +37 -0
  289. package/agent-docs/cli.sections/working-tree-authoring-tools.md +35 -0
  290. package/agent-docs/concepts.md +133 -0
  291. package/agent-docs/config/apis.md +136 -0
  292. package/agent-docs/config/content.md +264 -0
  293. package/agent-docs/config/content.sections/authoring.md +58 -0
  294. package/agent-docs/config/content.sections/badges.md +34 -0
  295. package/agent-docs/config/content.sections/callouts.md +34 -0
  296. package/agent-docs/config/content.sections/cookbooks.md +38 -0
  297. package/agent-docs/config/content.sections/frontmatter.md +75 -0
  298. package/agent-docs/config/content.sections/readerfilters.md +44 -0
  299. package/agent-docs/config/content.sections/related-reading.md +34 -0
  300. package/agent-docs/config/content.sections/relationships.md +76 -0
  301. package/agent-docs/config/content.sections/snippets.md +61 -0
  302. package/agent-docs/config/content.sections/templates.md +57 -0
  303. package/agent-docs/config/content.sections/variables.md +55 -0
  304. package/agent-docs/config/examples.md +354 -0
  305. package/agent-docs/config/examples.sections/feature-showcase.md +55 -0
  306. package/agent-docs/config/examples.sections/minimal-site.md +80 -0
  307. package/agent-docs/config/examples.sections/multilingual-help-center.md +110 -0
  308. package/agent-docs/config/examples.sections/parcel-api-documentation.md +153 -0
  309. package/agent-docs/config/examples.sections/related-reading.md +50 -0
  310. package/agent-docs/config/examples.sections/shared-company-preset.md +118 -0
  311. package/agent-docs/config/integrations.md +76 -0
  312. package/agent-docs/config/outputs.md +160 -0
  313. package/agent-docs/config/outputs.sections/exports.md +57 -0
  314. package/agent-docs/config/outputs.sections/metadata.md +42 -0
  315. package/agent-docs/config/outputs.sections/related-reading.md +34 -0
  316. package/agent-docs/config/publishing.md +219 -0
  317. package/agent-docs/config/publishing.sections/navigation.md +92 -0
  318. package/agent-docs/config/publishing.sections/redirects.md +79 -0
  319. package/agent-docs/config/publishing.sections/related-reading.md +33 -0
  320. package/agent-docs/config/site.md +193 -0
  321. package/agent-docs/config/site.sections/related-reading.md +33 -0
  322. package/agent-docs/config/site.sections/theme.md +74 -0
  323. package/agent-docs/config.md +195 -0
  324. package/agent-docs/configuration.md +384 -0
  325. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +36 -0
  326. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +76 -0
  327. package/agent-docs/configuration.sections/extract-a-section-with-include.md +75 -0
  328. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +77 -0
  329. package/agent-docs/configuration.sections/related-reading.md +42 -0
  330. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +54 -0
  331. package/agent-docs/configuration.sections/share-defaults-through-extends.md +121 -0
  332. package/agent-docs/configuration.sections/start-with-one-working-file.md +81 -0
  333. package/agent-docs/configuration.sections/understand-the-three-stages.md +59 -0
  334. package/agent-docs/configuration.sections/understand-where-paths-point.md +53 -0
  335. package/agent-docs/connect/mcp.md +85 -0
  336. package/agent-docs/contribute/agent-skills.md +72 -0
  337. package/agent-docs/cookbooks/authoring.md +68 -0
  338. package/agent-docs/cookbooks/site-workflows.md +59 -0
  339. package/agent-docs/cookbooks/welcome-email.md +55 -0
  340. package/agent-docs/documents.json +20058 -0
  341. package/agent-docs/example-api/cedar/create-enrollment-7af3e5d2.md +594 -0
  342. package/agent-docs/example-api/cedar/get-legacy-parcel-6758d051.md +122 -0
  343. package/agent-docs/example-api/cedar/get-parcel-edee10e6.md +122 -0
  344. package/agent-docs/example-api/cedar/list-parcels-0345fb5f.md +271 -0
  345. package/agent-docs/example-api/cedar/parcel-delivered-7d1ba6db.md +122 -0
  346. package/agent-docs/example-api/cedar/upload-manifest-1af17891.md +101 -0
  347. package/agent-docs/example-api/cedar.md +39 -0
  348. package/agent-docs/example-api/create-note.md +344 -0
  349. package/agent-docs/example-api/generated/get-note-cbedb319.md +165 -0
  350. package/agent-docs/example-api/write-note.md +55 -0
  351. package/agent-docs/explore.md +54 -0
  352. package/agent-docs/glossary.md +827 -0
  353. package/agent-docs/index.md +249 -0
  354. package/agent-docs/ingredients/audit-site.md +27 -0
  355. package/agent-docs/ingredients/build-site.md +29 -0
  356. package/agent-docs/ingredients/compile-framework.md +28 -0
  357. package/agent-docs/ingredients/complete-page.md +30 -0
  358. package/agent-docs/ingredients/inspect-agent-bundle.md +28 -0
  359. package/agent-docs/ingredients/inspect-build.md +41 -0
  360. package/agent-docs/ingredients/preview-site.md +31 -0
  361. package/agent-docs/ingredients/refresh-agent-bundle.md +29 -0
  362. package/agent-docs/ingredients/scaffold-page.md +28 -0
  363. package/agent-docs/non-goals.md +58 -0
  364. package/agent-docs/provenance.json +10 -0
  365. package/agent-docs/publish/agent-discovery.md +79 -0
  366. package/agent-docs/publish/agent-friendliness.md +201 -0
  367. package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +61 -0
  368. package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +48 -0
  369. package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +46 -0
  370. package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +48 -0
  371. package/agent-docs/publish/agent-friendliness.sections/related-reading.md +52 -0
  372. package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +50 -0
  373. package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +62 -0
  374. package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +50 -0
  375. package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +58 -0
  376. package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +68 -0
  377. package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +60 -0
  378. package/agent-docs/publish/api-references.md +217 -0
  379. package/agent-docs/publish/api-references.sections/add-useful-examples.md +36 -0
  380. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +65 -0
  381. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +48 -0
  382. package/agent-docs/publish/api-references.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +36 -0
  383. package/agent-docs/publish/api-references.sections/generate-many-pages-selectively.md +36 -0
  384. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +36 -0
  385. package/agent-docs/publish/api-references.sections/link-guides-to-api-references.md +36 -0
  386. package/agent-docs/publish/api-references.sections/map-extension-values-to-shoalrun-status.md +36 -0
  387. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +38 -0
  388. package/agent-docs/publish/api-references.sections/publish-several-versions.md +36 -0
  389. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +62 -0
  390. package/agent-docs/publish/api-references.sections/register-the-operation.md +64 -0
  391. package/agent-docs/publish/api-references.sections/related-reading.md +42 -0
  392. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +54 -0
  393. package/agent-docs/publish/api-references.sections/use-a-template-for-editorial-context.md +36 -0
  394. package/agent-docs/publish/api-references.sections/what-readers-get.md +38 -0
  395. package/agent-docs/publish/audit.md +160 -0
  396. package/agent-docs/publish/audit.sections/add-project-tests.md +57 -0
  397. package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +52 -0
  398. package/agent-docs/publish/audit.sections/check-before-pushing.md +80 -0
  399. package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +54 -0
  400. package/agent-docs/publish/audit.sections/read-the-report.md +67 -0
  401. package/agent-docs/publish/audit.sections/related-reading.md +47 -0
  402. package/agent-docs/publish/content-export.md +208 -0
  403. package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +40 -0
  404. package/agent-docs/publish/content-export.sections/check-the-result.md +27 -0
  405. package/agent-docs/publish/content-export.sections/export-selected-pages.md +113 -0
  406. package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +29 -0
  407. package/agent-docs/publish/content-export.sections/prerequisites.md +29 -0
  408. package/agent-docs/publish/content-export.sections/related-reading.md +35 -0
  409. package/agent-docs/publish/content-export.sections/review-exported-api-material.md +44 -0
  410. package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +34 -0
  411. package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +43 -0
  412. package/agent-docs/publish/content-negotiation.md +121 -0
  413. package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +60 -0
  414. package/agent-docs/publish/content-negotiation.sections/missing-pages.md +51 -0
  415. package/agent-docs/publish/content-negotiation.sections/related-reading.md +45 -0
  416. package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +49 -0
  417. package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +62 -0
  418. package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +47 -0
  419. package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +49 -0
  420. package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +47 -0
  421. package/agent-docs/publish/deployment-check.md +72 -0
  422. package/agent-docs/publish/evals.md +175 -0
  423. package/agent-docs/publish/evals.sections/add-the-audit-hook.md +63 -0
  424. package/agent-docs/publish/evals.sections/check-the-report.md +36 -0
  425. package/agent-docs/publish/evals.sections/define-a-task-file.md +47 -0
  426. package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +42 -0
  427. package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +39 -0
  428. package/agent-docs/publish/evals.sections/related-reading.md +36 -0
  429. package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +54 -0
  430. package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +42 -0
  431. package/agent-docs/publish/host-adapters.md +60 -0
  432. package/agent-docs/publish/manni.md +227 -0
  433. package/agent-docs/publish/manni.sections/check-the-result.md +40 -0
  434. package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +83 -0
  435. package/agent-docs/publish/manni.sections/optional-custom-policies.md +42 -0
  436. package/agent-docs/publish/manni.sections/prerequisites.md +40 -0
  437. package/agent-docs/publish/mcp-analytics.md +356 -0
  438. package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +50 -0
  439. package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +45 -0
  440. package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +53 -0
  441. package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +62 -0
  442. package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +54 -0
  443. package/agent-docs/publish/mcp-analytics.sections/related-reading.md +36 -0
  444. package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +46 -0
  445. package/agent-docs/publish/mcp.md +190 -0
  446. package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +52 -0
  447. package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +51 -0
  448. package/agent-docs/publish/mcp.sections/configure-the-client.md +55 -0
  449. package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +50 -0
  450. package/agent-docs/publish/mcp.sections/related-reading.md +42 -0
  451. package/agent-docs/publish/mcp.sections/search-then-read.md +53 -0
  452. package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +79 -0
  453. package/agent-docs/publish/mcp.sections/verify-the-connection.md +40 -0
  454. package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +42 -0
  455. package/agent-docs/publish/openapi-extension-mappings.md +84 -0
  456. package/agent-docs/publish/output.md +220 -0
  457. package/agent-docs/publish/output.sections/api-contracts.md +48 -0
  458. package/agent-docs/publish/output.sections/code-highlighting.md +38 -0
  459. package/agent-docs/publish/output.sections/current-limits.md +40 -0
  460. package/agent-docs/publish/output.sections/incremental-sync.md +69 -0
  461. package/agent-docs/publish/output.sections/manifest-records-and-sections.md +46 -0
  462. package/agent-docs/publish/output.sections/navigation-section-indexes.md +42 -0
  463. package/agent-docs/publish/output.sections/page-formats.md +46 -0
  464. package/agent-docs/publish/output.sections/published-output-contract.md +58 -0
  465. package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +44 -0
  466. package/agent-docs/publish/output.sections/related-reading.md +34 -0
  467. package/agent-docs/publish/output.sections/response-identity.md +38 -0
  468. package/agent-docs/publish/output.sections/site-files.md +64 -0
  469. package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +48 -0
  470. package/agent-docs/publish/output.sections/where-files-go.md +49 -0
  471. package/agent-docs/publish/publications.md +153 -0
  472. package/agent-docs/publish/revisions.md +104 -0
  473. package/agent-docs/publish/seo.md +119 -0
  474. package/agent-docs/publish/single-source-sites.md +168 -0
  475. package/agent-docs/publish/troubleshooting.md +112 -0
  476. package/agent-docs/publish/vercel.md +130 -0
  477. package/agent-docs/publish/vercel.sections/check-the-deployment.md +54 -0
  478. package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +38 -0
  479. package/agent-docs/publish/vercel.sections/prepare-your-project.md +52 -0
  480. package/agent-docs/publish/vercel.sections/related-reading.md +38 -0
  481. package/agent-docs/publish.md +95 -0
  482. package/agent-docs/recipes/add-page.md +194 -0
  483. package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +40 -0
  484. package/agent-docs/recipes/add-page.sections/before-you-start.md +33 -0
  485. package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +42 -0
  486. package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +42 -0
  487. package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +54 -0
  488. package/agent-docs/recipes/add-page.sections/check-the-outcome.md +28 -0
  489. package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +42 -0
  490. package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +41 -0
  491. package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +42 -0
  492. package/agent-docs/recipes/add-page.sections/related-reading.md +30 -0
  493. package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +42 -0
  494. package/agent-docs/recipes/audit-docs.md +122 -0
  495. package/agent-docs/recipes/build-docs.md +105 -0
  496. package/agent-docs/recipes/preview-hybrid-search.md +84 -0
  497. package/agent-docs/recipes/preview-page.md +124 -0
  498. package/agent-docs/recipes/queue-email.md +49 -0
  499. package/agent-docs/recipes/refresh-agent-docs.md +109 -0
  500. package/agent-docs/recipes/send-welcome-email.md +92 -0
  501. package/agent-docs/reference/agent-skills.md +73 -0
  502. package/agent-docs/search-and-chat.md +87 -0
  503. package/agent-docs/search-index.json +1 -0
  504. package/agent-docs/start.md +197 -0
  505. package/agent-docs/start.sections/add-the-page-to-navigation.md +50 -0
  506. package/agent-docs/start.sections/build-and-check-both-outputs.md +50 -0
  507. package/agent-docs/start.sections/build-this-site.md +35 -0
  508. package/agent-docs/start.sections/check-writing-style.md +35 -0
  509. package/agent-docs/start.sections/create-a-page.md +105 -0
  510. package/agent-docs/start.sections/make-it-yours.md +37 -0
  511. package/agent-docs/start.sections/prerequisites.md +37 -0
  512. package/agent-docs/start.sections/related-reading.md +45 -0
  513. package/agent-docs/start.sections/start-your-own-project.md +53 -0
  514. package/agent-docs/status.md +75 -0
  515. package/agent-docs/styling/color-modes.md +85 -0
  516. package/agent-docs/styling/footer.md +67 -0
  517. package/agent-docs/styling/header.md +65 -0
  518. package/agent-docs/styling/layouts.md +193 -0
  519. package/agent-docs/styling/layouts.sections/build-a-landing-page.md +61 -0
  520. package/agent-docs/styling/layouts.sections/build-a-splash-page.md +88 -0
  521. package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +51 -0
  522. package/agent-docs/styling/layouts.sections/customize-the-hero.md +50 -0
  523. package/agent-docs/styling/layouts.sections/hero.md +83 -0
  524. package/agent-docs/styling/layouts.sections/related-reading.md +42 -0
  525. package/agent-docs/styling/palettes.md +140 -0
  526. package/agent-docs/styling/share-images.md +105 -0
  527. package/agent-docs/styling/themes.md +125 -0
  528. package/agent-docs/styling/try.md +106 -0
  529. package/agent-docs/what-is-shoalrun.md +56 -0
  530. package/assets/analytics.js +72 -0
  531. package/assets/ask-widget.js +320 -0
  532. package/assets/code-samples.js +28 -0
  533. package/assets/components.js +32 -0
  534. package/assets/cookbook-chooser.js +170 -0
  535. package/assets/copy-markdown.js +24 -0
  536. package/assets/example-panel.js +77 -0
  537. package/assets/file-tree.js +49 -0
  538. package/assets/image-viewer.js +41 -0
  539. package/assets/mode.js +26 -0
  540. package/assets/navigation.js +233 -0
  541. package/assets/reader-filters.js +305 -0
  542. package/assets/reader.js +111 -0
  543. package/assets/search-highlight.js +32 -0
  544. package/assets/search-lexical.js +66 -0
  545. package/assets/search.js +150 -0
  546. package/assets/table-filter.js +63 -0
  547. package/assets/tabs.js +80 -0
  548. package/assets/theme-preview.css +17 -0
  549. package/assets/theme-preview.js +135 -0
  550. package/assets/theme-switcher.js +113 -0
  551. package/assets/tooltips.js +81 -0
  552. package/assets/walkthrough.js +233 -0
  553. package/dist/agent-discovery.d.ts +11 -0
  554. package/dist/agent-discovery.js +37 -0
  555. package/dist/analytics.d.ts +2 -0
  556. package/dist/analytics.js +13 -0
  557. package/dist/answer-cache.d.ts +24 -0
  558. package/dist/answer-cache.js +55 -0
  559. package/dist/answer-cards.d.ts +71 -0
  560. package/dist/answer-cards.js +148 -0
  561. package/dist/api-embeds.d.ts +22 -0
  562. package/dist/api-embeds.js +84 -0
  563. package/dist/api-identity.d.ts +6 -0
  564. package/dist/api-identity.js +7 -0
  565. package/dist/api-materialize.d.ts +12 -0
  566. package/dist/api-materialize.js +120 -0
  567. package/dist/api-publication-plan.d.ts +86 -0
  568. package/dist/api-publication-plan.js +187 -0
  569. package/dist/api-publication-review.d.ts +23 -0
  570. package/dist/api-publication-review.js +58 -0
  571. package/dist/api-selection.d.ts +21 -0
  572. package/dist/api-selection.js +84 -0
  573. package/dist/api.d.ts +74 -0
  574. package/dist/api.js +782 -0
  575. package/dist/artifact-bundle.d.ts +96 -0
  576. package/dist/artifact-bundle.js +306 -0
  577. package/dist/ask-function.d.ts +19 -0
  578. package/dist/ask-function.js +139 -0
  579. package/dist/ask-handler.d.ts +38 -0
  580. package/dist/ask-handler.js +157 -0
  581. package/dist/ask-log-kv.d.ts +14 -0
  582. package/dist/ask-log-kv.js +69 -0
  583. package/dist/ask-log.d.ts +106 -0
  584. package/dist/ask-log.js +159 -0
  585. package/dist/ask-setup.d.ts +43 -0
  586. package/dist/ask-setup.js +99 -0
  587. package/dist/ask.d.ts +152 -0
  588. package/dist/ask.js +532 -0
  589. package/dist/audit.d.ts +29 -0
  590. package/dist/audit.js +171 -0
  591. package/dist/authored-change.d.ts +22 -0
  592. package/dist/authored-change.js +47 -0
  593. package/dist/authoring-api.d.ts +18 -0
  594. package/dist/authoring-api.js +15 -0
  595. package/dist/authoring-findings.d.ts +31 -0
  596. package/dist/authoring-findings.js +104 -0
  597. package/dist/authoring-guidance.d.ts +15 -0
  598. package/dist/authoring-guidance.js +57 -0
  599. package/dist/authoring-preview.d.ts +24 -0
  600. package/dist/authoring-preview.js +160 -0
  601. package/dist/authoring-project-command.d.ts +7 -0
  602. package/dist/authoring-project-command.js +52 -0
  603. package/dist/authoring-project.d.ts +104 -0
  604. package/dist/authoring-project.js +287 -0
  605. package/dist/authoring-review-command.d.ts +1 -0
  606. package/dist/authoring-review-command.js +68 -0
  607. package/dist/authoring-review.d.ts +72 -0
  608. package/dist/authoring-review.js +71 -0
  609. package/dist/authoring-snapshot.d.ts +66 -0
  610. package/dist/authoring-snapshot.js +293 -0
  611. package/dist/authoring-validation-command.d.ts +1 -0
  612. package/dist/authoring-validation-command.js +54 -0
  613. package/dist/authoring-validation.d.ts +101 -0
  614. package/dist/authoring-validation.js +348 -0
  615. package/dist/badges.d.ts +16 -0
  616. package/dist/badges.js +57 -0
  617. package/dist/budget-store.d.ts +21 -0
  618. package/dist/budget-store.js +90 -0
  619. package/dist/budget.d.ts +45 -0
  620. package/dist/budget.js +128 -0
  621. package/dist/build-info.d.ts +10 -0
  622. package/dist/build-info.js +15 -0
  623. package/dist/callouts.d.ts +18 -0
  624. package/dist/callouts.js +63 -0
  625. package/dist/cards.d.ts +35 -0
  626. package/dist/cards.js +237 -0
  627. package/dist/chat-config.d.ts +117 -0
  628. package/dist/chat-config.js +400 -0
  629. package/dist/chat-pause.d.ts +1 -0
  630. package/dist/chat-pause.js +3 -0
  631. package/dist/chat.d.ts +46 -0
  632. package/dist/chat.js +78 -0
  633. package/dist/cli-discovery.d.ts +4 -0
  634. package/dist/cli-discovery.js +86 -0
  635. package/dist/cli.d.ts +2 -0
  636. package/dist/cli.js +750 -0
  637. package/dist/code-samples.d.ts +50 -0
  638. package/dist/code-samples.js +181 -0
  639. package/dist/compact-discovery.d.ts +15 -0
  640. package/dist/compact-discovery.js +78 -0
  641. package/dist/compiler-config.d.ts +67 -0
  642. package/dist/compiler-config.js +66 -0
  643. package/dist/compiler.d.ts +208 -0
  644. package/dist/compiler.js +524 -0
  645. package/dist/component-bundle.d.ts +4 -0
  646. package/dist/component-bundle.js +32 -0
  647. package/dist/component-content.d.ts +78 -0
  648. package/dist/component-content.js +47 -0
  649. package/dist/component-manifest.d.ts +15 -0
  650. package/dist/component-manifest.js +84 -0
  651. package/dist/component-names.d.ts +1 -0
  652. package/dist/component-names.js +1 -0
  653. package/dist/component-plugins.d.ts +28 -0
  654. package/dist/component-plugins.js +141 -0
  655. package/dist/component-transform.d.ts +10 -0
  656. package/dist/component-transform.js +697 -0
  657. package/dist/components.d.ts +2 -0
  658. package/dist/components.js +1 -0
  659. package/dist/config.d.ts +29 -0
  660. package/dist/config.js +149 -0
  661. package/dist/content-export-assets.d.ts +23 -0
  662. package/dist/content-export-assets.js +103 -0
  663. package/dist/content-export-command.d.ts +20 -0
  664. package/dist/content-export-command.js +57 -0
  665. package/dist/content-export-config.d.ts +16 -0
  666. package/dist/content-export-config.js +50 -0
  667. package/dist/content-export-render.d.ts +12 -0
  668. package/dist/content-export-render.js +132 -0
  669. package/dist/content-export.d.ts +30 -0
  670. package/dist/content-export.js +307 -0
  671. package/dist/content-filter.d.ts +4 -0
  672. package/dist/content-filter.js +16 -0
  673. package/dist/content-source.d.ts +100 -0
  674. package/dist/content-source.js +42 -0
  675. package/dist/content-workspace.d.ts +293 -0
  676. package/dist/content-workspace.js +69 -0
  677. package/dist/content.d.ts +41 -0
  678. package/dist/content.js +176 -0
  679. package/dist/cookbook-chooser.d.ts +19 -0
  680. package/dist/cookbook-chooser.js +56 -0
  681. package/dist/dev.d.ts +2 -0
  682. package/dist/dev.js +113 -0
  683. package/dist/diagram-svg.d.ts +1 -0
  684. package/dist/diagram-svg.js +44 -0
  685. package/dist/diagrams.d.ts +7 -0
  686. package/dist/diagrams.js +102 -0
  687. package/dist/docs-author.d.ts +86 -0
  688. package/dist/docs-author.js +380 -0
  689. package/dist/docs-command.d.ts +8 -0
  690. package/dist/docs-command.js +62 -0
  691. package/dist/docs-eval.d.ts +146 -0
  692. package/dist/docs-eval.js +231 -0
  693. package/dist/docs-mcp.d.ts +12 -0
  694. package/dist/docs-mcp.js +82 -0
  695. package/dist/docs-tool.d.ts +81 -0
  696. package/dist/docs-tool.js +7 -0
  697. package/dist/document-sync.d.ts +36 -0
  698. package/dist/document-sync.js +58 -0
  699. package/dist/documentation-core.d.ts +148 -0
  700. package/dist/documentation-core.js +160 -0
  701. package/dist/embeddings.d.ts +68 -0
  702. package/dist/embeddings.js +198 -0
  703. package/dist/focused-audit.d.ts +10 -0
  704. package/dist/focused-audit.js +69 -0
  705. package/dist/focused-openapi.d.ts +2 -0
  706. package/dist/focused-openapi.js +140 -0
  707. package/dist/fonts.d.ts +54 -0
  708. package/dist/fonts.js +92 -0
  709. package/dist/freshness.d.ts +7 -0
  710. package/dist/freshness.js +58 -0
  711. package/dist/frontmatter.d.ts +24 -0
  712. package/dist/frontmatter.js +342 -0
  713. package/dist/function-package.d.ts +1 -0
  714. package/dist/function-package.js +58 -0
  715. package/dist/highlight.d.ts +14 -0
  716. package/dist/highlight.js +114 -0
  717. package/dist/html-renderer.d.ts +10 -0
  718. package/dist/html-renderer.js +63 -0
  719. package/dist/icons.d.ts +8 -0
  720. package/dist/icons.js +40 -0
  721. package/dist/index-build.d.ts +55 -0
  722. package/dist/index-build.js +227 -0
  723. package/dist/ingredient-draft.d.ts +17 -0
  724. package/dist/ingredient-draft.js +94 -0
  725. package/dist/ingredient-workflow.d.ts +8 -0
  726. package/dist/ingredient-workflow.js +25 -0
  727. package/dist/init.d.ts +8 -0
  728. package/dist/init.js +66 -0
  729. package/dist/jev.d.ts +62 -0
  730. package/dist/jev.js +190 -0
  731. package/dist/link-audit.d.ts +12 -0
  732. package/dist/link-audit.js +146 -0
  733. package/dist/llms-discovery.d.ts +11 -0
  734. package/dist/llms-discovery.js +23 -0
  735. package/dist/markdown-sections.d.ts +15 -0
  736. package/dist/markdown-sections.js +60 -0
  737. package/dist/markdown-size.d.ts +7 -0
  738. package/dist/markdown-size.js +6 -0
  739. package/dist/mcp-analytics.d.ts +38 -0
  740. package/dist/mcp-analytics.js +35 -0
  741. package/dist/mcp-artifacts.d.ts +2 -0
  742. package/dist/mcp-artifacts.js +78 -0
  743. package/dist/mcp-client-metadata.d.ts +18 -0
  744. package/dist/mcp-client-metadata.js +69 -0
  745. package/dist/mcp-config.d.ts +23 -0
  746. package/dist/mcp-config.js +56 -0
  747. package/dist/mcp-http.d.ts +19 -0
  748. package/dist/mcp-http.js +157 -0
  749. package/dist/mcp-integrity.d.ts +3 -0
  750. package/dist/mcp-integrity.js +4 -0
  751. package/dist/mcp-node.d.ts +4 -0
  752. package/dist/mcp-node.js +68 -0
  753. package/dist/mcp-vercel-runtime.d.ts +3 -0
  754. package/dist/mcp-vercel-runtime.js +36 -0
  755. package/dist/mcp-vercel.d.ts +15 -0
  756. package/dist/mcp-vercel.js +65 -0
  757. package/dist/metadata-provider.d.ts +19 -0
  758. package/dist/metadata-provider.js +38 -0
  759. package/dist/negotiation.d.ts +10 -0
  760. package/dist/negotiation.js +35 -0
  761. package/dist/not-found.d.ts +16 -0
  762. package/dist/not-found.js +25 -0
  763. package/dist/output-commit.d.ts +1 -0
  764. package/dist/output-commit.js +133 -0
  765. package/dist/output-location.d.ts +3 -0
  766. package/dist/output-location.js +30 -0
  767. package/dist/page-materialization.d.ts +78 -0
  768. package/dist/page-materialization.js +132 -0
  769. package/dist/page-renderer.d.ts +71 -0
  770. package/dist/page-renderer.js +177 -0
  771. package/dist/palettes.d.ts +41 -0
  772. package/dist/palettes.js +160 -0
  773. package/dist/procedure-components.d.ts +2 -0
  774. package/dist/procedure-components.js +94 -0
  775. package/dist/project-navigation.d.ts +41 -0
  776. package/dist/project-navigation.js +190 -0
  777. package/dist/provider-http.d.ts +10 -0
  778. package/dist/provider-http.js +60 -0
  779. package/dist/publication-manifest.d.ts +229 -0
  780. package/dist/publication-manifest.js +53 -0
  781. package/dist/publication-plan.d.ts +34 -0
  782. package/dist/publication-plan.js +85 -0
  783. package/dist/publication-render.d.ts +71 -0
  784. package/dist/publication-render.js +92 -0
  785. package/dist/reader-filters.d.ts +30 -0
  786. package/dist/reader-filters.js +105 -0
  787. package/dist/recipe-draft.d.ts +17 -0
  788. package/dist/recipe-draft.js +147 -0
  789. package/dist/reference-audit.d.ts +18 -0
  790. package/dist/reference-audit.js +169 -0
  791. package/dist/remote-import.d.ts +62 -0
  792. package/dist/remote-import.js +292 -0
  793. package/dist/representation-tree.d.ts +3 -0
  794. package/dist/representation-tree.js +320 -0
  795. package/dist/retrieval-config.d.ts +30 -0
  796. package/dist/retrieval-config.js +83 -0
  797. package/dist/retrieval.d.ts +60 -0
  798. package/dist/retrieval.js +228 -0
  799. package/dist/scaffold.d.ts +39 -0
  800. package/dist/scaffold.js +167 -0
  801. package/dist/search-config.d.ts +8 -0
  802. package/dist/search-config.js +26 -0
  803. package/dist/search-handler.d.ts +16 -0
  804. package/dist/search-handler.js +111 -0
  805. package/dist/search-identifier.d.ts +3 -0
  806. package/dist/search-identifier.js +25 -0
  807. package/dist/search-literal.d.ts +1 -0
  808. package/dist/search-literal.js +28 -0
  809. package/dist/search-query.d.ts +54 -0
  810. package/dist/search-query.js +120 -0
  811. package/dist/search-results.d.ts +6 -0
  812. package/dist/search-results.js +45 -0
  813. package/dist/search-snippet.d.ts +11 -0
  814. package/dist/search-snippet.js +93 -0
  815. package/dist/search-synonyms.d.ts +8 -0
  816. package/dist/search-synonyms.js +46 -0
  817. package/dist/semantic-markdown.d.ts +10 -0
  818. package/dist/semantic-markdown.js +39 -0
  819. package/dist/server.d.ts +10 -0
  820. package/dist/server.js +223 -0
  821. package/dist/share-images.d.ts +24 -0
  822. package/dist/share-images.js +187 -0
  823. package/dist/site-path.d.ts +2 -0
  824. package/dist/site-path.js +15 -0
  825. package/dist/sitemap.d.ts +8 -0
  826. package/dist/sitemap.js +58 -0
  827. package/dist/snippets.d.ts +19 -0
  828. package/dist/snippets.js +84 -0
  829. package/dist/structured-model-output.d.ts +6 -0
  830. package/dist/structured-model-output.js +21 -0
  831. package/dist/subject-deprecation.d.ts +21 -0
  832. package/dist/subject-deprecation.js +57 -0
  833. package/dist/surface-text.d.ts +4 -0
  834. package/dist/surface-text.js +42 -0
  835. package/dist/taxonomy.d.ts +14 -0
  836. package/dist/taxonomy.js +88 -0
  837. package/dist/turnstile.d.ts +21 -0
  838. package/dist/turnstile.js +52 -0
  839. package/dist/vale.d.ts +28 -0
  840. package/dist/vale.js +103 -0
  841. package/dist/vercel-function.d.ts +21 -0
  842. package/dist/vercel-function.js +108 -0
  843. package/dist/vercel.d.ts +11 -0
  844. package/dist/vercel.js +103 -0
  845. package/dist/walkthrough.d.ts +25 -0
  846. package/dist/walkthrough.js +336 -0
  847. package/dist/yaml-value.d.ts +2 -0
  848. package/dist/yaml-value.js +36 -0
  849. package/example-configs/api-docs/README.md +59 -0
  850. package/example-configs/api-docs/apis/cedar-parcel.yaml +413 -0
  851. package/example-configs/api-docs/content/create-enrollment.mdx +11 -0
  852. package/example-configs/api-docs/content/overview.mdx +36 -0
  853. package/example-configs/api-docs/content/quickstart.mdx +52 -0
  854. package/example-configs/api-docs/docs.config.yaml +104 -0
  855. package/example-configs/faceted-sites/README.md +31 -0
  856. package/example-configs/faceted-sites/base.yaml +30 -0
  857. package/example-configs/faceted-sites/content/api.md +12 -0
  858. package/example-configs/faceted-sites/content/home.md +10 -0
  859. package/example-configs/faceted-sites/content/operations.md +12 -0
  860. package/example-configs/faceted-sites/developers.config.yaml +8 -0
  861. package/example-configs/faceted-sites/docs.config.yaml +7 -0
  862. package/example-configs/faceted-sites/europe.config.yaml +9 -0
  863. package/example-configs/minimal/content/install.mdx +12 -0
  864. package/example-configs/minimal/content/welcome.mdx +8 -0
  865. package/example-configs/minimal/docs.config.yaml +31 -0
  866. package/example-configs/multilingual/content/de/home.mdx +9 -0
  867. package/example-configs/multilingual/content/de/reset-password.mdx +9 -0
  868. package/example-configs/multilingual/content/home.mdx +10 -0
  869. package/example-configs/multilingual/content/reset-password.mdx +12 -0
  870. package/example-configs/multilingual/docs.config.yaml +61 -0
  871. package/example-configs/multilingual/snippets/contact.mdx +1 -0
  872. package/example-configs/notifications/apis/notifications.yaml +132 -0
  873. package/example-configs/notifications/content/cookbook.mdx +17 -0
  874. package/example-configs/notifications/content/get-message.mdx +14 -0
  875. package/example-configs/notifications/content/queue-email.mdx +42 -0
  876. package/example-configs/notifications/content/queue-push.mdx +33 -0
  877. package/example-configs/notifications/content/queue-sms.mdx +33 -0
  878. package/example-configs/notifications/content/send-email.mdx +14 -0
  879. package/example-configs/notifications/content/send-push.mdx +14 -0
  880. package/example-configs/notifications/content/send-sms.mdx +14 -0
  881. package/example-configs/notifications/content/start.mdx +13 -0
  882. package/example-configs/notifications/content/welcome-cookbook.mdx +21 -0
  883. package/example-configs/notifications/content/welcome-email.mdx +82 -0
  884. package/example-configs/notifications/demo.mjs +43 -0
  885. package/example-configs/notifications/docs.config.yaml +88 -0
  886. package/example-configs/notifications/ingredient-drafts/README.md +41 -0
  887. package/example-configs/notifications/ingredient-drafts/check-delivery.mdx +13 -0
  888. package/example-configs/notifications/ingredient-drafts/queue-welcome-email.mdx +48 -0
  889. package/example-configs/notifications/ingredient-specs/queue-welcome-email.yaml +7 -0
  890. package/example-configs/notifications/ingredients/check-delivery.mdx +42 -0
  891. package/example-configs/notifications/ingredients/queue-welcome-email.mdx +37 -0
  892. package/example-configs/notifications/recipe-drafts/send-welcome-email.mdx +91 -0
  893. package/example-configs/notifications/recipe-specs/send-welcome-email.yaml +11 -0
  894. package/example-configs/reference-stress/README.md +32 -0
  895. package/example-configs/reference-stress/apis/cedar-parcel.yaml +413 -0
  896. package/example-configs/reference-stress/content/enrollment-shapes.mdx +16 -0
  897. package/example-configs/reference-stress/content/overview.mdx +14 -0
  898. package/example-configs/reference-stress/docs.config.yaml +55 -0
  899. package/example-configs/shared-preset/shared/company-docs.yaml +46 -0
  900. package/example-configs/shared-preset/shared/runbook.mdx +7 -0
  901. package/example-configs/shared-preset/site/content/failed-invoices.mdx +15 -0
  902. package/example-configs/shared-preset/site/content/start.mdx +9 -0
  903. package/example-configs/shared-preset/site/docs.config.yaml +18 -0
  904. package/example-configs/showcase/README.md +20 -0
  905. package/example-configs/showcase/apis/cedar-parcel.yaml +413 -0
  906. package/example-configs/showcase/content/assets/collection.svg +1 -0
  907. package/example-configs/showcase/content/code.mdx +100 -0
  908. package/example-configs/showcase/content/create-enrollment.mdx +11 -0
  909. package/example-configs/showcase/content/features.mdx +39 -0
  910. package/example-configs/showcase/content/landing.mdx +36 -0
  911. package/example-configs/showcase/content/overview.mdx +42 -0
  912. package/example-configs/showcase/content/personalization.mdx +38 -0
  913. package/example-configs/showcase/content/preview.mdx +35 -0
  914. package/example-configs/showcase/content/procedures.mdx +88 -0
  915. package/example-configs/showcase/content/quickstart.mdx +64 -0
  916. package/example-configs/showcase/content/reading.mdx +99 -0
  917. package/example-configs/showcase/content/verify.mdx +27 -0
  918. package/example-configs/showcase/content/visuals.mdx +47 -0
  919. package/example-configs/showcase/content/workflows.mdx +12 -0
  920. package/example-configs/showcase/docs.config.yaml +149 -0
  921. package/example-configs/showcase/snippets/sandbox.mdx +1 -0
  922. package/examples/analytics/README.md +56 -0
  923. package/examples/analytics/inspector.js +25 -0
  924. package/examples/analytics/posthog.js +36 -0
  925. package/examples/components/comparison.mjs +8 -0
  926. package/examples/components/components.json +6 -0
  927. package/examples/components/copy-text/LICENSE.react-dom.txt +21 -0
  928. package/examples/components/copy-text/LICENSE.react.txt +21 -0
  929. package/examples/components/copy-text/LICENSE.scheduler.txt +21 -0
  930. package/examples/components/copy-text/browser.jsx +21 -0
  931. package/examples/components/copy-text/components.json +6 -0
  932. package/examples/components/copy-text/package-lock.json +41 -0
  933. package/examples/components/copy-text/package.json +9 -0
  934. package/examples/components/copy-text/plugin.mjs +5 -0
  935. package/examples/components/retry-budget/LICENSE.react-dom.txt +21 -0
  936. package/examples/components/retry-budget/LICENSE.react.txt +21 -0
  937. package/examples/components/retry-budget/LICENSE.scheduler.txt +21 -0
  938. package/examples/components/retry-budget/browser.jsx +50 -0
  939. package/examples/components/retry-budget/components.json +6 -0
  940. package/examples/components/retry-budget/model.js +22 -0
  941. package/examples/components/retry-budget/package-lock.json +41 -0
  942. package/examples/components/retry-budget/package.json +9 -0
  943. package/examples/components/retry-budget/plugin.mjs +31 -0
  944. package/examples/components/retry-budget/policy.json +9 -0
  945. package/examples/components/retry-budget/style.css +25 -0
  946. package/examples/diagrams/d2-gallery.json +138 -0
  947. package/examples/diagrams/gallery.json +236 -0
  948. package/examples/help-drawer/README.md +44 -0
  949. package/examples/help-drawer/app.js +53 -0
  950. package/examples/help-drawer/components/components.json +1 -0
  951. package/examples/help-drawer/components/support.mjs +10 -0
  952. package/examples/help-drawer/content/account.md +8 -0
  953. package/examples/help-drawer/content/billing.mdx +29 -0
  954. package/examples/help-drawer/content/keys.mdx +46 -0
  955. package/examples/help-drawer/content/settings.svg +1 -0
  956. package/examples/help-drawer/docs.config.yaml +30 -0
  957. package/examples/help-drawer/index.html +26 -0
  958. package/examples/help-drawer/preview.mjs +33 -0
  959. package/examples/mcp-analytics/README.md +59 -0
  960. package/examples/mcp-analytics/posthog.mjs +159 -0
  961. package/package.json +100 -4
  962. package/schemas/content-export.schema.json +55 -0
  963. package/skills/shoalrun-author/SKILL.md +52 -0
  964. package/skills/shoalrun-component-author/SKILL.md +24 -0
  965. package/skills/shoalrun-recipes/SKILL.md +25 -0
  966. package/skills/shoalrun-setup/SKILL.md +34 -0
  967. package/skills/shoalrun-walkthrough/SKILL.md +18 -0
  968. package/styles/fonts/figtree-LICENSE.txt +93 -0
  969. package/styles/fonts/figtree-italic.woff2 +0 -0
  970. package/styles/fonts/figtree.woff2 +0 -0
  971. package/styles/fonts/inter-LICENSE.txt +93 -0
  972. package/styles/fonts/inter-italic.woff2 +0 -0
  973. package/styles/fonts/inter.woff2 +0 -0
  974. package/styles/fonts/jetbrains-mono-LICENSE.txt +93 -0
  975. package/styles/fonts/jetbrains-mono.woff2 +0 -0
  976. package/styles/fonts/jost-LICENSE.txt +93 -0
  977. package/styles/fonts/jost-italic.woff2 +0 -0
  978. package/styles/fonts/jost.woff2 +0 -0
  979. package/styles/fonts/share/figtree-400.ttf +0 -0
  980. package/styles/fonts/share/figtree-700.ttf +0 -0
  981. package/styles/fonts/share/inter-400.ttf +0 -0
  982. package/styles/fonts/share/inter-700.ttf +0 -0
  983. package/styles/fonts/share/jetbrains-mono-700.ttf +0 -0
  984. package/styles/fonts/share/jost-italic-800.ttf +0 -0
  985. package/styles/fonts/share/metrics.json +1 -0
  986. package/styles/fonts/share/source-serif-4-400.ttf +0 -0
  987. package/styles/fonts/source-serif-4-LICENSE.txt +93 -0
  988. package/styles/fonts/source-serif-4-italic.woff2 +0 -0
  989. package/styles/fonts/source-serif-4.woff2 +0 -0
  990. package/styles/header.css +56 -0
  991. package/styles/site.css +825 -0
  992. package/styles/themes/ledger.css +93 -0
  993. package/styles/themes/palettes/amethyst.yaml +127 -0
  994. package/styles/themes/palettes/coral.yaml +127 -0
  995. package/styles/themes/palettes/harbor.yaml +127 -0
  996. package/styles/themes/palettes/ink.yaml +127 -0
  997. package/styles/themes/palettes/kelp.yaml +127 -0
  998. package/styles/themes/palettes/vice.yaml +127 -0
  999. package/styles/themes/reef.css +68 -0
  1000. package/styles/themes/vice.css +56 -0
  1001. package/styles/tokens.css +91 -0
  1002. package/templates/api-reference.mdx +133 -0
  1003. package/templates/cookbook.mdx +38 -0
  1004. package/templates/explanation.mdx +76 -0
  1005. package/templates/guide.mdx +175 -0
  1006. package/templates/how-to.mdx +171 -0
  1007. package/templates/ingredient.mdx +53 -0
  1008. package/templates/recipe.mdx +76 -0
  1009. package/templates/reference.mdx +171 -0
  1010. package/templates/troubleshooting.mdx +159 -0
  1011. package/templates/tutorial.mdx +165 -0
package/dist/cli.js ADDED
@@ -0,0 +1,750 @@
1
+ #!/usr/bin/env node
2
+ import { runExportCommand, exportHelp } from './content-export-command.js';
3
+ import { cliHelp, docsHelp, skillsHelp, runSkillsCommand } from './cli-discovery.js';
4
+ import { compareDocumentSnapshots } from './document-sync.js';
5
+ import { validateAuthoringGuidance } from './authoring-guidance.js';
6
+ import { resolveAgentDiscovery } from './agent-discovery.js';
7
+ import { configField } from './compiler-config.js';
8
+ import { checkThemeContrast, compile } from './compiler.js';
9
+ import { explain, loadConfig } from './config.js';
10
+ import { auditReference } from './reference-audit.js';
11
+ import { importRemoteOpenApi, refreshRemoteOpenApi } from './remote-import.js';
12
+ import { auditFocusedContracts } from './focused-audit.js';
13
+ import { auditProject } from './audit.js';
14
+ import { scaffold, scaffoldFromPath } from './scaffold.js';
15
+ import { initProject } from './init.js';
16
+ import { selectApiReferences } from './api-selection.js';
17
+ import { materializeApiPages } from './api-materialize.js';
18
+ import { serveSite } from './server.js';
19
+ import { createAskHandler } from './ask-handler.js';
20
+ import { createSearchHandler } from './search-handler.js';
21
+ import { Retriever } from './retrieval.js';
22
+ import { AskLog, analyzeLog, checkLogPath, formatReport, readLog } from './ask-log.js';
23
+ import { readKvLog } from './ask-log-kv.js';
24
+ import { envRedis } from './budget-store.js';
25
+ import { pausedKey } from './chat-pause.js';
26
+ import { stringify as yamlStringify } from 'yaml';
27
+ import { startDev } from './dev.js';
28
+ import { buildVercel } from './vercel.js';
29
+ import { queryBuiltSite } from './search-query.js';
30
+ import { parseDocsReadOptions, runDocsReadCommand } from './docs-command.js';
31
+ import { DocumentationError } from './documentation-core.js';
32
+ import { checkEvalReport, prepareEvalReport, evalBuildSnapshot, compareEvalBuildInventories } from './docs-eval.js';
33
+ import { docsApply, docsContext, docsPlan } from './docs-author.js';
34
+ import { runProjectCommand } from './authoring-project-command.js';
35
+ import { runValidationCommand } from './authoring-validation-command.js';
36
+ import { runAuthoringReviewCommand } from './authoring-review-command.js';
37
+ import { writeRecipeDraft } from './recipe-draft.js';
38
+ import { writeIngredientDraft } from './ingredient-draft.js';
39
+ import { buildChunkIndex, embeddingInput } from './index-build.js';
40
+ import { createProvider, embedChunkIndex, readEmbeddings } from './embeddings.js';
41
+ import { embeddingProviderConfig, queryProviderConfig, validateRetrieval } from './retrieval-config.js';
42
+ import { defaultLogNotice, validateChat } from './chat-config.js';
43
+ import { createSession, turnstileVerifier } from './turnstile.js';
44
+ import { adaptiveChallenge } from './budget.js';
45
+ import { validateReaderFilters } from './reader-filters.js';
46
+ import { askQuestion } from './ask.js';
47
+ import { parseReaderView, prepareAsk } from './ask-setup.js';
48
+ import { buildCards, parseCardQuestions, writeCards } from './answer-cards.js';
49
+ import { access, readFile } from 'node:fs/promises';
50
+ import { fileURLToPath } from 'node:url';
51
+ import path from 'node:path';
52
+ async function discoverConfig(start) {
53
+ let directory = path.resolve(start);
54
+ while (true) {
55
+ const candidate = path.join(directory, 'docs.config.yaml');
56
+ try {
57
+ await access(candidate);
58
+ return candidate;
59
+ }
60
+ catch { /* Try parent. */ }
61
+ const parent = path.dirname(directory);
62
+ if (parent === directory)
63
+ throw new Error('No docs.config.yaml found; pass --config FILE');
64
+ directory = parent;
65
+ }
66
+ }
67
+ function buildArguments(args, defaultOutput) {
68
+ const positional = [];
69
+ const flags = {};
70
+ for (let index = 0; index < args.length; index++) {
71
+ const value = args[index];
72
+ if (!value.startsWith('--')) {
73
+ positional.push(value);
74
+ continue;
75
+ }
76
+ if (!['--source-commit', '--release-label'].includes(value))
77
+ throw new Error(`Unknown build option ${value}`);
78
+ if (flags[value] !== undefined)
79
+ throw new Error(`Duplicate build option ${value}`);
80
+ const next = args[++index];
81
+ if (!next || next.startsWith('--'))
82
+ throw new Error(`Build option ${value} needs a value`);
83
+ flags[value] = next;
84
+ }
85
+ if (positional.length > 2)
86
+ throw new Error('Build accepts at most a config and output directory');
87
+ return { config: positional[0] ?? 'docs.config.yaml', output: positional[1] ?? defaultOutput, provenance: { sourceCommit: flags['--source-commit'], releaseLabel: flags['--release-label'] } };
88
+ }
89
+ // An unset or empty PORT means the default; serveSite rejects anything else that is not a port number.
90
+ const defaultPort = () => process.env.PORT?.trim() ? Number(process.env.PORT) : 8765;
91
+ const [command, subcommand, ...rest] = process.argv.slice(2);
92
+ try {
93
+ if ((command === undefined || ['--help', '-h', 'help'].includes(command)) && subcommand === undefined) {
94
+ process.stdout.write(cliHelp);
95
+ }
96
+ else if ((command === 'docs' || command === 'skills') && ['--help', '-h', 'help'].includes(subcommand) && !rest.length) {
97
+ process.stdout.write(command === 'docs' ? docsHelp : skillsHelp);
98
+ }
99
+ else if (command === 'skills') {
100
+ process.stdout.write(await runSkillsCommand([subcommand, ...rest].filter((value) => value !== undefined)));
101
+ }
102
+ else if (command === 'init') {
103
+ const args = [subcommand, ...rest].filter((item) => item !== undefined);
104
+ let directory = '.';
105
+ let starter = 'minimal';
106
+ let hasDirectory = false;
107
+ let hasStarter = false;
108
+ for (let index = 0; index < args.length; index++) {
109
+ const value = args[index];
110
+ if (value === '--starter') {
111
+ if (hasStarter || !args[index + 1] || args[index + 1].startsWith('--'))
112
+ throw new Error('Usage: shoalrun init [directory] [--starter minimal|api-docs|showcase]');
113
+ starter = args[++index];
114
+ hasStarter = true;
115
+ }
116
+ else if (value.startsWith('--') || hasDirectory) {
117
+ throw new Error('Usage: shoalrun init [directory] [--starter minimal|api-docs|showcase]');
118
+ }
119
+ else {
120
+ directory = value;
121
+ hasDirectory = true;
122
+ }
123
+ }
124
+ process.stdout.write(JSON.stringify(await initProject(directory, starter), null, 2) + '\n');
125
+ }
126
+ else if (command === 'export') {
127
+ if (subcommand === '--help' && !rest.length)
128
+ process.stdout.write(exportHelp);
129
+ else {
130
+ const result = await runExportCommand([subcommand, ...rest].filter((arg) => arg !== undefined));
131
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
132
+ if (result.status !== 'ok')
133
+ process.exitCode = 2;
134
+ }
135
+ }
136
+ else if (command === 'build') {
137
+ const { config, output, provenance } = buildArguments([subcommand, ...rest].filter((item) => item !== undefined), 'site-dist');
138
+ const manifest = await compile(config, output, provenance);
139
+ process.stdout.write(JSON.stringify({ status: 'ok', documents: manifest.documents.length, operations: Object.keys(manifest.operations).length }, null, 2) + '\n');
140
+ }
141
+ else if (command === 'dev') {
142
+ const args = [subcommand, ...rest].filter((item) => item !== undefined);
143
+ const positional = [];
144
+ let port = defaultPort();
145
+ for (let index = 0; index < args.length; index++) {
146
+ if (args[index] === '--port') {
147
+ 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
+ }
151
+ else if (args[index].startsWith('--'))
152
+ throw new Error(`Unknown dev option ${args[index]}`);
153
+ else
154
+ positional.push(args[index]);
155
+ }
156
+ 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);
159
+ }
160
+ else if (command === 'vercel' && subcommand === 'build') {
161
+ // --chat adds the optional answer function: it needs chat and retrieval settings and the embedding key at build time.
162
+ const chat = rest.includes('--chat');
163
+ const { config, output, provenance } = buildArguments(rest.filter(item => item !== '--chat'), '.vercel/output');
164
+ const result = await buildVercel(config, output, provenance, { chat });
165
+ // Asking for the chat and not getting it must fail the deploy. Otherwise a site would look ready and have no chat.
166
+ if (chat && result.chat && !result.chat.added)
167
+ throw new Error(`The chat was requested but not added: ${result.chat.reason}`);
168
+ process.stdout.write(JSON.stringify({ status: 'ok', ...result }, null, 2) + '\n');
169
+ }
170
+ else if (command === 'serve') {
171
+ const usage = 'Usage: shoalrun serve <site-directory> [--host HOST] [--port PORT] [--search [--config FILE]] [--ask [--config FILE] [--model MODEL] [--log FILE] [--public-preview] [--reader-view FACET=CHOICE[,CHOICE]]...]';
172
+ if (!subcommand || subcommand.startsWith('--'))
173
+ throw new Error(usage);
174
+ const options = {};
175
+ const serveViews = [];
176
+ let ask = false;
177
+ let search = false;
178
+ let publicPreview = false;
179
+ for (let index = 0; index < rest.length; index++) {
180
+ const flag = rest[index];
181
+ if (flag === '--ask') {
182
+ if (ask)
183
+ throw new Error('Duplicate --ask');
184
+ ask = true;
185
+ continue;
186
+ }
187
+ if (flag === '--search') {
188
+ if (search)
189
+ throw new Error('Duplicate --search');
190
+ search = true;
191
+ continue;
192
+ }
193
+ if (flag === '--public-preview') {
194
+ if (publicPreview)
195
+ throw new Error('Duplicate --public-preview');
196
+ publicPreview = true;
197
+ continue;
198
+ }
199
+ const value = rest[++index];
200
+ if (flag === '--reader-view' && value && !value.startsWith('--')) {
201
+ serveViews.push(value);
202
+ continue;
203
+ }
204
+ if (!['--host', '--port', '--config', '--model', '--log'].includes(flag) || !value)
205
+ throw new Error(usage);
206
+ if (options[flag] !== undefined)
207
+ throw new Error(`Duplicate serve option ${flag}`);
208
+ options[flag] = value;
209
+ }
210
+ if (!ask && !search && (options['--model'] || options['--log'] || publicPreview || serveViews.length))
211
+ throw new Error('--config, --model, --log, --public-preview, and --reader-view need --ask');
212
+ if (!ask && !search && options['--config'])
213
+ throw new Error('--config needs --search or --ask');
214
+ if (!ask && (options['--model'] || options['--log'] || publicPreview || serveViews.length))
215
+ throw new Error('--model, --log, --public-preview, and --reader-view need --ask');
216
+ const host = options['--host'] ?? '127.0.0.1';
217
+ const port = options['--port'] === undefined ? defaultPort() : Number(options['--port']);
218
+ let extras;
219
+ const hosts = [];
220
+ let banner = '';
221
+ if (search) {
222
+ if (!['127.0.0.1', 'localhost', '::1', '[::1]'].includes(host))
223
+ throw new Error('--search runs only on a loopback address because embedding queries spend API credits');
224
+ const configFile = options['--config'] ?? await discoverConfig(process.cwd());
225
+ const settings = (await loadConfig(configFile)).value;
226
+ const chunks = JSON.parse(await readFile(path.join(subcommand, 'ai', 'chunks.json'), 'utf8'));
227
+ const searchIndex = JSON.parse(await readFile(path.join(subcommand, 'search-index.json'), 'utf8'));
228
+ const pageSummaries = new Map(searchIndex.documents.map(document => [`${document.variant}:${document.id}`, document.summary]));
229
+ const embeddings = await readEmbeddings(subcommand);
230
+ const retriever = new Retriever(chunks, embeddings);
231
+ let embedQuery;
232
+ if (embeddings) {
233
+ const provider = createProvider(queryProviderConfig(validateRetrieval(settings.retrieval), embeddings.meta));
234
+ if (provider.space !== embeddings.meta.space || (embeddings.meta.backend && provider.backend !== embeddings.meta.backend))
235
+ throw new Error(`${provider.model} is not in the embedding space or backend of ${embeddings.meta.model}`);
236
+ embedQuery = async (query, signal) => (await provider.embed([query], 'query', signal))[0];
237
+ }
238
+ extras = { search: createSearchHandler({ retriever, embedQuery, hosts, readerFilters: validateReaderFilters(settings.readerFilters), pageSummaries }) };
239
+ banner = `Search is on: ${embeddings ? 'hybrid retrieval' : 'lexical retrieval; run shoalrun index --embed for semantic results'}.\n`;
240
+ }
241
+ if (ask) {
242
+ // The preview spends your API credits on every question, so it answers only on this machine.
243
+ if (!['127.0.0.1', 'localhost', '::1', '[::1]'].includes(host))
244
+ throw new Error('--ask runs only on a loopback address (127.0.0.1, localhost, or ::1), because every question spends your API credits');
245
+ const configFile = options['--config'] ?? await discoverConfig(process.cwd()).catch(() => { throw new Error('No docs.config.yaml found; pass --config FILE. `serve --ask` reads its chat provider and model from the config'); });
246
+ const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: options['--model'], readerView: parseReaderView(serveViews), cache: true });
247
+ for (const note of setup.notes)
248
+ process.stderr.write(`${note}\n`);
249
+ const log = options['--log'] ? new AskLog(await checkLogPath(options['--log'], subcommand)) : undefined;
250
+ if (log)
251
+ process.stderr.write(`Logging questions and answers to ${log.file} (emails, numbers, and keys are redacted; only you can read the file)\n`);
252
+ // --public-preview shows the panel as readers see it: the Turnstile check (with Cloudflare's test keys, which work on any address), the
253
+ // recording notice, and only the answer, sources, and warnings. Answers are still real, and the counters stay in memory.
254
+ let publicSettings;
255
+ let chatConfigForPreview;
256
+ let challenge;
257
+ const chatSettings = (await loadConfig(configFile)).value;
258
+ const chatConfig = validateChat(chatSettings.chat, validateReaderFilters(chatSettings.readerFilters));
259
+ if (publicPreview) {
260
+ chatConfigForPreview = chatConfig;
261
+ publicSettings = { siteKey: '1x00000000000000000000AA', ...(chatConfig?.challenge?.when === 'always' ? { prewarm: true } : {}), notice: chatConfig?.log?.notice ?? defaultLogNotice, ...(chatConfig?.panel ? { panel: chatConfig.panel } : {}) };
262
+ const verify = turnstileVerifier({ secret: '1x0000000000000000000000000000000AA' });
263
+ challenge = ({ token, ip }) => verify({ token, ip });
264
+ }
265
+ const handler = createAskHandler({ hosts, exposeErrors: true, ...(publicPreview ? { response: 'public', challenge, session: createSession({ secret: '1x0000000000000000000000000000000AA' }), ...(chatConfigForPreview?.challenge?.when === 'always' || !setup.budget ? {} : { challengeNeeded: adaptiveChallenge(setup.budget, { freeQuestions: chatConfigForPreview?.challenge?.freeQuestions, busyShare: chatConfigForPreview?.challenge?.busyShare }) }) } : {}), ...(log ? { record: event => log.write(event) } : {}), ...(setup.budget ? { budget: setup.budget } : {}), answer: (question, history, context) => askQuestion({ question, history, ...setup.options, modelAllowed: context.modelAllowed, signal: context.signal, ...(publicPreview ? { requireCitations: true } : {}) }) });
266
+ extras = { ...extras, ask: handler, ...(publicSettings ? { publicSettings } : chatConfig?.panel ? { panel: chatConfig.panel } : {}), widget: await readFile(path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../assets/ask-widget.js'), 'utf8') };
267
+ banner += `Ask is on: ${setup.chat.model}${setup.options.jev ? ', relevance scoring' : ''}${setup.options.embedQuery ? ', semantic search' : ', keyword search only'}. Look for the Ask button on any page.\n`;
268
+ }
269
+ const server = await serveSite(subcommand, host, port, undefined, extras);
270
+ const listening = server.address().port;
271
+ for (const name of ['127.0.0.1', 'localhost', '[::1]'])
272
+ hosts.push(`${name}:${listening}`);
273
+ process.stdout.write(`Serving ${path.resolve(subcommand)} at http://${host}:${listening}/\n${banner}`);
274
+ }
275
+ else if (command === 'eval' && subcommand === 'snapshot') {
276
+ if (rest.length !== 1 || rest[0].startsWith('--'))
277
+ throw new Error('Usage: shoalrun eval snapshot <site-directory>');
278
+ const snapshot = await evalBuildSnapshot(rest[0]);
279
+ process.stdout.write(JSON.stringify({ schemaVersion: 1, buildDigest: snapshot.buildDigest, files: snapshot.fileDigests }, null, 2) + '\n');
280
+ }
281
+ else if (command === 'eval' && subcommand === 'compare') {
282
+ if (rest.length !== 3 || rest[1] !== '--since' || rest[0].startsWith('--') || rest[2].startsWith('--'))
283
+ throw new Error('Usage: shoalrun eval compare CURRENT.json --since PREVIOUS.json');
284
+ const result = compareEvalBuildInventories(JSON.parse(await readFile(rest[2], 'utf8')), JSON.parse(await readFile(rest[0], 'utf8')));
285
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
286
+ if (result.status !== 'ok')
287
+ process.exitCode = 1;
288
+ }
289
+ else if (command === 'eval') {
290
+ const usage = 'Usage: shoalrun eval prepare <site-directory> --tasks FILE --out REPORT | eval check <site-directory> --tasks FILE --report REPORT';
291
+ if (!['prepare', 'check'].includes(subcommand) || !rest[0] || rest[0].startsWith('--'))
292
+ throw new Error(usage);
293
+ const flags = {};
294
+ for (let index = 1; index < rest.length; index++) {
295
+ const flag = rest[index];
296
+ const value = rest[++index];
297
+ if (!['--tasks', subcommand === 'prepare' ? '--out' : '--report'].includes(flag) || !value || value.startsWith('--') || flags[flag] !== undefined)
298
+ throw new Error(usage);
299
+ flags[flag] = value;
300
+ }
301
+ if (!flags['--tasks'] || !flags[subcommand === 'prepare' ? '--out' : '--report'])
302
+ throw new Error(usage);
303
+ const result = subcommand === 'prepare'
304
+ ? await prepareEvalReport(rest[0], flags['--tasks'], flags['--out'])
305
+ : await checkEvalReport(rest[0], flags['--tasks'], flags['--report']);
306
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
307
+ if (result.status !== 'ok')
308
+ process.exitCode = 1;
309
+ }
310
+ else if (command === 'docs') {
311
+ if (subcommand === 'baseline' || subcommand === 'validate' || subcommand === 'validation-status')
312
+ await runValidationCommand(subcommand, rest, () => discoverConfig(process.cwd()));
313
+ else if (subcommand === 'review' || subcommand === 'preview')
314
+ await runAuthoringReviewCommand(subcommand, rest);
315
+ else if (subcommand === 'project' || subcommand === 'source')
316
+ await runProjectCommand(subcommand, rest, () => discoverConfig(process.cwd()));
317
+ else if (subcommand === 'search' || subcommand === 'read' || subcommand === 'outline' || subcommand === 'section')
318
+ await runDocsReadCommand(subcommand, rest);
319
+ else if (subcommand === 'changes') {
320
+ if (rest.length !== 3 || rest[1] !== '--since' || rest[0].startsWith('--') || rest[2].startsWith('--'))
321
+ throw new Error('Usage: shoalrun docs changes CURRENT-SNAPSHOT --since PREVIOUS-SNAPSHOT');
322
+ const current = JSON.parse(await readFile(rest[0], 'utf8'));
323
+ const previous = JSON.parse(await readFile(rest[2], 'utf8'));
324
+ process.stdout.write(JSON.stringify(compareDocumentSnapshots(previous, current), null, 2) + '\n');
325
+ }
326
+ else if (subcommand === 'mcp') {
327
+ const { directory, positional } = parseDocsReadOptions(rest, true);
328
+ if (positional.length)
329
+ throw new DocumentationError('invalid_input', 'Usage: shoalrun docs mcp [--site DIRECTORY]');
330
+ const { serveDocsMcp } = await import('./docs-mcp.js');
331
+ serveDocsMcp(directory);
332
+ }
333
+ else if (subcommand === 'context' && rest[0] && (rest.length === 1 || (rest.length === 3 && rest[1] === '--config'))) {
334
+ const config = rest[2] ?? await discoverConfig(process.cwd());
335
+ process.stdout.write(JSON.stringify(await docsContext(rest[0], config), null, 2) + '\n');
336
+ }
337
+ else if (subcommand === 'plan' && (rest.length === 4 || rest.length === 6) && rest[0] === '--request-file' && rest[2] === '--out' && (rest.length === 4 || rest[4] === '--config')) {
338
+ const config = rest[5] ?? await discoverConfig(process.cwd());
339
+ process.stdout.write(JSON.stringify(await docsPlan(rest[1], config, rest[3]), null, 2) + '\n');
340
+ }
341
+ else if (subcommand === 'apply' && rest[0] && (rest.length === 1 || rest.length === 2 && rest[1] === '--check' || rest.length === 3 && rest[1] === '--config' || rest.length === 4 && rest[1] === '--config' && rest[3] === '--check')) {
342
+ const config = rest[2] ?? await discoverConfig(process.cwd());
343
+ process.stdout.write(JSON.stringify(await docsApply(rest[0], config, rest.includes('--check')), null, 2) + '\n');
344
+ }
345
+ else
346
+ throw new Error('Usage: shoalrun docs changes CURRENT-SNAPSHOT --since PREVIOUS-SNAPSHOT | docs review REPORT [--format json|markdown] | docs preview REPORT [--port PORT] | docs baseline --out FILE [--config FILE] | docs validate (--baseline FILE | --file FILE | --id ID) [--config FILE] | docs validation-status REPORT | docs project [--config FILE] [--section pages|guidance|configuration|navigation|relationships|templates|findings] [--id ID|--file FILE|--query QUERY] [--offset N] [--limit N] [--max-tokens N] | docs source FILE [--config FILE] [--offset N] [--max-tokens N] | docs search <query> | docs read <document-id> | docs context <document-id> [--config FILE] | docs plan --request-file FILE --out PLAN [--config FILE] | docs apply PLAN [--config FILE] [--check]');
347
+ }
348
+ else if (command === 'recipe' || command === 'ingredient') {
349
+ const usage = `Usage: shoalrun ${command} draft --spec FILE --out FILE [--config FILE] [--check]`;
350
+ if (subcommand !== 'draft')
351
+ throw new Error(usage);
352
+ const flags = {};
353
+ let check = false;
354
+ for (let index = 0; index < rest.length; index++) {
355
+ const flag = rest[index];
356
+ if (flag === '--check') {
357
+ if (check)
358
+ throw new Error(usage);
359
+ check = true;
360
+ continue;
361
+ }
362
+ if (!['--spec', '--out', '--config'].includes(flag) || flags[flag] !== undefined || !rest[index + 1] || rest[index + 1].startsWith('--'))
363
+ throw new Error(usage);
364
+ flags[flag] = rest[++index];
365
+ }
366
+ if (!flags['--spec'] || !flags['--out'])
367
+ throw new Error(usage);
368
+ const writer = command === 'ingredient' ? writeIngredientDraft : writeRecipeDraft;
369
+ process.stdout.write(JSON.stringify(await writer(flags['--config'] ?? await discoverConfig(process.cwd()), flags['--spec'], flags['--out'], check), null, 2) + '\n');
370
+ }
371
+ else if (command === 'search') {
372
+ if (!subcommand || !rest[0] || rest[0].startsWith('--'))
373
+ throw new Error('Usage: shoalrun search <site-directory> <query> [--channel C] [--version V] [--language L] [--limit N]');
374
+ const options = {};
375
+ const names = { '--channel': 'channel', '--version': 'version', '--language': 'language', '--limit': 'limit' };
376
+ for (let index = 1; index < rest.length; index += 2) {
377
+ const flag = rest[index];
378
+ const value = rest[index + 1];
379
+ if (!(flag in names))
380
+ throw new Error(`Unknown search option ${flag}`);
381
+ if (!value || value.startsWith('--'))
382
+ throw new Error(`Search option ${flag} needs a value`);
383
+ const name = names[flag];
384
+ if (options[name] !== undefined)
385
+ throw new Error(`Duplicate search option ${flag}`);
386
+ if (name === 'limit')
387
+ options.limit = Number(value);
388
+ else
389
+ options[name] = value;
390
+ }
391
+ process.stdout.write(JSON.stringify(await queryBuiltSite(subcommand, rest[0], options), null, 2) + '\n');
392
+ }
393
+ else if (command === 'index') {
394
+ const usage = 'Usage: shoalrun index <site-directory> [--embed [--config FILE] [--provider voyage|openai] [--model MODEL] [--dimension N] [--base-url URL] [--key-env NAME]]';
395
+ if (!subcommand || subcommand.startsWith('--'))
396
+ throw new Error(usage);
397
+ const values = {};
398
+ let embed = false;
399
+ for (let index = 0; index < rest.length; index++) {
400
+ const flag = rest[index];
401
+ if (flag === '--embed') {
402
+ if (embed)
403
+ throw new Error('Duplicate --embed');
404
+ embed = true;
405
+ continue;
406
+ }
407
+ const value = rest[++index];
408
+ if (!['--config', '--provider', '--model', '--dimension', '--base-url', '--key-env'].includes(flag) || !value || value.startsWith('--'))
409
+ throw new Error(usage);
410
+ if (values[flag] !== undefined)
411
+ throw new Error(`Duplicate index option ${flag}`);
412
+ values[flag] = value;
413
+ }
414
+ if (!embed && Object.keys(values).length)
415
+ throw new Error('Embedding options need --embed');
416
+ const result = await buildChunkIndex(subcommand);
417
+ let embeddings;
418
+ if (embed) {
419
+ // The project's retrieval.embeddings setting chooses the provider. Flags override it, and a complete pair of --provider and
420
+ // --model needs no config at all.
421
+ const configFile = values['--config'] ?? (values['--provider'] && values['--model'] ? undefined : await discoverConfig(process.cwd()).catch(() => undefined));
422
+ const retrieval = configFile ? validateRetrieval((await loadConfig(configFile)).value.retrieval) : undefined;
423
+ const provider = createProvider(embeddingProviderConfig(retrieval, { provider: values['--provider'], model: values['--model'], dimension: values['--dimension'] === undefined ? undefined : Number(values['--dimension']), baseUrl: values['--base-url'], keyEnv: values['--key-env'] }));
424
+ embeddings = await embedChunkIndex(subcommand, result.index, provider, embeddingInput);
425
+ }
426
+ process.stdout.write(JSON.stringify({ status: 'ok', documents: result.documents, chunks: result.index.chunks.length, output: result.output, ...(embeddings ? { embeddings } : {}) }, null, 2) + '\n');
427
+ }
428
+ else if (command === 'ask') {
429
+ 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]';
430
+ if (!subcommand || subcommand.startsWith('--') || !rest[0] || rest[0].startsWith('--'))
431
+ throw new Error(usage);
432
+ const values = {};
433
+ const views = [];
434
+ const switches = new Set();
435
+ for (let index = 1; index < rest.length; index++) {
436
+ const flag = rest[index];
437
+ if (['--no-rerank', '--no-direct', '--no-escalate', '--no-cards', '--json'].includes(flag)) {
438
+ switches.add(flag);
439
+ continue;
440
+ }
441
+ const value = rest[++index];
442
+ if (flag === '--reader-view' && value && !value.startsWith('--')) {
443
+ views.push(value);
444
+ continue;
445
+ }
446
+ if (!['--config', '--model', '--passages', '--channel', '--version', '--language'].includes(flag) || !value || value.startsWith('--'))
447
+ throw new Error(usage);
448
+ if (values[flag] !== undefined)
449
+ throw new Error(`Duplicate ask option ${flag}`);
450
+ values[flag] = value;
451
+ }
452
+ 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'); });
453
+ 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) });
454
+ for (const note of setup.notes)
455
+ process.stderr.write(`${note}\n`);
456
+ const chat = setup.chat;
457
+ const result = await askQuestion({ question: rest[0], ...setup.options });
458
+ if (switches.has('--json'))
459
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
460
+ else {
461
+ process.stdout.write(`${result.answer}\n`);
462
+ if (result.sources.length)
463
+ process.stdout.write(`\nSources:\n${result.sources.map(item => `[${item.number}] ${item.title}${item.heading ? ` > ${item.heading}` : ''}: ${item.url}`).join('\n')}\n`);
464
+ }
465
+ const seconds = (result.timings.rewriteMs + result.timings.retrieveMs + result.timings.rerankMs + result.timings.answerMs + result.timings.verifyMs) / 1000;
466
+ process.stderr.write(`[${result.mode} | ${result.decision}${result.jevBest !== undefined ? ` | jev ${result.jevBest.toFixed(2)}` : ''} | ${chat.model} | ${result.usage.chatCalls} model call${result.usage.chatCalls === 1 ? '' : 's'}, ${result.usage.promptTokens} in / ${result.usage.completionTokens} out tokens | ${seconds.toFixed(1)}s]\n`);
467
+ for (const note of result.notes)
468
+ process.stderr.write(`Note: ${note}\n`);
469
+ }
470
+ else if (command === 'chat') {
471
+ // Instant off switch for a hosted chat, in the store that chat.budget.store names. It reads the store's address and token from the
472
+ // environment variables that config names, so run it with those set (for example `vercel env pull` output, or your shell).
473
+ const usage = 'Usage: shoalrun chat pause|resume|status --config FILE';
474
+ if (!['pause', 'resume', 'status'].includes(subcommand ?? '') || rest[0] !== '--config' || !rest[1] || rest.length !== 2)
475
+ throw new Error(usage);
476
+ const settings = (await loadConfig(rest[1])).value;
477
+ const chat = validateChat(settings.chat, validateReaderFilters(settings.readerFilters));
478
+ if (!chat?.budget?.store)
479
+ throw new Error('The config needs chat.budget.store to pause the chat');
480
+ const redis = envRedis(chat.budget.store);
481
+ if (subcommand === 'pause') {
482
+ await redis.command(['SET', pausedKey, new Date().toISOString()]);
483
+ process.stdout.write('The chat is paused. Running functions notice within about five seconds.\n');
484
+ }
485
+ else if (subcommand === 'resume') {
486
+ await redis.command(['DEL', pausedKey]);
487
+ process.stdout.write('The chat is resumed.\n');
488
+ }
489
+ else {
490
+ const since = await redis.command(['GET', pausedKey]);
491
+ process.stdout.write(since === null ? 'The chat is running.\n' : `The chat is paused, since ${String(since)}.\n`);
492
+ }
493
+ }
494
+ else if (command === 'ask-log') {
495
+ const usage = 'Usage: shoalrun ask-log (<log-file> | --kv --config FILE [--days N]) [--min-repeats N] [--limit N] [--cards-out FILE] [--json]';
496
+ // --kv reads the hosted log from the key-value store that chat.budget.store names, using the environment variables that config names.
497
+ const fromStore = subcommand === '--kv';
498
+ if (!subcommand || (subcommand.startsWith('--') && !fromStore))
499
+ throw new Error(usage);
500
+ const values = {};
501
+ let json = false;
502
+ for (let index = 0; index < rest.length; index++) {
503
+ const flag = rest[index];
504
+ if (flag === '--json') {
505
+ json = true;
506
+ continue;
507
+ }
508
+ const value = rest[++index];
509
+ if (!['--min-repeats', '--limit', '--cards-out', ...(fromStore ? ['--config', '--days'] : [])].includes(flag) || !value || value.startsWith('--') || values[flag] !== undefined)
510
+ throw new Error(usage);
511
+ values[flag] = value;
512
+ }
513
+ const number = (flag, fallback) => { const value = values[flag] === undefined ? fallback : Number(values[flag]); if (!Number.isSafeInteger(value) || value < 1)
514
+ throw new Error(`${flag} must be a whole number of 1 or more`); return value; };
515
+ let records;
516
+ if (fromStore) {
517
+ if (!values['--config'])
518
+ throw new Error(usage);
519
+ const settings = (await loadConfig(values['--config'])).value;
520
+ const chat = validateChat(settings.chat, validateReaderFilters(settings.readerFilters));
521
+ if (!chat?.budget?.store || !chat.log)
522
+ throw new Error('The config needs chat.budget.store and chat.log to read the hosted log');
523
+ records = await readKvLog(envRedis(chat.budget.store), number('--days', chat.log.retentionDays));
524
+ }
525
+ else
526
+ records = await readLog(subcommand);
527
+ const report = analyzeLog(records, { minRepeats: number('--min-repeats', 2) });
528
+ process.stdout.write(json ? JSON.stringify(report, null, 2) + '\n' : formatReport(report, number('--limit', 15)));
529
+ if (values['--cards-out']) {
530
+ if (!report.cards.length)
531
+ process.stderr.write('No question qualifies for a card yet, so no file was written\n');
532
+ else {
533
+ // A new file only: this is a starting list to review, and it must never replace answers.yaml.
534
+ const { writeFile } = await import('node:fs/promises');
535
+ await writeFile(values['--cards-out'], `# Questions from the ask log that are worth answering ahead of time. Review them, then move the ones you want into your questions file.\n${yamlStringify(report.cards.map(card => card.question))}`, { flag: 'wx' });
536
+ process.stderr.write(`Wrote ${report.cards.length} question${report.cards.length === 1 ? '' : 's'} to ${values['--cards-out']}\n`);
537
+ }
538
+ }
539
+ }
540
+ else if (command === 'answers') {
541
+ const usage = 'Usage: shoalrun answers <site-directory> --questions FILE [--config FILE] [--model MODEL] [--reader-view FACET=CHOICE[,CHOICE]]...';
542
+ if (!subcommand || subcommand.startsWith('--'))
543
+ throw new Error(usage);
544
+ const values = {};
545
+ const views = [];
546
+ for (let index = 0; index < rest.length; index++) {
547
+ const flag = rest[index];
548
+ const value = rest[++index];
549
+ if (flag === '--reader-view' && value && !value.startsWith('--')) {
550
+ views.push(value);
551
+ continue;
552
+ }
553
+ if (!['--questions', '--config', '--model'].includes(flag) || !value || value.startsWith('--'))
554
+ throw new Error(usage);
555
+ if (values[flag] !== undefined)
556
+ throw new Error(`Duplicate answers option ${flag}`);
557
+ values[flag] = value;
558
+ }
559
+ if (!values['--questions'])
560
+ throw new Error(usage);
561
+ 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'); });
562
+ const questions = parseCardQuestions(await readFile(values['--questions'], 'utf8'));
563
+ // Cards are polished answers, so they come from the model, not from a direct excerpt, and never from another card.
564
+ const setup = await prepareAsk({ siteDirectory: subcommand, configFile, model: values['--model'], noCards: true, noDirect: true, readerView: parseReaderView(views) });
565
+ for (const note of setup.notes)
566
+ process.stderr.write(`${note}\n`);
567
+ if (!setup.embedTexts || !setup.embedding)
568
+ throw new Error('Answer cards need semantic search. Run shoalrun index --embed first');
569
+ const built = await buildCards({ questions, ask: question => askQuestion({ question, ...setup.options }), embed: setup.embedTexts, digestOf: id => setup.options.retriever.digestOf(id), embedding: setup.embedding, variant: setup.options.variant, readerSelection: setup.options.readerSelection, progress: message => process.stderr.write(`${message}\n`) });
570
+ const output = await writeCards(subcommand, built.file);
571
+ process.stdout.write(JSON.stringify({ status: 'ok', cards: built.file.cards.length, rejected: built.rejected, output }, null, 2) + '\n');
572
+ }
573
+ else if (command === 'check') {
574
+ const args = [subcommand, ...rest].filter((value) => value !== undefined);
575
+ const json = args.includes('--json');
576
+ const positional = args.filter(value => value !== '--json');
577
+ if (args.filter(value => value === '--json').length > 1 || positional.length > 1 || positional.some(value => value.startsWith('--')))
578
+ throw new Error('Usage: shoalrun check [config] [--json]');
579
+ const report = await auditProject(positional[0] ?? await discoverConfig(process.cwd()));
580
+ if (json)
581
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
582
+ else {
583
+ for (const result of report.results) {
584
+ process.stdout.write(`${result.status === 'ok' ? 'PASS' : 'FAIL'} ${result.id}\n`);
585
+ for (const finding of result.findings)
586
+ process.stdout.write(` ${finding.target}: ${finding.message}\n`);
587
+ }
588
+ process.stdout.write(`${report.status === 'ok' ? 'Checks passed.' : 'Checks failed. Fix the findings above and rerun shoalrun check.'}\n`);
589
+ }
590
+ if (report.status !== 'ok')
591
+ process.exitCode = 1;
592
+ }
593
+ else if (command === 'audit') {
594
+ const args = [subcommand, ...rest].filter((v) => v !== undefined);
595
+ const config = args[0] && !args[0].startsWith('--') ? args.shift() : await discoverConfig(process.cwd());
596
+ if (args.length)
597
+ throw new Error('Usage: shoalrun audit [config]');
598
+ const report = await auditProject(config);
599
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
600
+ if (report.status !== 'ok')
601
+ process.exitCode = 1;
602
+ }
603
+ else if (command === 'scaffold') {
604
+ if (!subcommand)
605
+ throw new Error('Usage: shoalrun scaffold <template> -n <target> [--config FILE] [--id ID] [--title TITLE] [--summary SUMMARY] [--slug SLUG] [--operation ID]');
606
+ const shortForm = rest.includes('-n') || rest.includes('--new');
607
+ if (!shortForm && (!rest[0] || !rest[1]))
608
+ throw new Error('Usage: shoalrun scaffold <template> -n <target> [--config FILE]');
609
+ const options = {};
610
+ const operations = [];
611
+ for (let index = shortForm ? 0 : 2; index < rest.length; index += 2) {
612
+ const flag = rest[index];
613
+ const value = rest[index + 1];
614
+ if ((!flag?.startsWith('--') && flag !== '-n') || !value || value.startsWith('--'))
615
+ throw new Error(`Scaffold option ${flag ?? ''} needs a value`);
616
+ const name = flag === '-n' ? 'new' : flag.slice(2);
617
+ if (!['new', 'config', 'id', 'title', 'summary', 'slug', 'channel', 'version', 'language', 'operation'].includes(name))
618
+ throw new Error(`Unknown scaffold option ${flag}`);
619
+ if (name === 'operation')
620
+ operations.push(value);
621
+ else if (options[name] !== undefined)
622
+ throw new Error(`Duplicate scaffold option ${flag}`);
623
+ else
624
+ options[name] = value;
625
+ }
626
+ if (shortForm && !options.new)
627
+ throw new Error('Scaffold needs -n or --new with a target file');
628
+ 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 } : {}) };
629
+ const result = shortForm
630
+ ? await scaffoldFromPath(options.config ?? await discoverConfig(process.cwd()), subcommand, options.new, Object.fromEntries(Object.entries(overrides).filter(([, value]) => value !== undefined)))
631
+ : await scaffold(rest[0], subcommand, rest[1], overrides);
632
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
633
+ }
634
+ else if (command === 'config' && subcommand === 'resolve') {
635
+ const config = await loadConfig(rest[0] ?? 'docs.config.yaml');
636
+ process.stdout.write(JSON.stringify({ value: config.value, digest: config.digest, dependencies: config.dependencies }, null, 2) + '\n');
637
+ }
638
+ else if (command === 'config' && subcommand === 'validate') {
639
+ const config = await loadConfig(rest[0] ?? 'docs.config.yaml');
640
+ validateAuthoringGuidance(config.value.authoring);
641
+ validateRetrieval(config.value.retrieval);
642
+ resolveAgentDiscovery(configField(config.value.site, 'agentDiscovery'));
643
+ validateChat(config.value.chat, validateReaderFilters(config.value.readerFilters));
644
+ const contrast = await checkThemeContrast(rest[0] ?? 'docs.config.yaml');
645
+ process.stdout.write(JSON.stringify({ status: 'ok', digest: config.digest, dependencies: config.dependencies.length, contrast: { status: 'ok', palette: contrast.palette, modes: contrast.modes } }, null, 2) + '\n');
646
+ }
647
+ else if (command === 'config' && subcommand === 'graph') {
648
+ const config = await loadConfig(rest[0] ?? 'docs.config.yaml');
649
+ process.stdout.write(JSON.stringify({ root: rest[0] ?? 'docs.config.yaml', dependencies: config.dependencies }, null, 2) + '\n');
650
+ }
651
+ else if (command === 'config' && subcommand === 'explain') {
652
+ const config = await loadConfig(rest[1] ?? 'docs.config.yaml');
653
+ process.stdout.write(JSON.stringify(explain(config, rest[0]), null, 2) + '\n');
654
+ }
655
+ else if (command === 'api' && subcommand === 'review') {
656
+ if (rest.length !== 3 || rest[1] !== '--output' || !rest[0] || !rest[2])
657
+ throw new Error('Usage: shoalrun api review <config-file> --output <local-directory>');
658
+ const result = await compile(rest[0], rest[2], {}, { apiReview: 'report' });
659
+ process.stdout.write(JSON.stringify({ status: 'review-needed', directory: path.resolve(rest[2]), apis: result.apiPublicationReview }, null, 2) + '\n');
660
+ }
661
+ else if (command === 'api' && subcommand === 'import') {
662
+ if (rest.length !== 3 || rest[1] !== '--output' || !rest[0] || !rest[2])
663
+ throw new Error('Usage: shoalrun api import <https-openapi-url> --output <snapshot-directory>');
664
+ process.stdout.write(JSON.stringify(await importRemoteOpenApi(rest[0], rest[2]), null, 2) + '\n');
665
+ }
666
+ else if (command === 'api' && subcommand === 'refresh') {
667
+ if (!rest[0] || (rest.length !== 1 && (rest.length !== 3 || rest[1] !== '--output' || !rest[2])))
668
+ throw new Error('Usage: shoalrun api refresh <snapshot-directory> [--output <new-snapshot-directory>]');
669
+ process.stdout.write(JSON.stringify(await refreshRemoteOpenApi(rest[0], { output: rest[2] }), null, 2) + '\n');
670
+ }
671
+ else if (command === 'api' && subcommand === 'audit') {
672
+ if (!rest[0])
673
+ throw new Error('Usage: shoalrun api audit <openapi-file>');
674
+ const result = await auditReference(rest[0]);
675
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
676
+ if (result.status !== 'ok')
677
+ process.exitCode = 1;
678
+ }
679
+ else if (command === 'api' && subcommand === 'focused-audit') {
680
+ if (!rest[0])
681
+ throw new Error('Usage: shoalrun api focused-audit <site-directory>');
682
+ const result = await auditFocusedContracts(rest[0]);
683
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
684
+ if (result.status !== 'ok')
685
+ process.exitCode = 1;
686
+ }
687
+ else if (command === 'api' && subcommand === 'select') {
688
+ if (!rest[0] || !rest[1] || rest[2] !== '--output' || !rest[3] || rest.length !== 4)
689
+ throw new Error('Usage: shoalrun api select <api-id> <config> --output <selection.yaml>');
690
+ const result = await selectApiReferences(rest[1], rest[0], rest[3]);
691
+ process.stdout.write(JSON.stringify({ status: 'ok', ...result }, null, 2) + '\n');
692
+ }
693
+ else if (command === 'api' && subcommand === 'materialize') {
694
+ const usage = 'Usage: shoalrun api materialize <api-id> <config> (--all | --operation ID | --route "METHOD /path")... [--output content/subdirectory]';
695
+ if (!rest[0] || !rest[1] || rest[0].startsWith('--') || rest[1].startsWith('--'))
696
+ throw new Error(usage);
697
+ const options = { operations: [], routes: [] };
698
+ for (let index = 2; index < rest.length; index++) {
699
+ const flag = rest[index];
700
+ if (flag === '--all') {
701
+ if (options.all)
702
+ throw new Error('Duplicate --all');
703
+ options.all = true;
704
+ continue;
705
+ }
706
+ const value = rest[++index];
707
+ if (!['--operation', '--route', '--output'].includes(flag) || !value || value.startsWith('--'))
708
+ throw new Error(usage);
709
+ if (flag === '--operation')
710
+ options.operations.push(value);
711
+ else if (flag === '--route')
712
+ options.routes.push(value);
713
+ else if (options.output)
714
+ throw new Error('Duplicate --output');
715
+ else
716
+ options.output = value;
717
+ }
718
+ const result = await materializeApiPages(rest[1], rest[0], options);
719
+ process.stdout.write(JSON.stringify({ status: 'ok', ...result }, null, 2) + '\n');
720
+ }
721
+ else if (command === 'operation' && subcommand === 'inspect') {
722
+ const usage = 'Usage: shoalrun operation inspect <id> [config] [--channel C] [--version V] [--language L]';
723
+ if (!rest[0] || rest[0].startsWith('--'))
724
+ throw new Error(usage);
725
+ const hasConfig = rest[1] !== undefined && !rest[1].startsWith('--');
726
+ const filters = {};
727
+ for (let index = hasConfig ? 2 : 1; index < rest.length; index += 2) {
728
+ const flag = rest[index];
729
+ const value = rest[index + 1];
730
+ const name = flag.slice(2);
731
+ if (!['--channel', '--version', '--language'].includes(flag))
732
+ throw new Error(`Unknown operation inspect option ${flag}`);
733
+ if (!value || value.startsWith('--'))
734
+ throw new Error(`Operation inspect option ${flag} needs a value`);
735
+ if (filters[name] !== undefined)
736
+ throw new Error(`Duplicate operation inspect option ${flag}`);
737
+ filters[name] = value;
738
+ }
739
+ const manifest = await compile(hasConfig ? rest[1] : 'docs.config.yaml');
740
+ 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));
741
+ process.stdout.write(JSON.stringify({ status: matches.length ? 'ok' : 'missing-variant', operationId: rest[0], bindings: matches }, null, 2) + '\n');
742
+ }
743
+ else {
744
+ 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]');
745
+ }
746
+ }
747
+ catch (error) {
748
+ process.stderr.write(JSON.stringify({ status: 'error', message: error.message }) + '\n');
749
+ process.exitCode = 1;
750
+ }