` block so
diff --git a/packages/docs/src/components/selector.tsx b/apps/docs-smoke/src/components/docs-mdx/selector.tsx
similarity index 94%
rename from packages/docs/src/components/selector.tsx
rename to apps/docs-smoke/src/components/docs-mdx/selector.tsx
index 6348743..3483523 100644
--- a/packages/docs/src/components/selector.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/selector.tsx
@@ -2,17 +2,17 @@
import { type ReactNode, useId, useState } from "react";
-export type SelectorOption = {
- value: string;
+export interface SelectorOption {
label: string;
-};
+ value: string;
+}
-export type SelectorProps = {
+export interface SelectorProps {
+ children?: (activeValue: string) => ReactNode;
+ defaultValue?: string;
label?: string;
options: SelectorOption[];
- defaultValue?: string;
- children?: (activeValue: string) => ReactNode;
-};
+}
/**
* Minimal dropdown-style selector. Consumers typically replace this with
diff --git a/packages/docs/src/components/steps.tsx b/apps/docs-smoke/src/components/docs-mdx/steps.tsx
similarity index 100%
rename from packages/docs/src/components/steps.tsx
rename to apps/docs-smoke/src/components/docs-mdx/steps.tsx
diff --git a/packages/docs/src/components/tabs.tsx b/apps/docs-smoke/src/components/docs-mdx/tabs.tsx
similarity index 98%
rename from packages/docs/src/components/tabs.tsx
rename to apps/docs-smoke/src/components/docs-mdx/tabs.tsx
index 1953ce7..89f1006 100644
--- a/packages/docs/src/components/tabs.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/tabs.tsx
@@ -10,12 +10,12 @@ import {
useState,
} from "react";
-type TabsContextValue = {
- items: string[];
+interface TabsContextValue {
activeValue: string;
- setActiveValue: (value: string) => void;
groupId: string;
-};
+ items: string[];
+ setActiveValue: (value: string) => void;
+}
const TabsContext = createContext(null);
@@ -44,11 +44,11 @@ function panelId(groupId: string, normalized: string, index: number): string {
return `${groupId}-panel-${normalized}-${index}`;
}
-export type TabsProps = {
- items?: string[];
- defaultIndex?: number;
+export interface TabsProps {
children?: ReactNode;
-};
+ defaultIndex?: number;
+ items?: string[];
+}
export function Tabs({ items = [], defaultIndex = 0, children }: TabsProps) {
const initial = items[defaultIndex] ?? items[0] ?? "";
@@ -126,10 +126,10 @@ export function Tabs({ items = [], defaultIndex = 0, children }: TabsProps) {
);
}
-export type TabProps = {
- value: string;
+export interface TabProps {
children?: ReactNode;
-};
+ value: string;
+}
export function Tab({ value, children }: TabProps) {
const { items, activeValue, groupId } = useTabsContext();
diff --git a/packages/docs/src/components/topic-switcher.tsx b/apps/docs-smoke/src/components/docs-mdx/topic-switcher.tsx
similarity index 100%
rename from packages/docs/src/components/topic-switcher.tsx
rename to apps/docs-smoke/src/components/docs-mdx/topic-switcher.tsx
diff --git a/packages/docs/src/components/type-table.tsx b/apps/docs-smoke/src/components/docs-mdx/type-table.tsx
similarity index 97%
rename from packages/docs/src/components/type-table.tsx
rename to apps/docs-smoke/src/components/docs-mdx/type-table.tsx
index d5e8b87..cad7a51 100644
--- a/packages/docs/src/components/type-table.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/type-table.tsx
@@ -1,14 +1,14 @@
import type { ReactNode } from "react";
-export type TypeTableProperty = {
+export interface TypeTableProperty {
+ default?: string;
+ deprecated?: boolean;
description?: ReactNode;
+ required?: boolean;
type: string;
typeDescription?: ReactNode;
typeDescriptionLink?: string;
- default?: string;
- required?: boolean;
- deprecated?: boolean;
-};
+}
const SAFE_URL_SCHEMES = new Set(["http:", "https:", "mailto:"]);
@@ -50,9 +50,9 @@ function renderTypeWithLink(property: TypeTableProperty): ReactNode {
);
}
-export type TypeTableProps = {
+export interface TypeTableProps {
properties?: Record;
-};
+}
export function TypeTable({ properties }: TypeTableProps) {
const rows = Object.entries(properties ?? {});
@@ -107,13 +107,13 @@ export function TypeTable({ properties }: TypeTableProps) {
);
}
-export type ExtractedTypeTableProps = {
- /** Path to the source file — rendered as a caption; actual type extraction happens at build time via the remark plugin */
- path?: string;
+export interface ExtractedTypeTableProps {
/** The exported type name in the source file */
name?: string;
+ /** Path to the source file — rendered as a caption; actual type extraction happens at build time via the remark plugin */
+ path?: string;
properties?: Record;
-};
+}
export function ExtractedTypeTable({
path,
diff --git a/apps/docs-smoke/src/generated/docs-search-content.json b/apps/docs-smoke/src/generated/docs-search-content.json
index d0871a4..28f17de 100644
--- a/apps/docs-smoke/src/generated/docs-search-content.json
+++ b/apps/docs-smoke/src/generated/docs-search-content.json
@@ -1 +1 @@
-{"version":2,"generatedAt":"2026-04-22T22:16:29.604Z","chunks":["Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\n✅ Success Runtime fixture This page exercises the exported MDX adapters without replacing them with app-local variants.","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nAuthoring Contract\n\n```mdx Render exported adapters through your shared `mdxComponents` map. Accordion content is collapsible in the browser and still available after MDX-to-markdown conversion. Tabs hydrate in the browser. Use `TypeTable` when type data already exists in MDX. B[mdxComponents] B --> C[Rendered route] `} /> ```","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nNavigation Cards\n\nQuickstart route External reference","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nBrowser Flow\n\n1. Author MDX Use semantic components such as Callout , Tabs , Cards , Steps , CommandTabs , Accordion , Example , TopicSwitcher , and TypeTable . 2. Render in the app Import the .mdx file directly and provide mdxComponents through the shared runtime map. 3. Validate the pipeline separately Keep ExtractedTypeTable coverage in the conversion pipeline where source extraction has a stable file-system base path. Package manager Command -- -- npm npm install @inth/docs pnpm pnpm add @inth/docs yarn yarn add @inth/docs bun bun add @inth/docs Authoring rule Prefer semantic components whose content can flatten cleanly into markdown for agents, search indexes, and LLM bundles. Naming rule Use TopicSwitcher for equivalent docs slices. Frameworks are one topic category, not the whole abstraction. Overview This tabset proves the package adapters hydrate correctly inside the demo app. Tables TypeTable is safe to render live because all of its data is already present in the MDX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx .\n\n```tsx import { mdxComponents } from \"@inth/docs\"; export const components = { ...mdxComponents, }; ``` ```mermaid `flowchart LR A[Authored MDX] --> B[mdxComponents] B --> C[TanStack Start route] C --> D[Playwright coverage] ```","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nBrowser Flow\n\nX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx . Framework React — React integration Next.js — Next.js integration Svelte — Svelte integration Render MDX Preview the output and inspect the source. ✅ Success Runtime adapter The host app owns styling while @inth/docs owns the MDX component contract. mdx-components.tsx Property Type Description Default Required -- -- -- -- -- command string Package name, CLI name, or custom command template with a \\ pm placeholder. - ✅ Required mode \"install\" \\ \"run\" \\ \"create\" Optional expansion mode for package names, CLI names, or project starters such as \\ pnpm create next-app\\ . - Optional commands Partial\\ Render app-owned components through your shared `mdxComponents` map. - Shared React MDX components, MDX conversion, LLM bundles, docs - linting, and static search in one package. This app renders the - package docs and keeps the integration paths easy to test. + Framework-neutral MDX conversion, LLM bundles, docs linting, and + static search. This app owns its MDX components while rendering + the package docs and keeping integration paths easy to test.
- Spread the package map into your MDX provider. Override - individual entries only when the app needs local styling. + Define the MDX component map in the docs app and spread it + into your MDX provider. The package owns conversion and + generation, not prebuilt UI.
- {`import { mdxComponents } from "@inth/docs";
+ {`import { mdxComponents } from "@/components/docs-mdx";
export const components = {
...mdxComponents,
diff --git a/apps/docs-smoke/src/routes/playground.tsx b/apps/docs-smoke/src/routes/playground.tsx
index f8079db..9424ba0 100644
--- a/apps/docs-smoke/src/routes/playground.tsx
+++ b/apps/docs-smoke/src/routes/playground.tsx
@@ -1,5 +1,6 @@
"use client";
+import { createFileRoute, Link } from "@tanstack/react-router";
import {
Callout,
CommandTabs,
@@ -7,16 +8,15 @@ import {
Tab,
Tabs,
TypeTable,
-} from "@inth/docs";
-import { createFileRoute, Link } from "@tanstack/react-router";
+} from "@/components/docs-mdx";
import { SiteHeader } from "@/components/site-header";
const recipes = {
render: {
title: "Render MDX",
summary:
- "Use the root export when your docs site renders authored MDX in React.",
- imports: `import { mdxComponents } from "@inth/docs";`,
+ "Define the MDX component map in your docs app when it renders authored MDX in React.",
+ imports: `import { mdxComponents } from "@/components/docs-mdx";`,
code: `export const components = {
...mdxComponents,
};`,
@@ -137,7 +137,7 @@ function RecipePanel({ activeValue }: { activeValue: string }) {
- Live package behavior
+ Live app behavior
@@ -197,14 +197,14 @@ function RecipePreview({ activeValue }: { activeValue: string }) {
return (
-
+
The default `mdxComponents` map keeps authored MDX semantic while the
host app owns the surrounding shell and styling.
- Write MDX with package components such as `Callout`, `Tabs`, `Cards`,
- and `TypeTable`.
+ Write MDX with app-owned components such as `Callout`, `Tabs`,
+ `Cards`, and `TypeTable`.
Spread `mdxComponents` into your MDX provider and override individual
diff --git a/apps/docs-smoke/tests/e2e/smoke.e2e.ts b/apps/docs-smoke/tests/e2e/smoke.e2e.ts
index c60cb67..5cc8c8b 100644
--- a/apps/docs-smoke/tests/e2e/smoke.e2e.ts
+++ b/apps/docs-smoke/tests/e2e/smoke.e2e.ts
@@ -12,7 +12,7 @@ async function waitForClientHydration(page: Page): Promise {
);
}
-test("home route renders the developer dashboard and package surfaces", async ({
+test("home route renders the developer dashboard and pipeline package surfaces", async ({
page,
request,
}) => {
@@ -36,7 +36,7 @@ test("home route renders the developer dashboard and package surfaces", async ({
).toBeVisible();
});
-test("docs route renders package docs and extracted ExtractedTypeTable output", async ({
+test("docs route renders docs pipeline reference and extracted ExtractedTypeTable output", async ({
page,
request,
}) => {
@@ -80,7 +80,7 @@ test("search docs route explains the headless search APIs", async ({
).toBeVisible();
});
-test("quickstart route renders MDX content on the server and hydrates interactive adapters", async ({
+test("quickstart route renders MDX content on the server and hydrates app-owned components", async ({
page,
request,
}) => {
@@ -114,7 +114,7 @@ test("quickstart route renders MDX content on the server and hydrates interactiv
).toBeVisible();
});
-test("components fixture renders package adapters and preserves external link safety", async ({
+test("components fixture renders app-owned MDX components and preserves external link safety", async ({
page,
request,
}) => {
diff --git a/bun.lock b/bun.lock
index 316abca..75d1c06 100644
--- a/bun.lock
+++ b/bun.lock
@@ -87,13 +87,9 @@
"@tanstack/ai": "^0.13.0",
"@types/mdast": "4.0.4",
"@types/node": "^22.10.0",
- "@types/react": "^19.0.0",
- "@types/react-dom": "^19.0.0",
"ai": "^6.0.168",
"bash-tool": "1.3.16",
"just-bash": "2.14.2",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
"tsup": "^8.3.5",
"typescript": "5.9.2",
"vitest": "^2.1.8",
@@ -104,7 +100,6 @@
"ai": ">=6.0.0",
"bash-tool": ">=1.3.16",
"just-bash": ">=2.14.2",
- "react": ">=19.0.0",
"typescript": ">=5.0.0",
},
"optionalPeers": [
@@ -113,7 +108,6 @@
"ai",
"bash-tool",
"just-bash",
- "react",
"typescript",
],
},
diff --git a/packages/docs/README.md b/packages/docs/README.md
index b74993d..8c2558a 100644
--- a/packages/docs/README.md
+++ b/packages/docs/README.md
@@ -1,10 +1,9 @@
# @inth/docs
-Shared MDX-to-markdown tooling for Inth docs projects.
+Framework-neutral docs pipeline tooling for Inth docs projects.
## Package Surfaces
-- `@inth/docs`: React MDX component adapters via `mdxComponents`
- `@inth/docs/remark`: remark plugins plus `defaultRemarkPlugins`
- `@inth/docs/convert`: MDX-to-markdown conversion APIs
- `@inth/docs/llm`: `llms.txt` and topic-scoped full-context generation
@@ -23,6 +22,8 @@ pnpm add @inth/docs
## Convert Docs
+`@inth/docs` does not export prebuilt UI components. The docs app owns its MDX component map and styling; this package owns the framework-neutral conversion, LLM, lint, and search pipeline:
+
```ts
import { convertAllMdx } from "@inth/docs/convert";
import { defaultRemarkPlugins, remarkInclude } from "@inth/docs/remark";
@@ -38,9 +39,9 @@ await convertAllMdx({
This package is verified in three distinct layers:
-- Package unit tests in `packages/docs/src/**/*.test.ts*` cover pure library behavior such as semantic markup and safe-link handling.
+- Package unit tests in `packages/docs/src/**/*.test.ts*` cover pure library behavior such as conversion, search, linting, and generated docs output.
- Pipeline fixtures in `apps/docs-smoke/scripts` and `apps/docs-smoke/content` exercise MDX conversion, LLM generation, and `ExtractedTypeTable`.
-- The live consumer demo in `apps/docs-smoke` renders the exported `mdxComponents` inside a TanStack Start app and provides Playwright browser coverage.
+- The live consumer demo in `apps/docs-smoke` owns and renders its MDX components inside a TanStack Start app and provides Playwright browser coverage.
Use the demo app as the reference integration when you need to see how a consumer should host and style the package in practice.
@@ -50,11 +51,13 @@ Use the demo app as the reference integration when you need to see how a consume
Use `@inth/docs` when the docs pipeline also needs to feed converted markdown, agent bundles, lint checks, static search data, source-grounded answer routes, and internal tooling while the consuming app keeps control of routing, layout, hosting, and framework choices.
+React, Vue, Nuxt, Svelte, Astro, and other stacks can use the framework-neutral pipeline APIs today while owning their own runtime component rendering.
+
## App Wiring Model
In a consuming repo, wire this package into the docs surface:
-- Runtime docs app: spread `mdxComponents` into the MDX provider when the app renders MDX directly.
+- Runtime docs app: define `mdxComponents` in the app when it renders MDX directly.
- Docs pipeline: run `convertAllMdx` against the docs source tree.
- Agent output: run `generateLlmsTxt` and `generateLLMFullContextFiles` against the converted markdown.
- Search output: run `generateDocsSearchFiles`, then import the generated JSON in your docs search route.
diff --git a/packages/docs/agent-docs-src/docs/components.mdx b/packages/docs/agent-docs-src/docs/components.mdx
index 069bfd5..9cccae5 100644
--- a/packages/docs/agent-docs-src/docs/components.mdx
+++ b/packages/docs/agent-docs-src/docs/components.mdx
@@ -1,21 +1,19 @@
---
title: "Components"
-description: "How to use the React MDX component adapters exported by @inth/docs."
+description: "How to define app-owned MDX components that the @inth/docs pipeline can flatten."
---
# Components
-Import the default adapter map from the package root:
+`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-```tsx
-import { mdxComponents } from "@inth/docs";
-```
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
-The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map.
+## App-Owned Adapter Map
-## Default Adapter Map
+Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`.
-`mdxComponents` includes:
+Common component names handled by the default remark pipeline include:
- `Accordion`
- `AccordionItem`
@@ -37,15 +35,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX
Use it like this:
```tsx
-import { mdxComponents } from "@inth/docs";
+import { mdxComponents } from "@/components/docs-mdx";
const components = {
...mdxComponents,
- Callout: MyCallout,
};
```
-Override individual entries rather than replacing the full map unless you want to own all component bindings.
+If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline.
## Important Components
@@ -84,7 +81,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman
### `Example`
-Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
+Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
```tsx
-
- The host app owns styling while `@inth/docs` owns the MDX component contract.
+
+ The host app owns styling and runtime components while `@inth/docs` owns conversion.
```
@@ -114,7 +111,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT
### `Tabs`, `Tab`, `Steps`, `Step`
-These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
+These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
### `TopicSwitcher`
@@ -145,6 +142,6 @@ Use for reader-facing navigation across equivalent documentation topics.
## Guidance
-- Prefer the package root export for React doc-site rendering.
-- Override styling in the host app rather than forking the semantics.
+- Keep runtime components in the docs app.
+- Keep component names stable when the conversion pipeline depends on them.
- If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules.
diff --git a/packages/docs/agent-docs-src/docs/index.mdx b/packages/docs/agent-docs-src/docs/index.mdx
index bd107ea..bfd3984 100644
--- a/packages/docs/agent-docs-src/docs/index.mdx
+++ b/packages/docs/agent-docs-src/docs/index.mdx
@@ -7,7 +7,6 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc-
`@inth/docs` is the shared docs package for Inth properties. It provides:
-- React MDX component adapters for doc sites.
- A remark pipeline that flattens MDX components into LLM-friendly markdown.
- MDX to markdown conversion utilities.
- `llms.txt` and topic-scoped `llms-full/*.txt` generators.
@@ -16,7 +15,7 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc-
## Package Surfaces
-- [Components](/docs/components): React components and the `mdxComponents` adapter map.
+- [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline.
- [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`.
- [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`.
- [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`.
@@ -25,9 +24,13 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc-
## When To Read Which Page
-- Reach for [Components](/docs/components) when wiring MDX rendering into an app.
+- Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
- Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
- Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
- Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
- Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
- Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+
+## Other Frameworks
+
+React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package.
diff --git a/packages/docs/agent-docs/docs/components.md b/packages/docs/agent-docs/docs/components.md
index b86cf32..e11e15c 100644
--- a/packages/docs/agent-docs/docs/components.md
+++ b/packages/docs/agent-docs/docs/components.md
@@ -1,20 +1,20 @@
---
title: Components
-description: How to use the React MDX component adapters exported by @inth/docs.
+description: >-
+ How to define app-owned MDX components that the @inth/docs pipeline can
+ flatten.
---
# Components
-Import the default adapter map from the package root:
+`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-```tsx
-import { mdxComponents } from "@inth/docs";
-```
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
-The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map.
+## App-Owned Adapter Map
-## Default Adapter Map
+Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`.
-`mdxComponents` includes:
+Common component names handled by the default remark pipeline include:
* `Accordion`
* `AccordionItem`
@@ -36,15 +36,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX
Use it like this:
```tsx
-import { mdxComponents } from "@inth/docs";
+import { mdxComponents } from "@/components/docs-mdx";
const components = {
...mdxComponents,
- Callout: MyCallout,
};
```
-Override individual entries rather than replacing the full map unless you want to own all component bindings.
+If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline.
## Important Components
@@ -83,7 +82,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman
### `Example`
-Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
+Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
```tsx
-
- The host app owns styling while `@inth/docs` owns the MDX component contract.
+
+ The host app owns styling and runtime components while `@inth/docs` owns conversion.
```
@@ -113,7 +112,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT
### `Tabs`, `Tab`, `Steps`, `Step`
-These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
+These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
### `TopicSwitcher`
@@ -144,6 +143,6 @@ Use for reader-facing navigation across equivalent documentation topics.
## Guidance
-* Prefer the package root export for React doc-site rendering.
-* Override styling in the host app rather than forking the semantics.
+* Keep runtime components in the docs app.
+* Keep component names stable when the conversion pipeline depends on them.
* If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules.
diff --git a/packages/docs/agent-docs/docs/index.md b/packages/docs/agent-docs/docs/index.md
index 6b53549..d23b537 100644
--- a/packages/docs/agent-docs/docs/index.md
+++ b/packages/docs/agent-docs/docs/index.md
@@ -8,7 +8,6 @@ description: >-
`@inth/docs` is the shared docs package for Inth properties. It provides:
-* React MDX component adapters for doc sites.
* A remark pipeline that flattens MDX components into LLM-friendly markdown.
* MDX to markdown conversion utilities.
* `llms.txt` and topic-scoped `llms-full/*.txt` generators.
@@ -17,7 +16,7 @@ description: >-
## Package Surfaces
-* [Components](/docs/components): React components and the `mdxComponents` adapter map.
+* [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline.
* [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`.
* [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`.
* [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`.
@@ -26,9 +25,13 @@ description: >-
## When To Read Which Page
-* Reach for [Components](/docs/components) when wiring MDX rendering into an app.
+* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+
+## Other Frameworks
+
+React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package.
diff --git a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
index 9a9bd86..30cc7d7 100644
--- a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
+++ b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
@@ -4,27 +4,25 @@
## Included Pages
-- [Components](https://example.invalid/@inth/docs/docs/components): How to use the React MDX component adapters exported by @inth/docs.
+- [Components](https://example.invalid/@inth/docs/docs/components): How to define app-owned MDX components that the @inth/docs pipeline can flatten.
## Content
# Components
URL: https://example.invalid/@inth/docs/docs/components
-How to use the React MDX component adapters exported by @inth/docs.
+How to define app-owned MDX components that the @inth/docs pipeline can flatten.
# Components
-Import the default adapter map from the package root:
+`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-```tsx
-import { mdxComponents } from "@inth/docs";
-```
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
-The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map.
+## App-Owned Adapter Map
-## Default Adapter Map
+Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`.
-`mdxComponents` includes:
+Common component names handled by the default remark pipeline include:
* `Accordion`
* `AccordionItem`
@@ -46,15 +44,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX
Use it like this:
```tsx
-import { mdxComponents } from "@inth/docs";
+import { mdxComponents } from "@/components/docs-mdx";
const components = {
...mdxComponents,
- Callout: MyCallout,
};
```
-Override individual entries rather than replacing the full map unless you want to own all component bindings.
+If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline.
## Important Components
@@ -93,7 +90,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman
### `Example`
-Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
+Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior.
```tsx
-
- The host app owns styling while `@inth/docs` owns the MDX component contract.
+
+ The host app owns styling and runtime components while `@inth/docs` owns conversion.
```
@@ -123,7 +120,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT
### `Tabs`, `Tab`, `Steps`, `Step`
-These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
+These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers.
### `TopicSwitcher`
@@ -154,6 +151,6 @@ Use for reader-facing navigation across equivalent documentation topics.
## Guidance
-* Prefer the package root export for React doc-site rendering.
-* Override styling in the host app rather than forking the semantics.
+* Keep runtime components in the docs app.
+* Keep component names stable when the conversion pipeline depends on them.
* If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules.
\ No newline at end of file
diff --git a/packages/docs/agent-docs/docs/llms-full/overview.txt b/packages/docs/agent-docs/docs/llms-full/overview.txt
index 5c694f3..fae2663 100644
--- a/packages/docs/agent-docs/docs/llms-full/overview.txt
+++ b/packages/docs/agent-docs/docs/llms-full/overview.txt
@@ -16,7 +16,6 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac
`@inth/docs` is the shared docs package for Inth properties. It provides:
-* React MDX component adapters for doc sites.
* A remark pipeline that flattens MDX components into LLM-friendly markdown.
* MDX to markdown conversion utilities.
* `llms.txt` and topic-scoped `llms-full/*.txt` generators.
@@ -25,7 +24,7 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac
## Package Surfaces
-* [Components](/docs/components): React components and the `mdxComponents` adapter map.
+* [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline.
* [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`.
* [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`.
* [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`.
@@ -34,9 +33,13 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac
## When To Read Which Page
-* Reach for [Components](/docs/components) when wiring MDX rendering into an app.
+* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
-* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
\ No newline at end of file
+* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+
+## Other Frameworks
+
+React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package.
\ No newline at end of file
diff --git a/packages/docs/agent-docs/docs/llms.txt b/packages/docs/agent-docs/docs/llms.txt
index 63121d2..313242e 100644
--- a/packages/docs/agent-docs/docs/llms.txt
+++ b/packages/docs/agent-docs/docs/llms.txt
@@ -16,7 +16,7 @@ Start here for package scope and surface selection.
React MDX components and remark pipeline behavior.
-- [Components](https://example.invalid/@inth/docs/docs/components): How to use the React MDX component adapters exported by @inth/docs.
+- [Components](https://example.invalid/@inth/docs/docs/components): How to define app-owned MDX components that the @inth/docs pipeline can flatten.
- [Remark](https://example.invalid/@inth/docs/docs/remark): Reference for the remark plugins and default plugin pipeline exported by @inth/docs.
## Generation
diff --git a/packages/docs/package.json b/packages/docs/package.json
index 77578c1..5f6dbc2 100644
--- a/packages/docs/package.json
+++ b/packages/docs/package.json
@@ -1,20 +1,14 @@
{
"name": "@inth/docs",
"version": "0.0.0",
- "description": "Shared MDX→MD pipeline and React component adapters for Inth public docs",
+ "description": "Framework-neutral docs pipeline tooling for Inth public docs",
"type": "module",
"license": "MIT",
"publishConfig": {
"access": "public"
},
"sideEffects": false,
- "main": "./dist/components/index.js",
- "types": "./dist/components/index.d.ts",
"exports": {
- ".": {
- "types": "./dist/components/index.d.ts",
- "import": "./dist/components/index.js"
- },
"./remark": {
"types": "./dist/remark/index.d.ts",
"import": "./dist/remark/index.js"
@@ -104,13 +98,9 @@
"@tanstack/ai": "^0.13.0",
"@types/mdast": "4.0.4",
"@types/node": "^22.10.0",
- "@types/react": "^19.0.0",
- "@types/react-dom": "^19.0.0",
"ai": "^6.0.168",
"bash-tool": "1.3.16",
"just-bash": "2.14.2",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
"tsup": "^8.3.5",
"typescript": "5.9.2",
"vitest": "^2.1.8"
@@ -121,7 +111,6 @@
"ai": ">=6.0.0",
"bash-tool": ">=1.3.16",
"just-bash": ">=2.14.2",
- "react": ">=19.0.0",
"typescript": ">=5.0.0"
},
"peerDependenciesMeta": {
@@ -140,9 +129,6 @@
"just-bash": {
"optional": true
},
- "react": {
- "optional": true
- },
"typescript": {
"optional": true
}
diff --git a/packages/docs/src/components/components.test.tsx b/packages/docs/src/components/components.test.tsx
deleted file mode 100644
index f5e3a98..0000000
--- a/packages/docs/src/components/components.test.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import { renderToStaticMarkup } from "react-dom/server";
-import { describe, expect, it } from "vitest";
-import { Accordion, AccordionItem } from "./accordion";
-import { Callout } from "./callout";
-import { Card } from "./card";
-import { CommandTabs } from "./command-tabs";
-import { Example } from "./example";
-import { Mermaid } from "./mermaid";
-import { TopicSwitcher, type TopicSwitcherItem } from "./topic-switcher";
-import { TypeTable } from "./type-table";
-
-describe("component semantics", () => {
- it("renders callouts as notes with a default title", () => {
- const markup = renderToStaticMarkup(
- Watch out.
- );
-
- expect(markup).toContain('role="note"');
- expect(markup).toContain("Warning");
- expect(markup).toContain("Watch out.");
- });
-
- it("adds safe external link attributes to cards", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain('target="_blank"');
- expect(markup).toContain('rel="noopener"');
- });
-
- it("renders mermaid content as a plain code block fallback", () => {
- const markup = renderToStaticMarkup(
- B[Browser]"} />
- );
-
- expect(markup).toContain("data-inth-mermaid");
- expect(markup).toContain("flowchart TD");
- });
-
- it("renders install commands from package names", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain("npm install @inth/docs");
- });
-
- it("keeps custom package manager command templates", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain("npm exec inth-docs-lint");
- });
-
- it("renders create commands from starter names", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain("npm create next-app");
- });
-
- it("drops unsafe type description links", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).not.toContain("javascript:alert");
- expect(markup).not.toContain("string");
- });
-
- it("renders accordion items as native details and summary elements", () => {
- const markup = renderToStaticMarkup(
-
- Hidden content.
-
- );
-
- expect(markup).toContain(" {
- const markup = renderToStaticMarkup(
-
- Preview content.
-
- );
-
- expect(markup).toContain("Preview content.");
- expect(markup).toContain("export const value = true;");
- expect(markup).toContain('data-language="ts"');
- expect(markup).toContain("example.ts");
- });
-
- it("marks the active topic switcher item as the current page", () => {
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain('aria-current="page"');
- expect(markup).toContain("/docs/frameworks/react/quickstart");
- expect(markup).toContain("/docs/frameworks/vue/quickstart");
- });
-
- it("does not throw when topic switcher content omits an href at runtime", () => {
- const malformedItems = [
- { value: "broken", label: "Broken" },
- ] as unknown as TopicSwitcherItem[];
-
- const markup = renderToStaticMarkup(
-
- );
-
- expect(markup).toContain("Broken");
- expect(markup).toContain('aria-disabled="true"');
- });
-});
diff --git a/packages/docs/src/internal/package-surface.test.ts b/packages/docs/src/internal/package-surface.test.ts
new file mode 100644
index 0000000..0aac287
--- /dev/null
+++ b/packages/docs/src/internal/package-surface.test.ts
@@ -0,0 +1,27 @@
+import { describe, expect, it } from "vitest";
+import packageJson from "../../package.json";
+
+const exportedPaths = Object.keys(packageJson.exports);
+
+describe("package surface", () => {
+ it("does not expose runtime component entry points", () => {
+ expect(exportedPaths).toEqual([
+ "./remark",
+ "./convert",
+ "./llm",
+ "./search",
+ "./search/node",
+ "./search/ai",
+ "./search/bash",
+ "./search/vercel",
+ "./search/tanstack",
+ "./search/cloudflare",
+ "./lint",
+ ]);
+ });
+
+ it("does not expose root or runtime component adapters", () => {
+ expect(exportedPaths).not.toContain(".");
+ expect(exportedPaths).not.toContain("./react");
+ });
+});
diff --git a/packages/docs/src/remark/remark-output.test.ts b/packages/docs/src/remark/remark-output.test.ts
index 22ee451..9ef7f47 100644
--- a/packages/docs/src/remark/remark-output.test.ts
+++ b/packages/docs/src/remark/remark-output.test.ts
@@ -186,7 +186,7 @@ Body
description="Preview the output and inspect the source."
filename="mdx-components.tsx"
language="tsx"
- code={\`import { mdxComponents } from "@inth/docs";
+ code={\`import { mdxComponents } from "@/components/docs-mdx";
export const components = {
...mdxComponents,
@@ -204,7 +204,7 @@ export const components = {
expect(result.markdown).toContain("**mdx-components.tsx**");
expect(result.markdown).toContain("```tsx");
expect(result.markdown).toContain(
- 'import { mdxComponents } from "@inth/docs";'
+ 'import { mdxComponents } from "@/components/docs-mdx";'
);
});
diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json
index 2f0ddd0..25e9ca7 100644
--- a/packages/docs/tsconfig.json
+++ b/packages/docs/tsconfig.json
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
- "extends": "@repo/typescript-config/react-library.json",
+ "extends": "@repo/typescript-config/base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
diff --git a/packages/docs/tsup.config.ts b/packages/docs/tsup.config.ts
index b17ca70..f86cdbe 100644
--- a/packages/docs/tsup.config.ts
+++ b/packages/docs/tsup.config.ts
@@ -2,7 +2,6 @@ import { defineConfig } from "tsup";
export default defineConfig({
entry: {
- "components/index": "src/components/index.ts",
"remark/index": "src/remark/index.ts",
"convert/index": "src/convert/index.ts",
"llm/index": "src/llm/index.ts",
@@ -26,24 +25,13 @@ export default defineConfig({
onSuccess: async () => {
const { chmod, readFile, writeFile } = await import("node:fs/promises");
const cli = "dist/lint/cli.js";
- const components = "dist/components/index.js";
const contents = await readFile(cli, "utf8");
if (!contents.startsWith("#!")) {
await writeFile(cli, `#!/usr/bin/env node\n${contents}`);
}
- const componentContents = await readFile(components, "utf8");
- // Consumers import the bundled root entry in RSC-aware apps, so the built
- // barrel needs a client boundary even though only some source files use
- // hooks directly.
- if (!componentContents.startsWith('"use client";')) {
- await writeFile(components, `"use client";\n${componentContents}`);
- }
await chmod(cli, 0o755);
},
external: [
- "react",
- "react-dom",
- "next",
"typescript",
"fs",
"path",
From e50e4d55dcdda4a33c69f32706958895fb9dcc57 Mon Sep 17 00:00:00 2001
From: Kaylee <65376239+KayleeWilliams@users.noreply.github.com>
Date: Thu, 23 Apr 2026 15:45:54 -0400
Subject: [PATCH 2/2] Address docs review comments
---
packages/docs/agent-docs-src/docs/components.mdx | 2 +-
packages/docs/agent-docs-src/docs/index.mdx | 10 +++++-----
packages/docs/agent-docs/docs/components.md | 2 +-
packages/docs/agent-docs/docs/index.md | 10 +++++-----
.../agent-docs/docs/llms-full/authoring/components.txt | 2 +-
packages/docs/agent-docs/docs/llms-full/overview.txt | 10 +++++-----
packages/docs/src/internal/package-surface.test.ts | 7 +++++--
7 files changed, 23 insertions(+), 20 deletions(-)
diff --git a/packages/docs/agent-docs-src/docs/components.mdx b/packages/docs/agent-docs-src/docs/components.mdx
index 9cccae5..01a444b 100644
--- a/packages/docs/agent-docs-src/docs/components.mdx
+++ b/packages/docs/agent-docs-src/docs/components.mdx
@@ -7,7 +7,7 @@ description: "How to define app-owned MDX components that the @inth/docs pipelin
`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation.
## App-Owned Adapter Map
diff --git a/packages/docs/agent-docs-src/docs/index.mdx b/packages/docs/agent-docs-src/docs/index.mdx
index bfd3984..5d522dc 100644
--- a/packages/docs/agent-docs-src/docs/index.mdx
+++ b/packages/docs/agent-docs-src/docs/index.mdx
@@ -25,11 +25,11 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc-
## When To Read Which Page
- Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
-- Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
-- Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
-- Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
-- Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
-- Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+- Use [Convert](/docs/convert) when you need markdown output from `.mdx` files.
+- Check [Remark](/docs/remark) for custom plugin order or component flattening behavior.
+- Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
+- See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming.
+- Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata.
## Other Frameworks
diff --git a/packages/docs/agent-docs/docs/components.md b/packages/docs/agent-docs/docs/components.md
index e11e15c..aa69beb 100644
--- a/packages/docs/agent-docs/docs/components.md
+++ b/packages/docs/agent-docs/docs/components.md
@@ -8,7 +8,7 @@ description: >-
`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation.
## App-Owned Adapter Map
diff --git a/packages/docs/agent-docs/docs/index.md b/packages/docs/agent-docs/docs/index.md
index d23b537..8e5a9fa 100644
--- a/packages/docs/agent-docs/docs/index.md
+++ b/packages/docs/agent-docs/docs/index.md
@@ -26,11 +26,11 @@ description: >-
## When To Read Which Page
* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
-* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
-* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
-* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
-* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
-* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+* Use [Convert](/docs/convert) when you need markdown output from `.mdx` files.
+* Check [Remark](/docs/remark) for custom plugin order or component flattening behavior.
+* Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
+* See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming.
+* Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata.
## Other Frameworks
diff --git a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
index 30cc7d7..b8cabca 100644
--- a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
+++ b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt
@@ -16,7 +16,7 @@ How to define app-owned MDX components that the @inth/docs pipeline can flatten.
`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration.
-The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation.
+The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation.
## App-Owned Adapter Map
diff --git a/packages/docs/agent-docs/docs/llms-full/overview.txt b/packages/docs/agent-docs/docs/llms-full/overview.txt
index fae2663..63032f2 100644
--- a/packages/docs/agent-docs/docs/llms-full/overview.txt
+++ b/packages/docs/agent-docs/docs/llms-full/overview.txt
@@ -34,11 +34,11 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac
## When To Read Which Page
* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs.
-* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files.
-* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior.
-* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
-* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers.
-* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata.
+* Use [Convert](/docs/convert) when you need markdown output from `.mdx` files.
+* Check [Remark](/docs/remark) for custom plugin order or component flattening behavior.
+* Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles.
+* See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming.
+* Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata.
## Other Frameworks
diff --git a/packages/docs/src/internal/package-surface.test.ts b/packages/docs/src/internal/package-surface.test.ts
index 0aac287..80997dc 100644
--- a/packages/docs/src/internal/package-surface.test.ts
+++ b/packages/docs/src/internal/package-surface.test.ts
@@ -5,7 +5,7 @@ const exportedPaths = Object.keys(packageJson.exports);
describe("package surface", () => {
it("does not expose runtime component entry points", () => {
- expect(exportedPaths).toEqual([
+ const expectedExportedPaths = [
"./remark",
"./convert",
"./llm",
@@ -17,7 +17,10 @@ describe("package surface", () => {
"./search/tanstack",
"./search/cloudflare",
"./lint",
- ]);
+ ] as const;
+
+ expect(exportedPaths).toHaveLength(expectedExportedPaths.length);
+ expect(new Set(exportedPaths)).toEqual(new Set(expectedExportedPaths));
});
it("does not expose root or runtime component adapters", () => {