@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.
- package/CHANGELOG.md +49 -0
- package/DEPLOYMENT-PROFILES.md +287 -0
- package/README.md +43 -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/assets/search-semantic.js +34 -0
- package/dist/api-publication-plan.d.ts +3 -0
- package/dist/api-publication-plan.js +30 -3
- package/dist/artifact-bundle.d.ts +2 -1
- package/dist/artifact-bundle.js +2 -2
- 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 +14 -8
- package/dist/compiler.d.ts +13 -0
- package/dist/compiler.js +27 -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/index-build.js +7 -3
- 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 +3 -2
- package/dist/publication-render.js +2 -2
- package/dist/retrieval.d.ts +4 -0
- package/dist/retrieval.js +28 -8
- package/dist/search-handler.js +11 -11
- package/dist/search-identifier.d.ts +2 -1
- package/dist/search-identifier.js +10 -4
- package/dist/search-results.d.ts +1 -1
- package/dist/search-results.js +39 -25
- 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 +4 -0
- package/styles/site.css +2 -0
- 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
|
-
|
|
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.
|
|
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.
|