diff --git a/docs/app/pyproject.toml b/docs/app/pyproject.toml index 995aca2..90a496f 100644 --- a/docs/app/pyproject.toml +++ b/docs/app/pyproject.toml @@ -6,11 +6,11 @@ requires-python = ">=3.11" dependencies = [ "numpy", "pillow", - "reflex @ git+https://github.com/reflex-dev/reflex@carlos/reusable-docs-components", - "reflex-components-internal @ git+https://github.com/reflex-dev/reflex@carlos/reusable-docs-components#subdirectory=packages/reflex-components-internal", - "reflex-docgen @ git+https://github.com/reflex-dev/reflex@carlos/reusable-docs-components#subdirectory=packages/reflex-docgen", + "reflex @ git+https://github.com/reflex-dev/reflex@carlos/doc-page-action-followup", + "reflex-components-internal @ git+https://github.com/reflex-dev/reflex@carlos/doc-page-action-followup#subdirectory=packages/reflex-components-internal", + "reflex-docgen @ git+https://github.com/reflex-dev/reflex@carlos/doc-page-action-followup#subdirectory=packages/reflex-docgen", "reflex-xy", - "reflex-site-shared @ git+https://github.com/reflex-dev/reflex@carlos/reusable-docs-components#subdirectory=packages/reflex-site-shared", + "reflex-site-shared @ git+https://github.com/reflex-dev/reflex@carlos/doc-page-action-followup#subdirectory=packages/reflex-site-shared", "xy", ] diff --git a/docs/app/rxconfig.py b/docs/app/rxconfig.py index bf30670..ea836f4 100644 --- a/docs/app/rxconfig.py +++ b/docs/app/rxconfig.py @@ -4,6 +4,7 @@ import reflex_xy from reflex_site_shared.plugins import DocsMarkdownPlugin, SharedSiteStylesPlugin from xy_docs.config import DOCS_CONFIG +from xy_docs.plugins import XYDocsAgentFilesPlugin config = rx.Config( app_name="xy_docs", @@ -22,6 +23,7 @@ rx.plugins.RadixThemesPlugin(), rx.plugins.SitemapPlugin(trailing_slash="always"), DocsMarkdownPlugin(docs=DOCS_CONFIG), + XYDocsAgentFilesPlugin(docs=DOCS_CONFIG), reflex_xy.XYPlugin(), ], ) diff --git a/docs/app/uv.lock b/docs/app/uv.lock index 7a1ee01..115e1d7 100644 --- a/docs/app/uv.lock +++ b/docs/app/uv.lock @@ -177,11 +177,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.30.1" +version = "3.30.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/b7/e82e2bf111ba6ea135062e556f2ed7f4ff1c17a6c385e95ffddd99885535/filelock-3.30.1.tar.gz", hash = "sha256:6ad1b1ec6a5e2c91e02979b7d1096e5e964d83ad8a55679bacd1d96f917fda6e", size = 176008, upload-time = "2026-07-16T16:59:22.201Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/01/9256cbe36eb2a84501920adad7d0e86738ab0ad60e64f4f5c38d7dd94dc1/filelock-3.30.3.tar.gz", hash = "sha256:6575420cd497ed15fc43a7ac46c48f6b6371c733fc40cf5a4e216871397bc1e2", size = 177706, upload-time = "2026-07-17T15:17:45.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/5e/6060a5791d3d5b54aae21c510eb2f76a51e1b28c2122cc1e39b12237e2e7/filelock-3.30.1-py3-none-any.whl", hash = "sha256:69b98bab51bed4c86b141ef338f85ca07937573e8a7798f7fe6a31ccd94b9338", size = 93698, upload-time = "2026-07-16T16:59:20.727Z" }, + { url = "https://files.pythonhosted.org/packages/e7/20/b0d6da41a08b30faef4f20302f5d826a9d39073750cd9100b463eb840cf4/filelock-3.30.3-py3-none-any.whl", hash = "sha256:06e1c6d5e12277022172b7f8d090affe0e8f940f1a37ca45f548855ee51a6b86", size = 94544, upload-time = "2026-07-17T15:17:44.129Z" }, ] [[package]] @@ -1094,8 +1094,8 @@ wheels = [ [[package]] name = "reflex" -version = "0.9.7.post9.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.7.post6.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "click" }, { name = "granian", extra = ["reload"] }, @@ -1127,8 +1127,8 @@ dependencies = [ [[package]] name = "reflex-base" -version = "0.9.7.post9.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-base&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.7.post6.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-base&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "packaging" }, { name = "platformdirs" }, @@ -1139,8 +1139,8 @@ dependencies = [ [[package]] name = "reflex-components-code" -version = "0.9.2.post205.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-code&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.2.post202.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-code&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1150,8 +1150,8 @@ dependencies = [ [[package]] name = "reflex-components-core" -version = "0.9.7.post8.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-core&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.7.post5.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-core&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "python-multipart" }, { name = "reflex-base" }, @@ -1163,8 +1163,8 @@ dependencies = [ [[package]] name = "reflex-components-dataeditor" -version = "0.9.1.post245.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-dataeditor&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.1.post242.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-dataeditor&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1172,32 +1172,32 @@ dependencies = [ [[package]] name = "reflex-components-gridjs" -version = "0.9.1.post245.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-gridjs&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.1.post242.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-gridjs&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-internal" -version = "0.0.23.post43.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.0.23.post40.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex" }, ] [[package]] name = "reflex-components-lucide" -version = "1.0.2.post88.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-lucide&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "1.0.2.post85.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-lucide&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-markdown" -version = "0.9.3.post113.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-markdown&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.3.post110.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-markdown&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-code" }, @@ -1207,16 +1207,16 @@ dependencies = [ [[package]] name = "reflex-components-moment" -version = "0.9.2.post54.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-moment&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.2.post51.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-moment&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-plotly" -version = "0.9.3.post54.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-plotly&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.3.post51.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-plotly&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1224,8 +1224,8 @@ dependencies = [ [[package]] name = "reflex-components-radix" -version = "0.9.6.post8.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-radix&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.6.post5.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-radix&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1234,8 +1234,8 @@ dependencies = [ [[package]] name = "reflex-components-react-player" -version = "0.9.1.post245.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-react-player&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.1.post242.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-react-player&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-core" }, @@ -1243,16 +1243,16 @@ dependencies = [ [[package]] name = "reflex-components-recharts" -version = "0.9.1.post245.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-recharts&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.1.post242.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-recharts&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, ] [[package]] name = "reflex-components-sonner" -version = "0.9.1.post245.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-sonner&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.1.post242.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-sonner&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "reflex-base" }, { name = "reflex-components-lucide" }, @@ -1260,8 +1260,8 @@ dependencies = [ [[package]] name = "reflex-docgen" -version = "0.9.3.post8.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.9.3.post5.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "griffelib" }, { name = "mistletoe" }, @@ -1272,8 +1272,8 @@ dependencies = [ [[package]] name = "reflex-hosting-cli" -version = "0.1.67.post72.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-hosting-cli&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.1.67.post69.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-hosting-cli&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "click" }, { name = "httpx" }, @@ -1284,13 +1284,13 @@ dependencies = [ [[package]] name = "reflex-integrations-docs" -version = "0.0.0.post3251.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Fintegrations-docs&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.0.0.post3248.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Fintegrations-docs&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } [[package]] name = "reflex-site-shared" -version = "0.0.36.post42.dev0+4f818610" -source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=carlos%2Freusable-docs-components#4f818610e125eeed022cd60fcdb1f9f1f983aff1" } +version = "0.0.38.post1.dev0+2b9e0e8d" +source = { git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=carlos%2Fdoc-page-action-followup#2b9e0e8d85606d3d6700974b2d4d56218a6f01ab" } dependencies = [ { name = "email-validator" }, { name = "httpx" }, @@ -1740,10 +1740,10 @@ dev = [ requires-dist = [ { name = "numpy" }, { name = "pillow" }, - { name = "reflex", git = "https://github.com/reflex-dev/reflex?rev=carlos%2Freusable-docs-components" }, - { name = "reflex-components-internal", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=carlos%2Freusable-docs-components" }, - { name = "reflex-docgen", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=carlos%2Freusable-docs-components" }, - { name = "reflex-site-shared", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=carlos%2Freusable-docs-components" }, + { name = "reflex", git = "https://github.com/reflex-dev/reflex?rev=carlos%2Fdoc-page-action-followup" }, + { name = "reflex-components-internal", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-components-internal&rev=carlos%2Fdoc-page-action-followup" }, + { name = "reflex-docgen", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-docgen&rev=carlos%2Fdoc-page-action-followup" }, + { name = "reflex-site-shared", git = "https://github.com/reflex-dev/reflex?subdirectory=packages%2Freflex-site-shared&rev=carlos%2Fdoc-page-action-followup" }, { name = "reflex-xy", editable = "../../python/reflex-xy" }, { name = "xy", editable = "../../" }, ] diff --git a/docs/app/xy_docs/breadcrumb.py b/docs/app/xy_docs/breadcrumb.py index b9190a3..8a6e7f4 100644 --- a/docs/app/xy_docs/breadcrumb.py +++ b/docs/app/xy_docs/breadcrumb.py @@ -2,9 +2,11 @@ import reflex as rx import reflex_components_internal as ui -from reflex_site_shared.docs.models import DocsPage +from reflex_site_shared.docs import DocsPage, docs_page_actions from reflex_site_shared.views.sidebar import docs_sidebar_drawer +from xy_docs.constants import LLMS_TXT_PATH, PUBLIC_DOCS_URL + def _breadcrumb_label(segment: str) -> str: """Convert one URL segment to its visible breadcrumb label. @@ -18,6 +20,14 @@ def _breadcrumb_label(segment: str) -> str: return segment.replace("-", " ").title() +def _markdown_asset_path(page: DocsPage) -> str: + """Return the canonical Markdown asset path for a discovered page.""" + route = page.route.strip("/") + if page.relative_path.stem.lower() == "index": + return f"{route}/index.md" if route else "index.md" + return f"{route}.md" + + def xy_docs_breadcrumb(page: DocsPage, sidebar: rx.Component) -> rx.Component: """Render official-style XY breadcrumbs and the mobile sidebar drawer. @@ -82,6 +92,12 @@ def xy_docs_breadcrumb(page: DocsPage, sidebar: rx.Component) -> rx.Component: class_name="flex flex-row items-center gap-[5px] overflow-hidden lg:gap-4", ), rx.box( + docs_page_actions( + markdown_url=f"{PUBLIC_DOCS_URL}/{_markdown_asset_path(page)}", + llms_full_txt_url=LLMS_TXT_PATH, + llms_label="llms.txt", + copy_url=f"/docs/xy/{_markdown_asset_path(page)}", + ), ui.icon( "ArrowDown01Icon", size=14, diff --git a/docs/app/xy_docs/constants.py b/docs/app/xy_docs/constants.py index 92e719f..80e3476 100644 --- a/docs/app/xy_docs/constants.py +++ b/docs/app/xy_docs/constants.py @@ -1,5 +1,7 @@ """Public XY documentation constants.""" PUBLIC_DOCS_URL = "https://reflex.dev/docs/xy" +LLMS_TXT_PATH = "/llms.txt" +LLMS_FULL_TXT_PATH = "/llms-full.txt" -__all__ = ["PUBLIC_DOCS_URL"] +__all__ = ["LLMS_FULL_TXT_PATH", "LLMS_TXT_PATH", "PUBLIC_DOCS_URL"] diff --git a/docs/app/xy_docs/plugins.py b/docs/app/xy_docs/plugins.py new file mode 100644 index 0000000..1107d25 --- /dev/null +++ b/docs/app/xy_docs/plugins.py @@ -0,0 +1,99 @@ +"""XY-specific compiler assets for agent-readable documentation.""" + +from __future__ import annotations + +import dataclasses +from pathlib import Path +from typing import Any + +from reflex.constants import Dirs +from reflex_base.config import get_config +from reflex_base.plugins import Plugin +from reflex_site_shared.docs import DocsPage, DocsSiteConfig, discover_docs + +from xy_docs.constants import LLMS_FULL_TXT_PATH, LLMS_TXT_PATH, PUBLIC_DOCS_URL + + +def _public_url(path: str) -> str: + """Return an absolute URL for an XY docs asset path.""" + return f"{PUBLIC_DOCS_URL}{path}" + + +def _page_markdown_url(page: DocsPage) -> str: + """Return the direct public Markdown asset URL for a discovered page.""" + route = page.route.strip("/") + if page.relative_path.stem.lower() == "index": + asset_path = f"{route}/index.md" if route else "index.md" + else: + asset_path = f"{route}.md" + return f"{PUBLIC_DOCS_URL}/{asset_path}" + + +def build_llms_txt(config: DocsSiteConfig) -> str: + """Build the concise agent-readable index of public XY pages.""" + lines = [ + "# XY Documentation", + "", + ( + "> XY is a high-performance plotting library for Python and Reflex. " + "Use this index to find agent-readable Markdown docs, or see " + f"[llms-full.txt]({_public_url(LLMS_FULL_TXT_PATH)}) for the " + "complete docs in one file." + ), + "", + "## Docs", + "", + ] + for page in discover_docs(config): + description = f": {page.description}" if page.description else "" + lines.append(f"- [{page.title}]({_page_markdown_url(page)}){description}") + return "\n".join(lines).rstrip() + "\n" + + +def build_llms_full_txt(config: DocsSiteConfig) -> str: + """Combine all public XY pages into one agent-readable Markdown file.""" + lines = [ + "# XY Documentation", + f"Source: {PUBLIC_DOCS_URL}/", + "", + ( + "This file stitches together the full XY documentation as Markdown " + "for AI agents and LLM indexing." + ), + "", + ( + "For a navigable index with links to individual docs pages, see " + f"[llms.txt]({_public_url(LLMS_TXT_PATH)})." + ), + "", + ] + for page in discover_docs(config): + lines.extend(( + f"## {page.title}", + "", + f"Source: {_page_markdown_url(page)}", + "", + page.content, + "", + )) + return "\n".join(lines).rstrip() + "\n" + + +@dataclasses.dataclass(frozen=True, slots=True) +class XYDocsAgentFilesPlugin(Plugin): + """Publish concise and complete agent-readable XY documentation.""" + + docs: DocsSiteConfig + + def get_static_assets(self, **context: Any) -> tuple[tuple[Path, str], ...]: + """Emit ``llms.txt`` and ``llms-full.txt`` under the frontend path.""" + root = Path(Dirs.PUBLIC) + if frontend_path := get_config().frontend_path: + root /= frontend_path.lstrip("/") + return ( + (root / "llms.txt", build_llms_txt(self.docs)), + (root / "llms-full.txt", build_llms_full_txt(self.docs)), + ) + + +__all__ = ["XYDocsAgentFilesPlugin", "build_llms_full_txt", "build_llms_txt"]