From e3325cd376958575190c0eab1e28acd9a2e489fe Mon Sep 17 00:00:00 2001 From: Rhuan Barreto Date: Sun, 15 Mar 2026 21:57:56 +0100 Subject: [PATCH 1/2] feat(docs): maximize SEO discoverability across docs website Add comprehensive SEO infrastructure for search engine and AI search discoverability: - robots.txt allowing all crawlers with sitemap reference - llms.txt for AI search engines (ChatGPT, Perplexity, etc.) - OG image (1200x630 PNG) with generation script for social sharing - Branded SVG favicon with Archgate indigo gradient - JSON-LD structured data: WebSite, SoftwareApplication (global), BreadcrumbList and TechArticle (per-page via HeadSEO component) - Open Graph image, Twitter card, author, theme-color, keywords meta tags - SEO-optimized descriptions (140-160 chars, keyword-rich) for all 40 pages (20 English + 20 Portuguese) Co-Authored-By: Claude Opus 4.6 --- docs/astro.config.mjs | 99 +++++++++++++++++ docs/public/favicon.svg | 10 ++ docs/public/llms.txt | 45 ++++++++ docs/public/og-image.png | Bin 0 -> 43960 bytes docs/public/robots.txt | 8 ++ docs/scripts/generate-og-image.ts | 63 +++++++++++ docs/src/components/HeadSEO.astro | 102 ++++++++++++++++++ docs/src/content/docs/concepts/adrs.mdx | 2 +- docs/src/content/docs/concepts/domains.mdx | 2 +- docs/src/content/docs/concepts/rules.mdx | 2 +- .../docs/examples/common-rule-patterns.mdx | 2 +- .../docs/getting-started/installation.mdx | 2 +- .../docs/getting-started/quick-start.mdx | 2 +- .../content/docs/guides/ci-integration.mdx | 2 +- .../docs/guides/claude-code-plugin.mdx | 2 +- .../docs/guides/copilot-cli-plugin.mdx | 2 +- .../docs/guides/cursor-integration.mdx | 2 +- docs/src/content/docs/guides/mcp-server.mdx | 2 +- .../content/docs/guides/pre-commit-hooks.mdx | 2 +- .../src/content/docs/guides/vscode-plugin.mdx | 2 +- docs/src/content/docs/guides/writing-adrs.mdx | 2 +- .../src/content/docs/guides/writing-rules.mdx | 2 +- docs/src/content/docs/index.mdx | 2 +- docs/src/content/docs/pt-br/concepts/adrs.mdx | 2 +- .../content/docs/pt-br/concepts/domains.mdx | 2 +- .../src/content/docs/pt-br/concepts/rules.mdx | 2 +- .../pt-br/examples/common-rule-patterns.mdx | 2 +- .../pt-br/getting-started/installation.mdx | 2 +- .../pt-br/getting-started/quick-start.mdx | 2 +- .../docs/pt-br/guides/ci-integration.mdx | 2 +- .../docs/pt-br/guides/claude-code-plugin.mdx | 2 +- .../docs/pt-br/guides/copilot-cli-plugin.mdx | 2 +- .../docs/pt-br/guides/cursor-integration.mdx | 2 +- .../content/docs/pt-br/guides/mcp-server.mdx | 2 +- .../docs/pt-br/guides/pre-commit-hooks.mdx | 2 +- .../docs/pt-br/guides/vscode-plugin.mdx | 2 +- .../docs/pt-br/guides/writing-adrs.mdx | 2 +- .../docs/pt-br/guides/writing-rules.mdx | 2 +- docs/src/content/docs/pt-br/index.mdx | 2 +- .../docs/pt-br/reference/adr-schema.mdx | 2 +- .../docs/pt-br/reference/cli-commands.mdx | 2 +- .../docs/pt-br/reference/mcp-tools.mdx | 2 +- .../content/docs/pt-br/reference/rule-api.mdx | 2 +- .../src/content/docs/reference/adr-schema.mdx | 2 +- .../content/docs/reference/cli-commands.mdx | 2 +- docs/src/content/docs/reference/mcp-tools.mdx | 2 +- docs/src/content/docs/reference/rule-api.mdx | 2 +- 47 files changed, 367 insertions(+), 40 deletions(-) create mode 100644 docs/public/favicon.svg create mode 100644 docs/public/llms.txt create mode 100644 docs/public/og-image.png create mode 100644 docs/public/robots.txt create mode 100644 docs/scripts/generate-og-image.ts create mode 100644 docs/src/components/HeadSEO.astro diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 67f2f9f3..14ee2c02 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -79,10 +79,24 @@ export default defineConfig({ href: "https://github.com/archgate/cli", }, ], + components: { + Head: "./src/components/HeadSEO.astro", + }, editLink: { baseUrl: "https://github.com/archgate/cli/edit/main/docs/", }, + favicon: "/favicon.svg", head: [ + // ── Favicon ─────────────────────────────────────────────── + { + tag: "link", + attrs: { + rel: "icon", + type: "image/svg+xml", + href: "/favicon.svg", + }, + }, + // ── Analytics ───────────────────────────────────────────── { tag: "script", attrs: { @@ -91,6 +105,91 @@ export default defineConfig({ "data-cf-beacon": '{"token": "cee359c05ecc496aabc4f40f05302a03"}', }, }, + // ── Open Graph image ────────────────────────────────────── + { + tag: "meta", + attrs: { + property: "og:image", + content: "https://cli.archgate.dev/og-image.png", + }, + }, + { + tag: "meta", + attrs: { property: "og:image:width", content: "1200" }, + }, + { + tag: "meta", + attrs: { property: "og:image:height", content: "630" }, + }, + { + tag: "meta", + attrs: { + property: "og:image:alt", + content: + "Archgate — Architecture Decision Records as Executable Rules", + }, + }, + // ── Twitter / X card ────────────────────────────────────── + { + tag: "meta", + attrs: { + name: "twitter:image", + content: "https://cli.archgate.dev/og-image.png", + }, + }, + // ── Additional meta ─────────────────────────────────────── + { + tag: "meta", + attrs: { name: "author", content: "Archgate" }, + }, + { + tag: "meta", + attrs: { name: "theme-color", content: "#6366f1" }, + }, + { + tag: "meta", + attrs: { + name: "keywords", + content: + "archgate, architecture decision records, ADR, executable rules, code governance, AI governance, TypeScript rules, CLI, compliance automation, MCP server", + }, + }, + // ── JSON-LD: WebSite ────────────────────────────────────── + { + tag: "script", + attrs: { type: "application/ld+json" }, + content: JSON.stringify({ + "@context": "https://schema.org", + "@type": "WebSite", + name: "Archgate CLI Documentation", + url: "https://cli.archgate.dev", + description: + "Documentation for Archgate — enforce Architecture Decision Records as executable TypeScript rules for automated code governance.", + inLanguage: ["en", "pt-BR"], + }), + }, + // ── JSON-LD: SoftwareApplication ────────────────────────── + { + tag: "script", + attrs: { type: "application/ld+json" }, + content: JSON.stringify({ + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "Archgate CLI", + applicationCategory: "DeveloperApplication", + operatingSystem: "macOS, Linux, Windows", + offers: { "@type": "Offer", price: "0", priceCurrency: "USD" }, + url: "https://cli.archgate.dev", + downloadUrl: "https://www.npmjs.com/package/archgate", + description: + "CLI tool that enforces Architecture Decision Records (ADRs) as executable TypeScript rules for automated code governance.", + author: { + "@type": "Organization", + name: "Archgate", + url: "https://archgate.dev", + }, + }), + }, ], sidebar: [ { diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 00000000..49212e6d --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1,10 @@ + + + + + + + + + A + diff --git a/docs/public/llms.txt b/docs/public/llms.txt new file mode 100644 index 00000000..7c8c1d0d --- /dev/null +++ b/docs/public/llms.txt @@ -0,0 +1,45 @@ +# Archgate CLI + +> Archgate is a CLI tool for AI governance via Architecture Decision Records (ADRs). It combines human-readable documentation with machine-checkable TypeScript rules to enforce architectural decisions across codebases — for both humans and AI agents. + +Archgate lets teams write an ADR once and enforce it everywhere. ADRs are Markdown files with YAML frontmatter that describe architectural decisions. Companion `.rules.ts` files contain automated TypeScript checks that run against the codebase and report violations with file paths and line numbers. + +## Key capabilities + +- **Executable rules**: Write compliance rules in TypeScript. Archgate runs them against your codebase and reports violations with file paths and line numbers. +- **CI integration**: Wire `archgate check` into any CI/CD pipeline. Exit code 1 blocks merges when rules are violated. +- **AI-aware governance**: The MCP server gives AI agents (Claude, Cursor, Copilot) live access to ADRs. Agents read decisions before writing code and validate after. +- **Editor plugins**: Claude Code, VS Code, Cursor, and Copilot CLI plugins give AI agents role-based governance skills. +- **Self-governance**: Archgate governs its own development using the same tool. + +## Installation + +Available via npm (`npm install -g archgate`), Homebrew, or standalone binary for macOS, Linux, and Windows. + +## Documentation + +- [Getting Started — Installation](https://cli.archgate.dev/getting-started/installation/): Install on macOS, Linux, or Windows via npm, Homebrew, or standalone binary. +- [Getting Started — Quick Start](https://cli.archgate.dev/getting-started/quick-start/): Set up Archgate in under 5 minutes with your first ADR and rule. +- [Core Concepts — ADRs](https://cli.archgate.dev/concepts/adrs/): How Architecture Decision Records work as both documentation and executable rules. +- [Core Concepts — Rules](https://cli.archgate.dev/concepts/rules/): The TypeScript rule system that turns ADR decisions into automated compliance checks. +- [Core Concepts — Domains](https://cli.archgate.dev/concepts/domains/): Organize ADRs by domain for targeted governance. +- [Guide — Writing ADRs](https://cli.archgate.dev/guides/writing-adrs/): Complete guide to writing effective ADRs with YAML frontmatter and markdown structure. +- [Guide — Writing Rules](https://cli.archgate.dev/guides/writing-rules/): Write TypeScript rules using the defineRules API with file matching and violation reporting. +- [Guide — CI Integration](https://cli.archgate.dev/guides/ci-integration/): Add Archgate checks to GitHub Actions, GitLab CI, or any pipeline. +- [Guide — Claude Code Plugin](https://cli.archgate.dev/guides/claude-code-plugin/): Give AI agents a governance workflow that reads ADRs, validates code, and captures patterns. +- [Guide — VS Code Plugin](https://cli.archgate.dev/guides/vscode-plugin/): Real-time ADR compliance in VS Code. +- [Guide — Copilot CLI Plugin](https://cli.archgate.dev/guides/copilot-cli-plugin/): Add architecture governance to GitHub Copilot CLI. +- [Guide — Cursor Integration](https://cli.archgate.dev/guides/cursor-integration/): Configure Cursor IDE with Archgate agent rules and skills. +- [Guide — MCP Server](https://cli.archgate.dev/guides/mcp-server/): Give AI agents live access to ADRs via the Model Context Protocol. +- [Guide — Pre-commit Hooks](https://cli.archgate.dev/guides/pre-commit-hooks/): Automatically check ADR compliance before every commit. +- [Reference — CLI Commands](https://cli.archgate.dev/reference/cli-commands/): Complete reference for init, check, adr create/list/show, login, and more. +- [Reference — MCP Tools](https://cli.archgate.dev/reference/mcp-tools/): API reference for adr_list, adr_read, check_compliance, and review_context. +- [Reference — Rule API](https://cli.archgate.dev/reference/rule-api/): TypeScript API reference for defineRules, RuleContext, and violation reporting. +- [Reference — ADR Schema](https://cli.archgate.dev/reference/adr-schema/): YAML frontmatter schema and markdown structure reference for ADRs. +- [Examples — Common Rule Patterns](https://cli.archgate.dev/examples/common-rule-patterns/): Ready-to-use rule patterns for naming conventions, import restrictions, and more. + +## Optional + +- [GitHub Repository](https://github.com/archgate/cli) +- [Editor Plugin Beta](https://plugins.archgate.dev) +- [npm Package](https://www.npmjs.com/package/archgate) diff --git a/docs/public/og-image.png b/docs/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c36372cbfdeb0e48e327da96169dd55bc8d766 GIT binary patch literal 43960 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 literal 0 HcmV?d00001 diff --git a/docs/public/robots.txt b/docs/public/robots.txt new file mode 100644 index 00000000..ddaa7724 --- /dev/null +++ b/docs/public/robots.txt @@ -0,0 +1,8 @@ +# Archgate CLI Documentation — https://cli.archgate.dev +# Allow all search engines and AI crawlers full access + +User-agent: * +Allow: / + +# Sitemap location +Sitemap: https://cli.archgate.dev/sitemap-index.xml diff --git a/docs/scripts/generate-og-image.ts b/docs/scripts/generate-og-image.ts new file mode 100644 index 00000000..09daeeba --- /dev/null +++ b/docs/scripts/generate-og-image.ts @@ -0,0 +1,63 @@ +/** + * Generates the default Open Graph image (1200×630 PNG) for social sharing. + * Uses sharp (already a project dependency) to render an SVG template to PNG. + * + * Run: bun run docs/scripts/generate-og-image.ts + */ +import sharp from "sharp"; +import { join } from "node:path"; + +const WIDTH = 1200; +const HEIGHT = 630; + +const svg = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Archgate + + + Architecture Decision Records as Executable Rules + + + + + + CLI DOCUMENTATION + + + cli.archgate.dev +`; + +const outputPath = join(import.meta.dirname, "..", "public", "og-image.png"); + +await sharp(Buffer.from(svg)).png({ quality: 90 }).toFile(outputPath); + +console.log(`Generated OG image: ${outputPath}`); diff --git a/docs/src/components/HeadSEO.astro b/docs/src/components/HeadSEO.astro new file mode 100644 index 00000000..0096ebc3 --- /dev/null +++ b/docs/src/components/HeadSEO.astro @@ -0,0 +1,102 @@ +--- +/** + * Custom Starlight Head override that injects structured data (JSON-LD) + * into every page: + * + * 1. BreadcrumbList — auto-generated from the URL path + * 2. TechArticle — for all documentation pages (not splash/home) + * + * Registered via `components: { Head }` in astro.config.mjs. + */ +import Default from "@astrojs/starlight/components/Head.astro"; + +const route = Astro.locals.starlightRoute; +const siteUrl = + Astro.site?.href?.replace(/\/$/, "") ?? "https://cli.archgate.dev"; +const pathname = Astro.url.pathname; +const pageUrl = `${siteUrl}${pathname}`; + +// Guard: 404 and other non-content pages may not have route data. +const hasRoute = route?.entry?.data !== undefined && route?.entry?.data !== null; +const title = hasRoute ? route.entry.data.title : undefined; +const description = hasRoute ? route.entry.data.description : undefined; +const template = hasRoute ? route.entry.data.template : undefined; + +// ── BreadcrumbList ──────────────────────────────────────────────── +// Build breadcrumbs from the URL path segments. +const segments = pathname + .split("/") + .filter((s: string) => s.length > 0); +const breadcrumbItems: Array<{ + "@type": string; + position: number; + name: string; + item: string; +}> = [ + { "@type": "ListItem", position: 1, name: "Home", item: `${siteUrl}/` }, +]; + +if (hasRoute && segments.length > 0) { + let cumulativePath = ""; + for (let i = 0; i < segments.length; i++) { + cumulativePath += `/${segments[i]}`; + const name = + i === segments.length - 1 + ? title + : segments[i] + .replaceAll("-", " ") + .replaceAll(/\b\w/g, (c: string) => c.toUpperCase()); + breadcrumbItems.push({ + "@type": "ListItem", + position: i + 2, + name: name ?? segments[i], + item: `${siteUrl}${cumulativePath}/`, + }); + } +} + +const breadcrumbLd = + breadcrumbItems.length > 1 + ? { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + itemListElement: breadcrumbItems, + } + : null; + +// ── TechArticle (all doc pages except splash/home) ──────────────── +const isSplash = template === "splash"; +const articleLd = + hasRoute && !isSplash + ? { + "@context": "https://schema.org", + "@type": "TechArticle", + headline: title, + description, + url: pageUrl, + inLanguage: route.lang ?? "en", + isPartOf: { + "@type": "WebSite", + name: "Archgate CLI Documentation", + url: siteUrl, + }, + publisher: { + "@type": "Organization", + name: "Archgate", + url: "https://archgate.dev", + }, + } + : null; +--- + + + +{/* BreadcrumbList — pages with path segments */} +{breadcrumbLd && ( +