Files
Viktor Petersson e23201d607 feat(website): generate llms.txt and llms-full.txt (#3179)
* feat(website): generate llms.txt and llms-full.txt

Add a post-build generator that produces llms.txt (a curated index)
and llms-full.txt (the full text of every page) for the marketing
site, following the llmstxt.org convention and served from the site
root.

The generator extracts clean Markdown from the rendered public/ HTML
rather than the Markdown/data sources, so it captures the marketing
copy that lives in Hugo layouts (home, features, get-started) and
never drifts from what visitors actually see. Wired into `bun run
build` and the deploy-website workflow.

Also fixes four pre-existing `sort $map` calls in the /api templates:
in Hugo, sorting a map collapses it to a slice, so the keys were
replaced by numeric indices — API paths, HTTP status codes, request
body content-types, and schema field names all rendered as 0, 1, 2…
on the live page. Hugo already ranges maps in sorted-key order, so
dropping `sort` fixes it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(website): escape backslashes before pipes in llms table cells

CodeQL js/incomplete-sanitization: the Markdown table-cell escaping
replaced "|" but not "\", so a literal backslash in a cell could
combine with the pipe escape. Escape backslashes first.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(website): collapse mixed-content whitespace and harden llms entrypoint

Address Copilot review:
- serializeMixed() now collapses text-node whitespace the same way
  inline() does, so HTML source indentation/newlines can't leak into
  list items and other mixed-content blocks.
- main() gets a .catch that sets a non-zero exit code, so build/CI
  failures (missing public/, read/write/parse errors) are deterministic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 06:54:53 +01:00
..