See Jira configuration or Jira tab.
+ ${createTabs(labels, labels.map((label) => `${label} instructions.
`), 741)} +Done.
`); + const markdown = convertHtmlToMarkdown(html); + + for (const label of labels) { + const slug = label.toLowerCase().replaceAll(' ', '-'); + assert.ok(markdown.includes(`\n\n### ${label}\n\n${label} instructions.`)); + assert.equal(markdown.split(`### ${label}\n`).length - 1, 1); + } + assert.match(markdown, /\[Jira configuration\]\(#tabs-jira\)/); + assert.match(markdown, /\[Jira tab\]\(#tabs-jira\)/); + assert.doesNotMatch(markdown, /tab-panel-|#tab-744|\[GitHub\]|role=|hidden/); + assert.match(markdown, /## Configure/); + assert.match(markdown, /\n## Verify\n/); + // Numeric component IDs can change between builds without changing Markdown. + assert.equal(markdown, convertHtmlToMarkdown(html.replaceAll(/74([1-5])/g, '99$1'))); +}); + +test('retains code metadata and nested lists within a procedure containing tabs', () => { + const code = `name: triageprompt: ```literal```
+ Configure providers.
${createTabs(['GitHub', 'Jira'], [ + 'Keep this in the first step.
Verify the result.
Inner GitHub.
', 'Inner Jira.
', + ], 30); + const html = createPage(`Outer GitHub.
${inner}Outer Jira.
', + ], 10)} +Second GitHub.
', 'Second Jira.
'], 50)} +Agent GitHub prompt.
', 'Agent Jira prompt.
', + ])}Search-only chrome.
`); + const markdown = convertHtmlToMarkdown(html); + + assert.match(markdown, /### GitHub\n\nAgent GitHub prompt\./); + assert.match(markdown, /### Jira\n\nAgent Jira prompt\./); + assert.doesNotMatch(markdown, /Search-only|template|tab-panel-/); +}); + +test('handles missing labels, broken references, and button-based tab controls', () => { + const markdown = convertHtmlToMarkdown(createPage(` +Unlabelled content.
Named content.
Punctuation content.
First.
', 'Hidden.
'])); + const htmlPath = path.join(pageDirectory, 'index.html'); + await writeFile(htmlPath, html); + + await docsMarkdownIntegration().hooks['astro:build:generated']({ + dir: pathToFileURL(`${directory}/`), logger: { info() {} }, + }); + + assert.equal(await readFile(htmlPath, 'utf8'), html); + const markdown = await readFile(path.join(directory, 'example.md'), 'utf8'); + assert.match(markdown, /## GitHub\n\nFirst\./); + assert.match(markdown, /## Jira\n\nHidden\./); +}); + test('includes inert agent-only templates in generated Markdown', () => { const html = ` diff --git a/src/sidebar.ts b/src/sidebar.ts index 539e2216b..64552f2d0 100644 --- a/src/sidebar.ts +++ b/src/sidebar.ts @@ -404,6 +404,18 @@ export const sidebarTopics: StarlightSidebarTopicsUserConfig = [ { slug: 'platform/transitioning-from-oz', label: 'Transitioning from Oz' }, ], }, + { + label: 'Factory use cases', + items: [ + { slug: 'factories/use-cases', label: 'Overview' }, + { slug: 'factories/use-cases/issue-triage', label: 'Issue triage' }, + { slug: 'factories/use-cases/code-review', label: 'Code review' }, + { slug: 'factories/use-cases/issue-implementation', label: 'Issue implementation' }, + { slug: 'factories/use-cases/production-incident-resolution', label: 'Production incident resolution' }, + { slug: 'factories/use-cases/computer-use-verification', label: 'Computer Use verification' }, + { slug: 'factories/use-cases/end-to-end-sdlc-automation', label: 'End-to-end SDLC automation' }, + ], + }, { // Parallel to 'Agent configuration' in the Automation Platform tab. // Scoped to the factory itself: who runs the work, how it is defined,