@shoalrun/cli 0.1.0-alpha.17 → 0.1.0-alpha.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUTHORING.md +29 -0
- package/CHANGELOG.md +23 -0
- package/DEPLOYMENT-PROFILES.md +96 -5
- package/README.md +58 -2
- package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +21 -17
- package/agent-docs/SNAPSHOT.json +5 -5
- package/agent-docs/api-docs/focused-contracts.md +4 -4
- package/agent-docs/api-docs/generate.md +11 -11
- package/agent-docs/api-docs/generate.sections/add-useful-examples.md +3 -3
- package/agent-docs/api-docs/generate.sections/choose-generated-references-or-mdx.md +4 -4
- package/agent-docs/api-docs/generate.sections/describe-filters-that-do-not-use-their-openapi-parameter-name.md +1 -1
- package/agent-docs/api-docs/generate.sections/generate-many-pages-selectively.md +2 -2
- package/agent-docs/api-docs/generate.sections/link-guides-to-api-references.md +1 -1
- package/agent-docs/api-docs/generate.sections/map-extension-values-to-shoalrun-status.md +1 -1
- package/agent-docs/api-docs/generate.sections/override-generated-reference-order-in-navigation.md +4 -4
- package/agent-docs/api-docs/generate.sections/related-reading.md +1 -1
- package/agent-docs/api-docs/generate.sections/use-a-template-for-editorial-context.md +2 -2
- package/agent-docs/api-docs/support.md +7 -7
- package/agent-docs/author/add-page.md +3 -3
- package/agent-docs/author/agent-overview.md +3 -3
- package/agent-docs/author/agent-workflow.md +7 -7
- package/agent-docs/author/analytics.md +27 -27
- package/agent-docs/author/analytics.sections/adapter-exports-and-consent.md +3 -3
- package/agent-docs/author/analytics.sections/built-in-events.md +15 -15
- package/agent-docs/author/analytics.sections/configure-an-adapter.md +1 -1
- package/agent-docs/author/analytics.sections/custom-interactions.md +2 -2
- package/agent-docs/author/analytics.sections/event-format.md +2 -2
- package/agent-docs/author/analytics.sections/html-markdown-and-agents.md +4 -4
- package/agent-docs/author/analytics.sections/inspect-events-locally.md +2 -2
- package/agent-docs/author/analytics.sections/map-events-to-your-service.md +3 -3
- package/agent-docs/author/analytics.sections/posthog-example.md +3 -3
- package/agent-docs/author/analytics.sections/related-reading.md +1 -1
- package/agent-docs/author/authoring-agent.md +3 -3
- package/agent-docs/author/coding-agent.md +4 -4
- package/agent-docs/author/components/api-embeds.md +6 -6
- package/agent-docs/author/components/api-embeds.sections/apiexample.md +3 -3
- package/agent-docs/author/components/api-embeds.sections/html-markdown-and-agents.md +1 -1
- package/agent-docs/author/components/api-embeds.sections/related-reading.md +1 -1
- package/agent-docs/author/components/badge.md +2 -2
- package/agent-docs/author/components/callout.md +2 -2
- package/agent-docs/author/components/cards.md +16 -16
- package/agent-docs/author/components/cards.sections/add-a-lucide-icon.md +4 -4
- package/agent-docs/author/components/cards.sections/build-a-collection.md +7 -7
- package/agent-docs/author/components/cards.sections/curate-a-reading-list.md +9 -9
- package/agent-docs/author/components/cards.sections/html-markdown-and-agents.md +3 -3
- package/agent-docs/author/components/cards.sections/link-to-one-document.md +3 -3
- package/agent-docs/author/components/cards.sections/override-card-text.md +5 -5
- package/agent-docs/author/components/cards.sections/related-reading.md +3 -3
- package/agent-docs/author/components/code-blocks.md +2 -2
- package/agent-docs/author/components/collapsible.md +3 -3
- package/agent-docs/author/components/cookbook-chooser.md +5 -5
- package/agent-docs/author/components/custom/react.md +8 -8
- package/agent-docs/author/components/custom/react.sections/html-markdown-and-agents.md +3 -3
- package/agent-docs/author/components/custom/react.sections/interactive-react-example.md +2 -2
- package/agent-docs/author/components/custom/react.sections/registration.md +1 -1
- package/agent-docs/author/components/custom/react.sections/related-reading.md +1 -1
- package/agent-docs/author/components/custom/react.sections/share-the-model-with-the-browser.md +3 -3
- package/agent-docs/author/components/custom/react.sections/where-the-content-lives.md +3 -3
- package/agent-docs/author/components/custom.md +7 -7
- package/agent-docs/author/components/definition-list.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/basic-shapes.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/flows-and-structures.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/html-markdown-and-agents.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/layout-engines.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/related-reading.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/sequences-and-grids.md +2 -2
- package/agent-docs/author/components/diagrams/d2-gallery.sections/styles-and-code.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.md +3 -3
- package/agent-docs/author/components/diagrams/pele-gallery.sections/charts-and-planning.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.sections/flowchart-shapes.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.sections/flows-and-behavior.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.sections/html-markdown-and-agents.md +3 -3
- package/agent-docs/author/components/diagrams/pele-gallery.sections/related-reading.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.sections/specialized-diagrams.md +2 -2
- package/agent-docs/author/components/diagrams/pele-gallery.sections/systems-and-structures.md +2 -2
- package/agent-docs/author/components/diagrams.md +8 -8
- package/agent-docs/author/components/doc-link.md +3 -3
- package/agent-docs/author/components/fields.md +18 -18
- package/agent-docs/author/components/file-tree.md +2 -2
- package/agent-docs/author/components/images.md +5 -5
- package/agent-docs/author/components/info-hint.md +3 -3
- package/agent-docs/author/components/kbd.md +2 -2
- package/agent-docs/author/components/math.md +2 -2
- package/agent-docs/author/components/only.md +3 -3
- package/agent-docs/author/components/progress.md +3 -3
- package/agent-docs/author/components/steps.md +2 -2
- package/agent-docs/author/components/tables.md +2 -2
- package/agent-docs/author/components/tabs.md +5 -5
- package/agent-docs/author/components/timeline.md +2 -2
- package/agent-docs/author/components/tooltips.md +2 -2
- package/agent-docs/author/components/walkthroughs.md +2 -2
- package/agent-docs/author/components/walkthroughs.sections/attributes.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/build-up-code.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/choose-a-layout.md +2 -2
- package/agent-docs/author/components/walkthroughs.sections/explain-one-file.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/html-markdown-and-agents.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/related-reading.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/syntax.md +1 -1
- package/agent-docs/author/components/walkthroughs.sections/take-code-from-a-file.md +1 -1
- package/agent-docs/author/components.md +2 -2
- package/agent-docs/author/content.md +3 -3
- package/agent-docs/author/cookbooks.md +9 -9
- package/agent-docs/author/css.md +4 -4
- package/agent-docs/author/css.sections/borders-fields-and-navigation-tokens.md +3 -3
- package/agent-docs/author/css.sections/core-color-tokens.md +3 -3
- package/agent-docs/author/css.sections/html-markdown-and-agents.md +4 -4
- package/agent-docs/author/css.sections/page-attributes.md +3 -3
- package/agent-docs/author/css.sections/page-transitions.md +3 -3
- package/agent-docs/author/css.sections/responsive-behavior.md +3 -3
- package/agent-docs/author/css.sections/status-code-and-callout-tokens.md +3 -3
- package/agent-docs/author/css.sections/typography-shape-and-width-tokens.md +3 -3
- package/agent-docs/author/custom-metadata.md +13 -13
- package/agent-docs/author/custom-metadata.sections/add-a-custom-page-field.md +4 -4
- package/agent-docs/author/custom-metadata.sections/choose-text-for-each-surface.md +3 -3
- package/agent-docs/author/custom-metadata.sections/preview-changes-to-metadata-providers.md +2 -2
- package/agent-docs/author/custom-metadata.sections/read-metadata-from-a-project-module.md +3 -3
- package/agent-docs/author/custom-metadata.sections/related-reading.md +1 -1
- package/agent-docs/author/design-templates.md +3 -3
- package/agent-docs/author/design-writing-guides.md +3 -3
- package/agent-docs/author/frontmatter-reference.md +45 -6
- package/agent-docs/author/frontmatter-reference.sections/categorize-connect-and-present-the-page.md +64 -0
- package/agent-docs/author/frontmatter-reference.sections/choose-a-publication-and-visibility.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/control-output-details.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/feature-availability.md +59 -0
- package/agent-docs/author/frontmatter-reference.sections/global-defaults-and-enforced-values.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/html-markdown-and-agents.md +3 -3
- package/agent-docs/author/frontmatter-reference.sections/identify-and-route-a-page.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/point-agents-to-it.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/product-publication-fields.md +37 -0
- package/agent-docs/author/frontmatter-reference.sections/project-defined-fields.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/related-reading.md +2 -2
- package/agent-docs/author/frontmatter-reference.sections/use-the-local-files-while-authoring.md +4 -4
- package/agent-docs/author/frontmatter-reference.sections/when-the-files-update.md +2 -2
- package/agent-docs/author/frontmatter.md +13 -13
- package/agent-docs/author/frontmatter.sections/audience-badges.md +3 -3
- package/agent-docs/author/frontmatter.sections/give-deprecation-guidance.md +4 -4
- package/agent-docs/author/frontmatter.sections/global-defaults-and-enforced-values.md +1 -1
- package/agent-docs/author/frontmatter.sections/optional-native-fields.md +4 -4
- package/agent-docs/author/frontmatter.sections/publication-fields.md +2 -2
- package/agent-docs/author/frontmatter.sections/publishing-policy.md +1 -1
- package/agent-docs/author/frontmatter.sections/related-metadata-tasks.md +1 -1
- package/agent-docs/author/frontmatter.sections/related-reading.md +1 -1
- package/agent-docs/author/frontmatter.sections/required-after-inheritance.md +1 -1
- package/agent-docs/author/frontmatter.sections/seo-fields.md +2 -2
- package/agent-docs/author/frontmatter.sections/validation-rules.md +3 -3
- package/agent-docs/author/markdown-metadata.md +20 -20
- package/agent-docs/author/navigation.md +12 -12
- package/agent-docs/author/navigation.sections/arrange-authored-pages.md +4 -4
- package/agent-docs/author/navigation.sections/fill-an-api-tag-group.md +2 -2
- package/agent-docs/author/navigation.sections/hide-group-page-counts.md +4 -4
- package/agent-docs/author/navigation.sections/html-markdown-and-agents.md +4 -4
- package/agent-docs/author/navigation.sections/local-api-preview.md +2 -2
- package/agent-docs/author/navigation.sections/mix-guides-and-api-references.md +3 -3
- package/agent-docs/author/navigation.sections/optionally-split-a-large-menu-into-files.md +2 -2
- package/agent-docs/author/navigation.sections/reach-navigation-while-reading.md +2 -2
- package/agent-docs/author/navigation.sections/related-reading.md +2 -2
- package/agent-docs/author/navigation.sections/split-navigation-into-tabs.md +4 -4
- package/agent-docs/author/navigation.sections/subject-lifecycle-labels.md +3 -3
- package/agent-docs/author/reader-views.md +9 -9
- package/agent-docs/author/reader-views.sections/configure-the-choices.md +2 -2
- package/agent-docs/author/reader-views.sections/connect-your-own-control.md +1 -1
- package/agent-docs/author/reader-views.sections/how-it-works-for-agents.md +3 -3
- package/agent-docs/author/reader-views.sections/mark-pages.md +3 -3
- package/agent-docs/author/reader-views.sections/mark-sections-and-add-an-entry-choice.md +2 -2
- package/agent-docs/author/reader-views.sections/place-filter-controls.md +2 -2
- package/agent-docs/author/reader-views.sections/try-the-controls-here.md +2 -2
- package/agent-docs/author/recipe-drafts.md +5 -5
- package/agent-docs/author/recipe-drafts.sections/1-write-one-reusable-step.md +2 -2
- package/agent-docs/author/recipe-drafts.sections/2-list-the-steps-for-one-complete-goal.md +2 -2
- package/agent-docs/author/recipe-drafts.sections/3-generate-a-draft-and-review-it.md +1 -1
- package/agent-docs/author/recipe-drafts.sections/4-maintain-shoalrun-s-published-recipe-snapshots.md +2 -2
- package/agent-docs/author/recipe-drafts.sections/related-reading.md +1 -1
- package/agent-docs/author/recipe-drafts.sections/start-an-ingredient-from-an-api-example.md +2 -2
- package/agent-docs/author/recipes.md +7 -7
- package/agent-docs/author/recipes.sections/how-agents-use-this.md +2 -2
- package/agent-docs/author/recipes.sections/one-example-from-shoalrun.md +2 -2
- package/agent-docs/author/recipes.sections/related-reading.md +1 -1
- package/agent-docs/author/recipes.sections/try-a-complete-workflow.md +1 -1
- package/agent-docs/author/recipes.sections/use-recipes-for-task-oriented-how-tos.md +3 -3
- package/agent-docs/author/recipes.sections/what-changing-an-ingredient-updates.md +2 -2
- package/agent-docs/author/recipes.sections/what-each-file-does.md +1 -1
- package/agent-docs/author/recipes.sections/what-happens-and-when.md +2 -2
- package/agent-docs/author/related-reading.md +11 -11
- package/agent-docs/author/related-reading.sections/automatic-footers.md +3 -3
- package/agent-docs/author/related-reading.sections/declare-relationships.md +3 -3
- package/agent-docs/author/related-reading.sections/display-related-documents.md +3 -3
- package/agent-docs/author/related-reading.sections/html-markdown-and-agents.md +1 -1
- package/agent-docs/author/related-reading.sections/inspect-output-and-changes.md +2 -2
- package/agent-docs/author/related-reading.sections/reading-paths-in-section-markdown.md +3 -3
- package/agent-docs/author/related-reading.sections/related-reading.md +1 -1
- package/agent-docs/author/related-reading.sections/where-relationship-explanations-come-from.md +2 -2
- package/agent-docs/author/release-notes.md +8 -8
- package/agent-docs/author/search.md +43 -39
- package/agent-docs/author/search.sections/agent-and-mcp-search-scope.md +12 -8
- package/agent-docs/author/search.sections/choose-a-provider.md +8 -8
- package/agent-docs/author/search.sections/cli-and-mcp-ranking-details.md +4 -4
- package/agent-docs/author/search.sections/enable-included-semantic-search.md +5 -5
- package/agent-docs/author/search.sections/hosted-semantic-search-limits.md +3 -3
- package/agent-docs/author/search.sections/html-markdown-and-agents.md +3 -3
- package/agent-docs/author/search.sections/lexical-search.md +6 -6
- package/agent-docs/author/search.sections/local-semantic-preview.md +3 -3
- package/agent-docs/author/search.sections/read-a-search-result-with-an-agent.md +2 -2
- package/agent-docs/author/search.sections/related-reading.md +2 -2
- package/agent-docs/author/search.sections/reuse-the-lexical-index.md +5 -5
- package/agent-docs/author/search.sections/turn-search-off.md +3 -3
- package/agent-docs/author/search.sections/use-the-search-box.md +2 -2
- package/agent-docs/author/search.sections/write-a-custom-provider.md +11 -11
- package/agent-docs/author/snippets.md +3 -3
- package/agent-docs/author/taxonomy.md +3 -3
- package/agent-docs/author/templates.md +16 -14
- package/agent-docs/author/templates.sections/built-in-feature-templates.md +2 -2
- package/agent-docs/author/templates.sections/built-in-templates.md +2 -2
- package/agent-docs/author/templates.sections/choose-formatting-enforcement-for-your-project.md +7 -7
- package/agent-docs/author/templates.sections/create-or-edit-a-project-template.md +8 -6
- package/agent-docs/author/templates.sections/keep-the-four-shapes-distinct.md +2 -2
- package/agent-docs/author/templates.sections/project-added-templates.md +3 -3
- package/agent-docs/author/templates.sections/related-reading.md +2 -2
- package/agent-docs/author/templates.sections/scaffold-a-page.md +2 -2
- package/agent-docs/author/templates.sections/short-cli-and-derived-values.md +3 -3
- package/agent-docs/author/templates.sections/what-every-template-gives-you.md +3 -3
- package/agent-docs/author/workspace/commands.md +4 -4
- package/agent-docs/author/workspace.md +7 -7
- package/agent-docs/author/writing-style.md +33 -18
- package/agent-docs/author/writing-style.sections/adapt-this-example.md +2 -2
- package/agent-docs/author/writing-style.sections/choose-components-by-reader-need.md +3 -3
- package/agent-docs/author/writing-style.sections/evidence-and-uncertainty.md +4 -4
- package/agent-docs/author/writing-style.sections/example-audience-and-scope.md +2 -2
- package/agent-docs/author/writing-style.sections/feature-availability.md +20 -7
- package/agent-docs/author/writing-style.sections/ingredients-recipes-and-cookbooks.md +5 -5
- package/agent-docs/author/writing-style.sections/page-purpose-and-structure.md +4 -4
- package/agent-docs/author/writing-style.sections/procedures-and-examples.md +4 -4
- package/agent-docs/author/writing-style.sections/related-reading.md +2 -2
- package/agent-docs/author/writing-style.sections/review-a-draft.md +3 -3
- package/agent-docs/author/writing-style.sections/reviewed-writing-examples.md +2 -2
- package/agent-docs/author/writing-style.sections/voice-and-explanations.md +4 -2
- package/agent-docs/changelog/2026-10-14-agent-readiness.md +2 -2
- package/agent-docs/changelog/2026-10-15-evaluation-builds.md +9 -9
- package/agent-docs/changelog/2026-10-16-navigation-layouts.md +4 -4
- package/agent-docs/changelog/2026-10-17-mcp-hosting.md +2 -2
- package/agent-docs/changelog/2026-10-18-search-and-tooltips.md +3 -3
- package/agent-docs/changelog/2026-10-19-visual-navigation.md +3 -3
- package/agent-docs/changelog/2026-10-25.md +2 -2
- package/agent-docs/changelog/2026-10-26.md +4 -4
- package/agent-docs/changelog/2026-10-27.md +1 -1
- package/agent-docs/changelog/2026-10-28.md +3 -3
- package/agent-docs/changelog/2026-10-30.md +1 -1
- package/agent-docs/changelog/2026-11-03.md +5 -5
- package/agent-docs/changelog/2026-11-04-runtime-packaging.md +46 -0
- package/agent-docs/changelog/authoring-preview.md +3 -3
- package/agent-docs/changelog/authoring-search.md +1 -1
- package/agent-docs/changelog/authoring-tools.md +2 -2
- package/agent-docs/changelog/product-publications.md +60 -0
- package/agent-docs/changelog/working-tree-skill.md +1 -1
- package/agent-docs/changelog.md +17 -1
- package/agent-docs/chat/checks.md +11 -11
- package/agent-docs/chat/checks.sections/answer-ahead-of-time.md +1 -1
- package/agent-docs/chat/checks.sections/answer-for-one-audience.md +2 -2
- package/agent-docs/chat/checks.sections/answer-without-a-model.md +2 -2
- package/agent-docs/chat/checks.sections/follow-up-questions.md +2 -2
- package/agent-docs/chat/checks.sections/how-an-answer-is-checked.md +3 -3
- package/agent-docs/chat/checks.sections/questions-with-several-parts.md +3 -3
- package/agent-docs/chat/checks.sections/related-reading.md +1 -1
- package/agent-docs/chat/checks.sections/reuse-answers.md +4 -4
- package/agent-docs/chat/host.md +8 -8
- package/agent-docs/chat/host.sections/cap-the-daily-spend.md +2 -2
- package/agent-docs/chat/host.sections/keep-a-record-of-questions.md +3 -3
- package/agent-docs/chat/host.sections/related-reading.md +2 -2
- package/agent-docs/chat/passage-index.md +17 -17
- package/agent-docs/chat/passage-index.sections/build-the-index.md +2 -2
- package/agent-docs/chat/passage-index.sections/embed-passages.md +3 -3
- package/agent-docs/chat/passage-index.sections/how-the-default-chunker-splits-a-page.md +2 -2
- package/agent-docs/chat/passage-index.sections/limits.md +2 -2
- package/agent-docs/chat/passage-index.sections/passage-ids-and-links.md +3 -3
- package/agent-docs/chat/passage-index.sections/related-reading.md +2 -2
- package/agent-docs/chat/passage-index.sections/what-a-passage-contains.md +15 -15
- package/agent-docs/chat/prepared-answers.md +4 -4
- package/agent-docs/chat/settings.md +3 -3
- package/agent-docs/chat/settings.sections/choose-the-scorer.md +1 -1
- package/agent-docs/chat/settings.sections/configure-chat.md +1 -1
- package/agent-docs/chat/settings.sections/configure-retrieval.md +1 -1
- package/agent-docs/chat/settings.sections/related-reading.md +1 -1
- package/agent-docs/chat/settings.sections/send-extra-request-fields.md +2 -2
- package/agent-docs/chat/settings.sections/use-more-than-one-model.md +2 -2
- package/agent-docs/chat/settings.sections/when-the-scorer-is-down.md +1 -1
- package/agent-docs/chat/setup.md +2 -2
- package/agent-docs/chat.md +3 -3
- package/agent-docs/cli.md +73 -59
- package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +11 -7
- package/agent-docs/cli.sections/author-pages.md +16 -12
- package/agent-docs/cli.sections/build-and-serve.md +30 -18
- package/agent-docs/cli.sections/inspect-config-and-operations.md +13 -9
- package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +7 -3
- package/agent-docs/cli.sections/related-reading.md +6 -2
- package/agent-docs/cli.sections/search-and-chat.md +24 -18
- package/agent-docs/cli.sections/start-a-project.md +7 -3
- package/agent-docs/cli.sections/working-tree-authoring-tools.md +7 -3
- package/agent-docs/concepts.md +2 -2
- package/agent-docs/config/apis.md +2 -2
- package/agent-docs/config/content.md +3 -3
- package/agent-docs/config/content.sections/authoring.md +3 -3
- package/agent-docs/config/content.sections/badges.md +1 -1
- package/agent-docs/config/content.sections/callouts.md +1 -1
- package/agent-docs/config/content.sections/cookbooks.md +1 -1
- package/agent-docs/config/content.sections/frontmatter.md +1 -1
- package/agent-docs/config/content.sections/readerfilters.md +1 -1
- package/agent-docs/config/content.sections/related-reading.md +1 -1
- package/agent-docs/config/content.sections/relationships.md +1 -1
- package/agent-docs/config/content.sections/snippets.md +1 -1
- package/agent-docs/config/content.sections/templates.md +1 -1
- package/agent-docs/config/content.sections/variables.md +1 -1
- package/agent-docs/config/examples.md +4 -4
- package/agent-docs/config/examples.sections/feature-showcase.md +4 -4
- package/agent-docs/config/examples.sections/minimal-site.md +2 -2
- package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
- package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
- package/agent-docs/config/examples.sections/related-reading.md +2 -2
- package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
- package/agent-docs/config/integrations.md +4 -4
- package/agent-docs/config/outputs.md +22 -16
- package/agent-docs/config/outputs.sections/exports.md +19 -13
- package/agent-docs/config/outputs.sections/metadata.md +2 -2
- package/agent-docs/config/outputs.sections/related-reading.md +1 -1
- package/agent-docs/config/publishing.md +29 -19
- package/agent-docs/config/publishing.sections/navigation.md +2 -2
- package/agent-docs/config/publishing.sections/redirects.md +8 -8
- package/agent-docs/config/publishing.sections/related-reading.md +2 -2
- package/agent-docs/config/site.md +42 -18
- package/agent-docs/config/site.sections/related-reading.md +1 -1
- package/agent-docs/config/site.sections/theme.md +1 -1
- package/agent-docs/config.md +2 -2
- package/agent-docs/configuration.md +19 -19
- package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
- package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +5 -5
- package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
- package/agent-docs/configuration.sections/inspect-and-validate-changes.md +5 -5
- package/agent-docs/configuration.sections/related-reading.md +1 -1
- package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +5 -5
- package/agent-docs/configuration.sections/share-defaults-through-extends.md +3 -3
- package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
- package/agent-docs/configuration.sections/understand-the-three-stages.md +3 -3
- package/agent-docs/configuration.sections/understand-where-paths-point.md +2 -2
- package/agent-docs/connect/mcp.md +24 -15
- package/agent-docs/content-delivery/agents.md +6 -6
- package/agent-docs/content-delivery/api.md +29 -16
- package/agent-docs/content-delivery/client.md +14 -8
- package/agent-docs/content-delivery/http-api/operations/get-content-representation-fa1d2e3f.md +10 -2
- package/agent-docs/content-delivery/http-api/operations/get-content-representation-head-4052375c.md +10 -2
- package/agent-docs/content-delivery/http-api/operations/get-content-resource-849f1c49.md +537 -3
- package/agent-docs/content-delivery/http-api/operations/get-content-resource-head-0a352acd.md +10 -2
- package/agent-docs/content-delivery/http-api/operations/list-content-resources-8e977ec7.md +545 -3
- package/agent-docs/content-delivery/http-api/operations/list-content-resources-head-b67cbad9.md +10 -2
- package/agent-docs/content-delivery/http-api.md +21 -7
- package/agent-docs/content-delivery/manifest.md +30 -8
- package/agent-docs/content-delivery/publish.md +5 -5
- package/agent-docs/content-delivery/render.md +6 -6
- package/agent-docs/content-delivery/rest.md +16 -8
- package/agent-docs/content-delivery/sections.md +11 -11
- package/agent-docs/content-delivery/select.md +6 -6
- package/agent-docs/content-delivery.md +4 -4
- package/agent-docs/contribute/agent-skills.md +3 -3
- package/agent-docs/cookbooks/authoring.md +3 -3
- package/agent-docs/cookbooks/site-workflows.md +2 -2
- package/agent-docs/cookbooks/welcome-email.md +3 -3
- package/agent-docs/documents.json +2415 -1936
- package/agent-docs/example-api/cedar.md +4 -4
- package/agent-docs/features.md +49 -0
- package/agent-docs/glossary.md +22 -22
- package/agent-docs/index.md +5 -5
- package/agent-docs/ingredients/audit-site.md +2 -2
- package/agent-docs/ingredients/build-site.md +2 -2
- package/agent-docs/ingredients/complete-page.md +2 -2
- package/agent-docs/ingredients/refresh-agent-bundle.md +2 -2
- package/agent-docs/non-goals.md +4 -4
- package/agent-docs/provenance.json +10 -4
- package/agent-docs/publish/agent-discovery.md +8 -2
- package/agent-docs/publish/agent-friendliness.md +21 -21
- package/agent-docs/publish/agent-friendliness.sections/discover-a-page-with-a-small-context-budget.md +5 -5
- package/agent-docs/publish/agent-friendliness.sections/distinguish-examples-from-a-real-service.md +5 -5
- package/agent-docs/publish/agent-friendliness.sections/evidence-has-a-scope.md +5 -5
- package/agent-docs/publish/agent-friendliness.sections/keep-shared-instructions-complete.md +5 -5
- package/agent-docs/publish/agent-friendliness.sections/related-reading.md +3 -3
- package/agent-docs/publish/agent-friendliness.sections/secret-handshake.md +3 -3
- package/agent-docs/publish/agent-friendliness.sections/try-the-page-controls.md +3 -3
- package/agent-docs/publish/agent-friendliness.sections/use-the-transport-your-client-supports.md +4 -4
- package/agent-docs/publish/agent-friendliness.sections/verify-the-page-and-detect-changes.md +9 -9
- package/agent-docs/publish/agent-friendliness.sections/what-an-agent-reads.md +5 -5
- package/agent-docs/publish/agent-friendliness.sections/what-happens-to-an-unsupported-component.md +4 -4
- package/agent-docs/publish/api-references.md +5 -5
- package/agent-docs/publish/api-references.sections/author-the-reference-page.md +2 -2
- package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -3
- package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +2 -2
- package/agent-docs/publish/api-references.sections/next-steps.md +2 -2
- package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +2 -2
- package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +2 -2
- package/agent-docs/publish/api-references.sections/register-the-operation.md +2 -2
- package/agent-docs/publish/api-references.sections/related-reading.md +2 -2
- package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -3
- package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -3
- package/agent-docs/publish/audit.md +8 -8
- package/agent-docs/publish/audit.sections/add-project-tests.md +2 -2
- package/agent-docs/publish/audit.sections/check-agent-evaluation-reports.md +2 -2
- package/agent-docs/publish/audit.sections/check-before-pushing.md +3 -3
- package/agent-docs/publish/audit.sections/connect-a-documentation-test-suite.md +2 -2
- package/agent-docs/publish/audit.sections/read-the-report.md +3 -3
- package/agent-docs/publish/audit.sections/related-reading.md +1 -1
- package/agent-docs/publish/content-export.md +37 -15
- package/agent-docs/publish/content-export.sections/assets-downloads-and-notices.md +4 -4
- package/agent-docs/publish/content-export.sections/check-the-result.md +2 -2
- package/agent-docs/publish/content-export.sections/inspect-the-manifest.md +3 -3
- package/agent-docs/publish/content-export.sections/prerequisites.md +4 -4
- package/agent-docs/publish/content-export.sections/related-reading.md +2 -2
- package/agent-docs/publish/content-export.sections/review-exported-api-material.md +3 -3
- package/agent-docs/publish/content-export.sections/try-the-help-drawer-example.md +2 -2
- package/agent-docs/publish/content-export.sections/what-the-representations-retain.md +4 -4
- package/agent-docs/publish/content-negotiation.md +10 -10
- package/agent-docs/publish/content-negotiation.sections/hosting-contract.md +2 -2
- package/agent-docs/publish/content-negotiation.sections/missing-pages.md +3 -3
- package/agent-docs/publish/content-negotiation.sections/related-reading.md +1 -1
- package/agent-docs/publish/content-negotiation.sections/validators-and-manifest-links.md +2 -2
- package/agent-docs/publish/content-negotiation.sections/verify-the-deployed-url.md +2 -2
- package/agent-docs/publish/content-negotiation.sections/what-if-the-host-cannot-negotiate.md +3 -3
- package/agent-docs/publish/content-negotiation.sections/what-shoalrun-builds-and-what-the-host-does.md +2 -2
- package/agent-docs/publish/content-negotiation.sections/why-this-matters.md +2 -2
- package/agent-docs/publish/deployment-check.md +6 -6
- package/agent-docs/publish/deployment-profiles.md +60 -26
- package/agent-docs/publish/deployment-profiles.sections/before-you-begin.md +5 -5
- package/agent-docs/publish/deployment-profiles.sections/build-and-inspect-the-edition.md +9 -9
- package/agent-docs/publish/deployment-profiles.sections/check-the-result.md +7 -7
- package/agent-docs/publish/deployment-profiles.sections/choose-navigation-labels.md +6 -6
- package/agent-docs/publish/deployment-profiles.sections/current-limits.md +7 -7
- package/agent-docs/publish/deployment-profiles.sections/define-the-shared-sku-manifest.md +6 -6
- package/agent-docs/publish/deployment-profiles.sections/html-markdown-and-agents.md +7 -7
- package/agent-docs/publish/deployment-profiles.sections/mark-pages-and-shared-sections.md +13 -13
- package/agent-docs/publish/deployment-profiles.sections/preview-and-edit-a-customer-edition.md +55 -0
- package/agent-docs/publish/deployment-profiles.sections/related-reading.md +6 -6
- package/agent-docs/publish/deployment-profiles.sections/select-each-product-release.md +55 -0
- package/agent-docs/publish/deployment-profiles.sections/supply-the-profile-from-the-deployment.md +6 -6
- package/agent-docs/publish/evals.md +16 -16
- package/agent-docs/publish/evals.sections/add-the-audit-hook.md +5 -5
- package/agent-docs/publish/evals.sections/check-the-report.md +4 -4
- package/agent-docs/publish/evals.sections/define-a-task-file.md +5 -5
- package/agent-docs/publish/evals.sections/diagnose-a-different-build.md +5 -5
- package/agent-docs/publish/evals.sections/prepare-a-report-for-the-built-site.md +5 -5
- package/agent-docs/publish/evals.sections/related-reading.md +3 -3
- package/agent-docs/publish/evals.sections/run-and-review-the-tasks.md +4 -4
- package/agent-docs/publish/evals.sections/shoalrun-s-own-example.md +6 -6
- package/agent-docs/publish/host-adapters.md +6 -6
- package/agent-docs/publish/manni.md +16 -16
- package/agent-docs/publish/manni.sections/check-the-result.md +3 -3
- package/agent-docs/publish/manni.sections/how-this-site-uses-manni.md +6 -6
- package/agent-docs/publish/manni.sections/optional-custom-policies.md +4 -4
- package/agent-docs/publish/manni.sections/prerequisites.md +2 -2
- package/agent-docs/publish/mcp-analytics.md +12 -12
- package/agent-docs/publish/mcp-analytics.sections/adapter-exports.md +4 -4
- package/agent-docs/publish/mcp-analytics.sections/enable-analytics.md +4 -4
- package/agent-docs/publish/mcp-analytics.sections/event-fields-and-service-mappings.md +4 -4
- package/agent-docs/publish/mcp-analytics.sections/optionally-collect-intent-and-group-calls.md +4 -4
- package/agent-docs/publish/mcp-analytics.sections/optionally-identify-the-client-and-model.md +5 -5
- package/agent-docs/publish/mcp-analytics.sections/related-reading.md +3 -3
- package/agent-docs/publish/mcp-analytics.sections/safeguards-and-limits.md +5 -5
- package/agent-docs/publish/mcp.md +56 -29
- package/agent-docs/publish/mcp.sections/check-budgets-and-errors.md +8 -8
- package/agent-docs/publish/mcp.sections/choose-the-documentation-source.md +4 -4
- package/agent-docs/publish/mcp.sections/configure-the-client.md +4 -4
- package/agent-docs/publish/mcp.sections/discover-product-releases-before-searching.md +52 -0
- package/agent-docs/publish/mcp.sections/generate-a-vercel-endpoint.md +6 -6
- package/agent-docs/publish/mcp.sections/html-markdown-and-agents.md +38 -0
- package/agent-docs/publish/mcp.sections/related-reading.md +3 -3
- package/agent-docs/publish/mcp.sections/search-then-read.md +13 -12
- package/agent-docs/publish/mcp.sections/serve-a-public-endpoint-on-node.md +12 -8
- package/agent-docs/publish/mcp.sections/verify-the-connection.md +4 -4
- package/agent-docs/publish/mcp.sections/why-offer-mcp-for-public-docs.md +4 -4
- package/agent-docs/publish/openapi-extension-mappings.md +12 -12
- package/agent-docs/publish/output.md +20 -20
- package/agent-docs/publish/output.sections/api-contracts.md +1 -1
- package/agent-docs/publish/output.sections/code-highlighting.md +1 -1
- package/agent-docs/publish/output.sections/current-limits.md +1 -1
- package/agent-docs/publish/output.sections/incremental-sync.md +4 -4
- package/agent-docs/publish/output.sections/manifest-records-and-sections.md +3 -3
- package/agent-docs/publish/output.sections/navigation-section-indexes.md +1 -1
- package/agent-docs/publish/output.sections/page-formats.md +2 -2
- package/agent-docs/publish/output.sections/published-output-contract.md +5 -5
- package/agent-docs/publish/output.sections/reader-appearance-and-controls.md +1 -1
- package/agent-docs/publish/output.sections/related-reading.md +1 -1
- package/agent-docs/publish/output.sections/response-identity.md +1 -1
- package/agent-docs/publish/output.sections/site-files.md +6 -6
- package/agent-docs/publish/output.sections/validate-an-existing-build-locally.md +3 -3
- package/agent-docs/publish/output.sections/where-files-go.md +3 -3
- package/agent-docs/publish/publications.md +108 -19
- package/agent-docs/publish/publications.sections/add-a-language.md +60 -0
- package/agent-docs/publish/publications.sections/change-just-one-part-of-a-shared-page.md +63 -0
- package/agent-docs/publish/publications.sections/give-each-api-version-its-own-contract.md +34 -0
- package/agent-docs/publish/publications.sections/keep-an-unchanged-page-in-one-file.md +53 -0
- package/agent-docs/publish/publications.sections/publish-versions-without-a-product-catalog.md +49 -0
- package/agent-docs/publish/publications.sections/related-reading.md +42 -0
- package/agent-docs/publish/publications.sections/version-products-independently.md +115 -0
- package/agent-docs/publish/publications.sections/what-agents-receive.md +38 -0
- package/agent-docs/publish/revisions.md +4 -4
- package/agent-docs/publish/seo.md +10 -10
- package/agent-docs/publish/seo.sections/related-reading.md +2 -2
- package/agent-docs/publish/seo.sections/set-the-public-address.md +3 -3
- package/agent-docs/publish/seo.sections/what-agents-receive.md +3 -3
- package/agent-docs/publish/seo.sections/what-the-build-adds.md +2 -2
- package/agent-docs/publish/seo.sections/write-the-page-title-and-summary.md +2 -2
- package/agent-docs/publish/single-source-sites.md +5 -5
- package/agent-docs/publish/troubleshooting.md +10 -10
- package/agent-docs/publish/vercel.md +5 -5
- package/agent-docs/publish/vercel.sections/check-the-deployment.md +1 -1
- package/agent-docs/publish/vercel.sections/include-an-mcp-endpoint.md +2 -2
- package/agent-docs/publish/vercel.sections/prepare-your-project.md +2 -2
- package/agent-docs/publish/vercel.sections/related-reading.md +1 -1
- package/agent-docs/publish.md +2 -2
- package/agent-docs/recipes/add-page.md +5 -5
- package/agent-docs/recipes/add-page.sections/audit-the-shoalrun-docs-project.md +2 -2
- package/agent-docs/recipes/add-page.sections/before-you-start.md +1 -1
- package/agent-docs/recipes/add-page.sections/build-the-shoalrun-docs-site.md +2 -2
- package/agent-docs/recipes/add-page.sections/check-agent-search-and-page-lookup.md +1 -1
- package/agent-docs/recipes/add-page.sections/check-the-built-page-artifacts.md +1 -1
- package/agent-docs/recipes/add-page.sections/check-the-outcome.md +1 -1
- package/agent-docs/recipes/add-page.sections/complete-the-guide-and-add-navigation.md +2 -2
- package/agent-docs/recipes/add-page.sections/install-the-site-dependencies.md +1 -1
- package/agent-docs/recipes/add-page.sections/regenerate-the-agent-documentation-bundle.md +2 -2
- package/agent-docs/recipes/add-page.sections/related-reading.md +1 -1
- package/agent-docs/recipes/add-page.sections/scaffold-a-new-guide.md +1 -1
- package/agent-docs/recipes/audit-docs.md +4 -4
- package/agent-docs/recipes/build-docs.md +2 -2
- package/agent-docs/recipes/preview-hybrid-search.md +5 -5
- package/agent-docs/recipes/preview-page.md +2 -2
- package/agent-docs/recipes/queue-email.md +2 -2
- package/agent-docs/recipes/refresh-agent-docs.md +4 -4
- package/agent-docs/recipes/send-welcome-email.md +13 -13
- package/agent-docs/reference/agent-skills.md +7 -7
- package/agent-docs/search-and-chat.md +4 -4
- package/agent-docs/search-index.json +1 -1
- package/agent-docs/start.md +5 -5
- package/agent-docs/start.sections/add-the-page-to-navigation.md +3 -3
- package/agent-docs/start.sections/build-and-check-both-outputs.md +3 -3
- package/agent-docs/start.sections/build-this-site.md +2 -2
- package/agent-docs/start.sections/check-writing-style.md +2 -2
- package/agent-docs/start.sections/create-a-page.md +2 -2
- package/agent-docs/start.sections/make-it-yours.md +2 -2
- package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
- package/agent-docs/start.sections/prerequisites.md +2 -2
- package/agent-docs/start.sections/related-reading.md +2 -2
- package/agent-docs/start.sections/start-your-own-project.md +3 -3
- package/agent-docs/status.md +14 -4
- package/agent-docs/styling/color-modes.md +2 -2
- package/agent-docs/styling/footer.md +2 -2
- package/agent-docs/styling/header.md +2 -2
- package/agent-docs/styling/layouts.md +3 -3
- package/agent-docs/styling/layouts.sections/build-a-landing-page.md +1 -1
- package/agent-docs/styling/layouts.sections/build-a-splash-page.md +1 -1
- package/agent-docs/styling/layouts.sections/control-navigation-tabs.md +2 -2
- package/agent-docs/styling/layouts.sections/customize-the-hero.md +1 -1
- package/agent-docs/styling/layouts.sections/hero.md +1 -1
- package/agent-docs/styling/layouts.sections/hide-the-table-of-contents-or-give-content-more-room.md +1 -1
- package/agent-docs/styling/layouts.sections/html-markdown-and-agents.md +2 -2
- package/agent-docs/styling/layouts.sections/related-reading.md +1 -1
- package/agent-docs/styling/palettes.md +3 -3
- package/agent-docs/styling/share-images.md +3 -3
- package/agent-docs/styling/themes.md +2 -2
- package/agent-docs/styling/try.md +2 -2
- package/agent-docs/what-is-shoalrun.md +7 -3
- package/assets/ask-widget.js +20 -6
- package/assets/navigation.js +5 -0
- package/dist/api-materialize.d.ts +2 -1
- package/dist/api-materialize.js +21 -9
- package/dist/api-publication-plan.d.ts +2 -0
- package/dist/api-publication-plan.js +23 -7
- package/dist/api-publication-review.js +4 -3
- package/dist/api-selection.d.ts +5 -2
- package/dist/api-selection.js +18 -11
- package/dist/artifact-bundle.js +9 -6
- package/dist/ask-runtime.d.ts +1 -0
- package/dist/ask-runtime.js +7 -2
- package/dist/authored-change.js +2 -1
- package/dist/authoring-project.js +1 -1
- package/dist/cards.js +2 -1
- package/dist/cli-discovery.d.ts +2 -2
- package/dist/cli-discovery.js +9 -4
- package/dist/cli.js +48 -23
- package/dist/compiler-config.d.ts +17 -0
- package/dist/compiler-config.js +43 -2
- package/dist/compiler.d.ts +21 -0
- package/dist/compiler.js +16 -12
- package/dist/component-transform.d.ts +2 -4
- package/dist/component-transform.js +20 -7
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -1
- package/dist/content-delivery-contract.d.ts +2 -1
- package/dist/content-delivery-validation.d.ts +2 -2
- package/dist/content-delivery-validation.js +6 -4
- package/dist/content-export-command.d.ts +1 -1
- package/dist/content-export-command.js +4 -4
- package/dist/content-export-comparison.js +6 -5
- package/dist/content-export-config.js +3 -1
- package/dist/content-export.js +9 -8
- package/dist/content-rest-client.js +4 -2
- package/dist/content-rest-contract.d.ts +2 -2
- package/dist/content-rest-server.js +11 -6
- package/dist/content-source.d.ts +13 -0
- package/dist/content-source.js +5 -2
- package/dist/content-workspace.d.ts +12 -0
- package/dist/content-workspace.js +2 -1
- package/dist/content.js +3 -2
- package/dist/cookbook-chooser.js +2 -1
- package/dist/deployment-profile.d.ts +2 -1
- package/dist/deployment-profile.js +38 -8
- package/dist/dev.d.ts +3 -1
- package/dist/dev.js +99 -12
- package/dist/docs-author.js +2 -1
- package/dist/docs-command.js +2 -2
- package/dist/docs-eval.d.ts +1 -0
- package/dist/docs-eval.js +2 -2
- package/dist/docs-mcp.d.ts +1 -0
- package/dist/docs-mcp.js +10 -5
- package/dist/docs-tool.d.ts +4 -10
- package/dist/document-sync.d.ts +1 -0
- package/dist/document-sync.js +2 -2
- package/dist/documentation-core.d.ts +29 -10
- package/dist/documentation-core.js +38 -4
- package/dist/freshness.js +2 -2
- package/dist/frontmatter.js +13 -7
- package/dist/function-runtime.d.ts +1 -0
- package/dist/index-build.d.ts +1 -0
- package/dist/index-build.js +2 -2
- package/dist/ingredient-draft.js +20 -10
- package/dist/mcp-analytics.d.ts +1 -0
- package/dist/mcp-artifacts.js +13 -4
- package/dist/mcp-config.d.ts +1 -0
- package/dist/mcp-config.js +3 -1
- package/dist/mcp-http.js +1 -1
- package/dist/page-materialization.d.ts +3 -4
- package/dist/page-materialization.js +15 -8
- package/dist/page-renderer.d.ts +6 -0
- package/dist/page-renderer.js +16 -5
- package/dist/project-navigation.js +2 -1
- package/dist/publication-identity.d.ts +12 -0
- package/dist/publication-identity.js +17 -0
- package/dist/publication-manifest.d.ts +24 -1
- package/dist/publication-manifest.js +14 -6
- package/dist/publication-plan.js +21 -9
- package/dist/publication-render.js +24 -8
- package/dist/recipe-draft.js +9 -6
- package/dist/scaffold.d.ts +7 -4
- package/dist/scaffold.js +16 -16
- package/dist/search-query.d.ts +4 -10
- package/dist/search-query.js +10 -9
- package/dist/server.d.ts +8 -0
- package/dist/server.js +14 -3
- package/dist/subject-deprecation.js +2 -1
- package/dist/vercel-function.js +1 -1
- package/example-configs/products/README.md +37 -0
- package/example-configs/products/content/operations.mdx +50 -0
- package/example-configs/products/content/payments-v2.mdx +30 -0
- package/example-configs/products/content/payments-v3.mdx +38 -0
- package/example-configs/products/content/priority-settlement.mdx +23 -0
- package/example-configs/products/content/reporting-v1.mdx +36 -0
- package/example-configs/products/content/scheduled-exports.mdx +23 -0
- package/example-configs/products/docs.config.yaml +56 -0
- package/example-configs/products/profiles/all-releases.yaml +9 -0
- package/example-configs/products/profiles/customer-a.yaml +13 -0
- package/example-configs/products/profiles/customer-b.yaml +13 -0
- package/example-configs/products/skus.yaml +11 -0
- package/examples/content-delivery/preview.mjs +1 -1
- package/package.json +1 -1
- package/schemas/content-export.schema.json +41 -3
- package/schemas/content-rest.openapi.json +184 -37
- package/skills/shoalrun-author/SKILL.md +6 -2
- package/skills/shoalrun-author/references/customer-editions.md +34 -4
- package/skills/shoalrun-author/references/publications.md +60 -0
- package/skills/shoalrun-recipes/SKILL.md +2 -0
- package/skills/shoalrun-setup/SKILL.md +3 -1
- package/styles/header.css +3 -0
- package/styles/site.css +3 -0
- package/agent-docs/publish/content-export.sections/export-selected-pages.md +0 -116
package/dist/dev.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import { watch } from 'node:fs';
|
|
1
|
+
import { statSync, watch } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { compile } from './compiler.js';
|
|
4
4
|
import { serveSite } from './server.js';
|
|
5
|
-
|
|
5
|
+
import { homeUrl } from './negotiation.js';
|
|
6
|
+
function dependencyStamp(file) {
|
|
7
|
+
try {
|
|
8
|
+
const info = statSync(file, { bigint: true });
|
|
9
|
+
return `${info.dev}:${info.ino}:${info.size}:${info.mtimeNs}:${info.ctimeNs}:${info.mode}`;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
return `missing:${error.code ?? 'unknown'}`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function startDev(configFile, outputDirectory, host = '127.0.0.1', port = 8765, options = {}) {
|
|
6
16
|
const config = path.resolve(configFile);
|
|
7
17
|
const root = path.dirname(config);
|
|
8
18
|
const output = path.resolve(outputDirectory);
|
|
@@ -10,29 +20,63 @@ export async function startDev(configFile, outputDirectory, host = '127.0.0.1',
|
|
|
10
20
|
const stagingPrefix = `${output}.staging-`;
|
|
11
21
|
const ignored = new Set(['.git', '.shoalrun', 'node_modules']);
|
|
12
22
|
const clients = new Set();
|
|
13
|
-
const
|
|
14
|
-
const
|
|
23
|
+
const profile = options.profile ? path.resolve(options.profile) : undefined;
|
|
24
|
+
const initialStamps = new Map();
|
|
25
|
+
const initial = await compile(config, output, {}, { profile, onDependency: file => {
|
|
26
|
+
const resolved = path.resolve(file);
|
|
27
|
+
if (!initialStamps.has(resolved))
|
|
28
|
+
initialStamps.set(resolved, dependencyStamp(resolved));
|
|
29
|
+
} });
|
|
30
|
+
let successfulDependencies = initial.dependencies;
|
|
31
|
+
const preview = { ...(profile ? { profile: path.basename(profile) } : {}), buildId: initial.buildId, profileDigest: initial.profileSelection?.profileDigest };
|
|
32
|
+
const server = await serveSite(output, host, port, clients, { preview });
|
|
15
33
|
process.stdout.write(`Preview: http://${host}:${server.address().port}/\n`);
|
|
16
34
|
let timer;
|
|
17
35
|
let dirty = false;
|
|
18
36
|
let running = false;
|
|
37
|
+
let closed = false;
|
|
19
38
|
const external = new Map();
|
|
39
|
+
const dependencyStamps = new Map();
|
|
20
40
|
const changed = () => {
|
|
41
|
+
if (closed)
|
|
42
|
+
return;
|
|
21
43
|
dirty = true;
|
|
22
44
|
if (timer)
|
|
23
45
|
clearTimeout(timer);
|
|
24
46
|
timer = setTimeout(() => { void rebuild(); }, 180);
|
|
25
47
|
};
|
|
26
48
|
const refreshExternal = (dependencies) => {
|
|
49
|
+
if (closed)
|
|
50
|
+
return;
|
|
27
51
|
const needed = new Map();
|
|
28
|
-
|
|
52
|
+
const files = new Set();
|
|
53
|
+
for (const dependency of [...dependencies, ...(profile ? [profile] : [])]) {
|
|
29
54
|
const file = path.resolve(dependency);
|
|
55
|
+
files.add(file);
|
|
56
|
+
if (!dependencyStamps.has(file))
|
|
57
|
+
dependencyStamps.set(file, initialStamps.get(file) ?? dependencyStamp(file));
|
|
30
58
|
if (file === root || (file.startsWith(`${root}${path.sep}`) && !path.relative(root, file).split(path.sep).some(part => ignored.has(part))))
|
|
31
59
|
continue;
|
|
32
|
-
|
|
60
|
+
let parent = path.dirname(file);
|
|
61
|
+
// A missing asset may also have missing parent directories. Watch its
|
|
62
|
+
// nearest existing directory, filtered to the next declared component.
|
|
63
|
+
while (true) {
|
|
64
|
+
try {
|
|
65
|
+
if (statSync(parent).isDirectory())
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (!['ENOENT', 'ENOTDIR'].includes(error.code ?? ''))
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const next = path.dirname(parent);
|
|
73
|
+
if (next === parent)
|
|
74
|
+
throw new Error(`No watchable parent for ${file}`);
|
|
75
|
+
parent = next;
|
|
76
|
+
}
|
|
33
77
|
if (!needed.has(parent))
|
|
34
78
|
needed.set(parent, new Set());
|
|
35
|
-
needed.get(parent).add(path.
|
|
79
|
+
needed.get(parent).add(path.relative(parent, file).split(path.sep)[0]);
|
|
36
80
|
}
|
|
37
81
|
for (const [directory, value] of external)
|
|
38
82
|
if (!needed.has(directory)) {
|
|
@@ -46,27 +90,50 @@ export async function startDev(configFile, outputDirectory, host = '127.0.0.1',
|
|
|
46
90
|
continue;
|
|
47
91
|
}
|
|
48
92
|
const entry = { names, watcher: undefined };
|
|
49
|
-
entry.watcher = watch(directory, (_event, filename) => {
|
|
50
|
-
|
|
93
|
+
entry.watcher = watch(directory, (_event, filename) => {
|
|
94
|
+
if (!filename || entry.names.has(filename.toString())) {
|
|
95
|
+
const file = filename ? path.resolve(directory, filename.toString()) : undefined;
|
|
96
|
+
if (file && dependencyStamps.has(file))
|
|
97
|
+
dependencyStamps.set(file, dependencyStamp(file));
|
|
98
|
+
changed();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
51
101
|
entry.watcher.on('error', error => process.stderr.write(`Watch failed: ${error.message}\n`));
|
|
52
102
|
external.set(directory, entry);
|
|
53
103
|
}
|
|
104
|
+
for (const file of dependencyStamps.keys())
|
|
105
|
+
if (!files.has(file))
|
|
106
|
+
dependencyStamps.delete(file);
|
|
107
|
+
initialStamps.clear();
|
|
54
108
|
};
|
|
55
109
|
const rebuild = async () => {
|
|
56
110
|
if (running)
|
|
57
111
|
return;
|
|
58
112
|
running = true;
|
|
59
|
-
while (dirty) {
|
|
113
|
+
while (dirty && !closed) {
|
|
60
114
|
dirty = false;
|
|
115
|
+
const discovered = new Set();
|
|
61
116
|
try {
|
|
62
|
-
const manifest = await compile(config, output);
|
|
117
|
+
const manifest = await compile(config, output, {}, { profile, onDependency: file => discovered.add(file) });
|
|
118
|
+
preview.buildId = manifest.buildId;
|
|
119
|
+
preview.profileDigest = manifest.profileSelection?.profileDigest;
|
|
120
|
+
delete preview.error;
|
|
121
|
+
successfulDependencies = manifest.dependencies;
|
|
63
122
|
refreshExternal(manifest.dependencies);
|
|
64
123
|
process.stdout.write(`Built ${manifest.documents.length} documents\n`);
|
|
124
|
+
const update = { routes: manifest.documents.map(document => document.url), home: homeUrl(manifest.documents) };
|
|
65
125
|
for (const client of clients)
|
|
66
|
-
client.write(
|
|
126
|
+
client.write(`event: built\ndata: ${JSON.stringify(update)}\n\n`);
|
|
67
127
|
}
|
|
68
128
|
catch (error) {
|
|
69
129
|
const message = error instanceof Error ? error.message : String(error);
|
|
130
|
+
preview.error = message;
|
|
131
|
+
try {
|
|
132
|
+
refreshExternal([...successfulDependencies, ...discovered]);
|
|
133
|
+
}
|
|
134
|
+
catch (watchError) {
|
|
135
|
+
process.stderr.write(`Watch failed: ${watchError instanceof Error ? watchError.message : String(watchError)}\n`);
|
|
136
|
+
}
|
|
70
137
|
process.stderr.write(`Build failed: ${message}\n`);
|
|
71
138
|
for (const client of clients)
|
|
72
139
|
client.write(`event: failed\ndata: ${JSON.stringify({ message })}\n\n`);
|
|
@@ -84,6 +151,8 @@ export async function startDev(configFile, outputDirectory, host = '127.0.0.1',
|
|
|
84
151
|
const file = path.resolve(root, filename.toString());
|
|
85
152
|
if (file === output || file === `${output}.shoalrun.lock` || file.startsWith(outputPrefix) || file.startsWith(stagingPrefix))
|
|
86
153
|
return;
|
|
154
|
+
if (dependencyStamps.has(file))
|
|
155
|
+
dependencyStamps.set(file, dependencyStamp(file));
|
|
87
156
|
}
|
|
88
157
|
changed();
|
|
89
158
|
});
|
|
@@ -96,8 +165,24 @@ export async function startDev(configFile, outputDirectory, host = '127.0.0.1',
|
|
|
96
165
|
throw error;
|
|
97
166
|
}
|
|
98
167
|
watcher.on('error', error => process.stderr.write(`Watch failed: ${error.message}\n`));
|
|
168
|
+
// Native directory notifications can be coalesced or lost, especially just
|
|
169
|
+
// after registration. Poll only the exact declared build dependencies as
|
|
170
|
+
// a fallback; seed their stamps synchronously so the first edit is observed.
|
|
171
|
+
const polling = setInterval(() => {
|
|
172
|
+
if (closed)
|
|
173
|
+
return;
|
|
174
|
+
for (const [file, previous] of dependencyStamps) {
|
|
175
|
+
const current = dependencyStamp(file);
|
|
176
|
+
if (current !== previous) {
|
|
177
|
+
dependencyStamps.set(file, current);
|
|
178
|
+
changed();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}, 500);
|
|
182
|
+
polling.unref();
|
|
99
183
|
const close = server.close.bind(server);
|
|
100
184
|
server.close = ((callback) => {
|
|
185
|
+
closed = true;
|
|
101
186
|
for (const client of clients)
|
|
102
187
|
client.end();
|
|
103
188
|
return close(callback);
|
|
@@ -106,6 +191,8 @@ export async function startDev(configFile, outputDirectory, host = '127.0.0.1',
|
|
|
106
191
|
watcher.close();
|
|
107
192
|
for (const entry of external.values())
|
|
108
193
|
entry.watcher.close();
|
|
194
|
+
dependencyStamps.clear();
|
|
195
|
+
clearInterval(polling);
|
|
109
196
|
if (timer)
|
|
110
197
|
clearTimeout(timer);
|
|
111
198
|
});
|
package/dist/docs-author.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { documentKey } from './publication-identity.js';
|
|
1
2
|
import { validateAuthoringGuidance } from './authoring-guidance.js';
|
|
2
3
|
import { createHash, randomUUID } from 'node:crypto';
|
|
3
4
|
import { chmod, cp, link, lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, writeFile } from 'node:fs/promises';
|
|
@@ -350,7 +351,7 @@ export async function docsApply(planFile, configFile, checkOnly, options = {}) {
|
|
|
350
351
|
if (!rendered.documents.some(doc => doc.id === id))
|
|
351
352
|
throw new Error(`Candidate excluded from rendering: ${id}`);
|
|
352
353
|
}
|
|
353
|
-
const key = (doc) =>
|
|
354
|
+
const key = (doc) => documentKey(doc.id, doc.variant);
|
|
354
355
|
const oldDocs = new Map(before?.documents.map(doc => [key(doc), doc]) ?? []);
|
|
355
356
|
const newDocs = new Map(result.documents.map(doc => [key(doc), doc]));
|
|
356
357
|
const affected = [...new Set([...oldDocs.keys(), ...newDocs.keys()])].filter(id => {
|
package/dist/docs-command.js
CHANGED
|
@@ -20,7 +20,7 @@ export function parseDocsReadOptions(args, mcp = false) {
|
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
const value = args[++i];
|
|
23
|
-
if (!(mcp ? ['--site'] : ['--site', '--max-tokens', '--limit', '--channel', '--version', '--language']).includes(flag) || !value || value.startsWith('--'))
|
|
23
|
+
if (!(mcp ? ['--site'] : ['--site', '--max-tokens', '--limit', '--product', '--channel', '--version', '--language']).includes(flag) || !value || value.startsWith('--'))
|
|
24
24
|
throw new DocumentationError('invalid_input', `Unknown option or missing value for ${flag}`);
|
|
25
25
|
if (flag === '--site')
|
|
26
26
|
directory = path.resolve(value);
|
|
@@ -40,7 +40,7 @@ export async function runDocsReadCommand(command, args) {
|
|
|
40
40
|
const parsed = parseDocsReadOptions(args);
|
|
41
41
|
json = json || parsed.json;
|
|
42
42
|
if (!parsed.positional.length || command !== 'search' && parsed.positional.length !== (command === 'section' ? 2 : 1) || command !== 'search' && parsed.options.limit !== undefined)
|
|
43
|
-
throw new DocumentationError('invalid_input', `Usage: shoalrun docs ${command} <${command === 'search' ? 'query' : command === 'section' ? 'document-id> <section-id' : 'document-id'}> [--site DIRECTORY] [--json] [--max-tokens N] [--channel C --version V --language L]${command === 'search' ? ' [--limit N]' : ''}`);
|
|
43
|
+
throw new DocumentationError('invalid_input', `Usage: shoalrun docs ${command} <${command === 'search' ? 'query' : command === 'section' ? 'document-id> <section-id' : 'document-id'}> [--site DIRECTORY] [--json] [--max-tokens N] [--product P --channel C --version V --language L]${command === 'search' ? ' [--limit N]' : ''}`);
|
|
44
44
|
const result = command === 'search'
|
|
45
45
|
? await searchDocumentation(parsed.directory, parsed.positional.join(' '), parsed.options)
|
|
46
46
|
: command === 'outline' ? await getDocumentationOutline(parsed.directory, parsed.positional[0], parsed.options)
|
package/dist/docs-eval.d.ts
CHANGED
package/dist/docs-eval.js
CHANGED
|
@@ -89,8 +89,8 @@ export function parseEvalReport(value) {
|
|
|
89
89
|
throw new Error(`${where} requires status pass/fail/skipped, a text answer, citations, and criteria`);
|
|
90
90
|
const citations = result.citations.map((value, j) => {
|
|
91
91
|
const cite = mapping(value, `${where}.citations[${j}]`, ['id', 'publication']);
|
|
92
|
-
const publication = mapping(cite.publication, `${where}.citations[${j}].publication`, ['channel', 'version', 'language']);
|
|
93
|
-
return { id: text(cite.id, `${where}.citations[${j}].id`), publication: { channel: text(publication.channel, 'citation.channel'), version: text(publication.version, 'citation.version'), language: text(publication.language, 'citation.language') } };
|
|
92
|
+
const publication = mapping(cite.publication, `${where}.citations[${j}].publication`, ['product', 'channel', 'version', 'language']);
|
|
93
|
+
return { id: text(cite.id, `${where}.citations[${j}].id`), publication: { ...(publication.product === undefined ? {} : { product: text(publication.product, 'citation.product') }), channel: text(publication.channel, 'citation.channel'), version: text(publication.version, 'citation.version'), language: text(publication.language, 'citation.language') } };
|
|
94
94
|
});
|
|
95
95
|
const criteria = unique(result.criteria.map((value, j) => {
|
|
96
96
|
const judgment = mapping(value, `${where}.criteria[${j}]`, ['id', 'status', 'reason']);
|
package/dist/docs-mcp.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type McpAnalyticsEvent } from './mcp-analytics.js';
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/server';
|
|
3
3
|
export declare function createDocsMcpServer(directory?: string, publication?: {
|
|
4
|
+
product?: string;
|
|
4
5
|
channel: string;
|
|
5
6
|
version: string;
|
|
6
7
|
language: string;
|
package/dist/docs-mcp.js
CHANGED
|
@@ -3,20 +3,20 @@ import { attemptAnalytics } from './mcp-analytics.js';
|
|
|
3
3
|
import { McpServer } from '@modelcontextprotocol/server';
|
|
4
4
|
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
5
5
|
import * as z from 'zod/v4';
|
|
6
|
-
import { bundledDocumentation, DocumentationError, documentationFailure, getDocumentationOutline, getDocumentationSection, getDocumentationPage, searchDocumentation } from './documentation-core.js';
|
|
6
|
+
import { bundledDocumentation, DocumentationError, documentationFailure, getDocumentationOutline, getDocumentationSection, getDocumentationPage, listDocumentationPublications, searchDocumentation } from './documentation-core.js';
|
|
7
7
|
export function createDocsMcpServer(directory = bundledDocumentation, publication, analytics, discardAnalyticsArguments = false) {
|
|
8
8
|
const server = new McpServer({ name: 'shoalrun-docs', version: '0.0.0' }, { maxToolInputElements: 1024 });
|
|
9
9
|
const scope = (filters) => {
|
|
10
10
|
if (!publication)
|
|
11
11
|
return filters;
|
|
12
|
-
for (const key of ['channel', 'version', 'language'])
|
|
12
|
+
for (const key of ['product', 'channel', 'version', 'language'])
|
|
13
13
|
if (filters[key] !== undefined && filters[key] !== publication[key])
|
|
14
14
|
throw new DocumentationError('invalid_input', 'This MCP endpoint serves a different publication');
|
|
15
15
|
return { ...filters, ...publication };
|
|
16
16
|
};
|
|
17
17
|
const coordinate = (key) => z.string().optional().describe(publication ? `This endpoint serves ${key}=${publication[key]}; omit this argument or pass that exact value.` : `Select the documentation ${key}.`);
|
|
18
18
|
const options = {
|
|
19
|
-
channel: coordinate('channel'), version: coordinate('version'), language: coordinate('language'),
|
|
19
|
+
product: coordinate('product'), channel: coordinate('channel'), version: coordinate('version'), language: coordinate('language'),
|
|
20
20
|
maxTokens: z.number().int().min(256).max(100_000).default(4096).describe('Maximum serialized result tokens, counted with cl100k_base, including metadata.'),
|
|
21
21
|
};
|
|
22
22
|
// A client may cache the instrumented schema after withdrawing consent.
|
|
@@ -57,13 +57,18 @@ export function createDocsMcpServer(directory = bundledDocumentation, publicatio
|
|
|
57
57
|
await attemptAnalytics(() => analytics.capture({ name: 'mcp_tool_call', ...(analytics.clientMetadata ? mcpClientMetadata(context, server.server.getClientVersion()) : {}), tool, durationMs: Math.max(0, performance.now() - start), isError, ...(errorCode ? { errorCode } : {}), ...(pageId ? { pageId } : {}), ...(sectionId ? { sectionId } : {}), buildId: analytics.buildId, publication: { ...publication } }));
|
|
58
58
|
}
|
|
59
59
|
};
|
|
60
|
+
server.registerTool('get_publications', {
|
|
61
|
+
description: 'Discover available product/channel/version/language coordinates before searching. Returns one compact page and concise product defaults; follow nextOffset for more. Products have independent versions. Preserve the selected product and publication coordinates in subsequent search and read calls. This endpoint lists only its published scope.',
|
|
62
|
+
inputSchema: schema(z.object({ ...options, maxTokens: z.number().int().min(256).max(100_000).default(2048), limit: z.number().int().min(1).max(100).default(20), offset: z.number().int().min(0).default(0) }).strict()),
|
|
63
|
+
annotations,
|
|
64
|
+
}, (filters, context) => respond('get_publications', context, () => listDocumentationPublications(directory, { ...scope(filters), ...(publication ? { publication } : {}) })));
|
|
60
65
|
server.registerTool('search_docs', {
|
|
61
|
-
description: 'Search the documentation by keyword. Partial fallback favors field relevance among results within one meaningful term of the best coverage (at least two matched). Complete lexical matches normally precede partial fallback; stronger near-complete matches can outrank body-only complete matches (matchMode: mixed). Search covers titles, summaries, headings, and bounded article text. For each chosen result, call read.tool with read.arguments exactly. Section recommendations require an author declaration of self-contained content. The result markdownUrl fetches the recommended section or full page; pageMarkdownUrl is always the full-page fallback. Do not guess a section ID or request an outline first.',
|
|
66
|
+
description: 'Search the documentation by keyword. Use get_publications to discover product/version scope when unknown. Partial fallback favors field relevance among results within one meaningful term of the best coverage (at least two matched). Complete lexical matches normally precede partial fallback; stronger near-complete matches can outrank body-only complete matches (matchMode: mixed). Search covers titles, summaries, headings, and bounded article text. For each chosen result, call read.tool with read.arguments exactly, retaining product and all publication coordinates. Section recommendations require an author declaration of self-contained content. The result markdownUrl fetches the recommended section or full page; pageMarkdownUrl is always the full-page fallback. Do not guess a section ID or request an outline first.',
|
|
62
67
|
inputSchema: schema(z.object({ query: z.string(), limit: z.number().int().min(1).max(100).default(8), ...options }).strict()),
|
|
63
68
|
annotations,
|
|
64
69
|
}, ({ query, ...filters }, context) => respond('search_docs', context, () => searchDocumentation(directory, query, scope(filters))));
|
|
65
70
|
server.registerTool('get_page', {
|
|
66
|
-
description: 'Read a published Markdown page by the stable document ID returned from search_docs. Includes all reader-marked sections. Check budget.truncated; increase maxTokens if needed.',
|
|
71
|
+
description: 'Read a published Markdown page by the stable document ID returned from search_docs. Retain its product/channel/version/language coordinates; IDs can repeat across products. Includes all reader-marked sections. Check budget.truncated; increase maxTokens if needed.',
|
|
67
72
|
inputSchema: schema(z.object({ id: z.string(), ...options }).strict()),
|
|
68
73
|
annotations,
|
|
69
74
|
}, ({ id, ...filters }, context) => respond('get_page', context, () => getDocumentationPage(directory, id, scope(filters))));
|
package/dist/docs-tool.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export declare function searchShoalrunDocs(query: string): Promise<({
|
|
|
20
20
|
channel: string;
|
|
21
21
|
version: string;
|
|
22
22
|
language: string;
|
|
23
|
+
product?: string | undefined;
|
|
23
24
|
section?: string | undefined;
|
|
24
25
|
id: string;
|
|
25
26
|
};
|
|
@@ -27,11 +28,7 @@ export declare function searchShoalrunDocs(query: string): Promise<({
|
|
|
27
28
|
}[];
|
|
28
29
|
status: string;
|
|
29
30
|
query: string;
|
|
30
|
-
publication:
|
|
31
|
-
channel: string;
|
|
32
|
-
version: string;
|
|
33
|
-
language: string;
|
|
34
|
-
};
|
|
31
|
+
publication: import("./publication-identity.js").PublicationCoordinate;
|
|
35
32
|
total: number;
|
|
36
33
|
matchMode?: undefined;
|
|
37
34
|
} | {
|
|
@@ -56,6 +53,7 @@ export declare function searchShoalrunDocs(query: string): Promise<({
|
|
|
56
53
|
channel: string;
|
|
57
54
|
version: string;
|
|
58
55
|
language: string;
|
|
56
|
+
product?: string | undefined;
|
|
59
57
|
section?: string | undefined;
|
|
60
58
|
id: string;
|
|
61
59
|
};
|
|
@@ -63,11 +61,7 @@ export declare function searchShoalrunDocs(query: string): Promise<({
|
|
|
63
61
|
}[];
|
|
64
62
|
status: string;
|
|
65
63
|
query: string;
|
|
66
|
-
publication:
|
|
67
|
-
channel: string;
|
|
68
|
-
version: string;
|
|
69
|
-
language: string;
|
|
70
|
-
};
|
|
64
|
+
publication: import("./publication-identity.js").PublicationCoordinate;
|
|
71
65
|
total: number;
|
|
72
66
|
matchMode: string;
|
|
73
67
|
}) & {
|
package/dist/document-sync.d.ts
CHANGED
package/dist/document-sync.js
CHANGED
|
@@ -5,7 +5,7 @@ export function canonicalJson(value) {
|
|
|
5
5
|
return JSON.stringify(value, (_key, item) => item && typeof item === 'object' && !Array.isArray(item)
|
|
6
6
|
? Object.fromEntries(Object.keys(item).sort().map(key => [key, item[key]])) : item);
|
|
7
7
|
}
|
|
8
|
-
const key = (doc) => JSON.stringify([doc.id, doc.variant.channel, doc.variant.version, doc.variant.language]);
|
|
8
|
+
const key = (doc) => JSON.stringify([doc.id, doc.variant.channel, doc.variant.version, doc.variant.language, ...(doc.variant.product === undefined ? [] : [doc.variant.product])]);
|
|
9
9
|
export function documentSnapshot(manifest, buildId) {
|
|
10
10
|
const { documents, dependencies, buildId: _buildId, ...metadata } = manifest;
|
|
11
11
|
const records = documents.map(doc => ({ id: doc.id, variant: doc.variant, url: doc.url, markdownUrl: doc.markdownUrl,
|
|
@@ -32,7 +32,7 @@ export function parseDocumentSnapshot(value) {
|
|
|
32
32
|
const seen = new Set();
|
|
33
33
|
for (const doc of value.documents) {
|
|
34
34
|
const variant = object(doc) && object(doc.variant) ? doc.variant : {};
|
|
35
|
-
if (!object(doc) || typeof doc.id !== 'string' || !doc.id.trim() || !object(doc.variant) || ['channel', 'version', 'language'].some(field => typeof variant[field] !== 'string' || !variant[field].trim()) || !route(doc.url) || !route(doc.markdownUrl) || !doc.markdownUrl.endsWith('.md') || !hex(doc.digest) || !hex(doc.contentDigest) || !hex(doc.recordDigest))
|
|
35
|
+
if (!object(doc) || typeof doc.id !== 'string' || !doc.id.trim() || !object(doc.variant) || (variant.product !== undefined && (typeof variant.product !== 'string' || !variant.product.trim())) || ['channel', 'version', 'language'].some(field => typeof variant[field] !== 'string' || !variant[field].trim()) || !route(doc.url) || !route(doc.markdownUrl) || !doc.markdownUrl.endsWith('.md') || !hex(doc.digest) || !hex(doc.contentDigest) || !hex(doc.recordDigest))
|
|
36
36
|
throw new Error('Invalid document sync record');
|
|
37
37
|
const identity = key(doc);
|
|
38
38
|
if (seen.has(identity))
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type SearchOptions } from './search-query.js';
|
|
2
|
+
import { type PublicationCoordinate } from './publication-identity.js';
|
|
2
3
|
export declare const bundledDocumentation: string;
|
|
3
4
|
export type DocumentationErrorCode = 'invalid_input' | 'unknown_page' | 'unknown_section' | 'missing_index' | 'internal_error';
|
|
4
5
|
export declare class DocumentationError extends Error {
|
|
@@ -16,6 +17,29 @@ export type DocumentationOptions = SearchOptions & {
|
|
|
16
17
|
maxTokens?: number;
|
|
17
18
|
};
|
|
18
19
|
export declare const documentationTokens: (value: string) => number;
|
|
20
|
+
/** Compact discovery of published coordinates, without returning page inventories. */
|
|
21
|
+
export declare function listDocumentationPublications(directory: string, options?: DocumentationOptions & {
|
|
22
|
+
offset?: number;
|
|
23
|
+
publication?: PublicationCoordinate;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
nextOffset?: number | undefined;
|
|
26
|
+
products?: {
|
|
27
|
+
defaultVersion?: any;
|
|
28
|
+
label?: any;
|
|
29
|
+
id: string;
|
|
30
|
+
}[] | undefined;
|
|
31
|
+
status: "ok";
|
|
32
|
+
total: number;
|
|
33
|
+
offset: number;
|
|
34
|
+
publications: PublicationCoordinate[];
|
|
35
|
+
} & {
|
|
36
|
+
budget: {
|
|
37
|
+
maxTokens: number;
|
|
38
|
+
encoding: string;
|
|
39
|
+
tokens: number;
|
|
40
|
+
truncated: boolean;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
19
43
|
export declare function searchDocumentation(directory: string, query: string, options?: DocumentationOptions): Promise<({
|
|
20
44
|
results: never[] | {
|
|
21
45
|
snippet: string;
|
|
@@ -38,6 +62,7 @@ export declare function searchDocumentation(directory: string, query: string, op
|
|
|
38
62
|
channel: string;
|
|
39
63
|
version: string;
|
|
40
64
|
language: string;
|
|
65
|
+
product?: string | undefined;
|
|
41
66
|
section?: string | undefined;
|
|
42
67
|
id: string;
|
|
43
68
|
};
|
|
@@ -45,11 +70,7 @@ export declare function searchDocumentation(directory: string, query: string, op
|
|
|
45
70
|
}[];
|
|
46
71
|
status: string;
|
|
47
72
|
query: string;
|
|
48
|
-
publication:
|
|
49
|
-
channel: string;
|
|
50
|
-
version: string;
|
|
51
|
-
language: string;
|
|
52
|
-
};
|
|
73
|
+
publication: PublicationCoordinate;
|
|
53
74
|
total: number;
|
|
54
75
|
matchMode?: undefined;
|
|
55
76
|
} | {
|
|
@@ -74,6 +95,7 @@ export declare function searchDocumentation(directory: string, query: string, op
|
|
|
74
95
|
channel: string;
|
|
75
96
|
version: string;
|
|
76
97
|
language: string;
|
|
98
|
+
product?: string | undefined;
|
|
77
99
|
section?: string | undefined;
|
|
78
100
|
id: string;
|
|
79
101
|
};
|
|
@@ -81,11 +103,7 @@ export declare function searchDocumentation(directory: string, query: string, op
|
|
|
81
103
|
}[];
|
|
82
104
|
status: string;
|
|
83
105
|
query: string;
|
|
84
|
-
publication:
|
|
85
|
-
channel: string;
|
|
86
|
-
version: string;
|
|
87
|
-
language: string;
|
|
88
|
-
};
|
|
106
|
+
publication: PublicationCoordinate;
|
|
89
107
|
total: number;
|
|
90
108
|
matchMode: string;
|
|
91
109
|
}) & {
|
|
@@ -104,6 +122,7 @@ export declare function getDocumentationPage(directory: string, id: string, opti
|
|
|
104
122
|
url: string;
|
|
105
123
|
markdownUrl: string;
|
|
106
124
|
publication: {
|
|
125
|
+
product?: string;
|
|
107
126
|
channel: string;
|
|
108
127
|
version: string;
|
|
109
128
|
language: string;
|
|
@@ -4,6 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { markdownTokens } from './markdown-size.js';
|
|
6
6
|
import { queryBuiltSite } from './search-query.js';
|
|
7
|
+
import { publicationKey, samePublication } from './publication-identity.js';
|
|
7
8
|
export const bundledDocumentation = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../agent-docs');
|
|
8
9
|
export class DocumentationError extends Error {
|
|
9
10
|
code;
|
|
@@ -18,7 +19,7 @@ function validate(options) {
|
|
|
18
19
|
const maxTokens = options.maxTokens ?? 4096;
|
|
19
20
|
if (!Number.isSafeInteger(maxTokens) || maxTokens < 256 || maxTokens > 100_000)
|
|
20
21
|
throw new DocumentationError('invalid_input', 'maxTokens must be an integer from 256 to 100000');
|
|
21
|
-
for (const key of ['channel', 'version', 'language'])
|
|
22
|
+
for (const key of ['product', 'channel', 'version', 'language'])
|
|
22
23
|
if (options[key] !== undefined && (typeof options[key] !== 'string' || !options[key]?.trim() || options[key].length > 128))
|
|
23
24
|
throw new DocumentationError('invalid_input', `${key} must be nonempty text of at most 128 characters`);
|
|
24
25
|
return maxTokens;
|
|
@@ -45,6 +46,39 @@ async function loadJson(directory, name) {
|
|
|
45
46
|
throw new DocumentationError('internal_error', `Cannot read valid ${name}. Rebuild the documentation.`);
|
|
46
47
|
}
|
|
47
48
|
}
|
|
49
|
+
/** Compact discovery of published coordinates, without returning page inventories. */
|
|
50
|
+
export async function listDocumentationPublications(directory, options = {}) {
|
|
51
|
+
const maxTokens = validate({ ...options, maxTokens: options.maxTokens ?? 2048 });
|
|
52
|
+
const limit = options.limit ?? 20;
|
|
53
|
+
const offset = options.offset ?? 0;
|
|
54
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100 || !Number.isSafeInteger(offset) || offset < 0)
|
|
55
|
+
throw new DocumentationError('invalid_input', 'limit must be from 1 to 100 and offset must be a nonnegative safe integer');
|
|
56
|
+
const manifest = await loadJson(directory, 'documents.json');
|
|
57
|
+
const source = manifest?.publications?.enabled ?? manifest?.documents?.map((doc) => doc.variant);
|
|
58
|
+
const valid = (item) => item && typeof item === 'object' && !Array.isArray(item) && ['channel', 'version', 'language'].every(key => typeof item[key] === 'string' && item[key].length > 0 && item[key].length <= 128) && (item.product === undefined || typeof item.product === 'string' && item.product.length > 0 && item.product.length <= 128);
|
|
59
|
+
if (manifest?.schemaVersion !== 1 || !Array.isArray(source) || source.some(item => !valid(item)))
|
|
60
|
+
throw new DocumentationError('internal_error', 'Invalid publication metadata. Rebuild the documentation.');
|
|
61
|
+
const coordinates = source.map((item) => ({ channel: item.channel, version: item.version, language: item.language, ...(item.product === undefined ? {} : { product: item.product }) }));
|
|
62
|
+
const available = [...new Map(coordinates.map((item) => [publicationKey(item), item])).values()]
|
|
63
|
+
.filter(item => (!options.publication || samePublication(item, options.publication)) && ['product', 'channel', 'version', 'language'].every(key => !options[key] || item[key] === options[key]))
|
|
64
|
+
.sort((a, b) => publicationKey(a).localeCompare(publicationKey(b)));
|
|
65
|
+
const total = available.length;
|
|
66
|
+
let publications = available.slice(offset, offset + limit);
|
|
67
|
+
while (true) {
|
|
68
|
+
const products = [...new Set(publications.flatMap(item => item.product === undefined ? [] : [item.product]))].map(id => {
|
|
69
|
+
const catalog = manifest.publications?.products?.[id];
|
|
70
|
+
const defaultVersion = typeof catalog?.defaultVersion === 'string' && available.some(item => item.product === id && item.version === catalog.defaultVersion) ? catalog.defaultVersion : undefined;
|
|
71
|
+
return { id, ...(typeof catalog?.label === 'string' ? { label: catalog.label.slice(0, 160) } : {}), ...(defaultVersion === undefined ? {} : { defaultVersion }) };
|
|
72
|
+
});
|
|
73
|
+
const nextOffset = offset + publications.length < total ? offset + publications.length : undefined;
|
|
74
|
+
const result = budget({ status: 'ok', total, offset, publications, ...(products.length ? { products } : {}), ...(nextOffset === undefined ? {} : { nextOffset }) }, maxTokens, nextOffset !== undefined);
|
|
75
|
+
if (result.fits)
|
|
76
|
+
return result.result;
|
|
77
|
+
if (!publications.length || publications.length === 1)
|
|
78
|
+
throw new DocumentationError('invalid_input', 'maxTokens is too small for publication metadata. Increase the budget.');
|
|
79
|
+
publications = publications.slice(0, -1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
48
82
|
export async function searchDocumentation(directory, query, options = {}) {
|
|
49
83
|
const maxTokens = validate(options);
|
|
50
84
|
if (typeof query !== 'string' || !query.trim() || query.length > 512)
|
|
@@ -76,14 +110,14 @@ async function selectDocument(directory, id, options) {
|
|
|
76
110
|
if (typeof id !== 'string' || !id.trim() || id.length > 256)
|
|
77
111
|
throw new DocumentationError('invalid_input', 'id must be nonempty text of at most 256 characters');
|
|
78
112
|
const manifest = await loadJson(directory, 'documents.json');
|
|
79
|
-
if (manifest?.schemaVersion !== 1 || !Array.isArray(manifest.documents) || manifest.documents.some((doc) => !doc || typeof doc.id !== 'string' || typeof doc.title !== 'string' || typeof doc.url !== 'string' || typeof doc.markdownUrl !== 'string' || !doc.variant || ['channel', 'version', 'language'].some(key => typeof doc.variant[key] !== 'string')))
|
|
113
|
+
if (manifest?.schemaVersion !== 1 || !Array.isArray(manifest.documents) || manifest.documents.some((doc) => !doc || typeof doc.id !== 'string' || typeof doc.title !== 'string' || typeof doc.url !== 'string' || typeof doc.markdownUrl !== 'string' || !doc.variant || (doc.variant.product !== undefined && (typeof doc.variant.product !== 'string' || !doc.variant.product)) || ['channel', 'version', 'language'].some(key => typeof doc.variant[key] !== 'string')))
|
|
80
114
|
throw new DocumentationError('internal_error', 'Invalid documents.json. Rebuild the documentation.');
|
|
81
115
|
const matching = manifest.documents.filter((doc) => doc.id === id);
|
|
82
116
|
if (!matching.length)
|
|
83
117
|
throw new DocumentationError('unknown_page', `No document with ID ${id}; search the documentation first.`);
|
|
84
|
-
const selected = matching.filter((doc) => ['channel', 'version', 'language'].every(key => !options[key] || doc.variant[key] === options[key]));
|
|
118
|
+
const selected = matching.filter((doc) => ['product', 'channel', 'version', 'language'].every(key => !options[key] || doc.variant[key] === options[key]));
|
|
85
119
|
if (selected.length !== 1)
|
|
86
|
-
throw new DocumentationError('invalid_input', selected.length ? 'Page has multiple publications; select channel, version, and language.' : 'Page does not match the selected publication.');
|
|
120
|
+
throw new DocumentationError('invalid_input', selected.length ? 'Page has multiple publications; select product where applicable, channel, version, and language.' : 'Page does not match the selected publication.');
|
|
87
121
|
return selected[0];
|
|
88
122
|
}
|
|
89
123
|
async function readMarkdown(directory, markdownUrl) {
|
package/dist/freshness.js
CHANGED
|
@@ -10,7 +10,7 @@ function stable(value) {
|
|
|
10
10
|
return value;
|
|
11
11
|
}
|
|
12
12
|
export function contentDigest(doc, htmlTree, markdownTree) {
|
|
13
|
-
const fields = ['id', 'title', 'summary', 'description', 'type', 'slug', 'date', 'releaseVersion', 'subjectLifecycle', 'audiences', 'readerFilters', 'product', 'area', 'subarea', 'operations', 'displayText'];
|
|
13
|
+
const fields = ['id', 'title', 'summary', 'description', 'type', 'slug', 'date', 'releaseVersion', 'availability', 'subjectLifecycle', 'audiences', 'readerFilters', 'product', 'area', 'subarea', 'operations', 'displayText'];
|
|
14
14
|
return createHash('sha256').update(JSON.stringify(stable({ metadata: Object.fromEntries(fields.map(key => [key, doc.frontmatter[key]])), html: htmlTree, markdown: markdownTree }))).digest('hex');
|
|
15
15
|
}
|
|
16
16
|
export async function loadFreshness(value, base, today = new Date().toISOString().slice(0, 10)) {
|
|
@@ -40,7 +40,7 @@ export async function loadFreshness(value, base, today = new Date().toISOString(
|
|
|
40
40
|
const current = {};
|
|
41
41
|
return {
|
|
42
42
|
resolve(doc, digest, fallback) {
|
|
43
|
-
const key = JSON.stringify([doc.frontmatter.id, doc.variant.channel, doc.variant.version, doc.variant.language]);
|
|
43
|
+
const key = JSON.stringify([doc.frontmatter.id, doc.variant.channel, doc.variant.version, doc.variant.language, ...(doc.variant.product === undefined ? [] : [doc.variant.product])]);
|
|
44
44
|
const previous = history.documents[key];
|
|
45
45
|
const updated = previous ? previous.contentDigest === digest ? previous.updated : today : doc.frontmatter.updated ?? fallback ?? today;
|
|
46
46
|
current[key] = { contentDigest: digest, updated };
|