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

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 (99) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/DEPLOYMENT-PROFILES.md +287 -0
  3. package/README.md +43 -2
  4. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +5 -1
  5. package/agent-docs/SNAPSHOT.json +5 -5
  6. package/agent-docs/changelog/2026-10-30.md +43 -0
  7. package/agent-docs/changelog/2026-11-03.md +56 -0
  8. package/agent-docs/changelog.md +17 -1
  9. package/agent-docs/documents.json +419 -61
  10. package/agent-docs/index.md +73 -103
  11. package/agent-docs/provenance.json +4 -4
  12. package/agent-docs/publish/content-export.md +1 -1
  13. package/agent-docs/publish/content-export.sections/prerequisites.md +11 -0
  14. package/agent-docs/publish/deployment-profiles.md +273 -0
  15. package/agent-docs/publish/deployment-profiles.sections/before-you-begin.md +44 -0
  16. package/agent-docs/publish/deployment-profiles.sections/build-and-inspect-the-edition.md +69 -0
  17. package/agent-docs/publish/deployment-profiles.sections/check-the-result.md +46 -0
  18. package/agent-docs/publish/deployment-profiles.sections/choose-navigation-labels.md +53 -0
  19. package/agent-docs/publish/deployment-profiles.sections/current-limits.md +46 -0
  20. package/agent-docs/publish/deployment-profiles.sections/define-the-shared-sku-manifest.md +70 -0
  21. package/agent-docs/publish/deployment-profiles.sections/html-markdown-and-agents.md +44 -0
  22. package/agent-docs/publish/deployment-profiles.sections/mark-pages-and-shared-sections.md +135 -0
  23. package/agent-docs/publish/deployment-profiles.sections/related-reading.md +42 -0
  24. package/agent-docs/publish/deployment-profiles.sections/supply-the-profile-from-the-deployment.md +68 -0
  25. package/agent-docs/search-index.json +1 -1
  26. package/agent-docs/start.md +2 -2
  27. package/agent-docs/start.sections/add-the-page-to-navigation.md +1 -1
  28. package/agent-docs/start.sections/build-and-check-both-outputs.md +1 -1
  29. package/agent-docs/start.sections/build-this-site.md +1 -1
  30. package/agent-docs/start.sections/check-writing-style.md +1 -1
  31. package/agent-docs/start.sections/create-a-page.md +1 -1
  32. package/agent-docs/start.sections/make-it-yours.md +1 -1
  33. package/agent-docs/start.sections/migrating-from-github-packages.md +1 -1
  34. package/agent-docs/start.sections/prerequisites.md +1 -1
  35. package/agent-docs/start.sections/related-reading.md +1 -1
  36. package/agent-docs/start.sections/start-your-own-project.md +2 -2
  37. package/assets/search-semantic.js +34 -0
  38. package/dist/api-publication-plan.d.ts +3 -0
  39. package/dist/api-publication-plan.js +30 -3
  40. package/dist/artifact-bundle.d.ts +2 -1
  41. package/dist/artifact-bundle.js +2 -2
  42. package/dist/authoring-api.d.ts +1 -1
  43. package/dist/authoring-api.js +1 -1
  44. package/dist/authoring-project-command.js +4 -2
  45. package/dist/authoring-project.d.ts +2 -0
  46. package/dist/authoring-project.js +4 -4
  47. package/dist/authoring-snapshot.d.ts +23 -4
  48. package/dist/authoring-snapshot.js +84 -12
  49. package/dist/authoring-validation-command.js +5 -3
  50. package/dist/authoring-validation.d.ts +2 -0
  51. package/dist/authoring-validation.js +38 -11
  52. package/dist/cli-discovery.d.ts +2 -2
  53. package/dist/cli-discovery.js +9 -9
  54. package/dist/cli.js +14 -8
  55. package/dist/compiler.d.ts +13 -0
  56. package/dist/compiler.js +27 -74
  57. package/dist/component-names.js +1 -1
  58. package/dist/component-transform.js +7 -1
  59. package/dist/config.d.ts +4 -1
  60. package/dist/config.js +19 -5
  61. package/dist/content-export-command.d.ts +13 -1
  62. package/dist/content-export-command.js +3 -2
  63. package/dist/content-export.d.ts +13 -0
  64. package/dist/content-export.js +5 -4
  65. package/dist/content-source.d.ts +1 -0
  66. package/dist/content-workspace.d.ts +13 -0
  67. package/dist/content-workspace.js +18 -1
  68. package/dist/deployment-profile.d.ts +52 -0
  69. package/dist/deployment-profile.js +277 -0
  70. package/dist/frontmatter.js +11 -4
  71. package/dist/index-build.js +7 -3
  72. package/dist/page-materialization.js +2 -0
  73. package/dist/page-renderer.d.ts +1 -0
  74. package/dist/page-renderer.js +3 -1
  75. package/dist/palettes.d.ts +1 -1
  76. package/dist/project-navigation.d.ts +5 -0
  77. package/dist/project-navigation.js +19 -0
  78. package/dist/publication-plan.d.ts +3 -1
  79. package/dist/publication-plan.js +23 -4
  80. package/dist/publication-render.d.ts +3 -2
  81. package/dist/publication-render.js +2 -2
  82. package/dist/retrieval.d.ts +4 -0
  83. package/dist/retrieval.js +28 -8
  84. package/dist/search-handler.js +11 -11
  85. package/dist/search-identifier.d.ts +2 -1
  86. package/dist/search-identifier.js +10 -4
  87. package/dist/search-results.d.ts +1 -1
  88. package/dist/search-results.js +39 -25
  89. package/dist/site-identity.d.ts +3 -0
  90. package/dist/site-identity.js +69 -0
  91. package/dist/vercel.d.ts +1 -0
  92. package/dist/vercel.js +3 -1
  93. package/package.json +2 -1
  94. package/skills/shoalrun-author/SKILL.md +5 -1
  95. package/skills/shoalrun-author/references/customer-editions.md +164 -0
  96. package/skills/shoalrun-recipes/SKILL.md +2 -0
  97. package/skills/shoalrun-setup/SKILL.md +4 -0
  98. package/styles/site.css +2 -0
  99. package/agent-docs/publish/content-export.sections/upgrade-an-existing-integration.md +0 -34
@@ -0,0 +1,69 @@
1
+ export function validateHeader(value) {
2
+ if (value === undefined)
3
+ return { links: [] };
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ throw new Error('site.header must be a mapping');
6
+ const { links = [], ...extra } = value;
7
+ if (Object.keys(extra).length)
8
+ throw new Error(`site.header does not accept ${Object.keys(extra).join(', ')}`);
9
+ if (!Array.isArray(links))
10
+ throw new Error('site.header.links must be a list');
11
+ return {
12
+ links: links.map((link, index) => {
13
+ const where = `site.header.links[${index}]`;
14
+ const { style = 'link', ...rest } = (link && typeof link === 'object' && !Array.isArray(link) ? link : {});
15
+ const checked = validateSiteLink(link, where, rest);
16
+ if (style !== 'link' && style !== 'button' && style !== 'primary')
17
+ throw new Error(`${where}.style must be link, button, or primary`);
18
+ return { ...checked, style };
19
+ })
20
+ };
21
+ }
22
+ // Header and footer links share one rule: a label and a site path, http(s) URL, or mailto link.
23
+ function validateSiteLink(link, where, fields = link) {
24
+ if (!link || typeof link !== 'object' || Array.isArray(link))
25
+ throw new Error(`${where} must be a mapping`);
26
+ const { label, href, ...rest } = fields;
27
+ if (Object.keys(rest).length)
28
+ throw new Error(`${where} does not accept ${Object.keys(rest).join(', ')}`);
29
+ if (typeof label !== 'string' || !label.trim())
30
+ throw new Error(`${where}.label is required`);
31
+ if (typeof href !== 'string' || !/^(\/|https?:\/\/|mailto:)/.test(href))
32
+ throw new Error(`${where}.href must be a site path, http(s) URL, or mailto link`);
33
+ return { label, href };
34
+ }
35
+ export function validateFooter(value) {
36
+ if (value === undefined)
37
+ return undefined;
38
+ if (!value || typeof value !== 'object' || Array.isArray(value))
39
+ throw new Error('site.footer must be a mapping');
40
+ const { columns = [], links = [], text, ...extra } = value;
41
+ if (Object.keys(extra).length)
42
+ throw new Error(`site.footer does not accept ${Object.keys(extra).join(', ')}`);
43
+ if (!Array.isArray(columns))
44
+ throw new Error('site.footer.columns must be a list');
45
+ if (!Array.isArray(links))
46
+ throw new Error('site.footer.links must be a list');
47
+ if (text !== undefined && (typeof text !== 'string' || !text.trim()))
48
+ throw new Error('site.footer.text must be non-empty text');
49
+ const footer = {
50
+ columns: columns.map((column, index) => {
51
+ const where = `site.footer.columns[${index}]`;
52
+ if (!column || typeof column !== 'object' || Array.isArray(column))
53
+ throw new Error(`${where} must be a mapping`);
54
+ const { title, links: columnLinks, ...rest } = column;
55
+ if (Object.keys(rest).length)
56
+ throw new Error(`${where} does not accept ${Object.keys(rest).join(', ')}`);
57
+ if (typeof title !== 'string' || !title.trim())
58
+ throw new Error(`${where}.title is required`);
59
+ if (!Array.isArray(columnLinks) || !columnLinks.length)
60
+ throw new Error(`${where}.links must list at least one link`);
61
+ return { title, links: columnLinks.map((link, linkIndex) => validateSiteLink(link, `${where}.links[${linkIndex}]`)) };
62
+ }),
63
+ links: links.map((link, index) => validateSiteLink(link, `site.footer.links[${index}]`)),
64
+ ...(typeof text === 'string' ? { text } : {})
65
+ };
66
+ if (!footer.columns.length && !footer.links.length && !footer.text)
67
+ throw new Error('site.footer needs columns, links, or text');
68
+ return footer;
69
+ }
package/dist/vercel.d.ts CHANGED
@@ -3,6 +3,7 @@ import type { BuildProvenance } from './build-info.js';
3
3
  import { type AskFunctionResult } from './vercel-function.js';
4
4
  export declare function buildVercel(configFile: string, outputDirectory: string, provenance?: BuildProvenance, options?: {
5
5
  chat?: boolean;
6
+ profile?: string;
6
7
  }): Promise<{
7
8
  documents: number;
8
9
  output: string;
package/dist/vercel.js CHANGED
@@ -30,7 +30,9 @@ async function removeStaleFunctions(directory, keep = new Set()) {
30
30
  export async function buildVercel(configFile, outputDirectory, provenance = {}, options = {}) {
31
31
  const output = path.resolve(outputDirectory);
32
32
  const staticDirectory = path.join(output, 'static');
33
- const manifest = await compile(configFile, staticDirectory, provenance);
33
+ if (options.profile && options.chat)
34
+ throw new Error('Profiled Vercel builds do not support chat functions yet');
35
+ const manifest = await compile(configFile, staticDirectory, provenance, { profile: options.profile });
34
36
  const basePath = manifest.basePath;
35
37
  const functionsDirectory = path.join(output, 'functions');
36
38
  const mcp = await addMcpFunction({ staticDirectory, functionsDirectory });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shoalrun/cli",
3
- "version": "0.1.0-alpha.14",
3
+ "version": "0.1.0-alpha.16",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"
@@ -33,6 +33,7 @@
33
33
  "skills",
34
34
  "README.md",
35
35
  "AUTHORING.md",
36
+ "DEPLOYMENT-PROFILES.md",
36
37
  "schemas/content-export.schema.json",
37
38
  "schemas/content-rest.openapi.json",
38
39
  "CHANGELOG.md",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: shoalrun-author
3
- description: Write or revise documentation in an existing Shoalrun project using the agent's own model, native file edits, and provider-free project, validation, and preview tools. Use for pages and their required navigation, relationships, API links, snippets, or project checks.
3
+ description: Write or revise documentation in an existing Shoalrun project using the agent's own model, native file edits, and provider-free project, validation, and preview tools. Use for pages and their required navigation, relationships, API links, snippets, customer editions, or project checks.
4
4
  ---
5
5
 
6
6
  # Author Shoalrun documentation
@@ -21,6 +21,10 @@ When reading a published site through Markdown, follow topic-index links when pr
21
21
 
22
22
  Read `reference.authoring-workspace` for tool contracts and `guide.authoring-workspace` for the working-tree procedure. Before unfamiliar syntax, check the relevant component attributes, configuration structure, or asset-handling contract instead of assuming another tool’s conventions. For MDX components, read their canonical reference; `<Step>` belongs inside `<Steps>` for an ordinary titled procedure, while your harness's task plan is separate. Read implementation/specification evidence with your harness's permitted tools; record the sources for changed claims. Bundled guidance does not establish a consumer project's facts.
23
23
 
24
+ ## Customer editions and feature selection
25
+
26
+ For SKU-selected or white-label documentation, read [references/customer-editions.md](references/customer-editions.md) before editing requirements, manifests, profiles, branding, or edition validation. Use the deployment's external profile, keep customer records out of shared source, and classify pages by feature IDs. Shared pages can use `<ForFeature>` for product-specific sections. Preserve the project's strict-classification policy and pass the same `--profile` to baseline, validation, build, and export; a default-context pass does not verify a customer edition.
27
+
24
28
  ## Record scope and edit
25
29
 
26
30
  Before editing, capture the current state with `docs baseline --out <new-baseline> --config <config>`. Put baselines inside the project's excluded `.shoalrun` directory or outside the project. This includes earlier dirty/untracked files rather than comparing with Git HEAD. Retain the corresponding before-content/task diff with your harness; a baseline stores digests, not earlier text. For an existing rendering failure, reproduce its located finding before repairing it.
@@ -0,0 +1,164 @@
1
+ # Author customer documentation editions
2
+
3
+ Use this workflow when a project selects documentation by purchased products or
4
+ features, including grandfathered access and deployment-owned branding. Keep
5
+ commercial selection in profiles and feature IDs in authored content.
6
+
7
+ ## Establish the edition context
8
+
9
+ Check the installed CLI's `shoalrun --help` and `shoalrun docs --help` for `--profile`
10
+ before using this workflow. Deployment profiles require `0.1.0-alpha.15` or later with this capability.
11
+ Do not silently upgrade the project's pinned package. The package's
12
+ `DEPLOYMENT-PROFILES.md` is the configuration reference; use
13
+ `docs read guide.deployment-profiles` when that guide exists in the bundled
14
+ snapshot. Do not assume a newly implemented feature is in an older snapshot.
15
+
16
+ Read the existing shared `profiles` configuration and SKU manifest. Preserve
17
+ immutable SKU revisions; use the purchase's explicit revision rather than
18
+ substituting today's bundle. SKU grants and direct `features` are additive.
19
+ Grandfathered features need no SKU. `deprecated` and `retired` labels do not
20
+ revoke grants, and feature grants do not select older documentation versions.
21
+
22
+ Use the one profile path supplied for the deployment. Keep real customer profiles,
23
+ branding, reports, and captured snapshots outside public source control and served
24
+ output. Do not introduce a central customer registry or scan adjacent deployments.
25
+ If the profile is unavailable, continue shared-source work and report which edition
26
+ checks remain unverified; do not fabricate real purchases or remove `required`.
27
+
28
+ For a new synthetic example, these are complete selection inputs:
29
+
30
+ ```yaml
31
+ # Shared sku-manifest.yaml, beside docs.config.yaml
32
+ schemaVersion: 1
33
+ features:
34
+ analytics: {}
35
+ reports.classic: {lifecycle: deprecated}
36
+ skus:
37
+ professional:
38
+ revisions:
39
+ "2026-10": {features: [analytics]}
40
+ ```
41
+
42
+ ```yaml
43
+ # Shared docs.config.yaml fragment; retain the project's other settings
44
+ profiles:
45
+ manifest: ./sku-manifest.yaml
46
+ required: true
47
+ pruneNavigation: true
48
+ requireClassification: true
49
+ ```
50
+
51
+ ```yaml
52
+ # Deployment-owned profile outside the shared repository
53
+ schemaVersion: 1
54
+ skus:
55
+ - {id: professional, revision: "2026-10"}
56
+ features: [reports.classic]
57
+ ```
58
+
59
+ Direct-only profiles can omit `skus`; `features: []` with no SKU grants selects
60
+ shared content only. Missing required input, unknown IDs/revisions, and `null`
61
+ grant lists fail rather than falling back to another edition. Profile paths resolve
62
+ from the invocation directory; declared logo/favicon paths resolve from the profile
63
+ directory and must remain inside it. Branding uses bounded existing `site`, `theme`,
64
+ and snippet `variables` settings, not arbitrary config merges. Profiles cannot
65
+ replace content sources, plugins, access policy, or navigation labels.
66
+
67
+ ## Choose page and section requirements
68
+
69
+ In normal mode, a page with no authored or inherited `requires` is shared after
70
+ ordinary publishing rules. Do not infer requirements from folders, product tags,
71
+ SKU names, or navigation labels.
72
+
73
+ With `profiles.requireClassification: true`, each public source page in the shared
74
+ enabled publications must explicitly declare either `shared: true` or `requires`.
75
+ The check precedes customer feature/publication selection. Drafts and disabled
76
+ shared publications do not need classification for that build. Inherited
77
+ requirements still restrict a page but do not satisfy classification. `shared`
78
+ cannot appear in defaults/enforced settings; `shared: false` and combining
79
+ `shared: true` with page requirements are invalid. Review unclassified pages
80
+ named in errors; do not automatically mark them shared or disable the policy.
81
+
82
+ ```yaml
83
+ # Shared page frontmatter fragment
84
+ shared: true
85
+ ```
86
+
87
+ ```yaml
88
+ # Feature-specific page frontmatter fragment
89
+ requires:
90
+ allOf: [analytics]
91
+ ```
92
+
93
+ Requirements name feature IDs, not SKUs. Use `allOf` when every feature is needed
94
+ and `anyOf` when one suffices; if both clauses appear, both must pass. Lists are
95
+ nonempty. Unmet page requirements omit the whole page.
96
+
97
+ A shared page may contain product-specific sections:
98
+
99
+ ```mdx
100
+ These setup instructions apply to every customer.
101
+
102
+ <ForFeature allOf="analytics">
103
+
104
+ ## Configure Analytics
105
+
106
+ Instructions for customers with Analytics.
107
+
108
+ </ForFeature>
109
+
110
+ These troubleshooting tips apply to every customer.
111
+ ```
112
+
113
+ `ForFeature` is a block with literal whitespace-separated `allOf`/`anyOf` feature
114
+ IDs. Excluded blocks contribute no text, links, snippets, API embeds, or images.
115
+ Put links to optional pages inside matching conditions. A matching inner block
116
+ cannot restore an excluded page. Ungated text on shared pages remains shared:
117
+ classification catches missing metadata, not incorrect decisions or paragraphs.
118
+
119
+ Generated API references accept explicit `shared: true` or `requires` on the API
120
+ definition beside `generateReferences`, or `x-shoalrun-shared: true` /
121
+ `x-shoalrun-requires: {allOf: [analytics]}` on an OpenAPI operation. API-level
122
+ requirements still apply. Classify differing operations individually; ordinary
123
+ frontmatter defaults do not satisfy generated classification. Authored API pages
124
+ follow the source-page rule. Profile builds require focused operation contracts;
125
+ full raw-source publication and standalone schema embeds are unsupported.
126
+
127
+ ## Validate the selected edition
128
+
129
+ Capture the baseline before editing and pass the same explicit profile during
130
+ validation, build, and export. From the project directory:
131
+
132
+ ```sh
133
+ shoalrun docs baseline --config docs.config.yaml \
134
+ --out .shoalrun/edition-before.json --profile /run/config/docs-profile.yaml
135
+
136
+ # Edit source, then validate with the selected deployment context.
137
+ shoalrun docs validate --config docs.config.yaml \
138
+ --baseline .shoalrun/edition-before.json --profile /run/config/docs-profile.yaml
139
+
140
+ shoalrun build docs.config.yaml edition-dist --profile /run/config/docs-profile.yaml
141
+ shoalrun export docs.config.yaml --out edition-content \
142
+ --profile /run/config/docs-profile.yaml
143
+ ```
144
+
145
+ Use explicit `--file`/`--id` selectors if no baseline exists. Apply the authoring
146
+ skill's applicable project checks, review, preview, and freshness workflow to the
147
+ returned report. Snapshot capture includes the external profile and its declared
148
+ assets; changing them invalidates the evidence. Export still needs its normal
149
+ publication selection when multiple combinations are enabled. `dev` and
150
+ checked-plan authoring do not resolve deployment editions; use build/serve or
151
+ snapshot validation/preview. Preview URLs and artifacts may contain customer data.
152
+
153
+ Check both included and excluded content in HTML, Markdown, search/discovery,
154
+ focused API contracts, and exports. Use synthetic no-grant, relevant single-feature,
155
+ and combined-feature profiles when changing shared selection logic; do not invent
156
+ customer records. Confirm unclassified content fails in strict mode, shared prose
157
+ remains, and excluded markers/assets are absent from output files. Selected prose
158
+ links must resolve; known excluded navigation entries prune only when configured.
159
+ The private `.shoalrun/profile-selection.json` receipt is not a public artifact.
160
+
161
+ Read coverage: pages excluded by the profile have not had their rendered content
162
+ checked. Validate a context that includes changed gated content before claiming
163
+ it is verified. Reports establish selection and validation, not authentication;
164
+ the deployment controls customer access to each resulting edition.
@@ -11,6 +11,8 @@ The CLI includes overrideable `recipe`, `ingredient`, and `cookbook` templates;
11
11
 
12
12
  Read `shoalrun docs read guide.recipes-overview`, then `guide.recipe-drafts` for composition or `guide.cookbooks` for choices. In a source checkout, use `node framework/dist/cli.js` in place of `shoalrun` after compiling the framework. Inspect the target project's config, neighboring pages, and existing ingredients before writing.
13
13
 
14
+ When recipes or ingredients vary by purchased features, read [the customer-edition workflow](../shoalrun-author/references/customer-editions.md). Apply page classification to the final recipe source, use `<ForFeature>` for feature-specific sections, and validate editions that include each changed conditional branch. Do not assume a shared-page build checks an excluded recipe or ingredient branch.
15
+
14
16
  Choose only the layers the task needs:
15
17
 
16
18
  - **Recipe:** write a complete page with prerequisites, ordered actions, explicit value handoffs, failure guidance, and a final success check. A recipe can be authored directly; ingredients are optional.
@@ -11,6 +11,8 @@ When adapting existing documentation, start with a connected, representative set
11
11
 
12
12
  Use `shoalrun init <directory> --starter minimal` for a small site or `--starter api-docs` for a parcel API site with guides, generated references, and focused contracts. Use `--starter showcase` for a fuller Cedar Parcel handbook with component examples, diagrams, reader views, a landing page, local-workflow cookbook, and generated API references. All three starters build without provider credentials. The command copies a bundled example without overwriting existing files. From the source checkout, use `node framework/dist/cli.js init <directory> --starter <name>` from the repository root. Replace fixture names, prose, API files, navigation, and example domains. Keep `docs.config.yaml` as the entry point. Consult the Shoalrun config reference for unfamiliar keys; do not invent config fields or assume that a package has been published to npm.
13
13
 
14
+ For customer-specific or white-label editions, read [the customer-edition workflow](../shoalrun-author/references/customer-editions.md) before configuring selection. Keep the SKU manifest shared and the selected customer profile in its deployment environment. Check CLI support before using `--profile`, preserve strict-classification choices, and use that profile for validation and build/serve; `dev` does not resolve deployment editions.
15
+
14
16
  Run scaffolding from the project directory or use an absolute target path. Passing `--config` does not rebase `scaffold -n` against that config's directory. Resolve scaffold placeholders and remove unused optional sections while retaining the page's intended identity and draft access.
15
17
 
16
18
  For a specific setting or workflow, run `shoalrun docs search "<topic>"`, then `shoalrun docs read <document-id>` to load the matching generated Markdown. Use these bundled docs before guessing at a command or config key.
@@ -31,4 +33,6 @@ For a new OpenAPI source, read `guide.api-references` and complete its API-sourc
31
33
 
32
34
  Check the generated HTML, Markdown twins, and `documents.json`. Confirm navigation and API links resolve, and inspect assets inside the components that contain them. Run `shoalrun audit docs.config.yaml` when project checks or API audits are configured; documentation behavior tests can use Doc Detective through `audit.tests` or another external CLI.
33
35
 
36
+ For optional semantic search, use `outputs.html.search.provider: semantic` (available since `0.1.0-alpha.16`) with `retrieval.embeddings`; do not generate a custom browser adapter for Shoalrun's own endpoint. Build the site, run `shoalrun index <output> --embed --config docs.config.yaml`, then `shoalrun serve <output> --search --config docs.config.yaml` with the provider key only in the environment. Confirm the endpoint returns `mode: vector`; a visible result or keyword fallback does not prove semantic retrieval. Selecting the browser provider does not provision production hosting, and profiled Vercel chat-function builds remain unsupported.
37
+
34
38
  Report the files created, commands run, and anything still needing an owner decision. Do not deploy, publish a release, or claim factual accuracy from a successful build alone.
package/styles/site.css CHANGED
@@ -71,6 +71,8 @@ button{cursor:pointer}
71
71
  @media(max-width:48rem){.footer-inner{padding:2rem 1.1rem 1.5rem}.site-footer a{min-height:2.75rem}}
72
72
  @media print{.footer-columns,.footer-links{display:none}.site-footer{background:none}}
73
73
  .brand{display:flex;align-items:center;gap:.7rem;font-weight:750;font-size:1rem;letter-spacing:-.025em;color:var(--color-ink);overflow-wrap:anywhere;min-width:0}
74
+ .brand-custom::before{display:none}
75
+ .brand-logo{display:block;flex:none;max-width:8rem;max-height:2rem;object-fit:contain}
74
76
  .brand::before{content:"";flex:none;width:.75rem;height:.75rem;border-radius:50% 50% 50% 0;background:var(--color-accent);transform:rotate(-45deg)}
75
77
  .edition{font-family:var(--font-code);font-size:.72rem;color:var(--color-header-muted);border:1px solid var(--color-header-border);border-radius:var(--radius-small);padding:.25rem .65rem;overflow-wrap:anywhere;max-width:100%}
76
78
  .layout{max-width:var(--width-site);margin:auto;display:grid;grid-template-areas:"side main rail";grid-template-columns:minmax(12rem,14rem) minmax(0,1fr) minmax(12rem,15rem);gap:clamp(1.5rem,3vw,3rem);padding:2.75rem 2rem 6rem}
@@ -1,34 +0,0 @@
1
- ---
2
- id: guide.content-export
3
- title: Export content into your application
4
- summary: Export selected documentation and assets for your application.
5
- type: how-to
6
- area: publishing
7
- subarea: publishing-builds
8
- canonical: /publish/content-export
9
- ---
10
-
11
- # Export content into your application
12
-
13
- > Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
14
-
15
- Navigation section: [Docs](https://www.shoalrun.com/.well-known/shoalrun/navigation/docs-50f26fe22670.txt) (ID: docs). [All sections and pages](https://www.shoalrun.com/llms.min.txt)
16
-
17
- Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Publish and maintain > Export content into your application
18
-
19
- **Updated: 2026-10-29.**
20
-
21
- Parent page: [Full Markdown page](/publish/content-export.md)
22
-
23
- Keep application help and your documentation website in one content source. `shoalrun export` produces a directory of resolved Markdown, passive HTML fragments, referenced assets, and a manifest. Your application owns the help drawer, onboarding screen, or other interface that displays the content. It does not need a Shoalrun browser runtime.
24
-
25
- ## Upgrade an existing integration
26
-
27
- If an existing bundle contains `manifest.documents`, upgrade the CLI and rebuild the export before using this guide's loader. Update custom consumers to the resource contract:
28
-
29
- - Read `manifest.resources` instead of `manifest.documents`.
30
- - Select page resources with `ref.kind === 'page'` and `ref.documentId` instead of a document's `id`.
31
- - Route links with `kind: resource` through their typed `ref`, rather than `kind: document` and `documentId`.
32
- - Read file paths from the rebuilt manifest; do not retain paths from the old bundle.
33
-
34
- The `documents` configuration selector remains shorthand for whole pages. Use [resource selectors](https://www.shoalrun.com/content-delivery/select.md) when selecting approved sections or named snippet instances.