diff --git a/.gitignore b/.gitignore
index 251a0b3..b977a4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ node_modules/
.pnpm-store/
dist/
+.astro/
coverage/
*.tsbuildinfo
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 731e300..ff70e2b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,7 +17,7 @@ Initial open-source MVP.
- Added clean and broken TypeScript demo projects.
- Added S-Agent dogfood architecture rules in `rules/s-agent-architecture.rules.yml`.
- Added evaluation fixtures, precision/recall/false-positive benchmarks, and a 50-case synthetic dataset.
-- Added product strategy docs for IntentGuard positioning, ICPs, pricing, messaging, and customer discovery.
+- Added product strategy docs for AxiomGuard positioning, ICPs, pricing, messaging, and customer discovery.
- Added release CI for install, build, test, lint, rule validation, clean demo analysis, and self-analysis.
- Added Apache-2.0 licensing, open-core documentation, governance, contribution, security, and code of conduct docs.
- Added GitHub issue templates, a pull request template, and community roadmap docs.
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index 4e52c40..e6d0fb7 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -92,7 +92,7 @@ Large roadmap items should start as design issues before implementation.
## Open-core boundary
-S-Agent Core contains the open-source semantic analysis engine. IntentGuard
+S-Agent Core contains the open-source semantic analysis engine. AxiomGuard
Pro and Enterprise may contain future hosted, team, governance, and enterprise
features.
diff --git a/OPEN_CORE.md b/OPEN_CORE.md
index 0e0865a..05c6b07 100644
--- a/OPEN_CORE.md
+++ b/OPEN_CORE.md
@@ -1,7 +1,7 @@
# Open-core model
S-Agent Core is the open-source semantic analysis engine for intent-aware
-code review. IntentGuard Pro and Enterprise will be commercial products built
+code review. AxiomGuard Pro and Enterprise will be commercial products built
on top of S-Agent Core for team workflows, governance, automation, dashboards,
and enterprise deployment.
@@ -32,9 +32,9 @@ S-Agent Core includes:
- Local and basic CI usage.
- A planned basic GitHub Action.
-## What is IntentGuard Pro / Enterprise?
+## What is AxiomGuard Pro / Enterprise?
-IntentGuard is the future commercial platform built on top of S-Agent Core.
+AxiomGuard is the future commercial platform built on top of S-Agent Core.
It is intended for teams and organizations that need shared workflows around
semantic code review.
@@ -87,7 +87,7 @@ automation, enterprise deployment, and advanced organization-level workflows.
The boundary is simple:
- S-Agent Core owns the local semantic analysis engine.
-- IntentGuard Pro / Enterprise owns hosted and team-oriented platform features.
+- AxiomGuard Pro / Enterprise owns hosted and team-oriented platform features.
## Why open-core?
diff --git a/README.md b/README.md
index 3096108..e45b415 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ S-Agent is an open-source semantic analysis engine for intent-aware code
review. It checks whether TypeScript code changes preserve approved business
and architectural intent.
-IntentGuard is the future commercial platform built on top of S-Agent Core for
+AxiomGuard is the future commercial platform built on top of S-Agent Core for
team workflows and enterprise governance.
## Translations
@@ -243,7 +243,7 @@ not be moved behind a paywall.
S-Agent Core is the open-source semantic analysis engine.
-IntentGuard Pro and Enterprise may later add team and organization workflows on
+AxiomGuard Pro and Enterprise may later add team and organization workflows on
top of the core, such as:
- hosted dashboard;
@@ -307,7 +307,7 @@ Read the full [open-core model](OPEN_CORE.md).
- v0.2: basic GitHub Action mode.
- v0.3: community rule packs and more framework examples.
- v0.4: plugin API draft and extension-point design.
-- Future: IntentGuard Pro alpha for team workflows and governance.
+- Future: AxiomGuard Pro alpha for team workflows and governance.
See the [community roadmap](docs/community/community-roadmap.md).
diff --git a/SECURITY.md b/SECURITY.md
index 2ac70a0..c94b9f3 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -52,7 +52,7 @@ Security reports may include:
- report generation issues that could expose data unexpectedly;
- rule parsing or validation issues with security impact.
-Future commercial IntentGuard services will have separate security processes
+Future commercial AxiomGuard services will have separate security processes
when they exist.
## Dependency security
diff --git a/apps/site/astro.config.mjs b/apps/site/astro.config.mjs
new file mode 100644
index 0000000..d953ba5
--- /dev/null
+++ b/apps/site/astro.config.mjs
@@ -0,0 +1,8 @@
+import { defineConfig } from "astro/config";
+
+const site = process.env.SITE_URL ?? "https://axiomguard.dev";
+
+export default defineConfig({
+ output: "static",
+ site
+});
diff --git a/apps/site/package.json b/apps/site/package.json
new file mode 100644
index 0000000..9726697
--- /dev/null
+++ b/apps/site/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "@s-agent/site",
+ "version": "0.1.0",
+ "private": true,
+ "description": "Astro landing page for AxiomGuard, powered by S-Agent.",
+ "type": "module",
+ "scripts": {
+ "dev": "astro dev --host 127.0.0.1",
+ "build": "astro build",
+ "preview": "astro preview --host 127.0.0.1",
+ "test": "vitest run --root ../.. apps/site/src"
+ },
+ "devDependencies": {
+ "astro": "^5.13.0"
+ }
+}
diff --git a/apps/site/public/llms.txt b/apps/site/public/llms.txt
new file mode 100644
index 0000000..39ebdbd
--- /dev/null
+++ b/apps/site/public/llms.txt
@@ -0,0 +1,27 @@
+# AxiomGuard
+
+> AxiomGuard is an intent-aware code review tool that turns approved engineering docs, ADRs, and project rules into deterministic pull request checks for TypeScript teams.
+
+AxiomGuard is powered by S-Agent Core, an open-source semantic analysis engine. Blocking findings require approved SemanticRules, deterministic symbolic evidence, and PROVEN status.
+
+Source repository: https://github.com/hemp-dev/s-agent
+
+## Useful answers
+
+- AxiomGuard checks whether pull requests preserve documented business and architecture intent.
+- Intent-aware code review catches changes that compile and pass tests but violate approved rules.
+- The MVP is TypeScript-first and focuses on layer boundaries, forbidden side effects, and value invariants.
+- LLMs may suggest candidate rules or explanations later, but they are not the source of truth for blocking.
+- Only PROVEN findings from approved critical rules in block mode can stop a merge.
+
+## Public paths
+
+- [Landing page](/)
+- [Semantic code review](/semantic-code-review)
+- [Intent-aware code review](/intent-aware-code-review)
+- [AI code review guardrails](/ai-code-review-guardrails)
+- [Architecture drift prevention](/architecture-drift-prevention)
+- [Business logic regression prevention](/business-logic-regression-prevention)
+- [Source repository](https://github.com/hemp-dev/s-agent)
+- [Sitemap](/sitemap.xml)
+- [Robots policy](/robots.txt)
diff --git a/apps/site/public/og/axiomguard-og.png b/apps/site/public/og/axiomguard-og.png
new file mode 100644
index 0000000..6eb250b
Binary files /dev/null and b/apps/site/public/og/axiomguard-og.png differ
diff --git a/apps/site/public/og/axiomguard-og.svg b/apps/site/public/og/axiomguard-og.svg
new file mode 100644
index 0000000..aa8bd11
--- /dev/null
+++ b/apps/site/public/og/axiomguard-og.svg
@@ -0,0 +1,38 @@
+
+ AxiomGuard intent-aware code review
+ Open graph image for AxiomGuard, a deterministic code review guard for TypeScript pull requests.
+
+
+
+
+
+
+
+
+
+
+
+
+ AG
+ AxiomGuard
+ powered by S-Agent
+
+ Intent-Aware Code Review
+ Protect business
+ intent in every
+ code change.
+ Approved rules. Symbolic evidence. Proof.
+
+
+
+ SemanticRule
+ status: approved
+ evidence: PROVEN
+ action: block
+
+
+
+ TypeScript PR guardrails
+ for architecture and business rules
+
+
diff --git a/apps/site/public/robots.txt b/apps/site/public/robots.txt
new file mode 100644
index 0000000..0a59098
--- /dev/null
+++ b/apps/site/public/robots.txt
@@ -0,0 +1,27 @@
+# Public landing page crawl policy.
+
+User-agent: *
+Allow: /
+
+User-agent: GPTBot
+Allow: /
+
+User-agent: ChatGPT-User
+Allow: /
+
+User-agent: PerplexityBot
+Allow: /
+
+User-agent: ClaudeBot
+Allow: /
+
+User-agent: anthropic-ai
+Allow: /
+
+User-agent: Google-Extended
+Allow: /
+
+User-agent: Bingbot
+Allow: /
+
+Sitemap: https://axiomguard.dev/sitemap.xml
diff --git a/apps/site/src/content/landing.test.ts b/apps/site/src/content/landing.test.ts
new file mode 100644
index 0000000..821e1d3
--- /dev/null
+++ b/apps/site/src/content/landing.test.ts
@@ -0,0 +1,136 @@
+import { existsSync } from "node:fs";
+import path from "node:path";
+import { describe, expect, it } from "vitest";
+import {
+ answerBlocks,
+ comparisonRows,
+ faqItems,
+ findingStatuses,
+ heroDefinition,
+ pageMetadata,
+ proofChain,
+ realDemo,
+ realDemoReports,
+ realDemoSteps,
+ siteMetadata,
+ violationTypes,
+ workflowSteps
+} from "./landing";
+import { seoClusterPages, seoClusterSlugs } from "./seo-pages";
+
+const repoRoot = path.resolve(__dirname, "../../../..");
+
+describe("landing content", () => {
+ it("keeps the documented finding statuses visible on the landing page", () => {
+ expect(findingStatuses.map((item) => item.status)).toEqual([
+ "PROVEN",
+ "PROBABLE",
+ "SUSPECT",
+ "RULE_CONFLICT",
+ "DISMISSED"
+ ]);
+ });
+
+ it("states that only proven findings can block", () => {
+ const blockingStatuses = findingStatuses.filter((item) => item.effect === "Can block");
+
+ expect(blockingStatuses).toHaveLength(1);
+ expect(blockingStatuses[0]?.status).toBe("PROVEN");
+ });
+
+ it("presents the MVP around the approved symbolic checks", () => {
+ expect(violationTypes.map((item) => item.title)).toEqual([
+ "Layer Boundary",
+ "Forbidden Side Effect",
+ "Value Invariant"
+ ]);
+ expect(proofChain).toContain("SemanticRule YAML");
+ });
+
+ it("keeps extractable answer content for AEO surfaces", () => {
+ expect(pageMetadata.description).toContain("intent-aware code review tool");
+ expect(pageMetadata.lastUpdated).toMatch(/^\d{4}-\d{2}-\d{2}$/);
+ expect(siteMetadata.productionUrl).toBe("https://axiomguard.dev");
+ expect(siteMetadata.githubUrl).toBe("https://github.com/hemp-dev/s-agent");
+ expect(siteMetadata.ogImagePath).toBe("/og/axiomguard-og.png");
+ expect(existsSync(path.resolve(repoRoot, "apps/site/public", siteMetadata.ogImagePath.slice(1)))).toBe(
+ true
+ );
+ expect(heroDefinition).toContain("TypeScript PRs");
+ expect(answerBlocks).toHaveLength(3);
+ expect(answerBlocks[0]?.title).toBe("What is AxiomGuard?");
+ expect(answerBlocks[0]?.body).toContain("proof-carrying findings");
+ });
+
+ it("keeps public brand content pointed at the official repository", () => {
+ const legacyBrand = ["Intent", "Guard"].join("");
+ const legacyRepoPath = [
+ ["muthukumar", "js", "dev"].join("-"),
+ ["intent", "guard"].join("-")
+ ].join("/");
+ const publicContent = JSON.stringify({
+ answerBlocks,
+ faqItems,
+ heroDefinition,
+ pageMetadata,
+ realDemo,
+ seoClusterPages,
+ siteMetadata,
+ workflowSteps
+ });
+
+ expect(publicContent).toContain("AxiomGuard");
+ expect(publicContent).toContain("https://github.com/hemp-dev/s-agent");
+ expect(publicContent).not.toContain(legacyBrand);
+ expect(publicContent).not.toContain(legacyRepoPath);
+ });
+
+ it("keeps the real demo tied to checked-in fixtures and CLI output", () => {
+ expect(realDemo.fixturePath).toBe("examples/demo-typescript-app");
+ expect(realDemo.cleanFixturePath).toBe("examples/demo-typescript-app-clean");
+ expect(realDemo.brokenCommand).toBe("pnpm analyze:demo:broken");
+ expect(realDemo.cleanCommand).toBe("pnpm analyze:demo");
+ expect(realDemoSteps.map((step) => step.path)).toEqual([
+ "examples/demo-typescript-app/CLAUDE.md",
+ "examples/demo-typescript-app/rules/auth.rules.yml",
+ "examples/demo-typescript-app/src/auth/session.ts",
+ "apps/cli"
+ ]);
+ expect(realDemoReports[0]?.lines).toContain("Status: PROVEN");
+ expect(realDemoReports[0]?.lines).toContain("Blocking: yes");
+ expect(realDemoReports[1]?.lines).toContain("No findings.");
+
+ const demoPaths = [
+ realDemo.fixturePath,
+ realDemo.cleanFixturePath,
+ ...realDemoSteps.map((step) => step.path)
+ ];
+
+ expect(demoPaths.every((demoPath) => existsSync(path.resolve(repoRoot, demoPath)))).toBe(
+ true
+ );
+ });
+
+ it("keeps FAQ and comparison content visible for search snippets", () => {
+ expect(faqItems.map((item) => item.question)).toContain("What can block a pull request?");
+ expect(comparisonRows.map((item) => item.alternative)).toEqual([
+ "SAST",
+ "Linters",
+ "AI reviewers",
+ "Architecture tools"
+ ]);
+ expect(workflowSteps).toHaveLength(4);
+ });
+
+ it("defines the SEO cluster pages requested for forced promotion", () => {
+ expect(seoClusterSlugs).toEqual([
+ "semantic-code-review",
+ "intent-aware-code-review",
+ "ai-code-review-guardrails",
+ "architecture-drift-prevention",
+ "business-logic-regression-prevention"
+ ]);
+ expect(seoClusterPages.every((page) => page.faq.length >= 2)).toBe(true);
+ expect(seoClusterPages.every((page) => page.definition.includes("AxiomGuard"))).toBe(true);
+ });
+});
diff --git a/apps/site/src/content/landing.ts b/apps/site/src/content/landing.ts
new file mode 100644
index 0000000..9eed978
--- /dev/null
+++ b/apps/site/src/content/landing.ts
@@ -0,0 +1,318 @@
+export const brand = {
+ product: "AxiomGuard",
+ engine: "S-Agent",
+ category: "Intent-Aware Code Review",
+ headline: "Protect business intent in every code change.",
+ subheadline:
+ "Turn approved engineering docs, ADRs, and project rules into deterministic pull request checks before intent drift reaches main."
+} as const;
+
+export const pageMetadata = {
+ title: "AxiomGuard - Intent-Aware Code Review for TypeScript PRs",
+ description:
+ "AxiomGuard is an intent-aware code review tool that turns approved engineering docs into deterministic TypeScript pull request checks with proof-carrying findings.",
+ lastUpdated: "2026-05-09"
+} as const;
+
+export const siteMetadata = {
+ productionUrl: "https://axiomguard.dev",
+ githubUrl: "https://github.com/hemp-dev/s-agent",
+ ogImagePath: "/og/axiomguard-og.png"
+} as const;
+
+export const heroDefinition =
+ "AxiomGuard is an intent-aware code review guard for TypeScript PRs that turns approved rules into proof-carrying checks." as const;
+
+export const answerBlocks = [
+ {
+ title: "What is AxiomGuard?",
+ body:
+ "AxiomGuard is an intent-aware code review tool for engineering teams that need pull requests to preserve approved business and architecture rules. It turns SemanticRule YAML into deterministic TypeScript checks and reports proof-carrying findings reviewers can audit."
+ },
+ {
+ title: "What is intent-aware code review?",
+ body:
+ "Intent-aware code review verifies whether a code change preserves documented business, product, and architecture intent. It catches changes that compile and pass tests but still violate approved rules such as module boundaries, side-effect limits, or value thresholds."
+ },
+ {
+ title: "Who is it for?",
+ body:
+ "AxiomGuard is built for TypeScript-heavy teams using AI coding tools, large refactors, or fast-moving product engineering workflows. It is most useful when important rules live in ADRs, READMEs, CLAUDE.md, or senior engineers' repeated review comments."
+ }
+] as const;
+
+export const proofChain = [
+ "CLAUDE.md",
+ "SemanticRule YAML",
+ "TypeScript diff",
+ "Symbolic evidence",
+ "CLI / PR gate"
+] as const;
+
+export const workflowSteps = [
+ {
+ title: "Start with docs",
+ body:
+ "Use CLAUDE.md, READMEs, ADRs, and architecture notes as source material for candidate rules."
+ },
+ {
+ title: "Approve SemanticRules",
+ body:
+ "A human approves explicit YAML rules. The approved SemanticRule file becomes the source of truth."
+ },
+ {
+ title: "Check every PR",
+ body:
+ "AxiomGuard indexes TypeScript code, analyzes imports and functions, verifies findings, and prints a proof-carrying report."
+ },
+ {
+ title: "Block only proof",
+ body:
+ "Only PROVEN findings from approved critical rules in block mode can stop a merge."
+ }
+] as const;
+
+export const realDemo = {
+ title: "Run the repo's real TypeScript demo.",
+ body:
+ "The landing demo uses the same fixture shipped in this repository: a CLAUDE.md rule, an approved SemanticRule, a TypeScript import violation, and the CLI report that blocks only after symbolic proof.",
+ fixturePath: "examples/demo-typescript-app",
+ cleanFixturePath: "examples/demo-typescript-app-clean",
+ brokenCommand: "pnpm analyze:demo:broken",
+ cleanCommand: "pnpm analyze:demo"
+} as const;
+
+export const realDemoSteps = [
+ {
+ label: "CLAUDE.md",
+ title: "Documented intent",
+ path: "examples/demo-typescript-app/CLAUDE.md",
+ lines: [
+ "The authentication layer is identity-only.",
+ "It must not import billing code or trigger billing side effects directly."
+ ]
+ },
+ {
+ label: "SemanticRule",
+ title: "Approved guardrail",
+ path: "examples/demo-typescript-app/rules/auth.rules.yml",
+ lines: [
+ "rule_id: INV-AUTH-001",
+ "status: approved",
+ "severity: critical",
+ "from: src/auth/**",
+ "to: src/billing/**",
+ "mode: block"
+ ]
+ },
+ {
+ label: "TypeScript change",
+ title: "Violating edge",
+ path: "examples/demo-typescript-app/src/auth/session.ts",
+ lines: [
+ 'import { BillingService } from "../billing/billing-service";',
+ "const billing = new BillingService();",
+ 'billing.recordSessionStart({ userId, reason: "auth-started" });'
+ ]
+ },
+ {
+ label: "Proof",
+ title: "Blocking evidence",
+ path: "apps/cli",
+ lines: [
+ "Changed file: src/auth/session.ts",
+ "Evidence: import edge auth -> billing",
+ "Status: PROVEN",
+ "Severity: critical",
+ "Blocking: yes"
+ ]
+ }
+] as const;
+
+export const violationTypes = [
+ {
+ title: "Layer Boundary",
+ rule: "auth must not import billing",
+ example: "import { charge } from '../billing/service'",
+ accent: "blue"
+ },
+ {
+ title: "Forbidden Side Effect",
+ rule: "read-only flows must not write",
+ example: "await db.invoice.update(...)",
+ accent: "red"
+ },
+ {
+ title: "Value Invariant",
+ rule: "discount cannot exceed max",
+ example: "discount = 0.85",
+ accent: "green"
+ }
+] as const;
+
+export const comparisonRows = [
+ {
+ alternative: "SAST",
+ checks: "Security vulnerability patterns",
+ adds: "Product and architecture intent, such as billing boundaries and domain invariants"
+ },
+ {
+ alternative: "Linters",
+ checks: "Style, syntax, and generic code-quality rules",
+ adds: "Team-specific business rules backed by approved documentation"
+ },
+ {
+ alternative: "AI reviewers",
+ checks: "Broad contextual suggestions and plausible concerns",
+ adds: "Deterministic blocking only when approved rules produce symbolic evidence"
+ },
+ {
+ alternative: "Architecture tools",
+ checks: "Dependencies, packages, and structural drift",
+ adds: "PR-level reports tied to documented business and architecture intent"
+ }
+] as const;
+
+export const findingStatuses = [
+ {
+ status: "PROVEN",
+ effect: "Can block",
+ detail: "A deterministic check found symbolic evidence for an approved critical rule."
+ },
+ {
+ status: "PROBABLE",
+ effect: "Review",
+ detail: "A strong signal needs human judgment before it can become enforceable."
+ },
+ {
+ status: "SUSPECT",
+ effect: "Inform",
+ detail: "A weak signal is useful context, not a reason to stop a merge."
+ },
+ {
+ status: "RULE_CONFLICT",
+ effect: "Investigate",
+ detail: "A heuristic suspicion disagrees with deterministic evidence."
+ },
+ {
+ status: "DISMISSED",
+ effect: "No action",
+ detail: "The finding has no actionable evidence for this change."
+ }
+] as const;
+
+export const faqItems = [
+ {
+ question: "Is AxiomGuard a replacement for SAST?",
+ answer:
+ "No. AxiomGuard complements SAST by checking business and architecture intent rather than security vulnerability classes."
+ },
+ {
+ question: "Does AxiomGuard use an LLM?",
+ answer:
+ "The MVP does not use an LLM for enforcement. Future LLM features may suggest candidate rules or explanations, but approved SemanticRules remain the source of truth."
+ },
+ {
+ question: "What can block a pull request?",
+ answer:
+ "Only a PROVEN finding from an approved critical rule in block mode can block a pull request."
+ },
+ {
+ question: "What languages are supported?",
+ answer:
+ "The MVP is TypeScript-first and focuses on deterministic symbolic checks for TypeScript diffs."
+ },
+ {
+ question: "Do teams need perfect documentation to start?",
+ answer:
+ "No. Teams can start with one important rule reviewers already enforce manually, then expand the SemanticRule set over time."
+ }
+] as const;
+
+export const semanticRuleSnippet = [
+ "rule_id: AUTH-BOUNDARY-001",
+ "status: approved",
+ "severity: critical",
+ "invariants:",
+ " - type: forbidden_import",
+ " forbidden_imports:",
+ " - '@acme/billing'",
+ "enforcement:",
+ " mode: block"
+] as const;
+
+export const diffLines = [
+ {
+ tone: "muted",
+ text: "apps/auth/session.ts"
+ },
+ {
+ tone: "bad",
+ text: '+ import { charge } from "@acme/billing";'
+ },
+ {
+ tone: "normal",
+ text: "+ export async function createSession(user) {"
+ },
+ {
+ tone: "normal",
+ text: "+ return issueSession(user);"
+ },
+ {
+ tone: "normal",
+ text: "+ }"
+ }
+] as const;
+
+export const cliReportLines = [
+ "$ pnpm analyze:demo:broken",
+ "# S-Agent Report",
+ "",
+ "Project: examples/demo-typescript-app",
+ "",
+ "## Violation: INV-AUTH-001",
+ "",
+ "Changed file: src/auth/session.ts",
+ "Changed symbol: module",
+ "",
+ "Problem: Layer boundary violation:",
+ "src/auth/session.ts imports ../billing/billing-service.",
+ "",
+ "Why this matters:",
+ "The authentication layer is identity-only;",
+ "billing behavior must stay inside the billing domain.",
+ "",
+ "Evidence:",
+ "- src/auth/session.ts:1 - forbidden boundary",
+ "- CLAUDE.md:3 - CLAUDE.md#authentication-module",
+ "",
+ "Status: PROVEN",
+ "Severity: critical",
+ "Blocking: yes"
+] as const;
+
+export const cleanCliReportLines = [
+ "$ pnpm analyze:demo",
+ "# S-Agent Report",
+ "",
+ "Project: examples/demo-typescript-app-clean",
+ "",
+ "No findings."
+] as const;
+
+export const realDemoReports = [
+ {
+ title: "Broken fixture",
+ outcome: "Blocks",
+ tone: "blocking",
+ ariaLabel: "CLI output for the broken demo fixture with a proven blocking finding",
+ lines: cliReportLines
+ },
+ {
+ title: "Clean fixture",
+ outcome: "Passes",
+ tone: "passing",
+ ariaLabel: "CLI output for the clean demo fixture with no findings",
+ lines: cleanCliReportLines
+ }
+] as const;
diff --git a/apps/site/src/content/seo-pages.ts b/apps/site/src/content/seo-pages.ts
new file mode 100644
index 0000000..4d25129
--- /dev/null
+++ b/apps/site/src/content/seo-pages.ts
@@ -0,0 +1,185 @@
+import { pageMetadata } from "./landing";
+
+export interface SeoFaq {
+ question: string;
+ answer: string;
+}
+
+export interface SeoClusterPage {
+ slug: string;
+ keyword: string;
+ title: string;
+ description: string;
+ hero: string;
+ definition: string;
+ proofPoints: string[];
+ useCases: string[];
+ faq: SeoFaq[];
+}
+
+export const seoClusterPages: SeoClusterPage[] = [
+ {
+ slug: "semantic-code-review",
+ keyword: "semantic code review",
+ title: "Semantic Code Review for TypeScript PRs",
+ description:
+ "Semantic code review checks whether a TypeScript pull request preserves approved business and architecture intent, not only syntax, style, or security patterns.",
+ hero: "Semantic code review catches code changes that are technically valid but semantically wrong for the system.",
+ definition:
+ "Semantic code review evaluates whether code preserves the meaning a team already approved in documentation, architecture decisions, and product rules. AxiomGuard implements this with approved SemanticRule YAML, deterministic TypeScript analysis, and proof-carrying findings.",
+ proofPoints: [
+ "Approved SemanticRules are the source of truth.",
+ "Deterministic symbolic evidence creates PROVEN findings.",
+ "Only approved critical rules in block mode can stop a merge."
+ ],
+ useCases: [
+ "Prevent auth code from importing billing code.",
+ "Catch read-only flows that write to a database or emit events.",
+ "Flag value literals that exceed an approved product threshold."
+ ],
+ faq: [
+ {
+ question: "How is semantic code review different from linting?",
+ answer:
+ "Linting checks generic style and syntax rules. Semantic code review checks project-specific intent, such as domain boundaries, side-effect rules, and business invariants."
+ },
+ {
+ question: "Can semantic code review block a pull request?",
+ answer:
+ "AxiomGuard can block only when an approved critical SemanticRule produces a PROVEN deterministic finding in block mode."
+ }
+ ]
+ },
+ {
+ slug: "intent-aware-code-review",
+ keyword: "intent-aware code review",
+ title: "Intent-Aware Code Review Guardrails",
+ description:
+ "Intent-aware code review verifies that every pull request preserves documented business, product, and architecture rules.",
+ hero: "Intent-aware code review gives every pull request a memory of the rules your team already agreed to follow.",
+ definition:
+ "Intent-aware code review checks code changes against approved intent from CLAUDE.md, READMEs, ADRs, and architecture notes. AxiomGuard turns those approved rules into deterministic TypeScript checks with evidence a reviewer can audit.",
+ proofPoints: [
+ "Candidate rules can come from documentation, but a human approves enforcement.",
+ "The YAML rule file remains the enforceable source of truth.",
+ "Findings include the violated invariant, changed file, evidence, status, and severity."
+ ],
+ useCases: [
+ "Turn repeated staff-engineer review comments into executable rules.",
+ "Keep product invariants visible during refactors.",
+ "Make architecture decisions enforceable in CI."
+ ],
+ faq: [
+ {
+ question: "What does intent-aware code review check?",
+ answer:
+ "It checks whether a change violates approved intent, including layer boundaries, forbidden side effects, and value invariants."
+ },
+ {
+ question: "Does intent-aware code review rely on an LLM?",
+ answer:
+ "AxiomGuard does not use an LLM as the source of truth for blocking. LLMs may suggest candidate rules or explanations, but approved SemanticRules decide enforcement."
+ }
+ ]
+ },
+ {
+ slug: "ai-code-review-guardrails",
+ keyword: "AI code review guardrails",
+ title: "AI Code Review Guardrails for Generated Code",
+ description:
+ "AI code review guardrails help teams keep AI-generated and refactored code aligned with approved business and architecture rules.",
+ hero: "AI-generated code can pass tests and still violate business intent. Guardrails make those rules explicit before merge.",
+ definition:
+ "AI code review guardrails are deterministic checks that constrain AI-assisted changes with approved project rules. AxiomGuard verifies TypeScript pull requests against SemanticRules so AI-written code must respect the same intent as human-written code.",
+ proofPoints: [
+ "Prompts and repository context are helpful, but they are not enforceable policy.",
+ "Approved rules create auditable findings with deterministic evidence.",
+ "Heuristic suspicions can inform review, but only proof can block."
+ ],
+ useCases: [
+ "Review AI-generated PRs for domain boundary drift.",
+ "Protect billing, auth, entitlement, and pricing flows from plausible but wrong edits.",
+ "Give platform teams a deterministic layer beside AI reviewers."
+ ],
+ faq: [
+ {
+ question: "Why do AI-generated pull requests need guardrails?",
+ answer:
+ "AI-generated code can be syntactically correct while missing business context. Guardrails check approved rules that prompts and tests may not enforce."
+ },
+ {
+ question: "Is AxiomGuard an AI reviewer?",
+ answer:
+ "No. AxiomGuard is deterministic-first. It can complement AI reviewers, but blocking findings come from approved SemanticRules and symbolic evidence."
+ }
+ ]
+ },
+ {
+ slug: "architecture-drift-prevention",
+ keyword: "architecture drift prevention",
+ title: "Architecture Drift Prevention for Pull Requests",
+ description:
+ "Architecture drift prevention catches pull requests that violate documented module boundaries and approved architecture decisions.",
+ hero: "Architecture drift starts with one reasonable import. AxiomGuard catches boundary violations before they become the new normal.",
+ definition:
+ "Architecture drift prevention keeps code changes aligned with approved architecture decisions. AxiomGuard checks TypeScript imports and scoped rules so teams can stop layer boundary violations before they merge.",
+ proofPoints: [
+ "Rules can encode boundaries such as auth must not import billing.",
+ "Findings show the importing file, resolved edge, violated invariant, and status.",
+ "The CLI can fail only on approved critical rules with PROVEN evidence."
+ ],
+ useCases: [
+ "Protect package direction in a TypeScript monorepo.",
+ "Keep UI code from reaching into persistence layers.",
+ "Preserve architecture decisions during modernization projects."
+ ],
+ faq: [
+ {
+ question: "What is architecture drift?",
+ answer:
+ "Architecture drift happens when code gradually diverges from approved design decisions, often through small dependencies, shortcuts, or refactors that look harmless in isolation."
+ },
+ {
+ question: "How does AxiomGuard prevent architecture drift?",
+ answer:
+ "AxiomGuard encodes approved boundaries as SemanticRules, analyzes TypeScript changes, and reports proof-carrying findings when a pull request violates those boundaries."
+ }
+ ]
+ },
+ {
+ slug: "business-logic-regression-prevention",
+ keyword: "business logic regression prevention",
+ title: "Business Logic Regression Prevention in Code Review",
+ description:
+ "Business logic regression prevention checks pull requests for rule violations such as unsafe side effects, broken product invariants, and invalid thresholds.",
+ hero: "Business logic regressions are often valid code with the wrong meaning. AxiomGuard checks the rules tests and linters miss.",
+ definition:
+ "Business logic regression prevention protects product rules such as pricing limits, entitlement assumptions, approval flows, and read-only behavior. AxiomGuard turns those rules into deterministic checks over TypeScript changes.",
+ proofPoints: [
+ "Value invariants can flag obvious numeric thresholds that exceed approved limits.",
+ "Forbidden side-effect rules can identify writes or emitted events in read-only flows.",
+ "Every finding carries business and technical explanations."
+ ],
+ useCases: [
+ "Prevent discounts from exceeding approved thresholds.",
+ "Keep reporting and read-model functions from writing to persistence.",
+ "Protect billing, entitlement, and compliance-sensitive modules during refactors."
+ ],
+ faq: [
+ {
+ question: "Why do business logic regressions escape normal tests?",
+ answer:
+ "Tests usually cover known examples. Business logic regressions can appear when a change is type-correct but violates an assumption documented outside the code path being tested."
+ },
+ {
+ question: "What business rules can AxiomGuard check today?",
+ answer:
+ "The MVP focuses on layer boundary violations, forbidden side effects, forbidden imports, and obvious value invariant violations in TypeScript projects."
+ }
+ ]
+ }
+] as const;
+
+export const seoClusterSlugs = seoClusterPages.map((page) => page.slug);
+
+export const seoLastUpdated = pageMetadata.lastUpdated;
diff --git a/apps/site/src/pages/[slug].astro b/apps/site/src/pages/[slug].astro
new file mode 100644
index 0000000..885393d
--- /dev/null
+++ b/apps/site/src/pages/[slug].astro
@@ -0,0 +1,171 @@
+---
+import { brand, pageMetadata, siteMetadata } from "../content/landing";
+import { seoClusterPages, type SeoClusterPage } from "../content/seo-pages";
+import "../styles/landing.css";
+
+export function getStaticPaths() {
+ return seoClusterPages.map((page) => ({
+ params: { slug: page.slug },
+ props: { page }
+ }));
+}
+
+interface Props {
+ page: SeoClusterPage;
+}
+
+const { page } = Astro.props;
+const siteBase = Astro.site ?? new URL(siteMetadata.productionUrl);
+const canonicalUrl = new URL(`/${page.slug}`, siteBase).toString();
+const ogImageUrl = new URL(siteMetadata.ogImagePath, siteBase).toString();
+const pageTitle = `${page.title} | ${brand.product}`;
+const relatedPages = seoClusterPages.filter((item) => item.slug !== page.slug);
+const articleSchema = {
+ "@context": "https://schema.org",
+ "@type": "Article",
+ headline: page.title,
+ description: page.description,
+ dateModified: pageMetadata.lastUpdated,
+ mainEntityOfPage: canonicalUrl,
+ publisher: {
+ "@type": "Organization",
+ name: brand.product,
+ sameAs: siteMetadata.githubUrl
+ },
+ sameAs: siteMetadata.githubUrl
+};
+const faqSchema = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: page.faq.map((item) => ({
+ "@type": "Question",
+ name: item.question,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: item.answer
+ }
+ }))
+};
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {pageTitle}
+
+
+
+
+
+
+ {page.keyword}
+ {page.title}
+ {page.hero}
+ {page.definition}
+
+
+
+
+
Why it matters
+
Proof beats plausible review comments.
+
+
+ {page.proofPoints.map((item) => (
+
+ {item}
+
+ ))}
+
+
+
+
+
+
Use cases
+
Where teams apply this first.
+
+
+ {page.useCases.map((item) => {item} )}
+
+
+
+
+
+
FAQ
+
Questions about {page.keyword}.
+
+
+ {page.faq.map((item) => (
+
+ {item.question}
+ {item.answer}
+
+ ))}
+
+
+
+
+
+
+
+
+
diff --git a/apps/site/src/pages/index.astro b/apps/site/src/pages/index.astro
new file mode 100644
index 0000000..be9b462
--- /dev/null
+++ b/apps/site/src/pages/index.astro
@@ -0,0 +1,390 @@
+---
+import {
+ answerBlocks,
+ brand,
+ comparisonRows,
+ diffLines,
+ faqItems,
+ findingStatuses,
+ heroDefinition,
+ pageMetadata,
+ proofChain,
+ realDemo,
+ realDemoReports,
+ realDemoSteps,
+ semanticRuleSnippet,
+ siteMetadata,
+ violationTypes,
+ workflowSteps
+} from "../content/landing";
+import { seoClusterPages } from "../content/seo-pages";
+import "../styles/landing.css";
+
+const pageTitle = pageMetadata.title;
+const pageDescription = pageMetadata.description;
+const canonicalUrl = Astro.site ? new URL(Astro.url.pathname, Astro.site).toString() : undefined;
+const siteBase = Astro.site ?? new URL(siteMetadata.productionUrl);
+const ogImageUrl = new URL(siteMetadata.ogImagePath, siteBase).toString();
+const softwareApplicationSchema = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ name: brand.product,
+ alternateName: brand.engine,
+ applicationCategory: "DeveloperApplication",
+ operatingSystem: "Any",
+ description: pageDescription,
+ dateModified: pageMetadata.lastUpdated,
+ sameAs: [siteMetadata.githubUrl],
+ codeRepository: siteMetadata.githubUrl,
+ featureList: violationTypes.map((item) => item.title),
+ audience: {
+ "@type": "Audience",
+ audienceType: "TypeScript engineering teams using AI-assisted development"
+ }
+};
+const faqSchema = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: faqItems.map((item) => ({
+ "@type": "Question",
+ name: item.question,
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: item.answer
+ }
+ }))
+};
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {canonicalUrl && }
+
+
+ {pageTitle}
+
+
+
+
+
+
+
+
{brand.category}
+
{brand.headline}
+
{brand.subheadline}
+
{heroDefinition}
+
+
+ Approved rules are source of truth
+ LLM cannot create blocking findings
+ PROVEN critical evidence can block
+
+
+
+
+
+
+
+ SemanticRule
+ {semanticRuleSnippet.join("\n")}
+
+
+
+ Changed diff
+ {diffLines.map((line) => (
+ {line.text}
+ ))}
+
+
+
+ Proof-carrying finding
+ AUTH-BOUNDARY-001
+
+
+
Status
+ PROVEN
+
+
+
Evidence
+ import edge auth -> billing
+
+
+
Action
+ Block merge
+
+
+
+
+
+ Trace
+
+ {proofChain.map((item) => {item} )}
+
+
+
+
+
+
+
+
Real repo demo
+
{realDemo.title}
+
{realDemo.body}
+
+
+
+ {realDemo.brokenCommand}
+ {realDemo.cleanCommand}
+
+
+
+ {realDemoSteps.map((step) => (
+
+ {step.label}
+ {step.title}
+ {step.path}
+ {step.lines.join("\n")}
+
+ ))}
+
+
+
+ {realDemoReports.map((report) => (
+
+
+
+
+
+
+
+
{report.title}
+
{report.outcome}
+
+ {report.lines.join("\n")}
+
+ ))}
+
+
+
+
+
+
Intent-aware review
+
What is AxiomGuard?
+
+ AxiomGuard gives reviewers concise, source-backed answers about what
+ changed, which approved rule was violated, and why the finding can or
+ cannot block.
+
+
+
+ {answerBlocks.map((item) => (
+
+ {item.title}
+ {item.body}
+
+ ))}
+
+
+
+
+
+ {violationTypes.map((item) => (
+
+ {item.title}
+ {item.rule}
+
+ ))}
+
+
+
+
+
+
Docs become guardrails
+
Your most repeated review comments should be executable.
+
+
+
+ AxiomGuard starts where teams already write intent: CLAUDE.md, READMEs,
+ ADRs, and architecture notes. Candidate rules can be suggested, but the
+ approved YAML file is the source of truth.
+
+
+ The MVP stays deliberately narrow: TypeScript diffs, symbolic checks, and
+ proof-carrying findings for the three violations that teams repeat by hand.
+
+
+
+
+
+ {violationTypes.map((item) => (
+
+ 0{violationTypes.indexOf(item) + 1}
+ {item.title}
+ {item.rule}
+ {item.example}
+
+ ))}
+
+
+
+
+
How it works
+
How does AxiomGuard check a pull request?
+
+ The review path stays small and auditable: approved rules, TypeScript
+ analysis, symbolic evidence, and conservative blocking.
+
+
+
+ {workflowSteps.map((item) => (
+
+ {item.title}
+ {item.body}
+
+ ))}
+
+
+
+
+
+
Comparison
+
AxiomGuard vs SAST, linters, and AI reviewers.
+
+ AxiomGuard is not another generic scanner. It adds a deterministic
+ intent layer beside the tools teams already use.
+
+
+
+
+
+
+ Alternative
+ What it checks
+ What AxiomGuard adds
+
+
+
+ {comparisonRows.map((item) => (
+
+ {item.alternative}
+ {item.checks}
+ {item.adds}
+
+ ))}
+
+
+
+
+
+
+
+
Search topics
+
Explore intent-aware review topics.
+
+ These short pages answer the priority questions teams ask when they
+ compare semantic review, AI guardrails, architecture drift prevention,
+ and business logic regression prevention.
+
+
+
+
+
+
+
+
Finding statuses
+
Only proof gets to stop a merge.
+
+ Heuristics can point reviewers toward risk. Blocking remains conservative:
+ approved critical rules, deterministic evidence, and a concrete trace.
+
+
+
+
+ {findingStatuses.map((item) => (
+
+ {item.status}
+ {item.effect}
+ {item.detail}
+
+ ))}
+
+
+
+
+
+
FAQ
+
Common questions about AxiomGuard.
+
+
+ {faqItems.map((item) => (
+
+ {item.question}
+ {item.answer}
+
+ ))}
+
+
+
+
+
+
+
diff --git a/apps/site/src/pages/sitemap.xml.ts b/apps/site/src/pages/sitemap.xml.ts
new file mode 100644
index 0000000..f715fc3
--- /dev/null
+++ b/apps/site/src/pages/sitemap.xml.ts
@@ -0,0 +1,36 @@
+import type { APIRoute } from "astro";
+import { pageMetadata, siteMetadata } from "../content/landing";
+import { seoClusterPages } from "../content/seo-pages";
+
+const routes = [
+ { path: "/", priority: "1.0" },
+ ...seoClusterPages.map((page) => ({ path: `/${page.slug}`, priority: "0.8" }))
+] as const;
+
+function routeUrl(path: string, baseUrl: URL): string {
+ return new URL(path, baseUrl).toString();
+}
+
+export const GET: APIRoute = ({ site }) => {
+ const baseUrl = site ?? new URL(siteMetadata.productionUrl);
+ const entries = routes
+ .map(
+ (route) => `
+ ${routeUrl(route.path, baseUrl)}
+ ${pageMetadata.lastUpdated}
+ weekly
+ ${route.priority}
+ `
+ )
+ .join("\n");
+
+ return new Response(`
+
+${entries}
+
+`, {
+ headers: {
+ "Content-Type": "application/xml; charset=utf-8"
+ }
+ });
+};
diff --git a/apps/site/src/styles/landing.css b/apps/site/src/styles/landing.css
new file mode 100644
index 0000000..0ff4e31
--- /dev/null
+++ b/apps/site/src/styles/landing.css
@@ -0,0 +1,1644 @@
+:root {
+ color-scheme: light;
+ --paper: #f4eddf;
+ --paper-strong: #fffaf0;
+ --ink: #11100e;
+ --muted: #6f675b;
+ --line: #11100e;
+ --blue: #2358ff;
+ --cyan: #5fd7ff;
+ --red: #f04a3a;
+ --green: #22b86f;
+ --yellow: #ffd84a;
+ --shadow: 10px 10px 0 var(--ink);
+ --radius: 6px;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+html {
+ background: var(--paper);
+ scroll-behavior: smooth;
+}
+
+body {
+ min-width: 320px;
+ margin: 0;
+ overflow-x: hidden;
+ color: var(--ink);
+ font-family: "Aptos", "Helvetica Neue", Helvetica, sans-serif;
+ letter-spacing: 0;
+ background:
+ repeating-linear-gradient(90deg, rgba(17, 16, 14, 0.045) 0 1px, transparent 1px 44px),
+ repeating-linear-gradient(0deg, rgba(17, 16, 14, 0.035) 0 1px, transparent 1px 44px),
+ var(--paper);
+}
+
+body::after {
+ position: fixed;
+ inset: 0;
+ z-index: 30;
+ pointer-events: none;
+ content: "";
+ opacity: 0.18;
+ background-image:
+ linear-gradient(90deg, rgba(17, 16, 14, 0.12) 1px, transparent 1px),
+ linear-gradient(0deg, rgba(255, 250, 240, 0.35) 1px, transparent 1px);
+ background-size: 7px 7px;
+ mix-blend-mode: multiply;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+pre,
+code {
+ font-family: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
+}
+
+.site-header {
+ position: sticky;
+ top: 0;
+ z-index: 20;
+ display: grid;
+ grid-template-columns: 1fr auto auto;
+ gap: 24px;
+ align-items: center;
+ padding: 14px 28px;
+ border-bottom: 2px solid var(--ink);
+ background: rgba(244, 237, 223, 0.86);
+ backdrop-filter: blur(14px);
+}
+
+.brand-mark {
+ display: inline-flex;
+ gap: 12px;
+ align-items: center;
+ width: max-content;
+}
+
+.brand-mark__sigil {
+ display: grid;
+ width: 42px;
+ height: 42px;
+ place-items: center;
+ color: var(--paper-strong);
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-weight: 800;
+ background: var(--ink);
+ border: 2px solid var(--ink);
+ box-shadow: 4px 4px 0 var(--red);
+}
+
+.brand-mark strong,
+.brand-mark small {
+ display: block;
+ line-height: 1.05;
+}
+
+.brand-mark strong {
+ font-size: 1.05rem;
+}
+
+.brand-mark small {
+ margin-top: 3px;
+ color: var(--muted);
+ font-size: 0.78rem;
+}
+
+.site-nav {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+}
+
+.site-nav a,
+.header-action {
+ padding: 10px 12px;
+ border: 1.5px solid transparent;
+ border-radius: var(--radius);
+ font-size: 0.92rem;
+ font-weight: 700;
+}
+
+.site-nav a:hover,
+.header-action:hover {
+ border-color: var(--ink);
+ background: var(--paper-strong);
+}
+
+.header-action {
+ border-color: var(--ink);
+ background: var(--yellow);
+ box-shadow: 3px 3px 0 var(--ink);
+}
+
+.hero {
+ display: grid;
+ grid-template-columns: minmax(0, 0.9fr) minmax(520px, 1.1fr);
+ gap: 42px;
+ align-items: center;
+ max-width: 1420px;
+ min-height: 80svh;
+ margin: 0 auto;
+ padding: 34px 32px 26px;
+}
+
+.hero__copy {
+ max-width: 700px;
+}
+
+.eyebrow {
+ width: max-content;
+ max-width: 100%;
+ margin: 0 0 18px;
+ padding: 8px 10px;
+ overflow-wrap: anywhere;
+ color: var(--ink);
+ font-size: 0.86rem;
+ font-weight: 800;
+ line-height: 1;
+ background: var(--cyan);
+ border: 2px solid var(--ink);
+ box-shadow: 4px 4px 0 var(--ink);
+}
+
+.hero h1,
+.section h2 {
+ margin: 0;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-weight: 900;
+ letter-spacing: 0;
+}
+
+.hero h1 {
+ max-width: 760px;
+ font-size: 4.75rem;
+ line-height: 0.96;
+ text-wrap: balance;
+}
+
+.hero__lede {
+ max-width: 640px;
+ margin: 26px 0 0;
+ color: #29241d;
+ font-size: 1.2rem;
+ line-height: 1.55;
+}
+
+.hero__definition {
+ width: 100%;
+ max-width: 660px;
+ padding: 12px 14px;
+ margin: 18px 0 0;
+ overflow-wrap: anywhere;
+ color: #29241d;
+ font-size: 0.98rem;
+ font-weight: 700;
+ line-height: 1.45;
+ background: rgba(255, 250, 240, 0.72);
+ border: 2px solid rgba(17, 16, 14, 0.22);
+}
+
+.hero__actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 14px;
+ margin-top: 30px;
+}
+
+.button {
+ display: inline-flex;
+ min-height: 48px;
+ align-items: center;
+ justify-content: center;
+ padding: 12px 18px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ font-weight: 900;
+ line-height: 1.1;
+ box-shadow: 5px 5px 0 var(--ink);
+ transition:
+ translate 160ms ease,
+ box-shadow 160ms ease;
+}
+
+.button:hover {
+ translate: 2px 2px;
+ box-shadow: 3px 3px 0 var(--ink);
+}
+
+.button--primary {
+ color: var(--paper-strong);
+ background: var(--ink);
+}
+
+.button--secondary {
+ background: var(--paper-strong);
+}
+
+.trust-list {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 10px;
+ max-width: 620px;
+ padding: 0;
+ margin: 30px 0 0;
+ list-style: none;
+}
+
+.trust-list li {
+ display: flex;
+ gap: 10px;
+ align-items: flex-start;
+ color: #29241d;
+ font-size: 0.9rem;
+ font-weight: 700;
+ line-height: 1.35;
+}
+
+.trust-list li::before {
+ flex: 0 0 auto;
+ width: 12px;
+ height: 12px;
+ margin-top: 5px;
+ content: "";
+ background: var(--green);
+ border: 2px solid var(--ink);
+}
+
+.proof-stage {
+ position: relative;
+ min-height: 560px;
+ isolation: isolate;
+}
+
+.stage-rails {
+ position: absolute;
+ inset: 52px 34px 42px;
+ z-index: -1;
+ border: 2px solid var(--ink);
+ background:
+ linear-gradient(135deg, transparent 0 47%, rgba(17, 16, 14, 0.14) 47% 48%, transparent 48%),
+ linear-gradient(45deg, transparent 0 47%, rgba(17, 16, 14, 0.14) 47% 48%, transparent 48%),
+ rgba(255, 216, 74, 0.22);
+ background-size: 80px 80px;
+ transform: rotate(-3deg);
+}
+
+.stage-rails::before,
+.stage-rails::after {
+ position: absolute;
+ content: "";
+ border: 2px solid var(--ink);
+ background: var(--paper);
+}
+
+.stage-rails::before {
+ top: -28px;
+ right: 18%;
+ width: 64px;
+ height: 64px;
+}
+
+.stage-rails::after {
+ right: -24px;
+ bottom: 18%;
+ width: 94px;
+ height: 28px;
+ background: var(--red);
+}
+
+.artifact {
+ position: absolute;
+ width: 320px;
+ padding: 16px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: rgba(255, 250, 240, 0.94);
+ box-shadow: var(--shadow);
+ translate: 0 0;
+ animation: lift 7s ease-in-out infinite;
+}
+
+.artifact__label {
+ width: max-content;
+ margin: 0 0 12px;
+ padding: 5px 8px;
+ font-size: 0.72rem;
+ font-weight: 900;
+ line-height: 1;
+ background: var(--yellow);
+ border: 1.5px solid var(--ink);
+}
+
+.artifact pre {
+ margin: 0;
+ overflow-x: auto;
+ font-size: 0.74rem;
+ line-height: 1.55;
+}
+
+.artifact--rule {
+ top: 20px;
+ left: 10px;
+ transform: rotate(-4deg);
+}
+
+.artifact--diff {
+ top: 100px;
+ right: 12px;
+ width: 360px;
+ transform: rotate(3deg);
+ animation-delay: 700ms;
+}
+
+.artifact--finding {
+ bottom: 48px;
+ left: 86px;
+ width: 360px;
+ transform: rotate(1deg);
+ animation-delay: 1300ms;
+}
+
+.artifact--trace {
+ right: 0;
+ bottom: 2px;
+ width: 292px;
+ background: var(--cyan);
+ transform: rotate(-2deg);
+ animation-delay: 1900ms;
+}
+
+.artifact--finding h2 {
+ margin: 0 0 14px;
+ font-size: 1.35rem;
+}
+
+.artifact dl {
+ display: grid;
+ gap: 8px;
+ margin: 0;
+}
+
+.artifact dl div {
+ display: grid;
+ grid-template-columns: 86px 1fr;
+ gap: 10px;
+ align-items: baseline;
+ padding-top: 8px;
+ border-top: 1.5px solid rgba(17, 16, 14, 0.22);
+}
+
+.artifact dt {
+ color: var(--muted);
+ font-size: 0.78rem;
+ font-weight: 800;
+}
+
+.artifact dd {
+ margin: 0;
+ font-weight: 900;
+}
+
+.artifact ol {
+ display: grid;
+ gap: 8px;
+ padding-left: 22px;
+ margin: 0;
+ font-weight: 900;
+}
+
+.diff-line {
+ padding: 7px 8px;
+ margin-top: 6px;
+ overflow-wrap: anywhere;
+ font-family: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
+ font-size: 0.78rem;
+ background: rgba(17, 16, 14, 0.05);
+ border-left: 4px solid var(--green);
+}
+
+.diff-line--bad {
+ background: rgba(240, 74, 58, 0.12);
+ border-left-color: var(--red);
+}
+
+.diff-line--muted {
+ color: var(--muted);
+ background: transparent;
+ border-left-color: var(--ink);
+}
+
+@keyframes lift {
+ 0%,
+ 100% {
+ translate: 0 0;
+ }
+
+ 50% {
+ translate: 0 -10px;
+ }
+}
+
+.signal-strip {
+ border-top: 2px solid var(--ink);
+ border-bottom: 2px solid var(--ink);
+ background: var(--ink);
+}
+
+.signal-strip__track {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ max-width: 1420px;
+ margin: 0 auto;
+}
+
+.signal-card {
+ min-height: 112px;
+ padding: 22px 28px;
+ color: var(--paper-strong);
+ border-right: 2px solid var(--paper);
+}
+
+.signal-card:last-child {
+ border-right: 0;
+}
+
+.signal-card strong,
+.signal-card span {
+ display: block;
+}
+
+.signal-card strong {
+ margin-bottom: 10px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.45rem;
+ line-height: 1.05;
+}
+
+.signal-card span {
+ color: rgba(255, 250, 240, 0.78);
+ font-size: 0.98rem;
+ line-height: 1.4;
+}
+
+.signal-card--blue {
+ background: var(--blue);
+}
+
+.signal-card--red {
+ background: var(--red);
+}
+
+.signal-card--green {
+ color: var(--ink);
+ background: var(--green);
+}
+
+.signal-card--green span {
+ color: rgba(17, 16, 14, 0.78);
+}
+
+.section {
+ max-width: 1220px;
+ padding: 92px 32px;
+ margin: 0 auto;
+}
+
+.section--split {
+ display: grid;
+ grid-template-columns: minmax(0, 0.92fr) minmax(360px, 1.08fr);
+ gap: 64px;
+ align-items: start;
+}
+
+.section h2 {
+ max-width: 640px;
+ font-size: 3.35rem;
+ line-height: 1;
+}
+
+.demo-section {
+ max-width: 1320px;
+ padding-top: 84px;
+}
+
+.demo-command-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ margin-top: 34px;
+}
+
+.demo-command-row code {
+ display: inline-flex;
+ min-height: 42px;
+ align-items: center;
+ padding: 10px 12px;
+ overflow-wrap: anywhere;
+ color: var(--paper-strong);
+ font-size: 0.86rem;
+ font-weight: 900;
+ line-height: 1.2;
+ background: var(--ink);
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ box-shadow: 4px 4px 0 var(--yellow);
+}
+
+.demo-step-grid {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 14px;
+ margin-top: 18px;
+}
+
+.demo-step {
+ min-height: 314px;
+ padding: 18px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ box-shadow: 7px 7px 0 var(--ink);
+}
+
+.demo-step__label {
+ display: inline-block;
+ max-width: 100%;
+ padding: 6px 8px;
+ margin-bottom: 24px;
+ overflow-wrap: anywhere;
+ font-size: 0.72rem;
+ font-weight: 900;
+ line-height: 1.05;
+ background: var(--cyan);
+ border: 1.5px solid var(--ink);
+}
+
+.demo-step h3 {
+ margin: 0 0 12px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.5rem;
+ line-height: 1.05;
+}
+
+.demo-step > code {
+ display: block;
+ min-height: 44px;
+ margin-bottom: 12px;
+ overflow-wrap: anywhere;
+ color: #342d25;
+ font-size: 0.74rem;
+ line-height: 1.35;
+}
+
+.demo-step pre {
+ min-height: 112px;
+ padding: 12px;
+ margin: 0;
+ overflow-x: auto;
+ overflow-wrap: anywhere;
+ font-size: 0.72rem;
+ line-height: 1.55;
+ background: rgba(17, 16, 14, 0.07);
+ border: 1.5px solid rgba(17, 16, 14, 0.2);
+}
+
+.demo-report-grid {
+ display: grid;
+ grid-template-columns: minmax(0, 1.28fr) minmax(320px, 0.72fr);
+ gap: 18px;
+ align-items: stretch;
+ margin-top: 24px;
+}
+
+.terminal--demo {
+ height: 100%;
+}
+
+.copy-stack {
+ display: grid;
+ gap: 18px;
+ font-size: 1.12rem;
+ line-height: 1.65;
+}
+
+.copy-stack p,
+.section-heading p,
+.work-copy p {
+ margin: 0;
+ color: #332d25;
+}
+
+.check-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 18px;
+ padding-top: 0;
+}
+
+.check-card {
+ position: relative;
+ min-height: 300px;
+ padding: 22px;
+ overflow: hidden;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ box-shadow: var(--shadow);
+}
+
+.check-card::before {
+ position: absolute;
+ right: 18px;
+ bottom: 18px;
+ width: 78px;
+ height: 78px;
+ content: "";
+ border: 2px solid var(--ink);
+}
+
+.check-card--blue::before {
+ background: var(--blue);
+}
+
+.check-card--red::before {
+ background: var(--red);
+}
+
+.check-card--green::before {
+ background: var(--green);
+}
+
+.check-card__index {
+ display: inline-grid;
+ width: 48px;
+ height: 48px;
+ place-items: center;
+ margin-bottom: 44px;
+ font-weight: 900;
+ border: 2px solid var(--ink);
+ background: var(--yellow);
+}
+
+.check-card h3 {
+ max-width: 260px;
+ margin: 0 0 12px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 2rem;
+ line-height: 1.05;
+}
+
+.check-card p {
+ max-width: 290px;
+ margin: 0 0 18px;
+ color: #342d25;
+ line-height: 1.5;
+}
+
+.check-card code {
+ display: block;
+ max-width: 100%;
+ padding: 10px;
+ overflow-wrap: anywhere;
+ font-size: 0.8rem;
+ line-height: 1.45;
+ background: rgba(17, 16, 14, 0.07);
+ border: 1.5px solid rgba(17, 16, 14, 0.2);
+}
+
+.proof-section {
+ border-top: 2px solid var(--ink);
+}
+
+.section-heading {
+ display: grid;
+ gap: 18px;
+ max-width: 760px;
+}
+
+.section-heading h2 {
+ max-width: 760px;
+}
+
+.section-heading p {
+ max-width: 680px;
+ font-size: 1.08rem;
+ line-height: 1.6;
+}
+
+.answer-section {
+ padding-bottom: 64px;
+}
+
+.answer-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 18px;
+ margin-top: 38px;
+}
+
+.answer-card {
+ min-height: 260px;
+ padding: 22px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ box-shadow: var(--shadow);
+}
+
+.answer-card h3 {
+ margin: 0 0 14px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.75rem;
+ line-height: 1.05;
+}
+
+.answer-card p {
+ margin: 0;
+ color: #342d25;
+ line-height: 1.58;
+}
+
+.workflow-section {
+ padding-top: 0;
+}
+
+.workflow-list {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 14px;
+ padding: 0;
+ margin: 40px 0 0;
+ list-style: none;
+ counter-reset: workflow;
+}
+
+.workflow-list li {
+ min-height: 238px;
+ padding: 18px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ counter-increment: workflow;
+}
+
+.workflow-list li::before {
+ display: inline-grid;
+ width: 42px;
+ height: 42px;
+ place-items: center;
+ margin-bottom: 32px;
+ content: counter(workflow);
+ font-weight: 900;
+ background: var(--yellow);
+ border: 2px solid var(--ink);
+}
+
+.workflow-list strong,
+.workflow-list span {
+ display: block;
+}
+
+.workflow-list strong {
+ margin-bottom: 10px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.45rem;
+ line-height: 1.05;
+}
+
+.workflow-list span {
+ color: #342d25;
+ line-height: 1.5;
+}
+
+.comparison-section {
+ padding-top: 0;
+}
+
+.comparison-table {
+ margin-top: 38px;
+ overflow-x: auto;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ box-shadow: var(--shadow);
+}
+
+.comparison-table table {
+ width: 100%;
+ min-width: 760px;
+ border-collapse: collapse;
+}
+
+.comparison-table th,
+.comparison-table td {
+ padding: 18px;
+ text-align: left;
+ vertical-align: top;
+ border-bottom: 2px solid rgba(17, 16, 14, 0.16);
+}
+
+.comparison-table thead th {
+ color: var(--paper-strong);
+ background: var(--ink);
+ border-bottom-color: var(--ink);
+}
+
+.comparison-table tbody th {
+ width: 22%;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.25rem;
+}
+
+.comparison-table tr:last-child th,
+.comparison-table tr:last-child td {
+ border-bottom: 0;
+}
+
+.topic-section {
+ padding-top: 0;
+}
+
+.topic-grid {
+ display: grid;
+ grid-template-columns: repeat(5, minmax(0, 1fr));
+ gap: 12px;
+ margin-top: 38px;
+}
+
+.topic-card {
+ display: grid;
+ min-height: 250px;
+ align-content: start;
+ padding: 16px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+}
+
+.topic-card:hover {
+ background: var(--yellow);
+}
+
+.topic-card span {
+ width: max-content;
+ max-width: 100%;
+ padding: 5px 7px;
+ margin-bottom: 28px;
+ overflow-wrap: anywhere;
+ font-size: 0.72rem;
+ font-weight: 900;
+ line-height: 1.1;
+ background: var(--cyan);
+ border: 1.5px solid var(--ink);
+}
+
+.topic-card strong {
+ margin-bottom: 12px;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 1.32rem;
+ line-height: 1.05;
+}
+
+.topic-card p {
+ margin: 0;
+ color: #342d25;
+ font-size: 0.92rem;
+ line-height: 1.45;
+}
+
+.cluster-hero {
+ max-width: 1120px;
+ padding: 76px 32px 56px;
+ margin: 0 auto;
+}
+
+.cluster-hero h1 {
+ max-width: 900px;
+ margin: 0;
+ font-family: "Zilla Slab", "Iowan Old Style", Georgia, serif;
+ font-size: 4.7rem;
+ font-weight: 900;
+ line-height: 0.96;
+ letter-spacing: 0;
+ text-wrap: balance;
+}
+
+.cluster-hero__lede {
+ max-width: 780px;
+ margin: 24px 0 0;
+ color: #29241d;
+ font-size: 1.22rem;
+ line-height: 1.55;
+}
+
+.cluster-answer {
+ max-width: 860px;
+ padding: 18px 20px;
+ margin: 28px 0 0;
+ color: #29241d;
+ font-size: 1.05rem;
+ font-weight: 700;
+ line-height: 1.58;
+ background: var(--paper-strong);
+ border: 2px solid rgba(17, 16, 14, 0.22);
+}
+
+.cluster-section {
+ padding-top: 32px;
+}
+
+.cluster-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+ margin-top: 36px;
+}
+
+.cluster-card {
+ min-height: 176px;
+ padding: 20px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+ box-shadow: var(--shadow);
+}
+
+.cluster-card p {
+ margin: 0;
+ color: #342d25;
+ font-weight: 800;
+ line-height: 1.55;
+}
+
+.cluster-list {
+ display: grid;
+ gap: 14px;
+ max-width: 900px;
+ padding: 0;
+ margin: 36px 0 0;
+ list-style: none;
+}
+
+.cluster-list li {
+ padding: 18px 20px;
+ font-weight: 800;
+ line-height: 1.45;
+ background: var(--paper-strong);
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+}
+
+.cluster-list li::before {
+ display: inline-block;
+ width: 12px;
+ height: 12px;
+ margin-right: 12px;
+ content: "";
+ background: var(--green);
+ border: 2px solid var(--ink);
+}
+
+.related-section {
+ padding-top: 0;
+}
+
+.status-grid {
+ display: grid;
+ grid-template-columns: repeat(5, minmax(0, 1fr));
+ gap: 12px;
+ margin-top: 42px;
+}
+
+.status-card {
+ min-height: 236px;
+ padding: 16px;
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+}
+
+.status-card strong {
+ display: block;
+ margin-bottom: 10px;
+ overflow-wrap: anywhere;
+ font-size: 1rem;
+ line-height: 1.1;
+}
+
+.status-card span {
+ display: inline-block;
+ padding: 6px 8px;
+ margin-bottom: 26px;
+ font-size: 0.78rem;
+ font-weight: 900;
+ border: 1.5px solid var(--ink);
+}
+
+.status-card p {
+ margin: 0;
+ color: #342d25;
+ font-size: 0.92rem;
+ line-height: 1.45;
+}
+
+.status-card--proven {
+ background: var(--green);
+}
+
+.status-card--proven span {
+ background: var(--paper-strong);
+}
+
+.status-card--probable span {
+ background: var(--yellow);
+}
+
+.status-card--suspect span {
+ color: var(--paper-strong);
+ background: var(--blue);
+}
+
+.status-card--rule_conflict span {
+ color: var(--paper-strong);
+ background: var(--red);
+}
+
+.status-card--dismissed {
+ background: #d8d0c2;
+}
+
+.status-card--dismissed span {
+ background: var(--paper);
+}
+
+.section--work {
+ align-items: center;
+ padding-top: 24px;
+}
+
+.work-copy {
+ display: grid;
+ gap: 20px;
+}
+
+.work-copy h2 {
+ max-width: 620px;
+}
+
+.work-copy p {
+ max-width: 560px;
+ font-size: 1.08rem;
+ line-height: 1.6;
+}
+
+.work-copy .button {
+ width: max-content;
+ margin-top: 6px;
+}
+
+.terminal {
+ overflow: hidden;
+ color: var(--paper-strong);
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: #12110f;
+ box-shadow: var(--shadow);
+}
+
+.terminal__bar {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ justify-content: space-between;
+ padding: 14px;
+ border-bottom: 2px solid #2f2d28;
+}
+
+.terminal__lights {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ margin-right: auto;
+}
+
+.terminal__lights span {
+ width: 13px;
+ height: 13px;
+ border: 1.5px solid var(--paper-strong);
+ border-radius: 50%;
+}
+
+.terminal__lights span:nth-child(1) {
+ background: var(--red);
+}
+
+.terminal__lights span:nth-child(2) {
+ background: var(--yellow);
+}
+
+.terminal__lights span:nth-child(3) {
+ background: var(--green);
+}
+
+.terminal__bar strong {
+ color: var(--paper-strong);
+ font-size: 0.9rem;
+}
+
+.terminal__bar em {
+ padding: 5px 8px;
+ color: var(--paper-strong);
+ font-size: 0.72rem;
+ font-style: normal;
+ font-weight: 900;
+ line-height: 1;
+ border: 1.5px solid var(--paper-strong);
+}
+
+.terminal--blocking .terminal__bar em {
+ background: var(--red);
+}
+
+.terminal--passing .terminal__bar em {
+ color: var(--ink);
+ background: var(--green);
+}
+
+.terminal pre {
+ min-height: 360px;
+ padding: 24px;
+ margin: 0;
+ overflow-x: auto;
+ font-size: 0.92rem;
+ line-height: 1.6;
+}
+
+.terminal--demo pre {
+ min-height: 420px;
+}
+
+.terminal--passing pre {
+ min-height: 220px;
+}
+
+.site-footer {
+ display: flex;
+ gap: 18px;
+ align-items: center;
+ justify-content: space-between;
+ padding: 26px 32px;
+ color: var(--paper-strong);
+ background: var(--ink);
+}
+
+.site-footer p {
+ max-width: 760px;
+ margin: 0;
+ line-height: 1.45;
+}
+
+.site-footer a {
+ font-weight: 900;
+ text-decoration: underline;
+ text-decoration-thickness: 2px;
+ text-underline-offset: 4px;
+}
+
+.site-footer__links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 14px;
+ align-items: center;
+ justify-content: flex-end;
+}
+
+.faq-section {
+ padding-top: 0;
+}
+
+.faq-list {
+ display: grid;
+ gap: 12px;
+ margin-top: 36px;
+}
+
+.faq-list details {
+ border: 2px solid var(--ink);
+ border-radius: var(--radius);
+ background: var(--paper-strong);
+}
+
+.faq-list summary {
+ cursor: pointer;
+ padding: 18px 20px;
+ font-weight: 900;
+ line-height: 1.3;
+}
+
+.faq-list p {
+ max-width: 820px;
+ padding: 0 20px 20px;
+ margin: 0;
+ color: #342d25;
+ line-height: 1.58;
+}
+
+@media (max-width: 1120px) {
+ .hero {
+ grid-template-columns: 1fr;
+ min-height: auto;
+ padding-top: 52px;
+ }
+
+ .hero h1 {
+ font-size: 4.6rem;
+ }
+
+ .proof-stage {
+ min-height: 640px;
+ }
+
+ .status-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .demo-step-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .demo-report-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .answer-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .topic-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .workflow-list {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .cluster-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-height: 760px) and (min-width: 900px) {
+ .hero {
+ align-items: start;
+ min-height: 62svh;
+ padding-top: 18px;
+ padding-bottom: 12px;
+ }
+
+ .hero h1 {
+ font-size: 3.55rem;
+ line-height: 0.98;
+ }
+
+ .hero__lede {
+ margin-top: 18px;
+ font-size: 1rem;
+ line-height: 1.48;
+ }
+
+ .hero__actions {
+ margin-top: 22px;
+ }
+
+ .trust-list {
+ display: none;
+ }
+
+ .proof-stage {
+ min-height: 470px;
+ }
+
+ .artifact {
+ padding: 14px;
+ }
+
+ .artifact--rule {
+ width: 300px;
+ top: 10px;
+ }
+
+ .artifact--diff {
+ top: 74px;
+ width: 340px;
+ }
+
+ .artifact--finding {
+ bottom: 26px;
+ left: 74px;
+ width: 340px;
+ }
+
+ .artifact--trace {
+ width: 270px;
+ }
+
+ .signal-card {
+ min-height: 96px;
+ padding: 10px 20px;
+ }
+
+ .signal-card strong {
+ margin-bottom: 4px;
+ font-size: 1.08rem;
+ }
+
+ .signal-card span {
+ font-size: 0.86rem;
+ }
+}
+
+@media (max-width: 840px) {
+ .site-header {
+ grid-template-columns: 1fr auto;
+ }
+
+ .site-nav {
+ display: none;
+ }
+
+ .hero {
+ padding-right: 20px;
+ padding-left: 20px;
+ }
+
+ .hero h1 {
+ font-size: 3.7rem;
+ }
+
+ .hero__lede {
+ font-size: 1.08rem;
+ }
+
+ .proof-stage {
+ display: grid;
+ gap: 18px;
+ min-height: auto;
+ }
+
+ .trust-list {
+ grid-template-columns: 1fr;
+ }
+
+ .stage-rails {
+ inset: 20px;
+ }
+
+ .stage-rails::before,
+ .stage-rails::after {
+ display: none;
+ }
+
+ .artifact {
+ position: relative;
+ inset: auto;
+ width: calc(100% - 8px);
+ transform: none;
+ }
+
+ .signal-strip__track,
+ .check-grid,
+ .demo-step-grid,
+ .topic-grid,
+ .section--split,
+ .workflow-list {
+ grid-template-columns: 1fr;
+ }
+
+ .signal-card {
+ border-right: 0;
+ border-bottom: 2px solid var(--paper);
+ }
+
+ .signal-card:last-child {
+ border-bottom: 0;
+ }
+
+ .section {
+ padding: 72px 20px;
+ }
+
+ .section h2 {
+ font-size: 2.65rem;
+ }
+
+ .cluster-hero {
+ padding: 58px 20px 42px;
+ }
+
+ .cluster-hero h1 {
+ font-size: 3.25rem;
+ }
+
+ .cluster-hero__lede {
+ font-size: 1.05rem;
+ }
+
+ .status-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 560px) {
+ .site-header {
+ grid-template-columns: 1fr;
+ gap: 14px;
+ padding: 12px 14px;
+ }
+
+ .brand-mark__sigil {
+ width: 38px;
+ height: 38px;
+ }
+
+ .brand-mark small {
+ display: none;
+ }
+
+ .header-action {
+ display: none;
+ }
+
+ .hero {
+ padding-top: 42px;
+ overflow: hidden;
+ }
+
+ .hero h1 {
+ max-width: 9ch;
+ font-size: 2.35rem;
+ line-height: 1;
+ text-wrap: normal;
+ }
+
+ .hero__lede {
+ max-width: 32ch;
+ font-size: 0.98rem;
+ }
+
+ .hero__definition {
+ max-width: 32ch;
+ font-size: 0.92rem;
+ }
+
+ .cluster-hero h1 {
+ max-width: 9ch;
+ font-size: 2.35rem;
+ line-height: 1;
+ text-wrap: normal;
+ }
+
+ .cluster-hero__lede {
+ max-width: 32ch;
+ font-size: 0.98rem;
+ }
+
+ .cluster-answer {
+ width: calc(100% - 8px);
+ max-width: 32ch;
+ overflow-wrap: anywhere;
+ font-size: 0.92rem;
+ }
+
+ .trust-list {
+ display: none;
+ }
+
+ .hero__actions,
+ .button,
+ .work-copy .button {
+ width: 100%;
+ }
+
+ .hero__actions {
+ padding-right: 8px;
+ }
+
+ .proof-stage {
+ display: none;
+ }
+
+ .stage-rails {
+ display: block;
+ inset: 28px 16px 12px;
+ transform: rotate(-2deg);
+ }
+
+ .artifact {
+ position: absolute;
+ width: 220px;
+ padding: 10px;
+ box-shadow: 5px 5px 0 var(--ink);
+ animation: none;
+ }
+
+ .artifact__label {
+ margin-bottom: 8px;
+ font-size: 0.65rem;
+ }
+
+ .artifact pre {
+ max-height: 116px;
+ font-size: 0.62rem;
+ }
+
+ .artifact--rule {
+ top: 0;
+ left: 0;
+ width: calc(100% - 18px);
+ }
+
+ .artifact--diff {
+ display: none;
+ }
+
+ .artifact--finding {
+ display: none;
+ }
+
+ .artifact--finding h2 {
+ font-size: 1rem;
+ }
+
+ .artifact dl div {
+ grid-template-columns: 64px 1fr;
+ gap: 8px;
+ }
+
+ .artifact dt,
+ .artifact dd {
+ font-size: 0.72rem;
+ }
+
+ .artifact--trace {
+ display: none;
+ }
+
+ .artifact ol {
+ gap: 4px;
+ padding-left: 18px;
+ font-size: 0.68rem;
+ }
+
+ .status-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .terminal pre {
+ min-height: 300px;
+ font-size: 0.8rem;
+ }
+
+ .demo-command-row,
+ .demo-command-row code {
+ width: 100%;
+ }
+
+ .demo-step {
+ min-height: auto;
+ }
+
+ .demo-step pre,
+ .terminal--demo pre,
+ .terminal--passing pre {
+ min-height: auto;
+ }
+
+ .site-footer {
+ display: grid;
+ }
+
+ .site-footer__links {
+ justify-content: flex-start;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+
+ *,
+ *::before,
+ *::after {
+ animation-duration: 1ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 1ms !important;
+ }
+}
diff --git a/apps/site/tsconfig.json b/apps/site/tsconfig.json
new file mode 100644
index 0000000..3f8474a
--- /dev/null
+++ b/apps/site/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "astro/tsconfigs/strict",
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"],
+ "compilerOptions": {
+ "types": ["vitest"]
+ }
+}
diff --git a/docs/community/community-roadmap.md b/docs/community/community-roadmap.md
index 2bc71b0..dc2b66f 100644
--- a/docs/community/community-roadmap.md
+++ b/docs/community/community-roadmap.md
@@ -1,7 +1,7 @@
# Community roadmap
This roadmap describes the intended direction for S-Agent Core and future
-IntentGuard commercial work. It is not a promise of dates. It is a shared map
+AxiomGuard commercial work. It is not a promise of dates. It is a shared map
for community planning.
## v0.1 OSS Core
@@ -46,7 +46,7 @@ Focus: design extension points before implementing a plugin system.
No plugin system is implemented yet.
-## Future IntentGuard Pro alpha
+## Future AxiomGuard Pro alpha
Focus: team workflows and governance built on top of S-Agent Core.
diff --git a/docs/evaluation/business-impact-metrics.md b/docs/evaluation/business-impact-metrics.md
index e32425c..4e35084 100644
--- a/docs/evaluation/business-impact-metrics.md
+++ b/docs/evaluation/business-impact-metrics.md
@@ -2,7 +2,7 @@
## Why Business Metrics Matter
-IntentGuard's value is not the number of findings. Its value is preventing changes that violate business intent, architecture decisions, and critical domain constraints.
+AxiomGuard's value is not the number of findings. Its value is preventing changes that violate business intent, architecture decisions, and critical domain constraints.
## Core Business Metrics
@@ -24,7 +24,7 @@ Examples:
### Escaped Semantic Bugs
```text
-escaped_semantic_bugs = semantic_bugs_reaching_production_after_intentguard
+escaped_semantic_bugs = semantic_bugs_reaching_production_after_axiomguard
```
This is the counter-metric to regressions prevented. If escaped semantic bugs continue after rules exist, either the rule coverage is too low or the checker is missing important cases.
@@ -85,7 +85,7 @@ MVP target: under 30 minutes.
Measure time to:
1. install or run the CLI;
-2. point IntentGuard at a repo;
+2. point AxiomGuard at a repo;
3. validate rules;
4. run analysis;
5. interpret the result.
@@ -123,7 +123,7 @@ Collect through discovery calls and pilot conversion:
team_retention_7d = teams_running_again_within_7_days / activated_teams
```
-Retention means the team ran IntentGuard again, added a rule, changed rule status, or discussed a finding.
+Retention means the team ran AxiomGuard again, added a rule, changed rule status, or discussed a finding.
## Reporting View
diff --git a/docs/evaluation/developer-experience-metrics.md b/docs/evaluation/developer-experience-metrics.md
index 8d5cdc4..b7cb06e 100644
--- a/docs/evaluation/developer-experience-metrics.md
+++ b/docs/evaluation/developer-experience-metrics.md
@@ -2,7 +2,7 @@
## Why DX Matters
-IntentGuard can only protect intent if developers trust its findings. The MVP should measure not only whether findings are correct, but whether they are understandable, actionable, and low-noise in real PR workflows.
+AxiomGuard can only protect intent if developers trust its findings. The MVP should measure not only whether findings are correct, but whether they are understandable, actionable, and low-noise in real PR workflows.
## Core DX Metrics
@@ -44,7 +44,7 @@ MVP target: under 60 seconds for deterministic findings.
### PR Review Time Impact
```text
-review_time_impact = median_review_time_with_intentguard - baseline_median_review_time
+review_time_impact = median_review_time_with_axiomguard - baseline_median_review_time
```
Do not expect immediate reduction during onboarding. The first target is neutral review time with higher confidence. Later, target reduced senior-review load for repeated rules.
diff --git a/docs/evaluation/metrics-framework.md b/docs/evaluation/metrics-framework.md
index a8aefe1..092bb1a 100644
--- a/docs/evaluation/metrics-framework.md
+++ b/docs/evaluation/metrics-framework.md
@@ -2,7 +2,7 @@
## Purpose
-S-Agent, customer-facing as IntentGuard, needs two measurement systems:
+S-Agent, customer-facing as AxiomGuard, needs two measurement systems:
1. Product correctness: does the deterministic review engine find real intent violations without noisy blocking findings?
2. Product usefulness: do teams understand, trust, and keep using the findings?
@@ -37,14 +37,14 @@ The MVP should optimize for narrow reliability over broad coverage. A small numb
| Developer acceptance rate | Findings accepted by developers divided by actionable findings. | Track in pilots |
| Suppression rate | Suppressed or dismissed findings divided by total findings. | Track; rising rate signals noise |
| Time to understand finding | Median time for a developer to explain why a finding exists. | Under 60 seconds for deterministic findings |
-| PR review time impact | Review duration with IntentGuard compared to baseline review duration. | Neutral or better after onboarding |
+| PR review time impact | Review duration with AxiomGuard compared to baseline review duration. | Neutral or better after onboarding |
### Business Metrics
| Metric | Definition | MVP target |
| --- | --- | --- |
| Semantic regressions prevented | Confirmed risky merges prevented by blocking or accepted review findings. | At least 1 in first real repo test |
-| Escaped semantic bugs | Semantic bugs that still reach production after IntentGuard is deployed. | Track; should trend down |
+| Escaped semantic bugs | Semantic bugs that still reach production after AxiomGuard is deployed. | Track; should trend down |
| Critical module coverage | Critical modules with at least one approved rule divided by total critical modules. | Track by repo |
| Architecture drift detected | Boundary or dependency violations detected before merge. | Track by repo |
| AI-generated code safety | AI-authored PRs checked and cleared or blocked by approved rules. | Track during AI coding pilots |
diff --git a/docs/evaluation/mvp-success-criteria.md b/docs/evaluation/mvp-success-criteria.md
index c2bd407..b43d1e7 100644
--- a/docs/evaluation/mvp-success-criteria.md
+++ b/docs/evaluation/mvp-success-criteria.md
@@ -48,10 +48,10 @@ The MVP succeeds when it proves that approved intent can be enforced in a small,
- The first pilot can name a real rule they want enforced.
- The product can show a useful finding or a trusted clean pass in the first session.
-- The team can explain why IntentGuard is different from SAST, a linter, and broad AI code review.
+- The team can explain why AxiomGuard is different from SAST, a linter, and broad AI code review.
- Pricing discovery has enough signal to validate or reject per-active-contributor pricing.
- A team can create at least 5 SemanticRules without custom engineering help.
-- A team still wants to run IntentGuard after 7 days.
+- A team still wants to run AxiomGuard after 7 days.
## Failure Conditions
@@ -77,4 +77,4 @@ Either outcome can be valuable. A noisy finding is not useful, even if technical
A user should be able to explain the product in one sentence:
-> IntentGuard checks whether AI-generated and refactored code still preserves approved business and architecture intent.
+> AxiomGuard checks whether AI-generated and refactored code still preserves approved business and architecture intent.
diff --git a/docs/i18n/README.ar.md b/docs/i18n/README.ar.md
index d1eaa05..b2bad96 100644
--- a/docs/i18n/README.ar.md
+++ b/docs/i18n/README.ar.md
@@ -7,7 +7,7 @@ S-Agent هو محرك مفتوح المصدر للتحليل الدلالي في
النية. يتحقق مما إذا كانت تغييرات كود TypeScript تحافظ على نية العمل
والهندسة المعمارية المعتمدة.
-IntentGuard هو المنصة التجارية المستقبلية المبنية فوق S-Agent Core لسير عمل
+AxiomGuard هو المنصة التجارية المستقبلية المبنية فوق S-Agent Core لسير عمل
الفرق وحوكمة المؤسسات.
## المشكلة
@@ -193,7 +193,7 @@ paywall.
S-Agent Core هو open-source semantic analysis engine.
-قد تضيف IntentGuard Pro و Enterprise لاحقا workflows للفرق والمؤسسات فوق
+قد تضيف AxiomGuard Pro و Enterprise لاحقا workflows للفرق والمؤسسات فوق
core، مثل:
- hosted dashboard;
@@ -255,7 +255,7 @@ core، مثل:
- v0.2: basic GitHub Action mode.
- v0.3: community rule packs ومزيد من framework examples.
- v0.4: plugin API draft وتصميم extension points.
-- Future: IntentGuard Pro alpha لـ team workflows و governance.
+- Future: AxiomGuard Pro alpha لـ team workflows و governance.
راجع [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.de.md b/docs/i18n/README.de.md
index 5458794..f32d718 100644
--- a/docs/i18n/README.de.md
+++ b/docs/i18n/README.de.md
@@ -7,7 +7,7 @@ S-Agent ist eine Open-Source-Engine für semantische Analyse im intent-aware
Code Review. Sie prüft, ob TypeScript-Codeänderungen genehmigte geschäftliche
und architektonische Absichten bewahren.
-IntentGuard ist die zukünftige kommerzielle Plattform auf Basis von S-Agent
+AxiomGuard ist die zukünftige kommerzielle Plattform auf Basis von S-Agent
Core für Team-Workflows und Enterprise-Governance.
## Problem
@@ -202,7 +202,7 @@ MVP-Features werden nicht hinter einen Paywall verschoben.
S-Agent Core ist die Open-Source-Engine für semantische Analyse.
-IntentGuard Pro und Enterprise können später Team- und Organisations-Workflows
+AxiomGuard Pro und Enterprise können später Team- und Organisations-Workflows
auf dem Core ergänzen, zum Beispiel:
- hosted dashboard;
@@ -267,7 +267,7 @@ Lies das vollständige [open-core model](../../OPEN_CORE.md).
- v0.2: basic GitHub Action mode.
- v0.3: community rule packs und mehr framework examples.
- v0.4: plugin API draft und extension-point design.
-- Future: IntentGuard Pro alpha für team workflows und governance.
+- Future: AxiomGuard Pro alpha für team workflows und governance.
Siehe die [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.es.md b/docs/i18n/README.es.md
index 1e3a96d..f151e8f 100644
--- a/docs/i18n/README.es.md
+++ b/docs/i18n/README.es.md
@@ -7,7 +7,7 @@ S-Agent es un motor open source de análisis semántico para revisiones de códi
orientadas a intención. Comprueba si los cambios en código TypeScript preservan
la intención de negocio y arquitectura aprobada.
-IntentGuard es la futura plataforma comercial construida sobre S-Agent Core
+AxiomGuard es la futura plataforma comercial construida sobre S-Agent Core
para flujos de trabajo de equipo y gobierno empresarial.
## Problema
@@ -199,7 +199,7 @@ MVP existentes no se moverán detrás de un paywall.
S-Agent Core es el motor open source de análisis semántico.
-IntentGuard Pro y Enterprise podrán añadir más adelante flujos de trabajo para
+AxiomGuard Pro y Enterprise podrán añadir más adelante flujos de trabajo para
equipos y organizaciones sobre el core, como:
- hosted dashboard;
@@ -262,7 +262,7 @@ Lee el [modelo open-core completo](../../OPEN_CORE.md).
- v0.2: modo básico de GitHub Action.
- v0.3: rule packs comunitarios y más ejemplos de frameworks.
- v0.4: borrador de plugin API y diseño de puntos de extensión.
-- Futuro: alpha de IntentGuard Pro para team workflows y governance.
+- Futuro: alpha de AxiomGuard Pro para team workflows y governance.
Consulta el [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.fr.md b/docs/i18n/README.fr.md
index b5f270b..7410efb 100644
--- a/docs/i18n/README.fr.md
+++ b/docs/i18n/README.fr.md
@@ -7,7 +7,7 @@ S-Agent est un moteur open source d'analyse sémantique pour la revue de code
orientée intention. Il vérifie si les changements de code TypeScript préservent
l'intention métier et architecturale approuvée.
-IntentGuard est la future plateforme commerciale construite sur S-Agent Core
+AxiomGuard est la future plateforme commerciale construite sur S-Agent Core
pour les workflows d'équipe et la gouvernance d'entreprise.
## Problème
@@ -203,7 +203,7 @@ existantes ne seront pas déplacées derrière un paywall.
S-Agent Core est le moteur open source d'analyse sémantique.
-IntentGuard Pro et Enterprise pourront plus tard ajouter des workflows d'équipe
+AxiomGuard Pro et Enterprise pourront plus tard ajouter des workflows d'équipe
et d'organisation au-dessus du core, par exemple :
- hosted dashboard ;
@@ -268,7 +268,7 @@ Lisez le [modèle open-core complet](../../OPEN_CORE.md).
- v0.2 : mode GitHub Action de base.
- v0.3 : rule packs communautaires et plus d'exemples de frameworks.
- v0.4 : draft d'API plugin et design des points d'extension.
-- Future : alpha IntentGuard Pro pour team workflows et governance.
+- Future : alpha AxiomGuard Pro pour team workflows et governance.
Voir la [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.hi.md b/docs/i18n/README.hi.md
index 090f701..e008fa8 100644
--- a/docs/i18n/README.hi.md
+++ b/docs/i18n/README.hi.md
@@ -7,7 +7,7 @@ S-Agent intent-aware code review के लिए एक open-source semantic an
है। यह जांचता है कि TypeScript code changes approved business और architectural
intent को सुरक्षित रखते हैं या नहीं।
-IntentGuard भविष्य का commercial platform है, जो team workflows और enterprise
+AxiomGuard भविष्य का commercial platform है, जो team workflows और enterprise
governance के लिए S-Agent Core के ऊपर बनाया जाएगा।
## समस्या
@@ -197,7 +197,7 @@ paywall के पीछे नहीं ले जाया जाएगा।
S-Agent Core open-source semantic analysis engine है।
-IntentGuard Pro और Enterprise बाद में core के ऊपर team और organization
+AxiomGuard Pro और Enterprise बाद में core के ऊपर team और organization
workflows जोड़ सकते हैं, जैसे:
- hosted dashboard;
@@ -260,7 +260,7 @@ workflows जोड़ सकते हैं, जैसे:
- v0.2: basic GitHub Action mode.
- v0.3: community rule packs और अधिक framework examples.
- v0.4: plugin API draft और extension-point design.
-- Future: team workflows और governance के लिए IntentGuard Pro alpha.
+- Future: team workflows और governance के लिए AxiomGuard Pro alpha.
[Community roadmap](../community/community-roadmap.md) देखें।
diff --git a/docs/i18n/README.ja.md b/docs/i18n/README.ja.md
index c8917a0..c672527 100644
--- a/docs/i18n/README.ja.md
+++ b/docs/i18n/README.ja.md
@@ -7,7 +7,7 @@ S-Agent は、意図を考慮したコードレビューのためのオープン
semantic analysis engine です。TypeScript のコード変更が、承認済みの
ビジネス意図とアーキテクチャ意図を保っているかを確認します。
-IntentGuard は、S-Agent Core の上に構築される将来の商用プラットフォーム
+AxiomGuard は、S-Agent Core の上に構築される将来の商用プラットフォーム
で、チーム workflow と enterprise governance を扱います。
## 問題
@@ -201,7 +201,7 @@ features が paywall の後ろに移されることはありません。
S-Agent Core は open-source semantic analysis engine です。
-IntentGuard Pro と Enterprise は、将来的に core の上に team と
+AxiomGuard Pro と Enterprise は、将来的に core の上に team と
organization workflows を追加する可能性があります。例えば:
- hosted dashboard;
@@ -264,7 +264,7 @@ organization workflows を追加する可能性があります。例えば:
- v0.2: basic GitHub Action mode。
- v0.3: community rule packs と more framework examples。
- v0.4: plugin API draft と extension-point design。
-- Future: team workflows と governance のための IntentGuard Pro alpha。
+- Future: team workflows と governance のための AxiomGuard Pro alpha。
[Community roadmap](../community/community-roadmap.md) を参照してください。
diff --git a/docs/i18n/README.pt-BR.md b/docs/i18n/README.pt-BR.md
index d2826c2..9d9b9df 100644
--- a/docs/i18n/README.pt-BR.md
+++ b/docs/i18n/README.pt-BR.md
@@ -7,7 +7,7 @@ S-Agent é um mecanismo open source de análise semântica para code review
orientado por intenção. Ele verifica se mudanças em código TypeScript preservam
a intenção de negócio e arquitetura aprovada.
-IntentGuard é a futura plataforma comercial construída sobre o S-Agent Core
+AxiomGuard é a futura plataforma comercial construída sobre o S-Agent Core
para fluxos de trabalho de equipes e governança empresarial.
## Problema
@@ -200,7 +200,7 @@ não serão colocadas atrás de um paywall.
S-Agent Core é o mecanismo open source de análise semântica.
-IntentGuard Pro e Enterprise podem adicionar futuramente fluxos de trabalho de
+AxiomGuard Pro e Enterprise podem adicionar futuramente fluxos de trabalho de
equipes e organizações sobre o core, como:
- hosted dashboard;
@@ -263,7 +263,7 @@ Leia o [modelo open-core completo](../../OPEN_CORE.md).
- v0.2: modo básico de GitHub Action.
- v0.3: rule packs comunitários e mais exemplos de frameworks.
- v0.4: rascunho de plugin API e design de pontos de extensão.
-- Futuro: alpha do IntentGuard Pro para team workflows e governance.
+- Futuro: alpha do AxiomGuard Pro para team workflows e governance.
Veja o [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.ru.md b/docs/i18n/README.ru.md
index 0701ffe..c410516 100644
--- a/docs/i18n/README.ru.md
+++ b/docs/i18n/README.ru.md
@@ -7,7 +7,7 @@ S-Agent — это open-source движок семантического ана
учетом намерений. Он проверяет, сохраняют ли изменения в TypeScript-коде
утвержденные бизнес- и архитектурные намерения.
-IntentGuard — будущая коммерческая платформа поверх S-Agent Core для командных
+AxiomGuard — будущая коммерческая платформа поверх S-Agent Core для командных
workflow и корпоративного управления.
## Проблема
@@ -200,7 +200,7 @@ features не будут перенесены за paywall.
S-Agent Core — open-source semantic analysis engine.
-IntentGuard Pro и Enterprise могут позже добавить командные и организационные
+AxiomGuard Pro и Enterprise могут позже добавить командные и организационные
workflow поверх core:
- hosted dashboard;
@@ -263,7 +263,7 @@ workflow поверх core:
- v0.2: basic GitHub Action mode.
- v0.3: community rule packs и больше framework examples.
- v0.4: plugin API draft и design extension points.
-- Future: IntentGuard Pro alpha для team workflows и governance.
+- Future: AxiomGuard Pro alpha для team workflows и governance.
Смотрите [community roadmap](../community/community-roadmap.md).
diff --git a/docs/i18n/README.zh-CN.md b/docs/i18n/README.zh-CN.md
index 4641ba4..c4b5ec4 100644
--- a/docs/i18n/README.zh-CN.md
+++ b/docs/i18n/README.zh-CN.md
@@ -6,7 +6,7 @@
S-Agent 是一个开源语义分析引擎,用于面向意图的代码审查。它检查
TypeScript 代码变更是否保留了已批准的业务和架构意图。
-IntentGuard 是未来构建在 S-Agent Core 之上的商业平台,用于团队工作流
+AxiomGuard 是未来构建在 S-Agent Core 之上的商业平台,用于团队工作流
和企业治理。
## 问题
@@ -188,7 +188,7 @@ Open-source core 必须保持自身有用。现有 MVP features 不会被移到
S-Agent Core 是 open-source semantic analysis engine。
-IntentGuard Pro 和 Enterprise 未来可能在 core 之上加入团队和组织工作流,
+AxiomGuard Pro 和 Enterprise 未来可能在 core 之上加入团队和组织工作流,
例如:
- hosted dashboard;
@@ -250,7 +250,7 @@ IntentGuard Pro 和 Enterprise 未来可能在 core 之上加入团队和组织
- v0.2:basic GitHub Action mode。
- v0.3:community rule packs 和更多 framework examples。
- v0.4:plugin API draft 和 extension-point design。
-- Future:用于 team workflows 和 governance 的 IntentGuard Pro alpha。
+- Future:用于 team workflows 和 governance 的 AxiomGuard Pro alpha。
查看 [community roadmap](../community/community-roadmap.md)。
diff --git a/docs/market/competitor-map.md b/docs/market/competitor-map.md
index c7aa3f8..687356e 100644
--- a/docs/market/competitor-map.md
+++ b/docs/market/competitor-map.md
@@ -4,7 +4,7 @@ Last researched: May 8, 2026
## Category Thesis
-IntentGuard should define and lead a focused category: **Intent-Aware Code Review**.
+AxiomGuard should define and lead a focused category: **Intent-Aware Code Review**.
The product does not replace SAST, AI reviewers, linters, or architecture visualization tools. It fills the gap between written intent and code change behavior:
@@ -20,18 +20,18 @@ The strongest AI-era framing:
```text
AI writes code.
-IntentGuard checks whether the code preserved business intent.
+AxiomGuard checks whether the code preserved business intent.
```
## Competitive Landscape
-| Category | Representative tools | What buyers use them for | Where they are strong | Gap IntentGuard can own |
+| Category | Representative tools | What buyers use them for | Where they are strong | Gap AxiomGuard can own |
| --- | --- | --- | --- | --- |
| SAST and AppSec | GitHub CodeQL, Snyk Code, Semgrep, Checkmarx, Veracode | Find vulnerabilities, taint flows, insecure APIs, known weakness classes | Security coverage, compliance, CI and IDE integration, mature reporting | They usually answer "is this code secure?", not "does this change violate our product or architecture intent?" |
-| AI code review | CodeRabbit, Greptile, Qodo, Bito, DeepSource AI review | Summarize PRs, flag bugs, enforce style or team guidance, accelerate review | Broad contextual feedback, PR-native experience, increasingly strong repo understanding | Findings can be hard to prove. IntentGuard should be deterministic-first and only block on approved rules with evidence. |
+| AI code review | CodeRabbit, Greptile, Qodo, Bito, DeepSource AI review | Summarize PRs, flag bugs, enforce style or team guidance, accelerate review | Broad contextual feedback, PR-native experience, increasingly strong repo understanding | Findings can be hard to prove. AxiomGuard should be deterministic-first and only block on approved rules with evidence. |
| Code quality tools | SonarQube, Codacy, DeepSource, ESLint | Maintainability, reliability, code smells, style, coverage, duplication | Developer familiarity, quality gates, broad rule libraries | They enforce generic or technical quality standards more than company-specific business invariants. |
| Architecture governance | ArchUnit, dependency-cruiser, CodeScene, Structure101 | Enforce layer boundaries, visualize dependency drift, prioritize technical debt | Architecture constraints, dependency maps, design drift awareness | Often language-specific, test-suite-specific, or focused on structure rather than business intent and PR reporting. |
-| AI coding safety layer | Emerging internal platform tools, coding-agent guardrails, pre-merge agent checks | Keep AI-generated and refactored code inside approved constraints | Timely buyer pain, direct connection to AI adoption, clear risk story | This is the best wedge for IntentGuard: AI-assisted code can compile and still violate business meaning. |
+| AI coding safety layer | Emerging internal platform tools, coding-agent guardrails, pre-merge agent checks | Keep AI-generated and refactored code inside approved constraints | Timely buyer pain, direct connection to AI adoption, clear risk story | This is the best wedge for AxiomGuard: AI-assisted code can compile and still violate business meaning. |
## Pricing Anchors
@@ -39,7 +39,7 @@ Pricing changes often, but current public anchors show that buyers already pay p
| Tool | Current public pricing anchor | Relevance |
| --- | --- | --- |
-| GitHub Code Security | $30 per active committer/month | Security checks before production. IntentGuard can sit beside this as business-intent protection. |
+| GitHub Code Security | $30 per active committer/month | Security checks before production. AxiomGuard can sit beside this as business-intent protection. |
| Semgrep Teams | Starting at $30 per contributor/month for Code or Supply Chain modules | AppSec platform pricing validates contributor-based spend for code controls. |
| SonarQube Cloud Team | Starts at EUR 30 monthly for up to 100k private LOC | LOC-based quality pricing validates codebase-scale budgets. |
| CodeRabbit Pro / Pro+ | $24 / $48 per developer/month billed annually | AI code review buyers already understand per-user pricing. |
@@ -50,18 +50,18 @@ Pricing changes often, but current public anchors show that buyers already pay p
SAST vendors own the security shelf. GitHub code scanning and CodeQL focus on vulnerabilities and coding errors surfaced as code scanning alerts. Snyk Code describes itself as developer-first SAST. Semgrep Code is a SAST tool using rules and data-flow analysis, including custom rules. Checkmarx SAST examines code structure and flows, with preconfigured and custom queries. Veracode emphasizes enterprise SAST, language coverage, low false positives, and remediation workflow.
-IntentGuard should not fight this category head-on. The best framing is "beside SAST":
+AxiomGuard should not fight this category head-on. The best framing is "beside SAST":
- SAST protects against exploit risk.
-- IntentGuard protects against business and architecture drift.
+- AxiomGuard protects against business and architecture drift.
- SAST rules come from security taxonomies.
-- IntentGuard rules come from approved internal docs, ADRs, architecture decisions, and domain constraints.
+- AxiomGuard rules come from approved internal docs, ADRs, architecture decisions, and domain constraints.
### AI Code Review Tools
CodeRabbit, Greptile, Qodo, Bito, and DeepSource are converging on context-aware pull request review. They emphasize repo context, summaries, bug detection, standards enforcement, AI fixes, and workflow automation. Greptile highlights custom rules and learning from review comments. Qodo positions around enterprise quality guardrails and rule enforcement. CodeRabbit offers PR reviews, planning, IDE/CLI workflows, and pre-merge checks.
-IntentGuard should not claim to be a better general AI reviewer. The wedge is narrower:
+AxiomGuard should not claim to be a better general AI reviewer. The wedge is narrower:
- approved rules, not inferred preferences;
- proof-carrying findings, not broad suggestions;
@@ -72,13 +72,13 @@ IntentGuard should not claim to be a better general AI reviewer. The wedge is na
SonarQube positions around clean, secure, maintainable code with quality gates. ESLint owns configurable JavaScript/TypeScript linting. Codacy and DeepSource combine static analysis, code quality, security, and AI review in PR workflows.
-IntentGuard should avoid "linter" language. A linter checks code shape. IntentGuard checks whether a change violates documented intent.
+AxiomGuard should avoid "linter" language. A linter checks code shape. AxiomGuard checks whether a change violates documented intent.
### Architecture Governance Tools
ArchUnit tests Java architecture within normal unit tests. dependency-cruiser validates and visualizes JavaScript and TypeScript dependencies with rules. CodeScene prioritizes code health and hotspots using development activity and quality signals.
-IntentGuard can learn from this shelf but should keep its own category:
+AxiomGuard can learn from this shelf but should keep its own category:
- architecture rules are one rule type, not the entire product;
- business invariants and side-effect constraints matter as much as package boundaries;
@@ -86,7 +86,7 @@ IntentGuard can learn from this shelf but should keep its own category:
## Positioning Matrix
-| Axis | Low end | High end | IntentGuard target |
+| Axis | Low end | High end | AxiomGuard target |
| --- | --- | --- | --- |
| Source of truth | Inferred preferences | Approved documented rules | Approved SemanticRules generated from docs and reviewed by humans |
| Finding type | Generic quality issue | Business or architecture intent violation | Intent violation with code evidence |
@@ -96,7 +96,7 @@ IntentGuard can learn from this shelf but should keep its own category:
## Strategic Opening
-The market is crowded around "find bugs faster" and "review code with AI." IntentGuard should choose a sharper pain:
+The market is crowded around "find bugs faster" and "review code with AI." AxiomGuard should choose a sharper pain:
> Teams are writing more code, but their product rules, architecture decisions, and domain constraints still live in docs that do not protect the codebase.
diff --git a/docs/market/customer-interview-script.md b/docs/market/customer-interview-script.md
index 14d2a77..d5a703f 100644
--- a/docs/market/customer-interview-script.md
+++ b/docs/market/customer-interview-script.md
@@ -20,7 +20,7 @@ Length: 30-45 minutes.
Positioning to test:
-> We are exploring IntentGuard, an intent-aware code review tool that turns approved engineering docs and architecture rules into deterministic PR checks.
+> We are exploring AxiomGuard, an intent-aware code review tool that turns approved engineering docs and architecture rules into deterministic PR checks.
Do not pitch heavily at the start. Spend the first two-thirds on current behavior and pain.
@@ -58,7 +58,7 @@ Thanks for taking the time. I am researching how teams protect architecture and
Show the short concept:
-> IntentGuard turns approved docs and architecture decisions into SemanticRules. It checks TypeScript PRs for layer boundary violations, forbidden side effects, and value invariant violations. Findings are classified as PROVEN, PROBABLE, or SUSPECT. Only approved critical PROVEN findings can block.
+> AxiomGuard turns approved docs and architecture decisions into SemanticRules. It checks TypeScript PRs for layer boundary violations, forbidden side effects, and value invariant violations. Findings are classified as PROVEN, PROBABLE, or SUSPECT. Only approved critical PROVEN findings can block.
Ask:
diff --git a/docs/market/icp.md b/docs/market/icp.md
index c594147..4230719 100644
--- a/docs/market/icp.md
+++ b/docs/market/icp.md
@@ -19,7 +19,7 @@
- Senior engineers cannot manually re-check every product invariant.
- The team wants AI speed without losing architecture discipline.
-**Value promise:** IntentGuard verifies that AI-generated and refactored code still preserves approved business and architecture intent.
+**Value promise:** AxiomGuard verifies that AI-generated and refactored code still preserves approved business and architecture intent.
## Secondary ICP: Fintech and Billing-Heavy SaaS
@@ -40,7 +40,7 @@
- SAST catches vulnerabilities but not pricing or entitlement intent.
- Reviewers need evidence for why a finding should block.
-**Value promise:** IntentGuard prevents business-rule regressions in modules where mistakes have visible ROI.
+**Value promise:** AxiomGuard prevents business-rule regressions in modules where mistakes have visible ROI.
## Tertiary ICP: Legacy Modernization Teams
@@ -60,7 +60,7 @@
- Refactors risk breaking implicit invariants.
- Migration teams need guardrails as rules become explicit.
-**Value promise:** IntentGuard turns rediscovered rules into enforceable checks during modernization.
+**Value promise:** AxiomGuard turns rediscovered rules into enforceable checks during modernization.
## Additional ICP: Scaling Product Engineering Teams
@@ -73,7 +73,7 @@
- AI-generated or junior-authored changes look plausible but violate boundaries.
- Existing linters and SAST tools do not understand product intent.
-**Value promise:** IntentGuard turns approved engineering and product intent into enforceable PR checks with proof.
+**Value promise:** AxiomGuard turns approved engineering and product intent into enforceable PR checks with proof.
## Non-ICP
diff --git a/docs/market/landing-page-copy.md b/docs/market/landing-page-copy.md
index 99aeabd..de6d3bb 100644
--- a/docs/market/landing-page-copy.md
+++ b/docs/market/landing-page-copy.md
@@ -6,9 +6,9 @@
**Headline:** Protect business intent in every code change.
-**Subheadline:** IntentGuard turns approved engineering docs, ADRs, and project rules into deterministic pull request checks. Prevent AI-generated and refactored code from breaking business intent before it merges.
+**Subheadline:** AxiomGuard turns approved engineering docs, ADRs, and project rules into deterministic pull request checks. Prevent AI-generated and refactored code from breaking business intent before it merges.
-**Primary CTA:** Run IntentGuard on a Demo PR
+**Primary CTA:** Run AxiomGuard on a Demo PR
**Secondary CTA:** See Example Rules
@@ -26,7 +26,7 @@ SAST finds vulnerabilities. Linters find style issues. AI reviewers find plausib
**Headline:** Turn intent into review guardrails.
-IntentGuard reads approved SemanticRules and checks TypeScript changes for violations of business and architecture intent.
+AxiomGuard reads approved SemanticRules and checks TypeScript changes for violations of business and architecture intent.
- Prevent layer boundary drift.
- Flag forbidden side effects in read-only flows.
@@ -46,7 +46,7 @@ A human approves the rules that should govern review. The YAML rule file becomes
### 3. Check every PR
-IntentGuard indexes TypeScript code, analyzes imports and functions, verifies findings, and produces a proof-carrying report.
+AxiomGuard indexes TypeScript code, analyzes imports and functions, verifies findings, and produces a proof-carrying report.
### 4. Block only proven critical violations
@@ -66,9 +66,9 @@ Heuristics can inform reviewers. Only approved critical rules with deterministic
**Headline:** Not another linter. Not another vague AI reviewer.
-IntentGuard is deterministic-first. AI can help suggest candidate rules, but it cannot create blocking findings. Blocking requires approved rules, symbolic evidence, and a trace back to source documentation.
+AxiomGuard is deterministic-first. AI can help suggest candidate rules, but it cannot create blocking findings. Blocking requires approved rules, symbolic evidence, and a trace back to source documentation.
-| Alternative | What it checks | What IntentGuard adds |
+| Alternative | What it checks | What AxiomGuard adds |
| --- | --- | --- |
| SAST | Security vulnerabilities | Product and architecture intent |
| Linters | Style and syntax patterns | Business-specific invariants |
@@ -89,7 +89,7 @@ Encode it. Approve it. Run it on a real PR.
**Is this a replacement for SAST?**
-No. IntentGuard complements SAST by checking business and architecture intent rather than security vulnerability classes.
+No. AxiomGuard complements SAST by checking business and architecture intent rather than security vulnerability classes.
**Does it use an LLM?**
diff --git a/docs/market/messaging.md b/docs/market/messaging.md
index 32a2734..1769157 100644
--- a/docs/market/messaging.md
+++ b/docs/market/messaging.md
@@ -2,7 +2,7 @@
## Message House
-**Core claim:** IntentGuard protects business intent in every code change.
+**Core claim:** AxiomGuard protects business intent in every code change.
**Audience:** Engineering leaders, platform teams, staff engineers, and teams adopting AI-assisted development.
@@ -14,11 +14,11 @@
### 1. Preserve the rules that make your system yours
-Generic tools catch generic issues. IntentGuard checks the rules that are specific to your product, domains, architecture, and business logic.
+Generic tools catch generic issues. AxiomGuard checks the rules that are specific to your product, domains, architecture, and business logic.
### 2. Block only what is approved and proven
-IntentGuard separates suggestions from enforceable findings. Only approved critical rules with deterministic evidence can block a PR.
+AxiomGuard separates suggestions from enforceable findings. Only approved critical rules with deterministic evidence can block a PR.
### 3. Turn docs into guardrails
@@ -26,11 +26,11 @@ Rules start from `CLAUDE.md`, READMEs, ADRs, and architecture docs, then become
### 4. Help reviewers focus on judgment
-Stop spending senior review time restating the same boundaries. Let IntentGuard handle repeatable intent checks and leave humans for design tradeoffs.
+Stop spending senior review time restating the same boundaries. Let AxiomGuard handle repeatable intent checks and leave humans for design tradeoffs.
### 5. Make AI coding safer without slowing it down
-AI can produce code that compiles, passes tests, and still violates product intent. IntentGuard gives AI-generated and refactored code a deterministic check against rules your team approved.
+AI can produce code that compiles, passes tests, and still violates product intent. AxiomGuard gives AI-generated and refactored code a deterministic check against rules your team approved.
## Product Language
@@ -72,15 +72,15 @@ Avoid:
### "Is this just a linter?"
-No. Linters usually enforce syntax, style, or generic correctness. IntentGuard enforces project-specific business and architecture intent approved by your team.
+No. Linters usually enforce syntax, style, or generic correctness. AxiomGuard enforces project-specific business and architecture intent approved by your team.
### "Our SAST already scans PRs."
-Keep it. SAST protects against security vulnerabilities. IntentGuard protects against documented domain and architecture violations, such as a read-only flow writing to the database or an auth module importing billing.
+Keep it. SAST protects against security vulnerabilities. AxiomGuard protects against documented domain and architecture violations, such as a read-only flow writing to the database or an auth module importing billing.
### "AI code review tools already do this."
-Some AI reviewers can suggest issues from context. IntentGuard is designed for enforceable decisions: approved rules, deterministic checks, evidence chains, and strict blocking rules.
+Some AI reviewers can suggest issues from context. AxiomGuard is designed for enforceable decisions: approved rules, deterministic checks, evidence chains, and strict blocking rules.
### "Will this slow developers down?"
@@ -96,11 +96,11 @@ Blocking requires deterministic evidence and an approved critical rule. Heuristi
### "We do not have perfect docs."
-That is normal. Start with the few rules senior engineers already repeat in reviews. IntentGuard can make those rules visible, testable, and easier to improve.
+That is normal. Start with the few rules senior engineers already repeat in reviews. AxiomGuard can make those rules visible, testable, and easier to improve.
### "Can developers bypass it?"
-The policy should match the team's CI and repository settings. IntentGuard can provide the evidence and exit code; branch protection decides whether blocking findings prevent merge.
+The policy should match the team's CI and repository settings. AxiomGuard can provide the evidence and exit code; branch protection decides whether blocking findings prevent merge.
## Proof Points To Build Toward
diff --git a/docs/market/positioning.md b/docs/market/positioning.md
index b54f6e8..89d91f2 100644
--- a/docs/market/positioning.md
+++ b/docs/market/positioning.md
@@ -18,13 +18,13 @@ Secondary category language to test:
## Core Positioning
-**IntentGuard protects business intent in every code change.**
+**AxiomGuard protects business intent in every code change.**
-For engineering teams shipping quickly, IntentGuard turns documented rules from `CLAUDE.md`, READMEs, ADRs, and architecture docs into deterministic pull request checks. It flags only approved rule violations as blocking, and every finding carries evidence back to the source intent.
+For engineering teams shipping quickly, AxiomGuard turns documented rules from `CLAUDE.md`, READMEs, ADRs, and architecture docs into deterministic pull request checks. It flags only approved rule violations as blocking, and every finding carries evidence back to the source intent.
Internal architecture formulation:
-> S-Agent is the internal semantic analysis architecture. IntentGuard is the product built on top of S-Agent. IntentGuard helps engineering teams verify that AI-generated and refactored code still preserves approved business and architectural intent.
+> S-Agent is the internal semantic analysis architecture. AxiomGuard is the product built on top of S-Agent. AxiomGuard helps engineering teams verify that AI-generated and refactored code still preserves approved business and architectural intent.
Product formulation:
@@ -32,7 +32,7 @@ Product formulation:
## Positioning Option 1: The Intent Guardrail
-**Statement:** IntentGuard is the PR guardrail for business and architecture intent.
+**Statement:** AxiomGuard is the PR guardrail for business and architecture intent.
**Best for:** Platform teams and staff engineers.
@@ -42,7 +42,7 @@ Product formulation:
## Positioning Option 2: Policy-as-Code for Product Engineering
-**Statement:** IntentGuard turns engineering decisions into policy-as-code for pull requests.
+**Statement:** AxiomGuard turns engineering decisions into policy-as-code for pull requests.
**Best for:** Enterprise and regulated buyers.
@@ -52,7 +52,7 @@ Product formulation:
## Positioning Option 3: Architecture Drift Prevention
-**Statement:** IntentGuard catches architecture drift before it merges.
+**Statement:** AxiomGuard catches architecture drift before it merges.
**Best for:** Architecture guilds and platform teams.
@@ -62,7 +62,7 @@ Product formulation:
## Positioning Option 4: Deterministic Review for AI-Written Code
-**Statement:** IntentGuard gives AI-generated code a deterministic review layer.
+**Statement:** AxiomGuard gives AI-generated code a deterministic review layer.
**Best for:** Teams adopting coding agents.
@@ -74,7 +74,7 @@ Product formulation:
Lead with Option 1 and support with Options 2 and 4:
-> IntentGuard is the intent-aware code review guardrail for engineering teams that need code changes to preserve approved business and architecture rules.
+> AxiomGuard is the intent-aware code review guardrail for engineering teams that need code changes to preserve approved business and architecture rules.
Supporting proof points:
@@ -86,7 +86,7 @@ Supporting proof points:
## Category Boundaries
-IntentGuard is not:
+AxiomGuard is not:
- a SAST replacement;
- a general AI reviewer;
@@ -94,7 +94,7 @@ IntentGuard is not:
- a dashboard-first governance platform;
- a prompt-based policy engine.
-IntentGuard is:
+AxiomGuard is:
- a deterministic review layer;
- a rule lifecycle for approved intent;
@@ -111,11 +111,11 @@ IntentGuard is:
## One-Liner
-IntentGuard is an intent-aware code review tool that turns approved engineering docs into deterministic PR checks.
+AxiomGuard is an intent-aware code review tool that turns approved engineering docs into deterministic PR checks.
## Elevator Pitch
-Modern teams write code faster than they can review it, especially with AI-assisted development. But the rules that matter most - domain boundaries, side-effect constraints, product invariants, compliance assumptions - still live in docs and senior engineers' heads. IntentGuard turns approved intent into deterministic review checks, so every blocking finding is backed by code evidence and source documentation.
+Modern teams write code faster than they can review it, especially with AI-assisted development. But the rules that matter most - domain boundaries, side-effect constraints, product invariants, compliance assumptions - still live in docs and senior engineers' heads. AxiomGuard turns approved intent into deterministic review checks, so every blocking finding is backed by code evidence and source documentation.
## Architecture-To-Product Language
@@ -125,8 +125,8 @@ Technical:
Customer-facing:
-> IntentGuard turns your architecture docs, `CLAUDE.md`, and product rules into enforceable semantic review checks for pull requests.
+> AxiomGuard turns your architecture docs, `CLAUDE.md`, and product rules into enforceable semantic review checks for pull requests.
Russian-language positioning for local discovery:
-> IntentGuard помогает инженерным командам проверять, что AI-сгенерированный и отрефакторенный код сохраняет утвержденный бизнес- и архитектурный смысл.
+> AxiomGuard помогает инженерным командам проверять, что AI-сгенерированный и отрефакторенный код сохраняет утвержденный бизнес- и архитектурный смысл.
diff --git a/docs/market/pricing.md b/docs/market/pricing.md
index 3fc2ea2..03a69c6 100644
--- a/docs/market/pricing.md
+++ b/docs/market/pricing.md
@@ -12,7 +12,7 @@ Comparable tools in adjacent categories often price per contributor or seat:
- DeepSource Team lists $30 per contributor per month, with additional AI and SCA usage models.
- SonarQube Cloud uses LOC-based pricing; the Team plan currently starts at EUR 30 monthly for up to 100k private LOC.
-IntentGuard should not race to the bottom as a linter. Its value is closer to preventing costly architecture and business-rule regressions, especially for teams where senior review time is scarce.
+AxiomGuard should not race to the bottom as a linter. Its value is closer to preventing costly architecture and business-rule regressions, especially for teams where senior review time is scarce.
## Recommended Model
diff --git a/docs/market/rebrand-directions.md b/docs/market/rebrand-directions.md
index 95ebb6e..6eb425c 100644
--- a/docs/market/rebrand-directions.md
+++ b/docs/market/rebrand-directions.md
@@ -4,29 +4,34 @@
`S-Agent` should remain the internal architecture and repository codename. It sounds technical, implementation-oriented, and agent-centric. The customer-facing product should be framed around intent protection, not agent mechanics.
-## Recommended Brand: IntentGuard
+## Selected Brand: AxiomGuard
-**Core line:** IntentGuard protects business intent in every code change.
+**Core line:** AxiomGuard protects business intent in every code change.
### Why It Works
-- Clear outcome: guarding intent.
-- Memorable enough for a category entry point.
+- "Axiom" signals foundational rules that must stay true as code changes.
+- "Guard" makes the review-time protection job clear.
+- Strong fit for engineering, platform, governance, and critical-systems buyers.
- Avoids overclaiming AI autonomy.
-- Works for engineering, platform, and governance buyers.
- Supports the category "Intent-Aware Code Review."
### Risks
- "Guard" language can sound security-heavy.
- The name may overlap conceptually with AI guardrails.
-- Needs visual and copy treatment that feels practical, not compliance-heavy.
+- "Axiom" may feel abstract to some developer audiences.
+- Needs practical copy that ties axioms back to docs, rules, and PR evidence.
### Mitigation
Pair the name with code review language:
-> IntentGuard: Intent-Aware Code Review for engineering teams.
+> AxiomGuard: Intent-Aware Code Review for engineering teams.
+
+Use the product sentence:
+
+> AxiomGuard guards the approved business and architecture rules behind every pull request.
## Alternative Directions
@@ -46,27 +51,17 @@ Pair the name with code review language:
**Pros:** Direct, SEO-friendly, easy to explain.
-**Cons:** Less premium and less enterprise-ready than IntentGuard.
+**Cons:** Less premium and less enterprise-ready than AxiomGuard.
**Tagline:** Know whether your code still means what it should.
-### AxiomGuard
-
-**Meaning:** Protect the foundational rules of a software system.
-
-**Pros:** Deep-tech, enterprise, and formal-systems feel.
-
-**Cons:** Less obvious for developers; may over-signal complexity.
-
-**Tagline:** Guard the axioms behind your software.
-
### RuleTrace
**Meaning:** Trace every finding back to an approved rule.
**Pros:** Strong evidence and audit connotation.
-**Cons:** Sounds narrower and less strategic than IntentGuard.
+**Cons:** Sounds narrower and less strategic than AxiomGuard.
### IntentCheck
@@ -104,7 +99,7 @@ Pair the name with code review language:
Use:
-- Product brand: **IntentGuard**
+- Product brand: **AxiomGuard**
- Internal architecture name: **S-Agent**
- Category: **Intent-Aware Code Review**
- Category aliases to test: **Semantic Code Review**, **Intent-Aware PR Guard**
@@ -139,15 +134,15 @@ Avoid:
| Layer | Name |
| --- | --- |
-| Public product | IntentGuard |
+| Public product | AxiomGuard |
| Category | Intent-Aware Code Review |
| Internal project | S-Agent |
| Rule object | SemanticRule |
| Report object | Proof-carrying finding |
-| CLI | `intentguard` eventually, `s-agent` during MVP |
+| CLI | `axiomguard` eventually, `s-agent` during MVP |
## Product/Architecture Sentence
Use this when explaining the relationship:
-> IntentGuard is powered by S-Agent, a semantic analysis engine that checks whether code changes preserve approved business and architectural intent.
+> AxiomGuard is powered by S-Agent, a semantic analysis engine that checks whether code changes preserve approved business and architectural intent.
diff --git a/package.json b/package.json
index 0373ba2..e730fe4 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,14 @@
"description": "Deterministic-first semantic code review guard for TypeScript projects.",
"type": "commonjs",
"scripts": {
- "build": "tsc -b",
+ "build": "tsc -b && pnpm --filter @s-agent/site run build",
"clean": "tsc -b --clean",
"lint": "tsc -b --pretty false",
"test": "vitest run",
"test:watch": "vitest",
+ "site:dev": "pnpm --filter @s-agent/site run dev",
+ "site:build": "pnpm --filter @s-agent/site run build",
+ "site:preview": "pnpm --filter @s-agent/site run preview",
"analyze:demo": "pnpm --filter @s-agent/cli run analyze --project ../../examples/demo-typescript-app-clean",
"analyze:demo:broken": "pnpm --filter @s-agent/cli run analyze --project ../../examples/demo-typescript-app",
"analyze:self": "pnpm --filter @s-agent/cli run analyze --project ../.. --rules ../../rules --json",
diff --git a/packages/analyzer/src/checks/check-utils.ts b/packages/analyzer/src/checks/check-utils.ts
index fcc8175..174d433 100644
--- a/packages/analyzer/src/checks/check-utils.ts
+++ b/packages/analyzer/src/checks/check-utils.ts
@@ -23,8 +23,14 @@ export function importMatchesPattern(importReference: ImportReference, pattern:
);
}
+ if (matchesPath(normalizedSource, normalizedPattern)) {
+ return true;
+ }
+
const basenamePattern = normalizeProjectPath(path.basename(normalizedPattern));
- return Boolean(basenamePattern && normalizedSource.includes(basenamePattern.replace(/\*/g, "")));
+ const literalPattern = basenamePattern.replace(/\*/g, "");
+
+ return Boolean(literalPattern && normalizedSource.includes(literalPattern));
}
export function functionAtLine(file: IndexedFile, line: number): FunctionInfo | undefined {
diff --git a/packages/parser/src/file-index.ts b/packages/parser/src/file-index.ts
index 2bfce28..0544eae 100644
--- a/packages/parser/src/file-index.ts
+++ b/packages/parser/src/file-index.ts
@@ -3,6 +3,7 @@ import path from "node:path";
import { relativeToRoot } from "@s-agent/shared";
const ignoredDirectories = new Set([".git", "dist", "node_modules", "coverage"]);
+const sourceFileExtensions = /\.(astro|ts|tsx)$/;
export interface SourceFileEntry {
absolutePath: string;
@@ -10,6 +11,10 @@ export interface SourceFileEntry {
text: string;
}
+function isIndexableSourceFile(fileName: string): boolean {
+ return sourceFileExtensions.test(fileName) && !fileName.endsWith(".d.ts");
+}
+
export async function listTypeScriptFiles(projectRoot: string): Promise {
async function visit(directory: string): Promise {
const entries = await fs.readdir(directory, { withFileTypes: true });
@@ -25,11 +30,7 @@ export async function listTypeScriptFiles(projectRoot: string): Promise fs.existsSync(filePath));
diff --git a/packages/parser/src/index.ts b/packages/parser/src/index.ts
index e899171..f3e7b19 100644
--- a/packages/parser/src/index.ts
+++ b/packages/parser/src/index.ts
@@ -18,16 +18,47 @@ export interface ProjectIndex {
files: IndexedFile[];
}
+function astroFrontmatterScript(text: string): string {
+ const lines = text.split(/\r?\n/);
+
+ if (lines[0]?.trim() !== "---") {
+ return "";
+ }
+
+ const closingFenceIndex = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
+
+ if (closingFenceIndex === -1) {
+ return "";
+ }
+
+ return lines
+ .map((line, index) => (index > 0 && index < closingFenceIndex ? line : ""))
+ .join("\n");
+}
+
+function scriptTextFor(entry: { absolutePath: string; text: string }): string {
+ if (entry.absolutePath.endsWith(".astro")) {
+ return astroFrontmatterScript(entry.text);
+ }
+
+ return entry.text;
+}
+
+function scriptKindFor(absolutePath: string): ts.ScriptKind {
+ return absolutePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
+}
+
export async function indexProject(projectRoot: string): Promise {
const root = path.resolve(projectRoot);
const sourceFiles = await readSourceFiles(root);
const files = sourceFiles.map((entry) => {
+ const scriptText = scriptTextFor(entry);
const sourceFile = ts.createSourceFile(
entry.absolutePath,
- entry.text,
+ scriptText,
ts.ScriptTarget.Latest,
true,
- entry.absolutePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS
+ scriptKindFor(entry.absolutePath)
);
const symbols = extractSymbols(sourceFile);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8f85924..a4b43fd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -37,6 +37,12 @@ importers:
specifier: workspace:*
version: link:../../packages/rules
+ apps/site:
+ devDependencies:
+ astro:
+ specifier: ^5.13.0
+ version: 5.18.1(@types/node@22.19.18)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4)
+
packages/analyzer:
dependencies:
'@s-agent/parser':
@@ -104,194 +110,696 @@ importers:
packages:
+ '@astrojs/compiler@2.13.1':
+ resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==}
+
+ '@astrojs/internal-helpers@0.7.6':
+ resolution: {integrity: sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==}
+
+ '@astrojs/markdown-remark@6.3.11':
+ resolution: {integrity: sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==}
+
+ '@astrojs/prism@3.3.0':
+ resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@astrojs/telemetry@3.3.0':
+ resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.3':
+ resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@capsizecss/unpack@4.0.0':
+ resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==}
+ engines: {node: '>=18'}
+
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.27.7':
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.21.5':
resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.27.7':
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.21.5':
resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.7':
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.21.5':
resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.7':
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.21.5':
resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.27.7':
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.21.5':
resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.7':
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.21.5':
resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.27.7':
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.21.5':
resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.7':
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.21.5':
resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.27.7':
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.21.5':
resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.7':
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.21.5':
resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.7':
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.21.5':
resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.7':
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.21.5':
resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.7':
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.21.5':
resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.7':
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.21.5':
resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.7':
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.21.5':
resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.7':
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.21.5':
resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.21.5':
resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.21.5':
resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
'@esbuild/sunos-x64@0.21.5':
resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.21.5':
resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.21.5':
resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.21.5':
resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
- '@jridgewell/sourcemap-codec@1.5.5':
- resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
- '@rollup/rollup-android-arm-eabi@4.60.3':
- resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==}
- cpu: [arm]
- os: [android]
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
- '@rollup/rollup-android-arm64@4.60.3':
- resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==}
- cpu: [arm64]
- os: [android]
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
- '@rollup/rollup-darwin-arm64@4.60.3':
- resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==}
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.60.3':
- resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==}
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.60.3':
- resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==}
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
cpu: [arm64]
- os: [freebsd]
+ os: [darwin]
- '@rollup/rollup-freebsd-x64@4.60.3':
- resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==}
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
cpu: [x64]
- os: [freebsd]
+ os: [darwin]
- '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
- resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==}
- cpu: [arm]
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.60.3':
- resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==}
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.60.3':
- resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==}
- cpu: [arm64]
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.60.3':
- resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==}
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.60.3':
+ resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.60.3':
+ resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.60.3':
+ resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.60.3':
+ resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.60.3':
+ resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.60.3':
+ resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
+ resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.60.3':
+ resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.60.3':
+ resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.60.3':
+ resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==}
cpu: [arm64]
os: [linux]
@@ -370,15 +878,57 @@ packages:
cpu: [x64]
os: [win32]
+ '@shikijs/core@3.23.0':
+ resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==}
+
+ '@shikijs/engine-javascript@3.23.0':
+ resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==}
+
+ '@shikijs/engine-oniguruma@3.23.0':
+ resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==}
+
+ '@shikijs/langs@3.23.0':
+ resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==}
+
+ '@shikijs/themes@3.23.0':
+ resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==}
+
+ '@shikijs/types@3.23.0':
+ resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
+ '@types/debug@4.1.13':
+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
+
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+
'@types/node@22.19.18':
resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@ungap/structured-clone@1.3.1':
+ resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==}
+
'@vitest/expect@2.1.9':
resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==}
@@ -408,22 +958,158 @@ packages:
'@vitest/utils@2.1.9':
resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==}
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-iterate@2.0.1:
+ resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
+
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
+ astro@5.18.1:
+ resolution: {integrity: sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ base-64@1.0.0:
+ resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ boxen@8.0.1:
+ resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+ engines: {node: '>=18'}
+
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
+ camelcase@8.0.0:
+ resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+ engines: {node: '>=16'}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
chai@5.3.3:
resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
engines: {node: '>=18'}
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
check-error@2.1.3:
resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==}
engines: {node: '>= 16'}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
+ ci-info@4.4.0:
+ resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
+ engines: {node: '>=8'}
+
+ cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ common-ancestor-path@1.0.1:
+ resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
+
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -433,10 +1119,75 @@ packages:
supports-color:
optional: true
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
+
deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'}
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ deterministic-object-hash@2.0.2:
+ resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==}
+ engines: {node: '>=18'}
+
+ devalue@5.8.0:
+ resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@8.0.4:
+ resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
+ engines: {node: '>=0.3.1'}
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
@@ -445,438 +1196,2503 @@ packages:
engines: {node: '>=12'}
hasBin: true
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.27.7:
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
expect-type@1.3.0:
resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
engines: {node: '>=12.0.0'}
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
+ fontace@0.4.1:
+ resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
+
+ fontkitten@1.0.3:
+ resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
+ engines: {node: '>=20'}
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- loupe@3.2.1:
- resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+ get-east-asian-width@1.6.0:
+ resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
+ engines: {node: '>=18'}
- magic-string@0.30.21:
- resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
- nanoid@3.3.12:
- resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
+ hast-util-from-html@2.0.3:
+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
- pathe@1.1.2:
- resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+ hast-util-from-parse5@8.0.3:
+ resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
- pathval@2.0.1:
- resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
- engines: {node: '>= 14.16'}
+ hast-util-is-element@3.0.0:
+ resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
- postcss@8.5.14:
- resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
- engines: {node: ^10 || ^12 || >=14}
+ hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
- rollup@4.60.3:
- resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
- siginfo@2.0.0:
- resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ hast-util-to-parse5@8.0.1:
+ resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
+ hast-util-to-text@4.0.2:
+ resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
- stackback@0.0.2:
- resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
- std-env@3.10.0:
- resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
- tinybench@2.9.0:
- resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
- tinyexec@0.3.2:
- resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
- tinypool@1.1.1:
- resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
- tinyrainbow@1.2.0:
- resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
- engines: {node: '>=14.0.0'}
+ import-meta-resolve@4.2.0:
+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
- tinyspy@3.0.2:
- resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
- engines: {node: '>=14.0.0'}
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
- engines: {node: '>=14.17'}
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
hasBin: true
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
- vite-node@2.1.9:
- resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
hasBin: true
- vite@5.4.21:
- resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
- vitest@2.1.9:
- resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@edge-runtime/vm': '*'
- '@types/node': ^18.0.0 || >=20.0.0
- '@vitest/browser': 2.1.9
- '@vitest/ui': 2.1.9
- happy-dom: '*'
- jsdom: '*'
- peerDependenciesMeta:
- '@edge-runtime/vm':
- optional: true
- '@types/node':
- optional: true
- '@vitest/browser':
- optional: true
- '@vitest/ui':
- optional: true
- happy-dom:
- optional: true
- jsdom:
- optional: true
+ is-wsl@3.1.1:
+ resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+ engines: {node: '>=16'}
- why-is-node-running@2.3.0:
- resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
- engines: {node: '>=8'}
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
- yaml@2.8.4:
- resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==}
- engines: {node: '>= 14.6'}
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loupe@3.2.1:
+ resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+
+ lru-cache@11.3.6:
+ resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==}
+ engines: {node: 20 || >=22}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ magicast@0.5.2:
+ resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ mdast-util-definitions@6.0.0:
+ resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.3:
+ resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- zod@3.25.76:
- resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+ neotraverse@0.6.18:
+ resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
+ engines: {node: '>= 10'}
-snapshots:
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
- '@esbuild/aix-ppc64@0.21.5':
- optional: true
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
- '@esbuild/android-arm64@0.21.5':
- optional: true
+ node-mock-http@1.0.4:
+ resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==}
- '@esbuild/android-arm@0.21.5':
- optional: true
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
- '@esbuild/android-x64@0.21.5':
- optional: true
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- '@esbuild/darwin-arm64@0.21.5':
- optional: true
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
- '@esbuild/darwin-x64@0.21.5':
- optional: true
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
- '@esbuild/freebsd-arm64@0.21.5':
- optional: true
+ oniguruma-parser@0.12.2:
+ resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
- '@esbuild/freebsd-x64@0.21.5':
- optional: true
+ oniguruma-to-es@4.3.6:
+ resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
- '@esbuild/linux-arm64@0.21.5':
- optional: true
+ p-limit@6.2.0:
+ resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
+ engines: {node: '>=18'}
- '@esbuild/linux-arm@0.21.5':
- optional: true
+ p-queue@8.1.1:
+ resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==}
+ engines: {node: '>=18'}
- '@esbuild/linux-ia32@0.21.5':
- optional: true
+ p-timeout@6.1.4:
+ resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
+ engines: {node: '>=14.16'}
- '@esbuild/linux-loong64@0.21.5':
- optional: true
+ package-manager-detector@1.6.0:
+ resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
- '@esbuild/linux-mips64el@0.21.5':
- optional: true
+ parse-latin@7.0.0:
+ resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
- '@esbuild/linux-ppc64@0.21.5':
- optional: true
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
- '@esbuild/linux-riscv64@0.21.5':
- optional: true
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
- '@esbuild/linux-s390x@0.21.5':
- optional: true
+ pathval@2.0.1:
+ resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
+ engines: {node: '>= 14.16'}
- '@esbuild/linux-x64@0.21.5':
- optional: true
+ piccolore@0.1.3:
+ resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==}
- '@esbuild/netbsd-x64@0.21.5':
- optional: true
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- '@esbuild/openbsd-x64@0.21.5':
- optional: true
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
- '@esbuild/sunos-x64@0.21.5':
- optional: true
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
- '@esbuild/win32-arm64@0.21.5':
- optional: true
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
- '@esbuild/win32-ia32@0.21.5':
- optional: true
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
- '@esbuild/win32-x64@0.21.5':
- optional: true
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
- '@jridgewell/sourcemap-codec@1.5.5': {}
+ property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
- '@rollup/rollup-android-arm-eabi@4.60.3':
- optional: true
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
- '@rollup/rollup-android-arm64@4.60.3':
- optional: true
+ readdirp@5.0.0:
+ resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ engines: {node: '>= 20.19.0'}
- '@rollup/rollup-darwin-arm64@4.60.3':
- optional: true
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
- '@rollup/rollup-darwin-x64@4.60.3':
- optional: true
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
- '@rollup/rollup-freebsd-arm64@4.60.3':
- optional: true
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
- '@rollup/rollup-freebsd-x64@4.60.3':
- optional: true
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
- '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
- optional: true
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
- '@rollup/rollup-linux-arm-musleabihf@4.60.3':
- optional: true
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
- '@rollup/rollup-linux-arm64-gnu@4.60.3':
- optional: true
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
+ remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+ remark-smartypants@3.0.2:
+ resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
+ engines: {node: '>=16.0.0'}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ retext-latin@4.0.0:
+ resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
+
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
+
+ retext-stringify@4.0.0:
+ resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
+
+ retext@9.0.0:
+ resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
+
+ rollup@4.60.3:
+ resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ sax@1.6.0:
+ resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
+ engines: {node: '>=11.0.0'}
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shiki@3.23.0:
+ resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ smol-toml@1.6.1:
+ resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==}
+ engines: {node: '>= 18'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ std-env@3.10.0:
+ resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
+
+ svgo@4.0.1:
+ resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyexec@1.1.2:
+ resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==}
+ engines: {node: '>=18'}
+
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@1.1.1:
+ resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@1.2.0:
+ resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ tsconfck@3.1.6:
+ resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-fest@4.41.0:
+ resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
+ engines: {node: '>=16'}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
+ ultrahtml@1.6.0:
+ resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unifont@0.7.4:
+ resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==}
+
+ unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-modify-children@4.0.0:
+ resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-children@3.0.0:
+ resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite-node@2.1.9:
+ resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ vite@5.4.21:
+ resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vite@6.4.2:
+ resolution: {integrity: sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitefu@1.1.3:
+ resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vitest@2.1.9:
+ resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 2.1.9
+ '@vitest/ui': 2.1.9
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ which-pm-runs@1.1.0:
+ resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
+ engines: {node: '>=4'}
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ widest-line@5.0.0:
+ resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+ engines: {node: '>=18'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
+ yaml@2.8.4:
+ resolution: {integrity: sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yocto-queue@1.2.2:
+ resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
+ engines: {node: '>=12.20'}
+
+ yocto-spinner@0.2.3:
+ resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==}
+ engines: {node: '>=18.19'}
+
+ yoctocolors@2.1.2:
+ resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
+ engines: {node: '>=18'}
+
+ zod-to-json-schema@3.25.2:
+ resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
+ peerDependencies:
+ zod: ^3.25.28 || ^4
+
+ zod-to-ts@1.2.0:
+ resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
+ peerDependencies:
+ typescript: ^4.9.4 || ^5.0.2
+ zod: ^3
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@astrojs/compiler@2.13.1': {}
+
+ '@astrojs/internal-helpers@0.7.6': {}
+
+ '@astrojs/markdown-remark@6.3.11':
+ dependencies:
+ '@astrojs/internal-helpers': 0.7.6
+ '@astrojs/prism': 3.3.0
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-text: 4.0.2
+ import-meta-resolve: 4.2.0
+ js-yaml: 4.1.1
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ remark-smartypants: 3.0.2
+ shiki: 3.23.0
+ smol-toml: 1.6.1
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.1.0
+ unist-util-visit-parents: 6.0.2
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/prism@3.3.0':
+ dependencies:
+ prismjs: 1.30.0
+
+ '@astrojs/telemetry@3.3.0':
+ dependencies:
+ ci-info: 4.4.0
+ debug: 4.4.3
+ dlv: 1.1.3
+ dset: 3.1.4
+ is-docker: 3.0.0
+ is-wsl: 3.1.1
+ which-pm-runs: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/parser@7.29.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@capsizecss/unpack@4.0.0':
+ dependencies:
+ fontkitten: 1.0.3
+
+ '@emnapi/runtime@1.10.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.27.7':
+ optional: true
+
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.27.7':
+ optional: true
+
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.27.7':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.7':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.7':
+ optional: true
+
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.7':
+ optional: true
+
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.7':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.7':
+ optional: true
+
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.7':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.7':
+ optional: true
+
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.7':
+ optional: true
+
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.7':
+ optional: true
+
+ '@img/colour@1.1.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.10.0
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@oslojs/encoding@1.1.0': {}
+
+ '@rollup/pluginutils@5.3.0(rollup@4.60.3)':
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-walker: 2.0.2
+ picomatch: 4.0.4
+ optionalDependencies:
+ rollup: 4.60.3
+
+ '@rollup/rollup-android-arm-eabi@4.60.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.60.3':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.60.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.60.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.60.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.60.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.60.3':
+ optional: true
+
+ '@shikijs/core@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+
+ '@shikijs/engine-javascript@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.6
+
+ '@shikijs/engine-oniguruma@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+
+ '@shikijs/themes@3.23.0':
+ dependencies:
+ '@shikijs/types': 3.23.0
+
+ '@shikijs/types@3.23.0':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
+ '@types/debug@4.1.13':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/estree@1.0.8': {}
+
+ '@types/estree@1.0.9': {}
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/ms@2.1.0': {}
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/node@22.19.18':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/unist@3.0.3': {}
+
+ '@ungap/structured-clone@1.3.1': {}
+
+ '@vitest/expect@2.1.9':
+ dependencies:
+ '@vitest/spy': 2.1.9
+ '@vitest/utils': 2.1.9
+ chai: 5.3.3
+ tinyrainbow: 1.2.0
+
+ '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))':
+ dependencies:
+ '@vitest/spy': 2.1.9
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
+ vite: 5.4.21(@types/node@22.19.18)
+
+ '@vitest/pretty-format@2.1.9':
+ dependencies:
+ tinyrainbow: 1.2.0
+
+ '@vitest/runner@2.1.9':
+ dependencies:
+ '@vitest/utils': 2.1.9
+ pathe: 1.1.2
+
+ '@vitest/snapshot@2.1.9':
+ dependencies:
+ '@vitest/pretty-format': 2.1.9
+ magic-string: 0.30.21
+ pathe: 1.1.2
+
+ '@vitest/spy@2.1.9':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@2.1.9':
+ dependencies:
+ '@vitest/pretty-format': 2.1.9
+ loupe: 3.2.1
+ tinyrainbow: 1.2.0
+
+ acorn@8.16.0: {}
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@6.2.3: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ array-iterate@2.0.1: {}
+
+ assertion-error@2.0.1: {}
+
+ astro@5.18.1(@types/node@22.19.18)(rollup@4.60.3)(typescript@5.9.3)(yaml@2.8.4):
+ dependencies:
+ '@astrojs/compiler': 2.13.1
+ '@astrojs/internal-helpers': 0.7.6
+ '@astrojs/markdown-remark': 6.3.11
+ '@astrojs/telemetry': 3.3.0
+ '@capsizecss/unpack': 4.0.0
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.3.0(rollup@4.60.3)
+ acorn: 8.16.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.4.0
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 1.1.1
+ cssesc: 3.0.0
+ debug: 4.4.3
+ deterministic-object-hash: 2.0.2
+ devalue: 5.8.0
+ diff: 8.0.4
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.7.0
+ esbuild: 0.27.7
+ estree-walker: 3.0.3
+ flattie: 1.1.1
+ fontace: 0.4.1
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ import-meta-resolve: 4.2.0
+ js-yaml: 4.1.1
+ magic-string: 0.30.21
+ magicast: 0.5.2
+ mrmime: 2.0.1
+ neotraverse: 0.6.18
+ p-limit: 6.2.0
+ p-queue: 8.1.1
+ package-manager-detector: 1.6.0
+ piccolore: 0.1.3
+ picomatch: 4.0.4
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.7.4
+ shiki: 3.23.0
+ smol-toml: 1.6.1
+ svgo: 4.0.1
+ tinyexec: 1.1.2
+ tinyglobby: 0.2.16
+ tsconfck: 3.1.6(typescript@5.9.3)
+ ultrahtml: 1.6.0
+ unifont: 0.7.4
+ unist-util-visit: 5.1.0
+ unstorage: 1.17.5
+ vfile: 6.0.3
+ vite: 6.4.2(@types/node@22.19.18)(yaml@2.8.4)
+ vitefu: 1.1.3(vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 21.1.1
+ yocto-spinner: 0.2.3
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.2(zod@3.25.76)
+ zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76)
+ optionalDependencies:
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - typescript
+ - uploadthing
+ - yaml
+
+ axobject-query@4.1.0: {}
+
+ bail@2.0.2: {}
+
+ base-64@1.0.0: {}
+
+ boolbase@1.0.0: {}
+
+ boxen@8.0.1:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 8.0.0
+ chalk: 5.6.2
+ cli-boxes: 3.0.0
+ string-width: 7.2.0
+ type-fest: 4.41.0
+ widest-line: 5.0.0
+ wrap-ansi: 9.0.2
+
+ cac@6.7.14: {}
+
+ camelcase@8.0.0: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.3.3:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.3
+ deep-eql: 5.0.2
+ loupe: 3.2.1
+ pathval: 2.0.1
+
+ chalk@5.6.2: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ check-error@2.1.3: {}
+
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.0.0
+
+ ci-info@4.4.0: {}
+
+ cli-boxes@3.0.0: {}
+
+ clsx@2.1.1: {}
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@11.1.0: {}
+
+ common-ancestor-path@1.0.1: {}
+
+ cookie-es@1.2.3: {}
+
+ cookie@1.1.1: {}
+
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
+
+ css-what@6.2.2: {}
+
+ cssesc@3.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decode-named-character-reference@1.3.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ deep-eql@5.0.2: {}
+
+ defu@6.1.7: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.5: {}
+
+ detect-libc@2.1.2:
+ optional: true
+
+ deterministic-object-hash@2.0.2:
+ dependencies:
+ base-64: 1.0.0
+
+ devalue@5.8.0: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@8.0.4: {}
+
+ dlv@1.1.3: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dset@3.1.4: {}
+
+ emoji-regex@10.6.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
+ es-module-lexer@1.7.0: {}
+
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ esbuild@0.27.7:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.7
+ '@esbuild/android-arm': 0.27.7
+ '@esbuild/android-arm64': 0.27.7
+ '@esbuild/android-x64': 0.27.7
+ '@esbuild/darwin-arm64': 0.27.7
+ '@esbuild/darwin-x64': 0.27.7
+ '@esbuild/freebsd-arm64': 0.27.7
+ '@esbuild/freebsd-x64': 0.27.7
+ '@esbuild/linux-arm': 0.27.7
+ '@esbuild/linux-arm64': 0.27.7
+ '@esbuild/linux-ia32': 0.27.7
+ '@esbuild/linux-loong64': 0.27.7
+ '@esbuild/linux-mips64el': 0.27.7
+ '@esbuild/linux-ppc64': 0.27.7
+ '@esbuild/linux-riscv64': 0.27.7
+ '@esbuild/linux-s390x': 0.27.7
+ '@esbuild/linux-x64': 0.27.7
+ '@esbuild/netbsd-arm64': 0.27.7
+ '@esbuild/netbsd-x64': 0.27.7
+ '@esbuild/openbsd-arm64': 0.27.7
+ '@esbuild/openbsd-x64': 0.27.7
+ '@esbuild/openharmony-arm64': 0.27.7
+ '@esbuild/sunos-x64': 0.27.7
+ '@esbuild/win32-arm64': 0.27.7
+ '@esbuild/win32-ia32': 0.27.7
+ '@esbuild/win32-x64': 0.27.7
+
+ escape-string-regexp@5.0.0: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.9
+
+ eventemitter3@5.0.4: {}
+
+ expect-type@1.3.0: {}
+
+ extend@3.0.2: {}
+
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
+ flattie@1.1.1: {}
+
+ fontace@0.4.1:
+ dependencies:
+ fontkitten: 1.0.3
+
+ fontkitten@1.0.3:
+ dependencies:
+ tiny-inflate: 1.0.3
+
+ fsevents@2.3.3:
+ optional: true
+
+ get-east-asian-width@1.6.0: {}
+
+ github-slugger@2.0.0: {}
+
+ h3@1.15.11:
+ dependencies:
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.4
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
+
+ hast-util-from-html@2.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.3
+ parse5: 7.3.0
+ vfile: 6.0.3
+ vfile-message: 4.0.3
+
+ hast-util-from-parse5@8.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.1.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-is-element@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.3.1
+ hast-util-from-parse5: 8.0.3
+ hast-util-to-parse5: 8.0.1
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ parse5: 7.3.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-html@9.0.5:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-text@4.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+
+ html-escaper@3.0.3: {}
+
+ html-void-elements@3.0.0: {}
+
+ http-cache-semantics@4.2.0: {}
+
+ import-meta-resolve@4.2.0: {}
+
+ iron-webcrypto@1.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-plain-obj@4.1.0: {}
+
+ is-wsl@3.1.1:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ kleur@3.0.3: {}
+
+ longest-streak@3.1.0: {}
+
+ loupe@3.2.1: {}
+
+ lru-cache@11.3.6: {}
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ magicast@0.5.2:
+ dependencies:
+ '@babel/parser': 7.29.3
+ '@babel/types': 7.29.0
+ source-map-js: 1.2.1
+
+ markdown-table@3.0.4: {}
+
+ mdast-util-definitions@6.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ mdast-util-from-markdown@2.0.3:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.1
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.27.1: {}
+
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
- '@rollup/rollup-linux-arm64-musl@4.60.3':
- optional: true
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
- '@rollup/rollup-linux-loong64-gnu@4.60.3':
- optional: true
+ micromark-util-encode@2.0.1: {}
- '@rollup/rollup-linux-loong64-musl@4.60.3':
- optional: true
+ micromark-util-html-tag-name@2.0.1: {}
- '@rollup/rollup-linux-ppc64-gnu@4.60.3':
- optional: true
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
- '@rollup/rollup-linux-ppc64-musl@4.60.3':
- optional: true
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.2
- '@rollup/rollup-linux-riscv64-gnu@4.60.3':
- optional: true
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
- '@rollup/rollup-linux-riscv64-musl@4.60.3':
- optional: true
+ micromark-util-subtokenize@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
- '@rollup/rollup-linux-s390x-gnu@4.60.3':
- optional: true
+ micromark-util-symbol@2.0.1: {}
- '@rollup/rollup-linux-x64-gnu@4.60.3':
- optional: true
+ micromark-util-types@2.0.2: {}
- '@rollup/rollup-linux-x64-musl@4.60.3':
- optional: true
+ micromark@4.0.2:
+ dependencies:
+ '@types/debug': 4.1.13
+ debug: 4.4.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
- '@rollup/rollup-openbsd-x64@4.60.3':
- optional: true
+ mrmime@2.0.1: {}
- '@rollup/rollup-openharmony-arm64@4.60.3':
- optional: true
+ ms@2.1.3: {}
- '@rollup/rollup-win32-arm64-msvc@4.60.3':
- optional: true
+ nanoid@3.3.12: {}
- '@rollup/rollup-win32-ia32-msvc@4.60.3':
- optional: true
+ neotraverse@0.6.18: {}
- '@rollup/rollup-win32-x64-gnu@4.60.3':
- optional: true
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
- '@rollup/rollup-win32-x64-msvc@4.60.3':
- optional: true
+ node-fetch-native@1.6.7: {}
- '@types/estree@1.0.8': {}
+ node-mock-http@1.0.4: {}
- '@types/estree@1.0.9': {}
+ normalize-path@3.0.0: {}
- '@types/node@22.19.18':
+ nth-check@2.1.1:
dependencies:
- undici-types: 6.21.0
+ boolbase: 1.0.0
- '@vitest/expect@2.1.9':
+ ofetch@1.5.1:
dependencies:
- '@vitest/spy': 2.1.9
- '@vitest/utils': 2.1.9
- chai: 5.3.3
- tinyrainbow: 1.2.0
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.4
- '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))':
+ ohash@2.0.11: {}
+
+ oniguruma-parser@0.12.2: {}
+
+ oniguruma-to-es@4.3.6:
dependencies:
- '@vitest/spy': 2.1.9
- estree-walker: 3.0.3
- magic-string: 0.30.21
- optionalDependencies:
- vite: 5.4.21(@types/node@22.19.18)
+ oniguruma-parser: 0.12.2
+ regex: 6.1.0
+ regex-recursion: 6.0.2
- '@vitest/pretty-format@2.1.9':
+ p-limit@6.2.0:
dependencies:
- tinyrainbow: 1.2.0
+ yocto-queue: 1.2.2
- '@vitest/runner@2.1.9':
+ p-queue@8.1.1:
dependencies:
- '@vitest/utils': 2.1.9
- pathe: 1.1.2
+ eventemitter3: 5.0.4
+ p-timeout: 6.1.4
- '@vitest/snapshot@2.1.9':
+ p-timeout@6.1.4: {}
+
+ package-manager-detector@1.6.0: {}
+
+ parse-latin@7.0.0:
dependencies:
- '@vitest/pretty-format': 2.1.9
- magic-string: 0.30.21
- pathe: 1.1.2
+ '@types/nlcst': 2.0.3
+ '@types/unist': 3.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-modify-children: 4.0.0
+ unist-util-visit-children: 3.0.0
+ vfile: 6.0.3
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
- '@vitest/spy@2.1.9':
+ pathe@1.1.2: {}
+
+ pathval@2.0.1: {}
+
+ piccolore@0.1.3: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.4: {}
+
+ postcss@8.5.14:
dependencies:
- tinyspy: 3.0.2
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- '@vitest/utils@2.1.9':
+ prismjs@1.30.0: {}
+
+ prompts@2.4.2:
dependencies:
- '@vitest/pretty-format': 2.1.9
- loupe: 3.2.1
- tinyrainbow: 1.2.0
+ kleur: 3.0.3
+ sisteransi: 1.0.5
- assertion-error@2.0.1: {}
+ property-information@7.1.0: {}
- cac@6.7.14: {}
+ radix3@1.1.2: {}
- chai@5.3.3:
+ readdirp@5.0.0: {}
+
+ regex-recursion@6.0.2:
dependencies:
- assertion-error: 2.0.1
- check-error: 2.1.3
- deep-eql: 5.0.2
- loupe: 3.2.1
- pathval: 2.0.1
+ regex-utilities: 2.3.0
- check-error@2.1.3: {}
+ regex-utilities@2.3.0: {}
- debug@4.4.3:
+ regex@6.1.0:
dependencies:
- ms: 2.1.3
-
- deep-eql@5.0.2: {}
+ regex-utilities: 2.3.0
- es-module-lexer@1.7.0: {}
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
- esbuild@0.21.5:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
- estree-walker@3.0.3:
+ rehype-stringify@10.0.1:
dependencies:
- '@types/estree': 1.0.9
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+ unified: 11.0.5
- expect-type@1.3.0: {}
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
- fsevents@2.3.3:
- optional: true
+ remark-gfm@4.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
- loupe@3.2.1: {}
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
- magic-string@0.30.21:
+ remark-rehype@11.1.2:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ unified: 11.0.5
+ vfile: 6.0.3
- ms@2.1.3: {}
+ remark-smartypants@3.0.2:
+ dependencies:
+ retext: 9.0.0
+ retext-smartypants: 6.2.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
- nanoid@3.3.12: {}
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
- pathe@1.1.2: {}
+ retext-latin@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ parse-latin: 7.0.0
+ unified: 11.0.5
- pathval@2.0.1: {}
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.1.0
- picocolors@1.1.1: {}
+ retext-stringify@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unified: 11.0.5
- postcss@8.5.14:
+ retext@9.0.0:
dependencies:
- nanoid: 3.3.12
- picocolors: 1.1.1
- source-map-js: 1.2.1
+ '@types/nlcst': 2.0.3
+ retext-latin: 4.0.0
+ retext-stringify: 4.0.0
+ unified: 11.0.5
rollup@4.60.3:
dependencies:
@@ -909,28 +3725,228 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.60.3
fsevents: 2.3.3
+ sax@1.6.0: {}
+
+ semver@7.7.4: {}
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
+ shiki@3.23.0:
+ dependencies:
+ '@shikijs/core': 3.23.0
+ '@shikijs/engine-javascript': 3.23.0
+ '@shikijs/engine-oniguruma': 3.23.0
+ '@shikijs/langs': 3.23.0
+ '@shikijs/themes': 3.23.0
+ '@shikijs/types': 3.23.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
siginfo@2.0.0: {}
+ sisteransi@1.0.5: {}
+
+ smol-toml@1.6.1: {}
+
source-map-js@1.2.1: {}
+ space-separated-tokens@2.0.2: {}
+
stackback@0.0.2: {}
std-env@3.10.0: {}
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.6.0
+ strip-ansi: 7.2.0
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.2.0:
+ dependencies:
+ ansi-regex: 6.2.2
+
+ svgo@4.0.1:
+ dependencies:
+ commander: 11.1.0
+ css-select: 5.2.2
+ css-tree: 3.2.1
+ css-what: 6.2.2
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.0
+
+ tiny-inflate@1.0.3: {}
+
tinybench@2.9.0: {}
tinyexec@0.3.2: {}
+ tinyexec@1.1.2: {}
+
+ tinyglobby@0.2.16:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
tinypool@1.1.1: {}
tinyrainbow@1.2.0: {}
tinyspy@3.0.2: {}
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ tsconfck@3.1.6(typescript@5.9.3):
+ optionalDependencies:
+ typescript: 5.9.3
+
+ tslib@2.8.1:
+ optional: true
+
+ type-fest@4.41.0: {}
+
typescript@5.9.3: {}
+ ufo@1.6.4: {}
+
+ ultrahtml@1.6.0: {}
+
+ uncrypto@0.1.3: {}
+
undici-types@6.21.0: {}
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unifont@0.7.4:
+ dependencies:
+ css-tree: 3.2.1
+ ofetch: 1.5.1
+ ohash: 2.0.11
+
+ unist-util-find-after@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-modify-children@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ array-iterate: 2.0.1
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-children@3.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unstorage@1.17.5:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.3.6
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
vite-node@2.1.9(@types/node@22.19.18):
dependencies:
cac: 6.7.14
@@ -958,6 +3974,23 @@ snapshots:
'@types/node': 22.19.18
fsevents: 2.3.3
+ vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+ postcss: 8.5.14
+ rollup: 4.60.3
+ tinyglobby: 0.2.16
+ optionalDependencies:
+ '@types/node': 22.19.18
+ fsevents: 2.3.3
+ yaml: 2.8.4
+
+ vitefu@1.1.3(vite@6.4.2(@types/node@22.19.18)(yaml@2.8.4)):
+ optionalDependencies:
+ vite: 6.4.2(@types/node@22.19.18)(yaml@2.8.4)
+
vitest@2.1.9(@types/node@22.19.18):
dependencies:
'@vitest/expect': 2.1.9
@@ -993,11 +4026,48 @@ snapshots:
- supports-color
- terser
+ web-namespaces@2.0.1: {}
+
+ which-pm-runs@1.1.0: {}
+
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
+ widest-line@5.0.0:
+ dependencies:
+ string-width: 7.2.0
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+
+ xxhash-wasm@1.1.0: {}
+
yaml@2.8.4: {}
+ yargs-parser@21.1.1: {}
+
+ yocto-queue@1.2.2: {}
+
+ yocto-spinner@0.2.3:
+ dependencies:
+ yoctocolors: 2.1.2
+
+ yoctocolors@2.1.2: {}
+
+ zod-to-json-schema@3.25.2(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76):
+ dependencies:
+ typescript: 5.9.3
+ zod: 3.25.76
+
zod@3.25.76: {}
+
+ zwitch@2.0.4: {}
diff --git a/rules/astro-site.rules.yml b/rules/astro-site.rules.yml
new file mode 100644
index 0000000..ee08ca8
--- /dev/null
+++ b/rules/astro-site.rules.yml
@@ -0,0 +1,167 @@
+rules:
+ - rule_id: S-AGENT-ASTRO-NODE-001
+ domain: astro-site
+ status: approved
+ owner: web-platform
+ severity: critical
+ scope:
+ modules:
+ - "src/pages/**"
+ - "src/components/**"
+ - "src/layouts/**"
+ - "apps/site/src/pages/**"
+ - "apps/site/src/components/**"
+ - "apps/site/src/layouts/**"
+ intent: "Astro presentation files must stay static and must not couple the site to server-only runtimes or S-Agent enforcement internals."
+ invariants:
+ - id: S-AGENT-ASTRO-NODE-001
+ type: forbidden_import
+ description: "Astro pages, layouts and components must not import Node runtime modules or S-Agent analysis packages."
+ forbidden_imports:
+ - "fs"
+ - "child_process"
+ - "net"
+ - "http"
+ - "https"
+ - "node:fs"
+ - "node:child_process"
+ - "node:net"
+ - "node:http"
+ - "node:https"
+ - "@s-agent/analyzer"
+ - "@s-agent/parser"
+ - "@s-agent/verifier"
+ - "@s-agent/rules"
+ - "@s-agent/core"
+ enforcement:
+ mode: block
+ source:
+ file: "AGENTS.md"
+ section: "Self-Application Principle"
+ line: 45
+
+ - rule_id: S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001
+ domain: astro-site
+ status: approved
+ owner: web-platform
+ severity: warning
+ scope:
+ modules:
+ - "src/pages/**"
+ - "src/components/**"
+ - "src/layouts/**"
+ - "src/content/**"
+ - "apps/site/src/pages/**"
+ - "apps/site/src/components/**"
+ - "apps/site/src/layouts/**"
+ - "apps/site/src/content/**"
+ intent: "Static Astro site source should render approved content and must not perform network, analytics, LLM or mutation side effects during page generation."
+ invariants:
+ - id: S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001
+ type: forbidden_side_effect
+ description: "Astro static site source must not perform runtime side-effect calls."
+ readonly: true
+ forbidden_calls:
+ - fetch
+ - openai
+ - anthropic
+ - chatCompletion
+ - responses
+ - generateText
+ - track
+ - identify
+ - capture
+ - setItem
+ - emit
+ - publish
+ - dispatch
+ enforcement:
+ mode: review
+ source:
+ file: "AGENTS.md"
+ section: "Core Principle"
+ line: 19
+
+ - rule_id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001
+ domain: astro-site
+ status: approved
+ owner: web-platform
+ severity: warning
+ scope:
+ modules:
+ - "src/content/**"
+ - "apps/site/src/content/**"
+ intent: "Astro content modules own approved marketing facts and must not depend on presentation pages, layouts or components."
+ invariants:
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001A
+ type: layer_boundary
+ description: "Standalone Astro content modules must not import pages."
+ from: "src/content/**"
+ to: "src/pages/**"
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001B
+ type: layer_boundary
+ description: "Standalone Astro content modules must not import components."
+ from: "src/content/**"
+ to: "src/components/**"
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001C
+ type: layer_boundary
+ description: "Standalone Astro content modules must not import layouts."
+ from: "src/content/**"
+ to: "src/layouts/**"
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001D
+ type: layer_boundary
+ description: "Monorepo Astro content modules must not import pages."
+ from: "apps/site/src/content/**"
+ to: "apps/site/src/pages/**"
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001E
+ type: layer_boundary
+ description: "Monorepo Astro content modules must not import components."
+ from: "apps/site/src/content/**"
+ to: "apps/site/src/components/**"
+ - id: S-AGENT-ASTRO-CONTENT-BOUNDARY-001F
+ type: layer_boundary
+ description: "Monorepo Astro content modules must not import layouts."
+ from: "apps/site/src/content/**"
+ to: "apps/site/src/layouts/**"
+ enforcement:
+ mode: review
+ source:
+ file: "AGENTS.md"
+ section: "Self-Application Principle"
+ line: 45
+
+ - rule_id: S-AGENT-ASTRO-SEO-STATIC-001
+ domain: astro-site
+ status: approved
+ owner: web-platform
+ severity: warning
+ scope:
+ modules:
+ - "apps/site/src/content/**"
+ - "apps/site/src/pages/**"
+ intent: "SEO and AEO pages must stay static, source-controlled, and independent from runtime network or analytics side effects."
+ invariants:
+ - id: S-AGENT-ASTRO-SEO-STATIC-001
+ type: forbidden_side_effect
+ description: "SEO and AEO site routes must not perform runtime side-effect calls."
+ readonly: true
+ forbidden_calls:
+ - fetch
+ - openai
+ - anthropic
+ - chatCompletion
+ - responses
+ - generateText
+ - track
+ - identify
+ - capture
+ - setItem
+ - emit
+ - publish
+ - dispatch
+ enforcement:
+ mode: review
+ source:
+ file: "AGENTS.md"
+ section: "Self-Application Principle"
+ line: 45
diff --git a/rules/s-agent-architecture.rules.yml b/rules/s-agent-architecture.rules.yml
index f6c886f..1f62227 100644
--- a/rules/s-agent-architecture.rules.yml
+++ b/rules/s-agent-architecture.rules.yml
@@ -96,6 +96,32 @@ rules:
section: "S-Agent Internal Architecture Rules"
line: 75
+ - rule_id: S-AGENT-ARCH-SITE-001
+ domain: architecture
+ status: approved
+ owner: core-team
+ severity: warning
+ scope:
+ modules:
+ - "apps/site/**"
+ intent: "The site app owns the public marketing landing page and must stay presentation-only."
+ invariants:
+ - id: S-AGENT-ARCH-SITE-001
+ type: forbidden_import
+ description: "apps/site must not import core analysis packages or duplicate analyzer logic."
+ forbidden_imports:
+ - "@s-agent/analyzer"
+ - "@s-agent/parser"
+ - "@s-agent/verifier"
+ - "@s-agent/rules"
+ - "@s-agent/core"
+ enforcement:
+ mode: review
+ source:
+ file: "AGENTS.md"
+ section: "Self-Application Principle"
+ line: 45
+
- rule_id: S-AGENT-RULE-LIFECYCLE-001
domain: rule-lifecycle
status: approved
diff --git a/s-agent b/s-agent
new file mode 160000
index 0000000..023ef97
--- /dev/null
+++ b/s-agent
@@ -0,0 +1 @@
+Subproject commit 023ef9706c20f3ad1ee56be7b272527f3b593b6c
diff --git a/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md b/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md
new file mode 100644
index 0000000..a11ef49
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-clean/CLAUDE.md
@@ -0,0 +1,3 @@
+# Clean Astro Site Fixture
+
+Astro pages render approved local content without runtime side effects.
diff --git a/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro b/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro
new file mode 100644
index 0000000..4085d44
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-clean/src/components/RuleCard.astro
@@ -0,0 +1,9 @@
+---
+interface Props {
+ title: string;
+}
+
+const { title } = Astro.props;
+---
+
+{title}
diff --git a/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts b/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts
new file mode 100644
index 0000000..13ba4a3
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-clean/src/content/landing.ts
@@ -0,0 +1,11 @@
+import { z } from "zod";
+
+const brandSchema = z.object({
+ headline: z.string()
+});
+
+export const brand = {
+ headline: "Protect business intent in every code change."
+} as const;
+
+brandSchema.parse(brand);
diff --git a/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro b/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro
new file mode 100644
index 0000000..c2773e4
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-clean/src/pages/index.astro
@@ -0,0 +1,9 @@
+---
+import RuleCard from "../components/RuleCard.astro";
+import { brand } from "../content/landing";
+---
+
+
+ {brand.headline}
+
+
diff --git a/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md b/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md
new file mode 100644
index 0000000..3e334fc
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-violation/CLAUDE.md
@@ -0,0 +1,3 @@
+# Astro Site Fixture
+
+Astro presentation files must stay static. Marketing content modules own approved facts and must not import pages, layouts or components.
diff --git a/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro b/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro
new file mode 100644
index 0000000..3acea42
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-violation/src/components/UnsafeWidget.astro
@@ -0,0 +1,7 @@
+---
+import fs from "node:fs";
+
+const localCopy = fs.readFileSync("landing.md", "utf8");
+---
+
+
diff --git a/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts b/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts
new file mode 100644
index 0000000..ae5b864
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-violation/src/content/landing.ts
@@ -0,0 +1,3 @@
+import Page from "../pages/index.astro";
+
+export const landingReference = Page;
diff --git a/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro b/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro
new file mode 100644
index 0000000..4d3e970
--- /dev/null
+++ b/tests/evaluation/fixtures/astro-site-violation/src/pages/index.astro
@@ -0,0 +1,10 @@
+---
+import UnsafeWidget from "../components/UnsafeWidget.astro";
+
+const remoteCopy = await fetch("https://example.com/landing-copy.json");
+---
+
+
+
+ {remoteCopy.status}
+
diff --git a/tests/integration/analyze-astro-site.test.ts b/tests/integration/analyze-astro-site.test.ts
new file mode 100644
index 0000000..bdbf970
--- /dev/null
+++ b/tests/integration/analyze-astro-site.test.ts
@@ -0,0 +1,46 @@
+import path from "node:path";
+import { describe, expect, it } from "vitest";
+import { runSAgentAnalysis } from "@s-agent/core";
+
+const repoRoot = path.resolve(__dirname, "../..");
+const rulesDirectory = path.join(repoRoot, "rules");
+const fixturesRoot = path.resolve(__dirname, "../evaluation/fixtures");
+
+describe("integration: Astro site rules", () => {
+ it("detects Astro presentation, side-effect, and content-boundary violations", async () => {
+ const result = await runSAgentAnalysis({
+ projectRoot: path.join(fixturesRoot, "astro-site-violation"),
+ rulesDirectory
+ });
+
+ expect(result.findings).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({
+ rule_id: "S-AGENT-ASTRO-NODE-001",
+ status: "PROVEN",
+ blocking: true
+ }),
+ expect.objectContaining({
+ rule_id: "S-AGENT-ASTRO-STATIC-SIDE-EFFECTS-001",
+ status: "PROBABLE",
+ blocking: false
+ }),
+ expect.objectContaining({
+ rule_id: "S-AGENT-ASTRO-CONTENT-BOUNDARY-001",
+ status: "PROVEN",
+ blocking: false
+ })
+ ])
+ );
+ });
+
+ it("keeps a clean Astro landing free of Astro rule findings", async () => {
+ const result = await runSAgentAnalysis({
+ projectRoot: path.join(fixturesRoot, "astro-site-clean"),
+ rulesDirectory
+ });
+
+ expect(result.findings).toEqual([]);
+ expect(result.blocking).toBe(false);
+ });
+});
diff --git a/tests/unit/astro-file-index.test.ts b/tests/unit/astro-file-index.test.ts
new file mode 100644
index 0000000..8d5b02d
--- /dev/null
+++ b/tests/unit/astro-file-index.test.ts
@@ -0,0 +1,42 @@
+import fs from "node:fs/promises";
+import os from "node:os";
+import path from "node:path";
+import { describe, expect, it } from "vitest";
+import { indexProject } from "@s-agent/parser";
+
+describe("unit: Astro file indexing", () => {
+ it("indexes Astro frontmatter imports with original line numbers", async () => {
+ const projectRoot = await fs.mkdtemp(path.join(os.tmpdir(), "s-agent-astro-index-"));
+ await fs.mkdir(path.join(projectRoot, "src/pages"), { recursive: true });
+ await fs.mkdir(path.join(projectRoot, "src/content"), { recursive: true });
+ await fs.writeFile(
+ path.join(projectRoot, "src/pages/index.astro"),
+ [
+ "---",
+ "import { brand } from \"../content/landing\";",
+ "const title = brand.product;",
+ "---",
+ "{title} ",
+ ""
+ ].join("\n"),
+ "utf8"
+ );
+ await fs.writeFile(
+ path.join(projectRoot, "src/content/landing.ts"),
+ "export const brand = { product: \"AxiomGuard\" } as const;\n",
+ "utf8"
+ );
+
+ const index = await indexProject(projectRoot);
+ const page = index.files.find((file) => file.relativePath === "src/pages/index.astro");
+
+ expect(page).toBeDefined();
+ expect(page?.imports).toEqual([
+ expect.objectContaining({
+ source: "../content/landing",
+ importedPath: "src/content/landing.ts",
+ line: 2
+ })
+ ]);
+ });
+});