@shoalrun/cli 0.1.0-alpha.14 → 0.1.0-alpha.15
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/CHANGELOG.md +23 -0
- package/DEPLOYMENT-PROFILES.md +287 -0
- package/README.md +5 -2
- package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +5 -1
- package/agent-docs/SNAPSHOT.json +5 -5
- package/agent-docs/changelog/2026-10-30.md +43 -0
- package/agent-docs/changelog/2026-11-03.md +56 -0
- package/agent-docs/changelog.md +17 -1
- package/agent-docs/documents.json +419 -61
- package/agent-docs/index.md +73 -103
- package/agent-docs/provenance.json +4 -4
- package/agent-docs/publish/content-export.md +1 -1
- package/agent-docs/publish/content-export.sections/prerequisites.md +11 -0
- package/agent-docs/publish/deployment-profiles.md +273 -0
- package/agent-docs/publish/deployment-profiles.sections/before-you-begin.md +44 -0
- package/agent-docs/publish/deployment-profiles.sections/build-and-inspect-the-edition.md +69 -0
- package/agent-docs/publish/deployment-profiles.sections/check-the-result.md +46 -0
- package/agent-docs/publish/deployment-profiles.sections/choose-navigation-labels.md +53 -0
- package/agent-docs/publish/deployment-profiles.sections/current-limits.md +46 -0
- package/agent-docs/publish/deployment-profiles.sections/define-the-shared-sku-manifest.md +70 -0
- package/agent-docs/publish/deployment-profiles.sections/html-markdown-and-agents.md +44 -0
- package/agent-docs/publish/deployment-profiles.sections/mark-pages-and-shared-sections.md +135 -0
- package/agent-docs/publish/deployment-profiles.sections/related-reading.md +42 -0
- package/agent-docs/publish/deployment-profiles.sections/supply-the-profile-from-the-deployment.md +68 -0
- package/agent-docs/search-index.json +1 -1
- package/agent-docs/start.md +2 -2
- package/agent-docs/start.sections/add-the-page-to-navigation.md +1 -1
- package/agent-docs/start.sections/build-and-check-both-outputs.md +1 -1
- package/agent-docs/start.sections/build-this-site.md +1 -1
- package/agent-docs/start.sections/check-writing-style.md +1 -1
- package/agent-docs/start.sections/create-a-page.md +1 -1
- package/agent-docs/start.sections/make-it-yours.md +1 -1
- package/agent-docs/start.sections/migrating-from-github-packages.md +1 -1
- package/agent-docs/start.sections/prerequisites.md +1 -1
- package/agent-docs/start.sections/related-reading.md +1 -1
- package/agent-docs/start.sections/start-your-own-project.md +2 -2
- package/dist/api-publication-plan.d.ts +3 -0
- package/dist/api-publication-plan.js +30 -3
- package/dist/artifact-bundle.d.ts +1 -0
- package/dist/artifact-bundle.js +1 -1
- package/dist/authoring-api.d.ts +1 -1
- package/dist/authoring-api.js +1 -1
- package/dist/authoring-project-command.js +4 -2
- package/dist/authoring-project.d.ts +2 -0
- package/dist/authoring-project.js +4 -4
- package/dist/authoring-snapshot.d.ts +23 -4
- package/dist/authoring-snapshot.js +84 -12
- package/dist/authoring-validation-command.js +5 -3
- package/dist/authoring-validation.d.ts +2 -0
- package/dist/authoring-validation.js +38 -11
- package/dist/cli-discovery.d.ts +2 -2
- package/dist/cli-discovery.js +9 -9
- package/dist/cli.js +8 -6
- package/dist/compiler.d.ts +13 -0
- package/dist/compiler.js +25 -74
- package/dist/component-names.js +1 -1
- package/dist/component-transform.js +7 -1
- package/dist/config.d.ts +4 -1
- package/dist/config.js +19 -5
- package/dist/content-export-command.d.ts +13 -1
- package/dist/content-export-command.js +3 -2
- package/dist/content-export.d.ts +13 -0
- package/dist/content-export.js +5 -4
- package/dist/content-source.d.ts +1 -0
- package/dist/content-workspace.d.ts +13 -0
- package/dist/content-workspace.js +18 -1
- package/dist/deployment-profile.d.ts +52 -0
- package/dist/deployment-profile.js +277 -0
- package/dist/frontmatter.js +11 -4
- package/dist/page-materialization.js +2 -0
- package/dist/page-renderer.d.ts +1 -0
- package/dist/page-renderer.js +3 -1
- package/dist/palettes.d.ts +1 -1
- package/dist/project-navigation.d.ts +5 -0
- package/dist/project-navigation.js +19 -0
- package/dist/publication-plan.d.ts +3 -1
- package/dist/publication-plan.js +23 -4
- package/dist/publication-render.d.ts +2 -1
- package/dist/publication-render.js +2 -2
- package/dist/site-identity.d.ts +3 -0
- package/dist/site-identity.js +69 -0
- package/dist/vercel.d.ts +1 -0
- package/dist/vercel.js +3 -1
- package/package.json +2 -1
- package/skills/shoalrun-author/SKILL.md +5 -1
- package/skills/shoalrun-author/references/customer-editions.md +164 -0
- package/skills/shoalrun-recipes/SKILL.md +2 -0
- package/skills/shoalrun-setup/SKILL.md +2 -0
- package/styles/site.css +2 -0
- package/agent-docs/publish/content-export.sections/upgrade-an-existing-integration.md +0 -34
package/agent-docs/index.md
CHANGED
|
@@ -12,121 +12,72 @@ canonical: /
|
|
|
12
12
|
|
|
13
13
|
> Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
|
|
14
14
|
|
|
15
|
-
**Updated: 2026-10-
|
|
15
|
+
**Updated: 2026-10-30.**
|
|
16
16
|
|
|
17
17
|
**Docs for people. Context for agents.**
|
|
18
18
|
|
|
19
|
-
One source,
|
|
19
|
+
One source, two audiences. Build interactive docs for people and readable content for agents, with checks before you publish.
|
|
20
20
|
|
|
21
|
+
- [Use your docs in your app](https://www.shoalrun.com/content-delivery.md)
|
|
21
22
|
- [See what an agent gets](https://www.shoalrun.com/publish/agent-friendliness.md)
|
|
22
23
|
- [See what works today](https://www.shoalrun.com/status.md)
|
|
23
24
|
|
|
24
|
-
> **Try the alpha:** Install `@shoalrun/cli` from npm
|
|
25
|
+
> **Try the alpha:** Install `@shoalrun/cli` from npm. No account or token is needed, and the normal build makes no model calls or network requests. Pin an exact version while the alpha evolves.
|
|
25
26
|
>
|
|
26
27
|
> [Install Shoalrun →](https://www.shoalrun.com/start.md)
|
|
27
28
|
|
|
28
|
-
##
|
|
29
|
-
|
|
30
|
-
Write Markdown, MDX, and OpenAPI once. People get tabs, disclosures, navigation, and reader views. Agents get the supported content in reading order, with stable page identities and machine-readable contracts.
|
|
31
|
-
|
|
32
|
-
| What you can inspect | What it gives you |
|
|
33
|
-
| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
34
|
-
| A manifest with byte digests | Stable page IDs and publication variants, with SHA-256 digests for checking the exact Markdown bytes. |
|
|
35
|
-
| Compact discovery and incremental sync | Find a page without the full search index; compare saved snapshots when a build changes. |
|
|
36
|
-
| Focused per-operation OpenAPI contracts | One small contract containing an operation and the local schemas it needs, when enabled. |
|
|
37
|
-
| Explicit component representations | Tabs and disclosures become labeled sections. Snippets expand into their resolved content. Unsupported components fail the build. |
|
|
38
|
-
| Reader views and format-specific content | Choose what people see in the browser and write different explanations for HTML and Markdown when needed. |
|
|
39
|
-
|
|
40
|
-
### A tabbed page, without missing panels
|
|
41
|
-
|
|
42
|
-
This example has two client choices and a closed disclosure. The Markdown includes both clients and the troubleshooting detail.
|
|
43
|
-
|
|
44
|
-
### You write
|
|
45
|
-
|
|
46
|
-
````mdx title="content/check-service.mdx"
|
|
47
|
-
<Tabs label="Client">
|
|
48
|
-
<Tab label="curl">
|
|
49
|
-
|
|
50
|
-
```sh
|
|
51
|
-
curl -fsS https://api.example.com/health
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
</Tab>
|
|
55
|
-
<Tab label="JavaScript">
|
|
56
|
-
|
|
57
|
-
```js
|
|
58
|
-
const response = await fetch('https://api.example.com/health');
|
|
59
|
-
console.log(response.status);
|
|
60
|
-
```
|
|
29
|
+
## Put your docs inside your product
|
|
61
30
|
|
|
62
|
-
|
|
63
|
-
</Tabs>
|
|
31
|
+
Export pages, single sections, and named snippets from the source that builds your site. Read them as HTML or Markdown in a help drawer, an onboarding screen, or an agent. Static files are enough; no content server or model provider is needed.
|
|
64
32
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
</Collapsible>
|
|
68
|
-
````
|
|
33
|
+
```ts
|
|
34
|
+
import { openManifestContentSource } from '@shoalrun/cli/content';
|
|
69
35
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
36
|
+
const snapshot = await openManifestContentSource({
|
|
37
|
+
manifestUrl: '/content/revisions/r1/manifest.json',
|
|
38
|
+
});
|
|
39
|
+
const result = await snapshot.get(
|
|
40
|
+
{ kind: 'section', documentId: 'guide.billing', sectionId: 'refunds' },
|
|
41
|
+
{ format: 'html' },
|
|
42
|
+
);
|
|
76
43
|
```
|
|
77
44
|
|
|
78
|
-
|
|
45
|
+
The client checks each representation against the manifest's digest. A REST adapter serves the same snapshots over HTTP.
|
|
79
46
|
|
|
80
|
-
|
|
81
|
-
const response = await fetch('https://api.example.com/health');
|
|
82
|
-
console.log(response.status);
|
|
83
|
-
```
|
|
47
|
+
- [Content delivery](https://www.shoalrun.com/content-delivery.md)
|
|
84
48
|
|
|
85
|
-
|
|
49
|
+
Deliver pages, sections, and snippet instances to applications from one reviewed content bundle.
|
|
86
50
|
|
|
87
|
-
|
|
51
|
+
- [Read content with a client](https://www.shoalrun.com/content-delivery/client.md)
|
|
88
52
|
|
|
89
|
-
|
|
53
|
+
Open a content revision and read typed resources without depending on generated filenames.
|
|
90
54
|
|
|
91
|
-
|
|
92
|
-
### curl
|
|
93
|
-
|
|
94
|
-
```sh
|
|
95
|
-
curl -fsS https://api.example.com/health
|
|
96
|
-
```
|
|
55
|
+
- [Serve content through REST](https://www.shoalrun.com/content-delivery/rest.md)
|
|
97
56
|
|
|
98
|
-
|
|
57
|
+
Expose reviewed content snapshots over HTTP and read them through the content client.
|
|
99
58
|
|
|
100
|
-
|
|
101
|
-
const response = await fetch('https://api.example.com/health');
|
|
102
|
-
console.log(response.status);
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### If the request fails
|
|
59
|
+
## Readable output, with checks you can inspect
|
|
106
60
|
|
|
107
|
-
|
|
108
|
-
````
|
|
61
|
+
Write Markdown, MDX, and OpenAPI once. People get tabs, navigation, and reader views. Agents get the supported content in reading order, with stable page IDs and machine-readable contracts.
|
|
109
62
|
|
|
110
|
-
|
|
63
|
+
| What you can inspect | What it gives you |
|
|
64
|
+
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
65
|
+
| A manifest with byte digests | Stable page IDs and publication variants, with SHA-256 digests for the exact Markdown bytes. |
|
|
66
|
+
| Compact discovery and incremental sync | Find a page without the full search index; compare snapshots when a build changes. |
|
|
67
|
+
| Focused per-operation OpenAPI contracts | One small contract with an operation and the local schemas it needs, when enabled. |
|
|
68
|
+
| Explicit component representations | Tabs and disclosures become labeled sections. Snippets expand. Unsupported components fail the build. |
|
|
69
|
+
| Reader views and format-specific content | Choose what people see in the browser, and write different explanations for HTML and Markdown when needed. |
|
|
111
70
|
|
|
112
|
-
Start with the compact page list,
|
|
71
|
+
Start with the compact page list, then fetch a page as Markdown. Hosts that support [content negotiation](https://www.shoalrun.com/publish/agent-friendliness.md) also serve it at the HTML route when the request sends `Accept: text/markdown`.
|
|
113
72
|
|
|
114
73
|
```sh
|
|
115
74
|
curl -fsSL https://www.shoalrun.com/llms.min.txt
|
|
116
75
|
curl -fsSL https://www.shoalrun.com/publish/agent-friendliness.md
|
|
117
76
|
```
|
|
118
77
|
|
|
119
|
-
Hosts that support [content negotiation](https://www.shoalrun.com/publish/agent-friendliness.md) can serve the same Markdown at the HTML route when the request sends `Accept: text/markdown`:
|
|
120
|
-
|
|
121
|
-
```sh
|
|
122
|
-
curl -fsSL -H 'Accept: text/markdown' https://www.shoalrun.com/author/search
|
|
123
|
-
```
|
|
124
|
-
|
|
125
78
|
## Check both audiences before you publish
|
|
126
79
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
For example, adding `<UnknownWidget />` to a page makes `shoalrun check` fail with the source path:
|
|
80
|
+
The audit builds HTML and Markdown, checks links and API contracts, and runs your project tests. An unsupported component stops the build instead of disappearing from the agent's document. Adding `<UnknownWidget />` to a page, for example, makes `shoalrun check` fail with the source path:
|
|
130
81
|
|
|
131
82
|
```text
|
|
132
83
|
FAIL build
|
|
@@ -134,9 +85,9 @@ FAIL build
|
|
|
134
85
|
Checks failed. Fix the findings above and rerun shoalrun check.
|
|
135
86
|
```
|
|
136
87
|
|
|
137
|
-
This is illustrative
|
|
88
|
+
This output is illustrative, not a failure on the current site. The check catches unsupported representations; it does not establish that every sentence is correct.
|
|
138
89
|
|
|
139
|
-
[Eval reports](https://www.shoalrun.com/publish/evals.md)
|
|
90
|
+
[Eval reports](https://www.shoalrun.com/publish/evals.md) add reviewed agent-task results to the gate. You supply the agent run and the review. Shoalrun's five example tasks are a self-reviewed demonstration, not an independent measure of agent accuracy.
|
|
140
91
|
|
|
141
92
|
- [Audit a docs project](https://www.shoalrun.com/publish/audit.md)
|
|
142
93
|
|
|
@@ -150,13 +101,31 @@ This is illustrative output, not a failure on the current site. The check catche
|
|
|
150
101
|
|
|
151
102
|
Import a local OpenAPI file, author an operation page, review its public content, and build HTML and Markdown.
|
|
152
103
|
|
|
153
|
-
##
|
|
104
|
+
## Let agents read your docs, and help write them
|
|
105
|
+
|
|
106
|
+
Agents search and read built docs through the CLI or a read-only MCP server with four tools: `search_docs`, `get_page`, `get_outline`, and `get_section`. MCP cannot edit files or deploy. Writing and checking use your agent's own file tools, CLI commands such as `docs validate` and `audit`, and five bundled skills.
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
shoalrun docs mcp --site docs/dist
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
This site's live endpoint is `https://www.shoalrun.com/mcp`.
|
|
113
|
+
|
|
114
|
+
- [Connect an MCP client](https://www.shoalrun.com/publish/mcp.md)
|
|
115
|
+
|
|
116
|
+
Connect read-only MCP clients over stdio or HTTP to search and read built documentation.
|
|
117
|
+
|
|
118
|
+
- [Use your coding agent](https://www.shoalrun.com/author/coding-agent.md)
|
|
119
|
+
|
|
120
|
+
Give your agent project guidance and draft a new documentation page.
|
|
121
|
+
|
|
122
|
+
- [Use the bundled agent skills](https://www.shoalrun.com/contribute/agent-skills.md)
|
|
154
123
|
|
|
155
|
-
|
|
124
|
+
Give an agent the setup and authoring workflows that ship with Shoalrun.
|
|
156
125
|
|
|
157
|
-
|
|
126
|
+
## Control the reading experience
|
|
158
127
|
|
|
159
|
-
[
|
|
128
|
+
[Reader views](https://www.shoalrun.com/author/reader-views.md) shape navigation, search, cards, and marked sections in the browser. A UI reader can follow screen actions while a developer sees request examples. The Markdown keeps every marked section, with a label. [Format-specific content](https://www.shoalrun.com/author/components/only.md) swaps an interactive instruction for a written explanation.
|
|
160
129
|
|
|
161
130
|
- [Reader views](https://www.shoalrun.com/author/reader-views.md)
|
|
162
131
|
|
|
@@ -170,9 +139,21 @@ Reader views are visibility controls, not access controls. Hidden browser conten
|
|
|
170
139
|
|
|
171
140
|
Public field projection, source paths, profiles, precedence, and required values.
|
|
172
141
|
|
|
142
|
+
## Build more than one site from one source
|
|
143
|
+
|
|
144
|
+
Keep one content directory and give each site its own config, origin, theme, and navigation. `site.contentFilter` selects pages by audience, product, or region at build time. Versions and languages can share unchanged pages.
|
|
145
|
+
|
|
146
|
+
- [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md)
|
|
147
|
+
|
|
148
|
+
Publish separate sites from shared content using optional facet selection.
|
|
149
|
+
|
|
150
|
+
- [Share pages across documentation versions](https://www.shoalrun.com/publish/publications.md)
|
|
151
|
+
|
|
152
|
+
Versioning one docs site without copying every page: share unchanged pages, vary sections, and publish changed pages separately.
|
|
153
|
+
|
|
173
154
|
## Make it look like yours
|
|
174
155
|
|
|
175
|
-
|
|
156
|
+
Pick a theme and palette, follow the reader's light or dark setting, and add brand colors or CSS. The build checks palette contrast.
|
|
176
157
|
|
|
177
158
|
```yaml title="docs.config.yaml"
|
|
178
159
|
theme:
|
|
@@ -218,23 +199,12 @@ Customize these parts through config, local modules, or a host adapter.
|
|
|
218
199
|
| ----------------- | --------------------------- | ---------------------------------------------------------------------- |
|
|
219
200
|
| Search | `outputs.html.search` | Use the built-in index, supply a provider, or turn browser search off. |
|
|
220
201
|
| Code highlighting | `outputs.html.highlighting` | Choose a Shiki theme or supply a highlighter. |
|
|
221
|
-
| Page metadata | `metadata.provider` | Define the fields your build can read
|
|
222
|
-
| Reader views | `readerFilters` | Define reader choices and mark pages and sections
|
|
202
|
+
| Page metadata | `metadata.provider` | Define the fields your build can read. |
|
|
203
|
+
| Reader views | `readerFilters` | Define reader choices and mark pages and sections. |
|
|
223
204
|
| Share images | `outputs.html.shareImages` | Customize the link-preview design and fonts. |
|
|
224
205
|
| Hosting | Build adapters | Configure HTTP behavior for Vercel, Node, or your own host. |
|
|
225
206
|
|
|
226
|
-
Split config across files with `$include`, share a base with `extends`, and
|
|
227
|
-
|
|
228
|
-
### Give your coding agent the docs
|
|
229
|
-
|
|
230
|
-
The prototype bundles four authoring skills: setup, authoring, recipes, and code walkthroughs. It also includes Shoalrun's generated documentation for offline lookup:
|
|
231
|
-
|
|
232
|
-
```sh
|
|
233
|
-
shoalrun docs search "custom search provider"
|
|
234
|
-
shoalrun docs read guide.search
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
[Use the bundled skills](https://www.shoalrun.com/contribute/agent-skills.md) or consult the [command reference](https://www.shoalrun.com/reference/agent-skills.md). Shoalrun does not generate reader-side skills for each site it builds. Skills need human expertise to create and maintain; see the [non-goals](https://www.shoalrun.com/non-goals.md).
|
|
207
|
+
Split config across files with `$include`, share a base with `extends`, and run `shoalrun config explain` to see which file set a value.
|
|
238
208
|
|
|
239
209
|
- [Organize project configuration](https://www.shoalrun.com/configuration.md)
|
|
240
210
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"siteBuild": {
|
|
4
4
|
"schemaVersion": 1,
|
|
5
|
-
"configDigest": "
|
|
6
|
-
"buildId": "
|
|
5
|
+
"configDigest": "e6facf6d76a90c838fde73e4bc4a253bc30f7fa0eb67547b4f89386abd3a0378",
|
|
6
|
+
"buildId": "c8c2a551d388148cf830e85bea3a58118a3a935dc91fa043ab2cd2a178ff9c6c"
|
|
7
7
|
},
|
|
8
|
-
"packageIntegrity": "sha512-
|
|
9
|
-
"manifestDigest": "
|
|
8
|
+
"packageIntegrity": "sha512-2Of7hhwylA4zWfoWIISM+0E63RzMhK9yI/NErSoNaUhquYQSD8iED1AWiUzqabnE0hg9rdtxCt82ws5+R9D3bQ==",
|
|
9
|
+
"manifestDigest": "3c6af9a8161232cd4e824e72a427fb2b2a21963939a761a5f0f3557415dba580"
|
|
10
10
|
}
|
|
@@ -26,7 +26,7 @@ Install Shoalrun `0.1.0-alpha.13` or newer in the documentation project. This gu
|
|
|
26
26
|
|
|
27
27
|
Start with a Shoalrun project and public pages assigned to an enabled publication. Navigation, facets, a site title, and a previous website build are optional. A site origin is needed only when links must fall back to pages on the documentation website. The export does not generate embeddings or run documentation chat.
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
### Upgrade an existing integration
|
|
30
30
|
|
|
31
31
|
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:
|
|
32
32
|
|
|
@@ -27,3 +27,14 @@ Keep application help and your documentation website in one content source. `sho
|
|
|
27
27
|
Install Shoalrun `0.1.0-alpha.13` or newer in the documentation project. This guide uses the resource-based export manifest described in the [manifest reference](https://www.shoalrun.com/content-delivery/manifest.md).
|
|
28
28
|
|
|
29
29
|
Start with a Shoalrun project and public pages assigned to an enabled publication. Navigation, facets, a site title, and a previous website build are optional. A site origin is needed only when links must fall back to pages on the documentation website. The export does not generate embeddings or run documentation chat.
|
|
30
|
+
|
|
31
|
+
### Upgrade an existing integration
|
|
32
|
+
|
|
33
|
+
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:
|
|
34
|
+
|
|
35
|
+
- Read `manifest.resources` instead of `manifest.documents`.
|
|
36
|
+
- Select page resources with `ref.kind === 'page'` and `ref.documentId` instead of a document's `id`.
|
|
37
|
+
- Route links with `kind: resource` through their typed `ref`, rather than `kind: document` and `documentId`.
|
|
38
|
+
- Read file paths from the rebuilt manifest; do not retain paths from the old bundle.
|
|
39
|
+
|
|
40
|
+
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.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: guide.deployment-profiles
|
|
3
|
+
title: Build customer documentation editions
|
|
4
|
+
summary: Select purchased and grandfathered features with a deployment-owned
|
|
5
|
+
profile and apply customer branding.
|
|
6
|
+
type: how-to
|
|
7
|
+
area: publishing
|
|
8
|
+
subarea: publishing-configuration
|
|
9
|
+
canonical: /publish/deployment-profiles
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Build customer documentation editions
|
|
13
|
+
|
|
14
|
+
> Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
|
|
15
|
+
|
|
16
|
+
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)
|
|
17
|
+
|
|
18
|
+
Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Publish and maintain > Customer editions
|
|
19
|
+
|
|
20
|
+
**Updated: 2026-11-03.**
|
|
21
|
+
|
|
22
|
+
Build a documentation edition for each customer from one shared content project. Keep product definitions in the shared repository and supply each customer's purchases, additional features, and branding through that deployment's own profile file. Customer profiles do not need to share a repository.
|
|
23
|
+
|
|
24
|
+
By default, you do not need to mark every page. Pages without feature requirements are shared across customer editions. For customer deployments that need a deliberate decision on each page, enable explicit classification. In either mode, add requirements to pages or sections that depend on specific features.
|
|
25
|
+
|
|
26
|
+
Available since `0.1.0-alpha.15`.
|
|
27
|
+
|
|
28
|
+
## Before you begin
|
|
29
|
+
|
|
30
|
+
Start with a [configured documentation project](https://www.shoalrun.com/configuration.md), its authored pages, and CLI `0.1.0-alpha.15` or later. Your deployment must be able to supply one local profile file and any declared branding assets. The fictional names and products below illustrate the format; replace them with your own catalog.
|
|
31
|
+
|
|
32
|
+
A stock keeping unit (SKU) identifies a product or bundle you sell. A feature ID identifies functionality that documentation describes. A SKU revision grants a set of features; a profile can also grant features directly for standalone purchases or grandfathered agreements.
|
|
33
|
+
|
|
34
|
+
## Define the shared SKU manifest
|
|
35
|
+
|
|
36
|
+
Create `sku-manifest.yaml` beside `docs.config.yaml`:
|
|
37
|
+
|
|
38
|
+
```yaml title="sku-manifest.yaml"
|
|
39
|
+
schemaVersion: 1
|
|
40
|
+
features:
|
|
41
|
+
analytics: { description: Analytics reports }
|
|
42
|
+
connectors: { description: External data connectors }
|
|
43
|
+
reports.classic: { lifecycle: deprecated }
|
|
44
|
+
skus:
|
|
45
|
+
professional:
|
|
46
|
+
revisions:
|
|
47
|
+
"2025-04":
|
|
48
|
+
features: [analytics, reports.classic]
|
|
49
|
+
"2026-10":
|
|
50
|
+
features: [analytics, connectors]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Retain historical revisions unchanged when packaging changes. An existing customer can continue using the original revision, or receive an explicit feature grant. Marking a feature `deprecated` or `retired` does not remove its documentation grant.
|
|
54
|
+
|
|
55
|
+
Enable profile selection in the shared configuration:
|
|
56
|
+
|
|
57
|
+
```yaml title="docs.config.yaml (fragment)"
|
|
58
|
+
profiles:
|
|
59
|
+
manifest: ./sku-manifest.yaml
|
|
60
|
+
required: true
|
|
61
|
+
pruneNavigation: true
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`required` defaults to `true`. A missing profile fails the build. `pruneNavigation` defaults to `false`; enabling it removes known excluded destinations and empty groups. Misspelled navigation targets remain errors.
|
|
65
|
+
|
|
66
|
+
## Mark pages and shared sections
|
|
67
|
+
|
|
68
|
+
Pages declare feature requirements with `requires`. They do not name SKU IDs. The profile's SKU mappings and direct grants determine which features are available.
|
|
69
|
+
|
|
70
|
+
### Unmarked pages are shared by default
|
|
71
|
+
|
|
72
|
+
With `profiles.requireClassification` omitted or `false`, a page with no authored or inherited `requires` is included in every eligible customer edition. Common setup, introductions, and shared troubleshooting can remain unmarked.
|
|
73
|
+
|
|
74
|
+
Shared content still has to pass the project's access, publication, language, and facet rules. A draft stays excluded from normal builds, and a page for an older version still needs that publication enabled.
|
|
75
|
+
|
|
76
|
+
The following table shows feature selection after those other rules pass. Grants can come from SKUs or direct feature entries:
|
|
77
|
+
|
|
78
|
+
| Page requirements | No granted features | Analytics only | Analytics and Connectors |
|
|
79
|
+
| ------------------------------------- | ------------------- | -------------- | ------------------------ |
|
|
80
|
+
| No authored or inherited requirements | Included | Included | Included |
|
|
81
|
+
| `allOf: [analytics]` | Omitted | Included | Included |
|
|
82
|
+
| `allOf: [analytics, connectors]` | Omitted | Omitted | Included |
|
|
83
|
+
| `anyOf: [analytics, connectors]` | Omitted | Included | Included |
|
|
84
|
+
|
|
85
|
+
**Forgetting a requirement makes a feature-specific page shared.** Shoalrun does not infer requirements from its folder, title, product metadata, or navigation label. Enable explicit classification to catch missing page declarations, and review feature-specific content before distributing an edition.
|
|
86
|
+
|
|
87
|
+
### Require a deliberate page classification
|
|
88
|
+
|
|
89
|
+
Enable strict classification in the shared project configuration:
|
|
90
|
+
|
|
91
|
+
```yaml title="docs.config.yaml (fragment)"
|
|
92
|
+
profiles:
|
|
93
|
+
manifest: ./sku-manifest.yaml
|
|
94
|
+
required: true
|
|
95
|
+
pruneNavigation: true
|
|
96
|
+
requireClassification: true
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Every public page in the shared project's enabled publications must now explicitly declare `shared: true` or `requires` in its own source frontmatter. An unclassified page fails the build with its source filename; it does not silently disappear. The check runs before customer feature and publication selection, so a later purchase or publication change cannot expose a previously unchecked page. Drafts and pages outside the shared project's enabled publications do not need classification for that build.
|
|
100
|
+
|
|
101
|
+
For common instructions, add this page-level declaration:
|
|
102
|
+
|
|
103
|
+
```yaml title="Shared page frontmatter (fragment)"
|
|
104
|
+
shared: true
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
For a product-specific page, use `requires` as shown below. Do not combine `shared: true` and `requires` on the same page. `shared: false` is invalid. `shared` must stay page-specific and cannot appear in frontmatter defaults or enforced settings. Inherited feature requirements still restrict content, but do not satisfy strict classification: each page needs its own declaration.
|
|
108
|
+
|
|
109
|
+
To migrate, enable the policy locally and classify the pages named in build errors after reviewing their content. Put the declaration in page templates to make the choice part of creating a page; avoid marking an entire collection shared without reviewing it.
|
|
110
|
+
|
|
111
|
+
This policy catches missing declarations. It cannot tell whether a declaration is correct or detect an ungated product-specific paragraph inside a shared page. It does not authenticate readers; the deployment still controls access to the resulting edition.
|
|
112
|
+
|
|
113
|
+
### Restrict a feature-specific page
|
|
114
|
+
|
|
115
|
+
Add a requirement to each page that depends on specific functionality. This integration guide needs both features:
|
|
116
|
+
|
|
117
|
+
```yaml title="Integration guide frontmatter (fragment)"
|
|
118
|
+
requires:
|
|
119
|
+
allOf: [analytics, connectors]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Use `anyOf` when either feature is sufficient. If a requirement contains both clauses, both must pass. When the resolved requirements do not match the profile's grants, the whole page is omitted.
|
|
123
|
+
|
|
124
|
+
### Restrict part of a shared page
|
|
125
|
+
|
|
126
|
+
A page classified `shared: true` can still contain product-specific sections. Use `<ForFeature>` around each section that depends on features. Its attributes contain whitespace-separated feature IDs:
|
|
127
|
+
|
|
128
|
+
```mdx
|
|
129
|
+
These setup instructions apply to every customer.
|
|
130
|
+
|
|
131
|
+
<ForFeature allOf="analytics connectors">
|
|
132
|
+
|
|
133
|
+
## Connect your reports <Anchor id="connect-reports" />
|
|
134
|
+
|
|
135
|
+
Import a dataset through a connector, then select it in your analytics report.
|
|
136
|
+
|
|
137
|
+
</ForFeature>
|
|
138
|
+
|
|
139
|
+
These troubleshooting tips apply to every customer.
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The page's content outside `<ForFeature>` stays shared. A block appears only when its requirements match; excluding a block does not exclude the rest of the page. If a page-level requirement excludes the whole page, a matching block inside it cannot restore that page.
|
|
143
|
+
|
|
144
|
+
Excluded blocks contribute no text, links, snippet expansions, API embeds, or images to the edition. Put links to optional pages inside matching conditions. A link remaining in selected prose must point to a selected destination.
|
|
145
|
+
|
|
146
|
+
### Classify generated API references
|
|
147
|
+
|
|
148
|
+
Generated pages take an explicit classification from their API definition or OpenAPI operation. For an API whose generated references are shared, add `shared: true` beside `generateReferences`:
|
|
149
|
+
|
|
150
|
+
```yaml title="Shared API definition (fragment)"
|
|
151
|
+
apis:
|
|
152
|
+
example:
|
|
153
|
+
shared: true
|
|
154
|
+
source:
|
|
155
|
+
kind: file
|
|
156
|
+
path: ./openapi.yaml
|
|
157
|
+
focused: true
|
|
158
|
+
generateReferences: true
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
For a feature-specific API, use `requires` instead of `shared`. An individual OpenAPI operation can declare `x-shoalrun-shared: true` or `x-shoalrun-requires: { allOf: [analytics] }`. Its declaration satisfies classification for that generated page; API-level feature requirements still apply. Operations with differing requirements need their own declarations. General frontmatter defaults do not satisfy generated-page classification. Authored API reference pages follow the ordinary page rule.
|
|
162
|
+
|
|
163
|
+
## Supply the profile from the deployment
|
|
164
|
+
|
|
165
|
+
Mount or generate the customer profile outside the shared docs repository. For example, a deployment could provide `/run/config/docs-profile.yaml` and a `brand` directory beside it:
|
|
166
|
+
|
|
167
|
+
```yaml title="Deployment-owned docs-profile.yaml"
|
|
168
|
+
schemaVersion: 1
|
|
169
|
+
skus:
|
|
170
|
+
- { id: professional, revision: "2026-10" }
|
|
171
|
+
features:
|
|
172
|
+
- reports.classic
|
|
173
|
+
site:
|
|
174
|
+
title: Example Partner documentation
|
|
175
|
+
origin: https://docs.partner.example
|
|
176
|
+
logo: ./brand/logo.svg
|
|
177
|
+
favicon: ./brand/icon.png
|
|
178
|
+
theme:
|
|
179
|
+
palette: kelp
|
|
180
|
+
publications:
|
|
181
|
+
enabled:
|
|
182
|
+
- { channel: production, version: current, language: en }
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
This profile grants Analytics and Connectors through the SKU, plus Classic Reports through a direct grant. A customer with only grandfathered functionality can omit `skus` and declare `features: [reports.classic]`. No synthetic SKU is needed.
|
|
186
|
+
|
|
187
|
+
SKU and direct grants combine into a set. Unknown IDs and revisions fail validation. Declare `features: []` with no SKU grants for a shared-content-only edition; `null` is invalid. That edition still includes eligible shared pages and text outside feature blocks, while pages and blocks requiring a feature are omitted. A missing required profile fails the build rather than selecting this shared-only behavior.
|
|
188
|
+
|
|
189
|
+
Profile logo and favicon paths resolve from the profile directory and must stay inside it. Shared configuration paths retain their own origins. Shoalrun reads the chosen profile and declared assets without discovering other customers' files in that deployment directory.
|
|
190
|
+
|
|
191
|
+
Profiles accept selected `site`, `theme`, and existing snippet `variables` settings. They can narrow `publications.enabled` to combinations already enabled by the shared project. They cannot replace content sources, register plugins, change access policy, or override navigation. Profile CSS, custom fonts, and file-backed palettes are not supported.
|
|
192
|
+
|
|
193
|
+
## Build and inspect the edition
|
|
194
|
+
|
|
195
|
+
From the shared documentation project directory, build into a deployment-specific output:
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
shoalrun build docs.config.yaml dist/customer \
|
|
199
|
+
--profile /run/config/docs-profile.yaml
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
To export application content, pass the same profile to `shoalrun export`:
|
|
203
|
+
|
|
204
|
+
```sh
|
|
205
|
+
shoalrun export docs.config.yaml --out dist/customer-content \
|
|
206
|
+
--profile /run/config/docs-profile.yaml
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
If several publications are enabled, an export still needs its normal explicit publication selection. Grandfathered features and older instructions are independent: the feature grant selects functionality, while the [publication version](https://www.shoalrun.com/publish/publications.md) selects the release's instructions.
|
|
210
|
+
|
|
211
|
+
Use the profile when [validating documentation edits](https://www.shoalrun.com/author/workspace.md):
|
|
212
|
+
|
|
213
|
+
```sh
|
|
214
|
+
shoalrun docs baseline --config docs.config.yaml \
|
|
215
|
+
--out .shoalrun/baseline.json --profile /run/config/docs-profile.yaml
|
|
216
|
+
|
|
217
|
+
# Edit your documentation, then validate the same edition.
|
|
218
|
+
shoalrun docs validate --config docs.config.yaml \
|
|
219
|
+
--baseline .shoalrun/baseline.json --profile /run/config/docs-profile.yaml
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Review and preview use the returned report. The snapshot captures the external profile and declared assets; later changes make the report stale. Treat reports and captured project directories as private build artifacts.
|
|
223
|
+
|
|
224
|
+
## Choose navigation labels
|
|
225
|
+
|
|
226
|
+
Navigation headings come from the shared project's ordinary navigation configuration. For example:
|
|
227
|
+
|
|
228
|
+
```yaml title="Shared navigation (fragment)"
|
|
229
|
+
navigation:
|
|
230
|
+
- id: product-guides
|
|
231
|
+
label: Product guides
|
|
232
|
+
items:
|
|
233
|
+
- { id: analytics, doc: guide.analytics }
|
|
234
|
+
- { id: connectors, doc: guide.connectors }
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
`Product guides` is authored text. You can name this group `Your products`, `Reference`, or another label that suits your readers. The framework does not supply the words “Your products.” Profile selection removes ineligible destinations from the group; it does not rename the group or infer purchases from navigation labels.
|
|
238
|
+
|
|
239
|
+
## Check the result
|
|
240
|
+
|
|
241
|
+
Inspect the edition's sidebar, selected pages, and shared sections. Then inspect its Markdown, search indexes, `documents.json`, and exports for the same selections. An excluded feature's content should be absent from the output files, rather than hidden by browser controls.
|
|
242
|
+
|
|
243
|
+
A normal site build writes a private selection report at `.shoalrun/profile-selection.json`. It lists resolved features, grant sources, and inclusion decisions. Match its `buildId` to the output before treating it as a receipt for that output. The profile itself, its source filenames, and the report are not served as public metadata.
|
|
244
|
+
|
|
245
|
+
Affected pages excluded from the selected profile remain listed in validation coverage with a warning that their rendered content was not checked. Validate another profile that includes those pages before accepting their content changes.
|
|
246
|
+
|
|
247
|
+
## HTML, Markdown, and agents
|
|
248
|
+
|
|
249
|
+
HTML displays the selected documentation with the deployment's title, logo, favicon, theme, and configured links. The masthead keeps the title as its accessible label. Markdown retains the selected instructions and links, without the site's branding controls. Feature selection happens during compilation and does not need browser JavaScript.
|
|
250
|
+
|
|
251
|
+
Agents reading search, discovery, or exported content receive the selected edition. They cannot retrieve excluded instructions from that edition's Markdown twin. Existing browser reader views still affect visibility only; use feature requirements for build-time omission.
|
|
252
|
+
|
|
253
|
+
## Current limits
|
|
254
|
+
|
|
255
|
+
Profiled API builds reject full OpenAPI source publication. Set `source.publish: false` and `source.focused: true` for focused operation downloads. Generated operations can declare `x-shoalrun-requires`; API definitions and explicit bindings also accept `requires`. Generated references respect inherited frontmatter requirements.
|
|
256
|
+
|
|
257
|
+
Operation embeds respect the selection. Standalone `<ApiSchema api="..." schema="..." />` embeds are not supported in profiled builds. Static `vercel build --profile FILE` is supported; profiled chat-function builds are not.
|
|
258
|
+
|
|
259
|
+
`dev` and checked-plan authoring do not yet accept deployment profiles. Use build/serve or captured validation/preview. Your deployment supplies the declared purchases and grants; Shoalrun does not query billing systems or expire entitlements. Protect private editions through host authentication.
|
|
260
|
+
|
|
261
|
+
## Related reading
|
|
262
|
+
|
|
263
|
+
### Read first
|
|
264
|
+
|
|
265
|
+
- [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md) — Understand how separate sites share authored content and configuration.
|
|
266
|
+
|
|
267
|
+
### Next steps
|
|
268
|
+
|
|
269
|
+
- [Check working-tree documentation edits](https://www.shoalrun.com/author/workspace.md) — Review the selected edition using captured HTML and Markdown. (Status: experimental.)
|
|
270
|
+
|
|
271
|
+
### Reference while working
|
|
272
|
+
|
|
273
|
+
- [Share pages across documentation versions](https://www.shoalrun.com/publish/publications.md) — Select older product instructions independently of feature grants.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: guide.deployment-profiles
|
|
3
|
+
title: Build customer documentation editions
|
|
4
|
+
summary: Select purchased and grandfathered features with a deployment-owned
|
|
5
|
+
profile and apply customer branding.
|
|
6
|
+
type: how-to
|
|
7
|
+
area: publishing
|
|
8
|
+
subarea: publishing-configuration
|
|
9
|
+
canonical: /publish/deployment-profiles
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Build customer documentation editions
|
|
13
|
+
|
|
14
|
+
> Documentation index: [llms.min.txt](https://www.shoalrun.com/llms.min.txt) · Document manifest: [documents.json](https://www.shoalrun.com/documents.json)
|
|
15
|
+
|
|
16
|
+
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)
|
|
17
|
+
|
|
18
|
+
Breadcrumbs: [Docs](https://www.shoalrun.com/what-is-shoalrun.md) > Publish and maintain > Customer editions
|
|
19
|
+
|
|
20
|
+
**Updated: 2026-11-03.**
|
|
21
|
+
|
|
22
|
+
Parent page: [Full Markdown page](/publish/deployment-profiles.md)
|
|
23
|
+
|
|
24
|
+
**Page reading path** — these links apply to the full page.
|
|
25
|
+
|
|
26
|
+
**Read first**
|
|
27
|
+
|
|
28
|
+
- [Build separate sites from shared content](https://www.shoalrun.com/publish/single-source-sites.md) — Understand how separate sites share authored content and configuration.
|
|
29
|
+
|
|
30
|
+
**Next steps**
|
|
31
|
+
|
|
32
|
+
- [Check working-tree documentation edits](https://www.shoalrun.com/author/workspace.md) — Review the selected edition using captured HTML and Markdown. (Status: experimental.)
|
|
33
|
+
|
|
34
|
+
Build a documentation edition for each customer from one shared content project. Keep product definitions in the shared repository and supply each customer's purchases, additional features, and branding through that deployment's own profile file. Customer profiles do not need to share a repository.
|
|
35
|
+
|
|
36
|
+
By default, you do not need to mark every page. Pages without feature requirements are shared across customer editions. For customer deployments that need a deliberate decision on each page, enable explicit classification. In either mode, add requirements to pages or sections that depend on specific features.
|
|
37
|
+
|
|
38
|
+
Available since `0.1.0-alpha.15`.
|
|
39
|
+
|
|
40
|
+
## Before you begin
|
|
41
|
+
|
|
42
|
+
Start with a [configured documentation project](https://www.shoalrun.com/configuration.md), its authored pages, and CLI `0.1.0-alpha.15` or later. Your deployment must be able to supply one local profile file and any declared branding assets. The fictional names and products below illustrate the format; replace them with your own catalog.
|
|
43
|
+
|
|
44
|
+
A stock keeping unit (SKU) identifies a product or bundle you sell. A feature ID identifies functionality that documentation describes. A SKU revision grants a set of features; a profile can also grant features directly for standalone purchases or grandfathered agreements.
|