* feat(satteri): add @fumadocs/satteri package and compiler discriminator
Introduce @fumadocs/satteri with Sätteri-native ports of Fumadocs MDX
plugins (remark-heading, structure, image, code-tab, npm, rehype-toc,
rehype-code, and others), plus applySatteriPreset and compileMdx.
In fumadocs-mdx, add compiler: 'satteri' on doc collections with
satteriOptions typing, getSatteriOptions(), and a buildSatteriMDX path
that uses mdxToJs instead of @mdx-js/mdx.
Co-authored-by: Fuma Nama <[email protected]>
* Port native rehype-code and isolate Satteri as optional peer
- Rewrite @fumadocs/satteri rehype-code as a Satteri hast plugin using
fumadocs-core Shiki (no unified/vfile deps in the package)
- Unwrap Shiki root fragments before ctx.replaceNode
- Move getSatteriOptions to fumadocs-mdx/config/build-satteri and expose
fumadocs-mdx/satteri and fumadocs-mdx/config/satteri entry points
- Make @fumadocs/satteri and satteri optional peerDependencies
- Dynamic-import the satteri build path only when compiler is satteri
- Add rehype-code and fumadocs-mdx satteri pipeline tests
Co-authored-by: Fuma Nama <[email protected]>
* Port official docs app to Satteri compiler
- Switch apps/docs docs and blog collections to compiler: satteri
- Replace mdxOptions/applyMdxPreset with applySatteriPreset and Satteri plugins
- Add @fumadocs/satteri plugins: rehypeKatex, remarkElementIds, remarkLlms
- Port remarkAutoTypeTableSatteri and remarkTypeScriptToJavaScriptSatteri
- Enhance remark-structure stringify and satteri postprocess pipeline
- Drop remark-math/rehype-katex/unified from docs deps (math via features.math)
Co-authored-by: Fuma Nama <[email protected]>
* Remove custom rehypeKatex; use Satteri features.math
Satteri natively parses inline ($...$) and display ($$...$$) math via
features.math. Drop the redundant KaTeX hast plugin, katex peer dependency,
and hast-util-from-html-isomorphic from @fumadocs/satteri.
Co-authored-by: Fuma Nama <[email protected]>
* Use structuredClone for Satteri node snapshots; fix build blockers
- Replace custom materialize() with structuredClone in remark-llms and
remark-structure (snapshot nodes during visitor, stringify after pass)
- Add GFM/math stringifiers for structured data and LLM markdown export
- Fix remark-include cwd attribute, section extraction, and node replacement
- Fix remarkAutoTypeTableSatteri cwd resolution via collection _cwd
- Restore remark deps for apps/docs markdown.tsx
Co-authored-by: Fuma Nama <[email protected]>
* docs: add AGENTS.md with Cursor Cloud setup instructions
Co-authored-by: god63820869 <[email protected]>
* Fix Satteri plugin patterns per upstream API docs
Plugins were fighting Satteri's Rust-backed AST model:
- Export once at compile end via ctx.data, not queueDataExport per visit
(rehype-toc, remark-llms, valueExportPlugin) — avoids 1600+ duplicate exports
- Use ctx.replaceNode / insertChildAt instead of splicing parent.children
(remark-npm, remark-code-tab, remark-auto-type-table)
- Return { raw: string } for includes instead of inserting external mdast
- Skip Shiki on math code blocks; flatten toc titles for appendExports
- Sync remark-llms _markdown writes; guard get-llm-text processed fallback
Adds satteri-toc-count test. Docs build passes.
Co-authored-by: Fuma Nama <[email protected]>
* Use Satteri exported types instead of duplicating context shapes
Centralize ctx.data keys in @fumadocs/satteri/data-map via DataMap
augmentation. Plugins use MdastVisitorContext, HastVisitorContext, and
Data from satteri rather than inline { data: Record<...> } or
Parameters<typeof queueDataExport> hacks.
Re-export visitor context types from @fumadocs/satteri. MDX loader adds
_compiler to satteri DataMap separately.
Co-authored-by: Fuma Nama <[email protected]>
* Move remarkElementIds to docs; optimize Satteri plugin hot paths
- remarkElementIds is docs-only (apps/docs/lib) for lint link validation,
removed from @fumadocs/satteri exports
- remark-llms: stringify once after all root children collected (was O(n²))
- remark-structure: attach structuredData once instead of every visit
- rehype-toc: store textContent title strings, not hast element refs
- preset: drop valueExportPlugin; compile.ts already handles _valueToExport
Co-authored-by: Fuma Nama <[email protected]>
* reduce deps
* Further Satteri plugin perf: defer clones, use textContent
- remark-llms: collect root indices during visit, structuredClone batch at end
- remark-structure: ctx.textContent instead of flattenNode when no custom stringify;
single shared visitor per type; attach structuredData on first visit only
- remark-heading/postprocess: ctx.textContent for slug/title (no double tree walk)
- rehype-toc: assign export object once, mutate items array in place
- rehype-code: skip elements already highlighted by shiki
- Add remark-llms tests; vitest @ path alias
Co-authored-by: Fuma Nama <[email protected]>
* Move remark-ts2js Satteri plugin to @fumadocs/satteri
- Add remarkTs2js to @fumadocs/satteri (oxc-transform dep)
- doc-gen keeps unified remarkTypeScriptToJavaScript only; drop satteri peer
- Docs source.config imports remarkTs2js from @fumadocs/satteri
- Document Satteri usage tab in remark-ts2js docs page
Co-authored-by: Fuma Nama <[email protected]>
* Move remarkAutoTypeTable Satteri plugin to @fumadocs/satteri
Extract shared generation into fumadocs-typescript/auto-type-table-generate.
fumadocs-typescript keeps unified remarkAutoTypeTable only; no satteri dep.
Satteri remarkAutoTypeTable uses createAutoTypeTableGenerator from
fumadocs-typescript. Docs imports plugin from @fumadocs/satteri.
Co-authored-by: Fuma Nama <[email protected]>
* refactor(satteri): remove barrel export, use subpath imports
Drop src/index.ts and the package root export. Each plugin, preset,
compile, utils, and data-map module is now a separate subpath export.
Consumers import from paths like @fumadocs/satteri/preset and
@fumadocs/satteri/remark-ts2js. Satteri core APIs are imported
from the satteri package directly.
Co-authored-by: Fuma Nama <[email protected]>
* fix(satteri): keep auto-type-table logic local, use markdownToHast
Revert all fumadocs-typescript changes. Move auto-type-table generation
into @fumadocs/satteri with duplicated parse-tags helper. Render JSDoc
markdown via Satteri's markdownToHast (no remark/unified deps); sanitize
raw hast nodes for hast-util-to-estree compatibility.
Co-authored-by: Fuma Nama <[email protected]>
* refactor(satteri): consolidate remark-auto-type-table into one file
Merge auto-type-table-generate, markdown-renderer, and parse-tags into
remark-auto-type-table.ts. Drop factory/helpers; inline prop parsing and
table generation in the Satteri plugin visitor.
Co-authored-by: Fuma Nama <[email protected]>
* improve performance
* Merge branch 'pr-3398' into cursor/satteri-package-b279
---------
Co-authored-by: Fuma Nama <[email protected]>
* fix(ui): use 'prompt' param for Open in ChatGPT link
* fix(base-ui): use 'prompt' param for Open in ChatGPT link
* docs(changeset): add changelog for ChatGPT prompt param fix