Skip to content
This repository was archived by the owner on Oct 27, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
64206ba
chore: scaffold Fumadocs + Next 16 + bun skeleton
sdserranog Oct 6, 2026
646cce7
docs: migration plan / workstream contract
sdserranog Oct 6, 2026
89527f1
feat: migrate all docs content, components, toolkit pages, scripts, t…
sdserranog Oct 6, 2026
395cdbc
feat(content): link directly to /en routes; fix stale internal links
sdserranog Oct 6, 2026
f2081ba
fix(ui): restore the Nextra chrome and fix visual regressions
sdserranog Oct 6, 2026
12e4d25
ci: skip jobs that need upstream secrets when they are not configured
sdserranog Oct 6, 2026
b2f8135
fix: keep root files out of the locale redirect; verifier overrides; …
sdserranog Oct 6, 2026
9c6f170
build: allow NEXT_DIST_DIR for parallel builds
sdserranog Oct 6, 2026
077f8db
Bring in upstream docs changes since the migration snapshot
sdserranog Oct 12, 2026
0e10b0e
Make the migrated site an exact copy of production
sdserranog Oct 13, 2026
b6b404c
Close the gaps a full-page pixel diff found against production
sdserranog Oct 13, 2026
03bb2e4
Upgrade every package to its latest version
sdserranog Oct 13, 2026
2e9d9cd
Remove machine-specific paths from the migration script and plan
sdserranog Oct 13, 2026
762b0af
Replace the Nextra site with the Fumadocs migration
sdserranog Oct 13, 2026
88eb19b
Remove migration scripts and plan, run the toolkit generator on Node
sdserranog Oct 13, 2026
4bba780
Run llms.txt generation on Node
sdserranog Oct 13, 2026
a6c0eb3
Keep package versions at production levels, restore dropped files
sdserranog Oct 13, 2026
0c61a1a
Drop formatting and refactors unrelated to the migration
sdserranog Oct 13, 2026
7c89c31
Point the changelog agent and the Examples page at the new paths
sdserranog Oct 13, 2026
074ed6e
Remove stale references to the old layout
sdserranog Oct 13, 2026
6b308f0
Update old paths in test fixtures and two comments
sdserranog Oct 13, 2026
a242f1f
Restore the header and footer on the page-not-found screen
sdserranog Oct 14, 2026
6a4bf02
Match production: dependency pins, crawler selectors, workflow condit…
sdserranog Oct 14, 2026
4910834
Match production's proxy: drop the yaml exclusion and the pathname re…
sdserranog Oct 14, 2026
bbb0ebc
Bring in upstream docs changes up to faf89cdc
sdserranog Oct 19, 2026
10fe71a
Point Next at the following page on toolkit pages
sdserranog Oct 19, 2026
0d47732
Bring in upstream docs changes up to a1936381
sdserranog Oct 19, 2026
9f3d9ee
Check the root meta.json in the pre-commit hook
sdserranog Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .claude/skills/curate-toolkit-docs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ procedure.
Curation is for prose bound to one toolkit or one tool: auth setup, enum value
tables, parameter caveats, per-tool warnings. If the content is a standalone
guide or concept explanation — anything a reader would reach from the sidebar
on its own — it belongs in `app/en/` as a normal MDX page instead. Stop and
on its own — it belongs in `content/docs/` as a normal MDX page instead. Stop and
write that page.

## Step 2: read the neighbors
Expand Down Expand Up @@ -116,7 +116,7 @@ cd toolkit-docs-generator
../node_modules/.bin/tsx src/cli/index.ts validate-curation --toolkit <ToolkitId>
```

Errors name the exact file and reason. Then `pnpm vale:check` from the repo
Errors name the exact file and reason. Then `bun run vale:check` from the repo
root.

If you used `tool:`, confirm the value against the generated JSON, where
Expand Down
1 change: 0 additions & 1 deletion .cursorignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ out/
toolkit-docs-generator/dist/
toolkit-docs-generator/output/
toolkit-docs-generator/test-output/
.i18n-cache/
.pytest_cache/
*.log
*.sqlite
Expand Down
25 changes: 16 additions & 9 deletions .github/scripts/update-example-dates.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,21 @@ function parseRepositoriesFromMDX(content) {

let match = sampleAppCardRegex.exec(content);
while (match !== null) {
const propsString = match[1];
const [, propsString] = match;

// Extract title and href from props
const titleMatch = propsString.match(TITLE_PATTERN);
const hrefMatch = propsString.match(HREF_PATTERN);

if (titleMatch && hrefMatch) {
const title = titleMatch[1];
const href = hrefMatch[1];
const [, title] = titleMatch;
const [, href] = hrefMatch;

// Check if it's a GitHub URL and extract repo name
const githubMatch = href.match(GITHUB_PATTERN);

if (githubMatch) {
const repoName = githubMatch[1];
const [, repoName] = githubMatch;
repositories.push({
title,
repo: repoName,
Expand Down Expand Up @@ -95,11 +95,18 @@ function formatDate(date) {
async function updateExampleDates() {
console.log("Parsing repositories from MDX file...");

// Read the current MDX file
const mdxPath = path.join(
import.meta.dirname,
"../../app/en/resources/examples/page.mdx"
);
// Read the current MDX file. The examples page is content/docs/resources/
// examples.mdx, or examples/index.mdx once it gains child pages.
const contentDir = path.join(import.meta.dirname, "../../content/docs");
const mdxPath = [
path.join(contentDir, "resources/examples.mdx"),
path.join(contentDir, "resources/examples/index.mdx"),
].find((candidate) => fs.existsSync(candidate));
if (!mdxPath) {
throw new Error(
"Could not find the examples page under content/docs/resources/"
);
}
let content = fs.readFileSync(mdxPath, "utf8");

// Parse repositories from the MDX file
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/algolia-reindex.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
id: changed
run: |
files=$(git diff-tree --no-commit-id --name-only -r HEAD)
if echo "$files" | grep -qE '^app/en/|^toolkit-docs-generator/data/toolkits/|^app/_components/toolkit-docs/|^app/_lib/toolkit-|^algolia/crawler-config\.js$|^scripts/sync-crawler-config\.ts$'; then
if echo "$files" | grep -qE '^content/docs/|^toolkit-docs-generator/data/toolkits/|^components/toolkit-docs/|^lib/toolkit-|^algolia/crawler-config\.js$|^scripts/sync-crawler-config\.ts$'; then
echo "docs=true" >> "$GITHUB_OUTPUT"
echo "Docs content changed — will reindex."
else
Expand Down
14 changes: 5 additions & 9 deletions .github/workflows/check-external-urls.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,13 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
node-version: "22"
cache: pnpm
bun-version-file: package.json

- name: Install dependencies
run: pnpm install
run: bun install --frozen-lockfile

- name: Check external URLs
run: pnpm vitest run --config vitest.external-urls.config.ts
run: bun run test:external-urls
16 changes: 8 additions & 8 deletions .github/workflows/check-redirects.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- "app/**/*.md"
- "app/**/*.mdx"
- "content/docs/**/*.md"
- "content/docs/**/*.mdx"
- "redirects.ts"

permissions:
Expand All @@ -26,19 +26,19 @@ jobs:
- name: Fetch base branch
run: git fetch origin ${{ github.base_ref }}:${{ github.base_ref }}

- name: Setup Node.js
uses: actions/setup-node@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
node-version: "20"
bun-version-file: package.json

- name: Install dependencies
run: npm install -g pnpm && pnpm install
run: bun install --frozen-lockfile

- name: Check for missing redirects
id: check
run: |
set -o pipefail
pnpm check-redirects ${{ github.base_ref }} 2>&1 | tee redirect-check-output.txt
bun run check-redirects ${{ github.base_ref }} 2>&1 | tee redirect-check-output.txt
continue-on-error: true

- name: Comment on PR if redirects are missing
Expand All @@ -52,7 +52,7 @@ jobs:
// Extract the missing redirects and suggestions from output
const body = `## 🔗 Missing Redirects Detected

This PR deletes markdown files that don't have corresponding redirects in \`redirects.ts\`.
This PR deletes content pages that don't have corresponding redirects in \`redirects.ts\`.

When you delete a page, you must add a redirect to prevent broken links for users who have bookmarked the old URL.

Expand Down
23 changes: 13 additions & 10 deletions .github/workflows/generate-toolkit-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Generate toolkit docs
# Description: Generate toolkit JSON from the public tool catalog, then sync sidebar navigation.
# Flow:
# 1) Generate toolkit JSON into toolkit-docs-generator/data/toolkits
# 2) Sync integrations sidebar _meta.tsx from toolkit-docs-generator/data/toolkits
# 2) Sync integrations sidebar meta.json files from toolkit-docs-generator/data/toolkits
# 3) Regenerate public/llms.txt so the automation PR is self-contained
# 4) Create or update a PR if changes were produced
#
Expand Down Expand Up @@ -52,22 +52,25 @@ jobs:
with:
fetch-depth: 0

- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

# The generator runs on Node through tsx: Bun resolves the design system's
# `bun` export condition, which points at sources the package does not ship.
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: pnpm
node-version-file: .nvmrc

- name: Install dependencies
run: pnpm install --frozen-lockfile
run: bun install --frozen-lockfile

- name: Generate toolkit docs
id: generate-docs
# Invoked by path rather than through `pnpm exec`, which would reset the
# working directory to the repo root and break the relative paths below.
# Invoked by path from the generator directory so the relative paths
# below resolve against it.
run: |
../node_modules/.bin/tsx src/cli/index.ts generate \
--all \
Expand Down Expand Up @@ -99,12 +102,12 @@ jobs:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

- name: Sync toolkit sidebar navigation
run: pnpm exec tsx toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts --remove-empty-sections=false --verbose
run: bun run sync-toolkit-sidebar --remove-empty-sections=false --verbose

# GITHUB_TOKEN PRs do not start llmstxt.yml, so generate the file here.
# The toolkit generator CLI still does not write llms.txt.
- name: Generate llms.txt
run: pnpm llmstxt
run: bun run llmstxt
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

Expand Down
32 changes: 18 additions & 14 deletions .github/workflows/llmstxt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ on:
branches:
- main
paths:
- "app/en/**/*.mdx"
- "app/en/**/_meta.tsx"
- "content/docs/**/*.mdx"
- "content/docs/**/meta.json"
- "scripts/generate-llmstxt.ts"
- "toolkit-docs-generator/data/toolkits/**"
pull_request:
types: [opened, synchronize, reopened]
paths:
- "app/en/**/*.mdx"
- "app/en/**/_meta.tsx"
- "content/docs/**/*.mdx"
- "content/docs/**/meta.json"
- "scripts/generate-llmstxt.ts"
- "toolkit-docs-generator/data/toolkits/**"

Expand All @@ -28,24 +28,28 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: "22.x"

- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref || github.ref }}

- name: Install dependencies
run: npm install -g pnpm
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Install pnpm
run: pnpm install
# The script runs on Node through tsx: Bun resolves the design system's
# `bun` export condition, which points at sources the package does not ship.
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc

- name: Install dependencies
run: bun install --frozen-lockfile

- name: generate LLMs.txt
run: pnpm llmstxt
run: bun run llmstxt
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

Expand Down
17 changes: 7 additions & 10 deletions .github/workflows/style-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ on:
pull_request:
types: [opened, synchronize, reopened]
paths:
- "app/en/**/*.md"
- "app/en/**/*.mdx"
- "content/docs/**/*.md"
- "content/docs/**/*.mdx"

permissions:
contents: read
Expand All @@ -37,16 +37,13 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Use Node.js
uses: actions/setup-node@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
node-version: "22.x"

- name: Install pnpm
run: npm install -g pnpm
bun-version-file: package.json

- name: Install dependencies
run: pnpm install
run: bun install --frozen-lockfile

- name: Install Vale
run: |
Expand All @@ -56,7 +53,7 @@ jobs:
run: vale sync

- name: Run style review
run: pnpm vale:review --pr ${{ github.event.pull_request.number || inputs.pr_number }}
run: bun run vale:review --pr ${{ github.event.pull_request.number || inputs.pr_number }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Expand Down
17 changes: 7 additions & 10 deletions .github/workflows/style-structural-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ on:
pull_request:
types: [closed]
paths:
- "app/en/**/*.md"
- "app/en/**/*.mdx"
- "content/docs/**/*.md"
- "content/docs/**/*.mdx"

permissions:
contents: write
Expand All @@ -30,16 +30,13 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Use Node.js
uses: actions/setup-node@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
node-version: "22.x"

- name: Install pnpm
run: npm install -g pnpm
bun-version-file: package.json

- name: Install dependencies
run: pnpm install
run: bun install --frozen-lockfile

- name: Install Vale
run: |
Expand All @@ -49,7 +46,7 @@ jobs:
run: vale sync

- name: Run editorial review
run: pnpm vale:editorial --pr ${{ github.event.pull_request.number || inputs.pr_number }}
run: bun run vale:editorial --pr ${{ github.event.pull_request.number || inputs.pr_number }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/sync-crawler-config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
node-version-file: .nvmrc
bun-version-file: package.json

- name: Install dependencies
run: bun install --frozen-lockfile
- name: Sync config and trigger reindex
env:
ALGOLIA_CRAWLER_ID: ${{ vars.ALGOLIA_CRAWLER_ID }}
Expand All @@ -50,4 +53,4 @@ jobs:
# Vercel production deploy so pages are live before the crawl starts.
# On workflow_dispatch there is no pending deploy, so reindex immediately.
SKIP_REINDEX: ${{ github.event_name == 'push' }}
run: pnpm sync-crawler-config
run: bun run sync-crawler-config
Loading
Loading