material-ui icon indicating copy to clipboard operation
material-ui copied to clipboard

[docs-infra] Add a script to generate Material UI `llms.txt` and docs markdown.

Open siriwatknp opened this issue 7 months ago • 1 comments

Result:

  • llms.txt: https://deploy-preview-46308--material-ui.netlify.app/material-ui/llms.txt
  • public component: https://deploy-preview-46308--material-ui.netlify.app/material-ui/react-accordion.md (APIs for this component family are attached to the main component)
  • public docs: https://deploy-preview-46308--material-ui.netlify.app/material-ui/getting-started/installation.md

Summary

This PR introduces a new script to generate LLM-optimized documentation by processing MUI component markdown files and creating standalone documentation with embedded code examples and API references.

What's included

New build script: buildLlmsDocs

  • Location: /scripts/buildLlmsDocs/index.ts
  • Purpose: Generates comprehensive markdown files optimized for LLM consumption
  • Features:
    • Replaces {{"demo": "filename.js"}} syntax with actual code snippets
    • Appends component API documentation (props, slots, CSS classes)
    • Supports non-component documentation (guides, customization docs)
    • Generates root llms.txt based on the project settings
    • Reusable across repositories via --projectSettings parameter

Core processing utilities

  • processComponent.ts: Handles demo replacement in markdown files
  • processApi.ts: Converts API JSON to markdown tables with proper formatting

Key improvements

  • Escapes pipe characters in union types for better markdown readability
  • Properly handles HTML-to-markdown conversion including lists
  • Uses existing API docs builder infrastructure for consistency
  • Supports grep filtering for selective generation

Usage

# Generate all Material UI component docs
pnpm tsx scripts/buildLlmsDocs/index.ts \
  --projectSettings ./packages/api-docs-builder-core/materialUi/projectSettings.ts

# Generate specific components and guides
pnpm tsx scripts/buildLlmsDocs/index.ts \
  --projectSettings ./packages/api-docs-builder-core/materialUi/projectSettings.ts \
  --nonComponentFolders system material/customization \
  --grep "Button|borders"

Output structure

- Components: docs/public/material-ui/react-{component}.md
- Guides: docs/public/material-ui/{category}/{topic}.md
- Index files: docs/public/{directory}/llms.txt

Testing

The script has been tested with Material UI components and documentation. Unit tests are included for the
core processing functions.

The script has been tested with Material UI components and documentation. Unit tests are included for the core processing functions.

siriwatknp avatar Jun 10 '25 06:06 siriwatknp

Netlify deploy preview

https://deploy-preview-46308--material-ui.netlify.app/

Bundle size report

@mui/materialparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/labparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/systemparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/utilsparsed: 0B(0.00%) gzip: 0B(0.00%)

Show details for 100 more bundles (86 more not shown)

@mui/lab/AdapterDateFnsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/AdapterDayjsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/AdapterLuxonparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/AdapterMomentparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/CalendarPickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/CalendarPickerSkeletonparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/ClockPickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DatePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DateRangePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DateRangePickerDayparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DateTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DesktopDatePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DesktopDateRangePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DesktopDateTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/DesktopTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/LoadingButtonparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/LocalizationProviderparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/Masonryparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/MobileDatePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/MobileDateRangePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/MobileDateTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/MobileTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/MonthPickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/PickersDayparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/StaticDatePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/StaticDateRangePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/StaticDateTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/StaticTimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TabContextparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TabListparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TabPanelparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/Timelineparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineConnectorparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineContentparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineDotparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineItemparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineOppositeContentparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimelineSeparatorparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TimePickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TreeItemparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/TreeViewparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/useAutocompleteparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/lab/YearPickerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Accordionparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AccordionActionsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AccordionDetailsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AccordionSummaryparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Alertparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AlertTitleparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AppBarparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Autocompleteparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Avatarparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/AvatarGroupparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Backdropparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Badgeparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/BottomNavigationparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/BottomNavigationActionparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Boxparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Breadcrumbsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Buttonparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ButtonBaseparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ButtonGroupparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Cardparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CardActionAreaparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CardActionsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CardContentparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CardHeaderparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CardMediaparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Checkboxparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Chipparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CircularProgressparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ClickAwayListenerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Collapseparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Containerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/CssBaselineparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/DefaultPropsProviderparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Dialogparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/DialogActionsparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/DialogContentparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/DialogContentTextparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/DialogTitleparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Dividerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Drawerparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Fabparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Fadeparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FilledInputparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FormControlparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FormControlLabelparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FormGroupparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FormHelperTextparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/FormLabelparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/GlobalStylesparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Gridparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/GridLegacyparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Growparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/Iconparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/IconButtonparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ImageListparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ImageListItemparsed: 0B(0.00%) gzip: 0B(0.00%) @mui/material/ImageListItemBarparsed: 0B(0.00%) gzip: 0B(0.00%)

Details of bundle changes

Generated by :no_entry_sign: dangerJS against 7c9e60ede9b854483762146225422ccd871e6ecf

mui-bot avatar Jun 10 '25 06:06 mui-bot

A bit late to the party here, but any plans on supporting an llms.txt for Mui X? I've been wanting to feed some better documentation to an LLM for complex things like DataGrid and Charts.

amerryma avatar Jun 24 '25 14:06 amerryma