From db90ffe5cb387e95eeac2e3cfbdd9853c6631b8e Mon Sep 17 00:00:00 2001 From: Christopher Tso Date: Sat, 4 Jul 2026 01:04:40 +0200 Subject: [PATCH] fix(web): publish current docs at root routes --- apps/web/astro.config.mjs | 55 +++++++++++---- apps/web/package.json | 1 + apps/web/scripts/check-doc-routes.mjs | 69 +++++++++++++++++++ apps/web/src/components/VersionSelect.astro | 2 +- .../web/src/components/VersionedSidebar.astro | 7 +- .../docs/docs/next/evaluation/batch-cli.mdx | 1 + .../docs/docs/next/evaluation/eval-cases.mdx | 1 + .../docs/docs/next/evaluation/eval-files.mdx | 1 + .../docs/docs/next/evaluation/examples.mdx | 1 + .../docs/docs/next/evaluation/experiments.mdx | 1 + .../docs/docs/next/evaluation/rubrics.mdx | 1 + .../docs/next/evaluation/running-evals.mdx | 1 + .../content/docs/docs/next/evaluation/sdk.mdx | 1 + .../next/getting-started/installation.mdx | 1 + .../docs/next/getting-started/quickstart.mdx | 1 + .../docs/docs/next/graders/composite.mdx | 1 + .../docs/next/graders/custom-assertions.mdx | 1 + .../docs/docs/next/graders/custom-graders.mdx | 1 + .../docs/next/graders/execution-metrics.mdx | 1 + .../docs/docs/next/graders/llm-graders.mdx | 1 + .../docs/docs/next/graders/python-helpers.mdx | 1 + .../docs/docs/next/graders/script-graders.mdx | 1 + .../docs/next/graders/structured-data.mdx | 1 + .../docs/next/graders/tool-trajectory.mdx | 1 + .../docs/next/guides/agent-eval-layers.mdx | 1 + .../docs/docs/next/guides/autoresearch.mdx | 1 + .../docs/next/guides/benchmark-provenance.mdx | 1 + .../next/guides/enterprise-governance.mdx | 1 + .../docs/docs/next/guides/eval-authoring.mdx | 1 + .../docs/next/guides/evaluation-types.mdx | 1 + .../guides/skill-improvement-workflow.mdx | 1 + .../next/guides/workspace-architecture.mdx | 1 + apps/web/src/content/docs/docs/next/index.mdx | 1 + .../next/integrations/agent-skills-evals.mdx | 1 + .../integrations/autoevals-integration.mdx | 1 + .../docs/docs/next/integrations/langfuse.mdx | 1 + .../docs/docs/next/integrations/phoenix.mdx | 1 + .../docs/docs/next/reference/comparison.mdx | 1 + .../docs/next/reference/result-artifacts.mdx | 1 + .../docs/docs/next/targets/cli-provider.mdx | 1 + .../docs/docs/next/targets/coding-agents.mdx | 1 + .../docs/docs/next/targets/configuration.mdx | 1 + .../docs/next/targets/custom-providers.mdx | 1 + .../docs/docs/next/targets/llm-providers.mdx | 1 + .../content/docs/docs/next/targets/retry.mdx | 1 + .../content/docs/docs/next/tools/compare.mdx | 1 + .../content/docs/docs/next/tools/convert.mdx | 1 + .../docs/docs/next/tools/dashboard.mdx | 1 + .../content/docs/docs/next/tools/import.mdx | 1 + .../content/docs/docs/next/tools/inspect.mdx | 1 + .../content/docs/docs/next/tools/prepare.mdx | 1 + .../content/docs/docs/next/tools/results.mdx | 1 + .../content/docs/docs/next/tools/trend.mdx | 1 + .../content/docs/docs/next/tools/validate.mdx | 1 + .../docs/docs/next/tools/wip-checkpoints.mdx | 1 + .../docs/v4.42.4/evaluation/eval-files.mdx | 3 + .../docs/v4.42.4/evaluation/running-evals.mdx | 3 + .../docs/v4.42.4/targets/cli-provider.mdx | 3 + .../docs/v4.42.4/targets/coding-agents.mdx | 3 + .../docs/v4.42.4/targets/configuration.mdx | 3 + .../docs/v4.42.4/targets/custom-providers.mdx | 3 + .../docs/v4.42.4/targets/llm-providers.mdx | 3 + .../docs/docs/v4.42.4/targets/retry.mdx | 3 + .../docs/docs/v4.42.4/tools/dashboard.mdx | 3 + 64 files changed, 194 insertions(+), 17 deletions(-) create mode 100644 apps/web/scripts/check-doc-routes.mjs diff --git a/apps/web/astro.config.mjs b/apps/web/astro.config.mjs index 2f751aeac..4f3c55212 100644 --- a/apps/web/astro.config.mjs +++ b/apps/web/astro.config.mjs @@ -1,27 +1,58 @@ -import { readFileSync } from 'node:fs'; +import { readFileSync, readdirSync } from 'node:fs'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import starlight from '@astrojs/starlight'; import { defineConfig } from 'astro/config'; -// Static builds can't redirect an open-ended `/docs/[...slug]` wildcard to -// v4.42.4 (that requires enumerable paths), so generate one concrete -// redirect per known v4.42.4 route from its route manifest instead. -const v4RoutesPath = fileURLToPath(new URL('./src/data/docs-v4.42.4-routes.json', import.meta.url)); -const v4Routes = JSON.parse(readFileSync(v4RoutesPath, 'utf8')); -const v4Redirects = Object.fromEntries( - v4Routes.map((route) => { - const bareRoute = route.replace('/docs/v4.42.4/', '/docs/'); - const from = bareRoute === '/docs/' ? '/docs' : bareRoute.replace(/\/$/, ''); - return [from, route]; +const currentDocsRoot = fileURLToPath(new URL('./src/content/docs/docs/next', import.meta.url)); + +const currentRoutes = collectDocsRoutes(currentDocsRoot, '/docs'); +const nextRedirects = Object.fromEntries( + currentRoutes.map((route) => { + const suffix = route === '/docs/' ? '' : route.slice('/docs/'.length); + const from = suffix ? `/docs/next/${suffix}` : '/docs/next'; + return [from.replace(/\/$/, ''), route]; }), ); +function collectDocsRoutes(root, base) { + return collectMarkdownFiles(root) + .map((file) => { + const slug = getFrontmatterSlug(file); + if (slug) return `/${slug.replace(/^\/|\/$/g, '')}/`; + + const relative = path.relative(root, file).replace(/\\/g, '/'); + const suffix = relative + .replace(/\.mdx?$/, '') + .replace(/(^|\/)index$/, '') + .replace(/\/$/, ''); + return suffix ? `${base}/${suffix}/` : `${base}/`; + }) + .sort(); +} + +function getFrontmatterSlug(file) { + const source = readFileSync(file, 'utf8'); + return source + .split('---')[1] + ?.match(/^slug:\s*(.+)$/m)?.[1] + ?.trim(); +} + +function collectMarkdownFiles(dir) { + return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) return collectMarkdownFiles(fullPath); + return /\.mdx?$/.test(entry.name) ? [fullPath] : []; + }); +} + export default defineConfig({ site: 'https://agentv.dev', image: { service: { entrypoint: 'astro/assets/services/noop' } }, redirects: { '/docs/v4': '/docs/v4.42.4/', - ...v4Redirects, + ...nextRedirects, }, integrations: [ starlight({ diff --git a/apps/web/package.json b/apps/web/package.json index c0f22be33..ad0cb42b2 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -6,6 +6,7 @@ "dev": "astro dev", "docs:snapshot:v4.42.4": "node ../../scripts/snapshot-docs-version.mjs v4.42.4", "build": "astro build", + "check:routes": "node scripts/check-doc-routes.mjs", "preview": "astro preview" }, "dependencies": { diff --git a/apps/web/scripts/check-doc-routes.mjs b/apps/web/scripts/check-doc-routes.mjs new file mode 100644 index 000000000..cfb3c2563 --- /dev/null +++ b/apps/web/scripts/check-doc-routes.mjs @@ -0,0 +1,69 @@ +import { existsSync, readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const webRoot = fileURLToPath(new URL('..', import.meta.url)); +const distRoot = path.join(webRoot, 'dist'); +const v4Routes = JSON.parse( + readFileSync(path.join(webRoot, 'src/data/docs-v4.42.4-routes.json'), 'utf8'), +); + +const checks = [ + { + path: 'docs/index.html', + includes: ['Introduction | AgentV', ' Current '], + excludes: ['Redirecting to:'], + }, + { + path: 'docs/targets/llm-providers/index.html', + includes: ['LLM Providers | AgentV', '