From 6ba83537ebc3788abe1d24fce04115e7062bfdc2 Mon Sep 17 00:00:00 2001 From: Randy Wilson Date: Sun, 23 Aug 2026 21:15:04 -0400 Subject: [PATCH] Tell the truth everywhere: refreshed READMEs, an honest landing page, and a verified tool reference Every documentation surface now matches the shipped product: five tool groups and 25 actions, local embeddings as the zero-config default, bundled embedded storage with no separate Redis install, the graph explorer as it actually behaves, the history window, and ownership analysis. The landing page drops the four-tool era copy and synthetic art for real captures from a fresh index, with install commands clearly gated on the pending npm publication. All numbers were re-measured or re-derived from source during an independent review that found zero blockers. Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 73 ++-- CONTRIBUTING.md | 1 + README.md | 16 +- SECURITY.md | 2 +- apps/web/app/layout.tsx | 22 +- apps/web/app/page.tsx | 51 ++- .../components/landing/analysis-section.tsx | 66 ++++ .../landing/architecture-section.tsx | 96 ----- .../components/landing/benchmarks-block.tsx | 51 --- apps/web/components/landing/code-block.tsx | 188 ---------- .../components/landing/explorer-section.tsx | 89 +++++ apps/web/components/landing/features-data.ts | 55 --- .../landing/features-grid-section.tsx | 66 ---- .../web/components/landing/footer-section.tsx | 104 +++--- .../components/landing/hero-graph-demo.tsx | 132 ------- apps/web/components/landing/hero-section.tsx | 244 +++++-------- .../landing/how-it-works-section.tsx | 337 ------------------ .../components/landing/integrations-data.ts | 81 ----- .../landing/integrations-section.tsx | 110 ------ .../components/landing/knowledge-section.tsx | 57 +++ apps/web/components/landing/navigation.tsx | 204 ++++------- .../components/landing/platform-section.tsx | 67 ++++ .../components/landing/problem-section.tsx | 150 -------- .../components/landing/release-section.tsx | 66 ++++ apps/web/components/landing/setup-section.tsx | 87 +++++ apps/web/package.json | 1 + .../public/captures/explorer-expansion.jpg | Bin 0 -> 156351 bytes apps/web/public/captures/explorer-files.jpg | Bin 0 -> 112811 bytes apps/web/public/captures/explorer-symbols.jpg | Bin 0 -> 122535 bytes apps/web/public/captures/guided-setup.jpg | Bin 0 -> 60626 bytes .../web/public/captures/indexing-progress.jpg | Bin 0 -> 70948 bytes apps/web/public/placeholder-logo.png | Bin 568 -> 0 bytes apps/web/public/placeholder-logo.svg | 1 - apps/web/public/placeholder-user.jpg | Bin 1635 -> 0 bytes apps/web/public/placeholder.jpg | Bin 1064 -> 0 bytes apps/web/public/placeholder.svg | 1 - apps/web/scripts/audit-landing.mjs | 73 ++++ benchmarks/cgbench-v1/README.md | 129 ++----- mcp.json.example | 22 +- packages/cli/README.md | 257 +++++-------- packages/core/README.md | 98 +---- packages/graph/README.md | 151 ++------ packages/logger/README.md | 46 +-- packages/mcp-server/README.md | 129 ++----- packages/mcpb/README.md | 54 +-- packages/plugin-go/README.md | 14 +- packages/plugin-languages/README.md | 6 +- packages/plugin-nlp/README.md | 179 ++-------- packages/plugin-python/README.md | 12 +- packages/plugin-rust/README.md | 16 +- packages/plugin-typescript/README.md | 29 +- packages/types/README.md | 131 ++----- 52 files changed, 1098 insertions(+), 2666 deletions(-) create mode 100644 apps/web/components/landing/analysis-section.tsx delete mode 100644 apps/web/components/landing/architecture-section.tsx delete mode 100644 apps/web/components/landing/benchmarks-block.tsx delete mode 100644 apps/web/components/landing/code-block.tsx create mode 100644 apps/web/components/landing/explorer-section.tsx delete mode 100644 apps/web/components/landing/features-data.ts delete mode 100644 apps/web/components/landing/features-grid-section.tsx delete mode 100644 apps/web/components/landing/hero-graph-demo.tsx delete mode 100644 apps/web/components/landing/how-it-works-section.tsx delete mode 100644 apps/web/components/landing/integrations-data.ts delete mode 100644 apps/web/components/landing/integrations-section.tsx create mode 100644 apps/web/components/landing/knowledge-section.tsx create mode 100644 apps/web/components/landing/platform-section.tsx delete mode 100644 apps/web/components/landing/problem-section.tsx create mode 100644 apps/web/components/landing/release-section.tsx create mode 100644 apps/web/components/landing/setup-section.tsx create mode 100644 apps/web/public/captures/explorer-expansion.jpg create mode 100644 apps/web/public/captures/explorer-files.jpg create mode 100644 apps/web/public/captures/explorer-symbols.jpg create mode 100644 apps/web/public/captures/guided-setup.jpg create mode 100644 apps/web/public/captures/indexing-progress.jpg delete mode 100644 apps/web/public/placeholder-logo.png delete mode 100644 apps/web/public/placeholder-logo.svg delete mode 100644 apps/web/public/placeholder-user.jpg delete mode 100644 apps/web/public/placeholder.jpg delete mode 100644 apps/web/public/placeholder.svg create mode 100644 apps/web/scripts/audit-landing.mjs diff --git a/CLAUDE.md b/CLAUDE.md index 4368a69f..8870c770 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,4 +1,4 @@ -# CodeGraph — AI Assistant Skill Document +# CodeGraph: AI Assistant Skill Document CodeGraph indexes codebases into a graph database (FalkorDB) and provides MCP tools for code search, context retrieval, repository analysis, knowledge management, and raw graph queries. @@ -21,9 +21,9 @@ Configuration does not index the project. Reindexing parses structure first and ## Tool Reference (5 tool groups, 25 actions) -### 1. `search` — Find code and knowledge +### 1. `search`: Find code and knowledge -Vector search + cross-encoder reranking. Returns enriched results with complexity, callers, callees, importerCount, linkedKnowledge. +Vector search with optional cross-encoder reranking when a supported provider key is configured. Without one, search keeps vector-search ordering. Local 768-dimension embeddings remain the no-key default. Results include complexity, callers, callees, importerCount, and linkedKnowledge. | Action | Use When | Required Params | |--------|----------|-----------------| @@ -40,33 +40,33 @@ search({ action: "context", file: "src/service.ts", includeRelationships: true } search({ action: "context", symbol: "enrichedSearchV2" }) ``` -**Multi-step questions:** for complex queries that need iterative refinement, chain `search` calls in your agent — examine results, refine the query, search again. CodeGraph stays focused on per-call retrieval quality; orchestration is the agent's job. +**Multi-step questions:** for complex queries that need iterative refinement, chain `search` calls in your agent. Examine results, refine the query, and search again. CodeGraph stays focused on per-call retrieval quality; orchestration is the agent's job. -### 2. `knowledge` — Knowledge graph (8 actions) +### 2. `knowledge`: Knowledge graph (8 actions) | Action | Use When | Required Params | |--------|----------|-----------------| | `store` | Store entities, relationships, or extract facts from text | `text` | | `add` | Ingest a document (PDF, DOCX, HTML, CSV, URL, or raw text) | `input` | -| `recall` | "What do I know about X?" — with temporal and speaker queries | `text` | +| `recall` | "What do I know about X?", with temporal and speaker queries | `text` | | `query_knowledge` | Search entities by type, text, source, or fact meaning | (any filter) | | `ingest_conversation` | Ingest multi-turn conversation with speaker attribution | `text` | | `resolve_entities` | On-demand 3-tier entity deduplication | (none) | -| `decay_and_prune` | Temporal maintenance — decay relevance, prune stale entities | (none) | +| `decay_and_prune` | Temporal maintenance: decay relevance, prune stale entities | (none) | | `get_knowledge_stats` | Memory statistics | (none) | **Recall parameters (all optional):** -- `at` — ISO timestamp for point-in-time: "what was true on March 1st?" -- `from` / `to` — time range: "what changed this week?" -- `timeline: true` — full chronological history including superseded facts -- `minRelevance` — relevance-weighted search (0-1 threshold) -- `speaker` — "what has Alice said?" (follows SAID relationships) -- `includeHistory: true` — include invalidated/superseded facts +- `at`: ISO timestamp for point-in-time: "what was true on March 1st?" +- `from` / `to`: time range: "what changed this week?" +- `timeline: true`: full chronological history including superseded facts +- `minRelevance`: relevance-weighted search (0-1 threshold) +- `speaker`: "what has Alice said?" (follows SAID relationships) +- `includeHistory: true`: include invalidated/superseded facts **Query parameters (all optional):** -- `semanticQuery` — find entities by meaning, not just text -- `searchFacts` — search relationship explanations by meaning -- `source` — filter by provenance/sampleId prefix +- `semanticQuery`: find entities by meaning, not just text +- `searchFacts`: search relationship explanations by meaning +- `source`: filter by provenance/sampleId prefix **Examples:** ``` @@ -84,7 +84,7 @@ knowledge({ action: "ingest_conversation", text: "Alice: let's use Redis\nBob: a knowledge({ action: "resolve_entities" }) ``` -### 3. `codebase` — Index management +### 3. `codebase`: Index management | Action | Use When | Required Params | |--------|----------|-----------------| @@ -96,6 +96,8 @@ knowledge({ action: "resolve_entities" }) | `ping` | Test connectivity | (none) | | `profile` | Get a fast static and dynamic project snapshot | (none) | +The `profile` handler is intended to accept an optional absolute `projectPath` filter and an optional `limit` (default 10). Its published input schema currently omits both properties, so clients that enforce the schema cannot reliably send them. Calling `profile` without either property remains schema-valid and returns the unfiltered snapshot. + Widen the persisted git history window during reindexing when deeper history is needed: ``` codebase({ action: "reindex", mode: "full", scope: "/path/to/project", historySince: "2024-01-01T00:00:00Z", historyMaxCommits: 20000 }) @@ -141,17 +143,17 @@ query({ cypher: "MATCH (f:Function) WHERE f.name CONTAINS $name RETURN f.name, f ## Workflow Guides ### Codebase Onboarding -1. `codebase({ action: "stats" })` — get overview -2. `search({ action: "find", query: "main index app" })` — find entry points -3. `search({ action: "context", file: "", includeRelationships: true })` — understand architecture +1. `codebase({ action: "stats" })`: get overview +2. `search({ action: "find", query: "main index app" })`: find entry points +3. `search({ action: "context", file: "", includeRelationships: true })`: understand architecture ### Find and Understand Code -1. `search({ action: "find", query: "authentication" })` — find relevant symbols -2. `search({ action: "context", symbol: "" })` — see callers, imports, relationships -3. `codebase({ action: "source", path: "" })` — read the actual code +1. `search({ action: "find", query: "authentication" })`: find relevant symbols +2. `search({ action: "context", symbol: "" })`: see callers, imports, relationships +3. `codebase({ action: "source", path: "" })`: read the actual code ### Unified Search (Code + Knowledge) -1. `search({ action: "find", query: "retry logic", searchScope: "all" })` — search both code and knowledge +1. `search({ action: "find", query: "retry logic", searchScope: "all" })`: search both code and knowledge 2. Results include both code symbols and knowledge entities, ranked by RRF fusion ### Analyze Change Risk @@ -164,27 +166,28 @@ query({ cypher: "MATCH (f:Function) WHERE f.name CONTAINS $name RETURN f.name, f 2. `analyze({ action: "dead_code", projectPath: "" })`: review unreferenced export candidates 3. `analyze({ action: "hotspots", projectPath: "" })`: rank frequently changed files 4. `analyze({ action: "change_coupling", projectPath: "" })`: find correlated file changes -5. Treat historyCoverage as the observed indexed window, not all-time repository history +5. `analyze({ action: "ownership", projectPath: "" })`: review inferred per-file authorship contributors +6. Treat `historyCoverage` as the observed indexed window, not all-time repository history. Ownership reflects authorship inferred from that indexed history, not CODEOWNERS, review activity, expertise, or current team assignment. ### Ingest Documents -1. `knowledge({ action: "add", input: "/path/to/spec.pdf" })` — auto-detects format, chunks, extracts entities +1. `knowledge({ action: "add", input: "/path/to/spec.pdf" })`: auto-detects format, chunks, extracts entities 2. Supported: PDF, DOCX, HTML, CSV, URLs, raw text ### Temporal Knowledge Queries -1. `knowledge({ action: "recall", text: "auth system", at: "2026-01-15T00:00:00Z" })` — point-in-time reconstruction -2. `knowledge({ action: "recall", text: "decisions", from: "2026-03-01", to: "2026-03-31" })` — what changed in March -3. `knowledge({ action: "recall", text: "AuthModule", timeline: true })` — full entity history +1. `knowledge({ action: "recall", text: "auth system", at: "2026-01-15T00:00:00Z" })`: point-in-time reconstruction +2. `knowledge({ action: "recall", text: "decisions", from: "2026-03-01", to: "2026-03-31" })`: what changed in March +3. `knowledge({ action: "recall", text: "AuthModule", timeline: true })`: full entity history ### Knowledge Capture -1. `knowledge({ action: "store", text: "" })` — extract and store entities -2. `knowledge({ action: "recall", text: "" })` — retrieve what was captured +1. `knowledge({ action: "store", text: "" })`: extract and store entities +2. `knowledge({ action: "recall", text: "" })`: retrieve what was captured ## Anti-Patterns -- **Don't** pass raw user input to `query` — use parameterized queries with `params` -- **Don't** fetch everything — always use `limit` and `scope` to constrain results +- **Don't** pass raw user input to `query`. Use parameterized queries with `params` +- **Don't** fetch everything. Always use `limit` and `scope` to constrain results - **Don't** use `query` for things `search` or `analyze` can do. The purpose-built tools have safer bounds and clearer caveats. -- **Don't** call `codebase({ action: "reindex" })` repeatedly — use `mode: "incremental"` (the default) +- **Don't** call `codebase({ action: "reindex" })` repeatedly. Use `mode: "incremental"` (the default) ## Environment @@ -196,6 +199,6 @@ query({ cypher: "MATCH (f:Function) WHERE f.name CONTAINS $name RETURN f.name, f - **Build**: `pnpm build` (monorepo with Turbo) - **Test**: `pnpm test` -## Public Benchmark — CGBench v1 +## Public Benchmark: CGBench v1 Cross-system retrieval benchmark at `benchmarks/cgbench-v1/`. Compares CodeGraph against 7 named competitors on a uniform 6-task battery (NL→code, structural, multi-hop, bitemporal, linked code+knowledge, document ingestion). Results published in [`benchmarks/cgbench-v1/BENCHMARKS.md`](benchmarks/cgbench-v1/BENCHMARKS.md). Methodology: [`benchmarks/cgbench-v1/COMPETITORS.md`](benchmarks/cgbench-v1/COMPETITORS.md), [`benchmarks/cgbench-v1/questions/REVIEW.md`](benchmarks/cgbench-v1/questions/REVIEW.md). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4d55e87e..ab0ad749 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,6 +51,7 @@ Include the commands and results in the pull request. CI repeats the repository - Keep public functions typed and validate data at system boundaries. - Add tests for new behavior and regressions. - Update user-facing documentation when commands, configuration, or behavior changes. +- For documentation and landing-page changes, avoid the em dash character U+2014 and verify links and factual copy against merged source. - Call out security, compatibility, migration, and release effects. - Never commit generated `dist` directories, secrets, `.env` files, local `.codegraph` data, or benchmark output containing local paths. diff --git a/README.md b/README.md index 723251e5..62a1fdb3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ CodeGraph turns source code and project knowledge into a searchable graph for AI ## Access the project -- [Live application](https://v0-landing-page-build-kappa-virid.vercel.app) +- [Landing page](https://v0-landing-page-build-kappa-virid.vercel.app) - [Source code](https://github.com/Phoenixrr2113/codebase-graph) - [Issues](https://github.com/Phoenixrr2113/codebase-graph/issues) - [Discussions](https://github.com/Phoenixrr2113/codebase-graph/discussions) @@ -26,6 +26,7 @@ The public npm package is named `codegraph-mcp`. Its npm link, version badge, an - Stores project facts with `valid_at` and `invalid_at` timestamps for point-in-time queries. - Supports first-class TypeScript, JavaScript, Python, Go, Rust, and Markdown parsing, with generic tree-sitter support for additional languages. - Runs with embedded FalkorDBLite on Linux x64 and Apple silicon macOS, or an external FalkorDB service on any supported Node.js platform. Apple silicon requires Homebrew `libomp` and `openssl@3` runtime libraries. +- Explores exact graph totals in Files or Symbols view with most-connected-first windows, Previous/Next paging, append-style loading, in-place neighbor expansion, and a Files-view toggle for unresolved external modules. - Exposes `analyze`, `codebase`, `knowledge`, `query`, and `search` MCP tools. ## Choose how to start @@ -50,17 +51,17 @@ Add this server configuration to an MCP client: In the first conversation, ask the agent to check CodeGraph status: ```json -{"action":"status"} +{"method":"tools/call","params":{"name":"codebase","arguments":{"action":"status"}}} ``` On a fresh install, `codebase` status returns `configured: false` and `setupRequired: true`. An empty database is a valid first run. Configure one absolute project path, then start a full index: ```json -{"action":"configure","projectAction":"set","projects":["/absolute/path/to/project"]} +{"method":"tools/call","params":{"name":"codebase","arguments":{"action":"configure","projectAction":"set","projects":["/absolute/path/to/project"]}}} ``` ```json -{"action":"reindex","mode":"full","scope":"/absolute/path/to/project"} +{"method":"tools/call","params":{"name":"codebase","arguments":{"action":"reindex","mode":"full","scope":"/absolute/path/to/project"}}} ``` Configuration saves the project but does not index it. The full reindex parses structure first and then finishes embeddings. With the local provider, `codebase` status includes model load and indexing state while work is running. @@ -73,7 +74,7 @@ Start the dashboard directly from the package: npx -y --package codegraph-mcp codegraph-dashboard ``` -Open the URL printed by the process. A fresh database opens on the setup flow. Confirm storage and embeddings, use Browse to choose a folder, then select Index project. The page shows model download and indexing progress, finishes remaining embeddings automatically, and reports file, symbol, edge, and embedding counts before opening the graph explorer. +Open the URL printed by the process. A fresh database opens on the setup flow. Confirm storage and embeddings, choose Browse to select a folder, then select Index project. The page shows model download and indexing progress, finishes remaining embeddings automatically, and reports file, symbol, edge, and embedding counts before opening the graph explorer. The dashboard and MCP server are separate entry points. They can run at the same time against the same data path. @@ -125,13 +126,13 @@ Provider, model, and dimension are stored with the graph. If any of them changes | Tool | Purpose | | --- | --- | -| `analyze` | Inspect impact, call hierarchy, cycles, dead-code candidates, hotspots, and change coupling | +| `analyze` | Inspect impact, call hierarchy, cycles, dead-code candidates, hotspots, change coupling, and ownership inferred from indexed git history | | `search` | Find code and project knowledge by name, structure, or meaning | | `knowledge` | Store and recall entities, relationships, facts, and documents | | `codebase` | Configure projects, index code, inspect status, and read source | | `query` | Run read-only Cypher queries against the graph | -Set `CODEGRAPH_RAW_TOOLS=1` to expose lower-level handlers instead of the five grouped tools. +Set `CODEGRAPH_RAW_TOOLS=true` to expose lower-level handlers alongside the five grouped tools. ## Configuration @@ -150,6 +151,7 @@ Set `CODEGRAPH_RAW_TOOLS=1` to expose lower-level handlers instead of the five g | `CEREBRAS_API_KEY` | Optional LLM-backed knowledge extraction | | `API_PORT` | Dashboard and REST API port, default `3001`; use the printed URL | | `CODEGRAPH_BROWSE_ROOTS` | Additional absolute dashboard Browse roots, separated by commas | +| `CODEGRAPH_RAW_TOOLS` | Set to the literal value `true` to expose raw handlers alongside the five grouped MCP tools | Never commit provider keys. Put secrets in the MCP client's protected environment configuration or a local ignored `.env` file. diff --git a/SECURITY.md b/SECURITY.md index 88711031..2a8a449a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -17,7 +17,7 @@ Include affected versions, impact, reproduction steps, and any suggested mitigat The maintainer will aim to acknowledge a report within 72 hours, provide status updates while it is investigated, and coordinate disclosure after a fix is available. Response and remediation timing depend on severity and reproducibility. -## Known advisories in the published package +## Known advisories in the package dependency tree `npm audit` reports findings against `codegraph-mcp` that we cannot resolve from this repository. They are listed here rather than suppressed, and the release pipeline enforces diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 807b8f0b..dd914536 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -3,19 +3,27 @@ import { Analytics } from '@vercel/analytics/next' import './globals.css' export const metadata: Metadata = { - title: 'CodeGraph — Deep Codebase Understanding for AI Agents', - description: 'CodeGraph builds a queryable knowledge graph of every function, class, and relationship in your codebase — then gives your AI assistant the tools to search, analyze, and navigate it.', + title: 'CodeGraph | Local-first code intelligence for AI agents', + description: 'CodeGraph indexes supported code structure, relationships, git history, and project knowledge into a local-first graph for AI agents and developers.', keywords: ['CodeGraph', 'MCP', 'AI agent', 'codebase', 'knowledge graph', 'tree-sitter', 'FalkorDB', 'developer tools'], authors: [{ name: 'CodeGraph' }], + icons: { + icon: [ + { url: '/icon.svg', type: 'image/svg+xml' }, + { url: '/icon-light-32x32.png', media: '(prefers-color-scheme: light)' }, + { url: '/icon-dark-32x32.png', media: '(prefers-color-scheme: dark)' }, + ], + apple: '/apple-icon.png', + }, openGraph: { - title: 'CodeGraph — Deep Codebase Understanding for AI Agents', - description: 'Your AI agent doesn\'t understand your codebase. CodeGraph fixes that.', + title: 'CodeGraph | Local-first code intelligence for AI agents', + description: 'Index supported code structure, relationships, git history, and project knowledge into a graph your tools can query.', type: 'website', }, twitter: { card: 'summary_large_image', - title: 'CodeGraph — Deep Codebase Understanding for AI Agents', - description: 'Your AI agent doesn\'t understand your codebase. CodeGraph fixes that.', + title: 'CodeGraph | Local-first code intelligence for AI agents', + description: 'Index supported code structure, relationships, git history, and project knowledge into a graph your tools can query.', }, } @@ -34,7 +42,7 @@ export default function RootLayout({ {children} - + {process.env.VERCEL === '1' ? : null} ) diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 84cb7992..37f8d694 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -1,37 +1,30 @@ -import { Navigation } from "@/components/landing/navigation" -import { HeroSection } from "@/components/landing/hero-section" -import { ProblemSection } from "@/components/landing/problem-section" -import { HowItWorksSection } from "@/components/landing/how-it-works-section" -import { FeaturesGridSection } from "@/components/landing/features-grid-section" -import { features } from "@/components/landing/features-data" -import { IntegrationsSection } from "@/components/landing/integrations-section" -import { integrations } from "@/components/landing/integrations-data" -import { ArchitectureSection } from "@/components/landing/architecture-section" -import { TechCredibilityBar, Footer } from "@/components/landing/footer-section" +import { AnalysisSection } from "@/components/landing/analysis-section" import { AuroraBackground } from "@/components/landing/aurora-background" -import { highlight } from "@/lib/highlight" - -export default async function LandingPage() { - const featuresHighlighted = await Promise.all( - features.map((f) => highlight(f.snippet, "ts")) - ) - const integrationsHighlightedEntries = await Promise.all( - integrations.map(async (i) => [i.id, await highlight(i.snippet, i.lang)] as const) - ) - const integrationsHighlighted = Object.fromEntries(integrationsHighlightedEntries) +import { ExplorerSection } from "@/components/landing/explorer-section" +import { Footer, TechnicalBar } from "@/components/landing/footer-section" +import { HeroSection } from "@/components/landing/hero-section" +import { KnowledgeSection } from "@/components/landing/knowledge-section" +import { Navigation } from "@/components/landing/navigation" +import { PlatformSection } from "@/components/landing/platform-section" +import { ReleaseSection } from "@/components/landing/release-section" +import { SetupSection } from "@/components/landing/setup-section" +export default function LandingPage() { return ( -
+
- - - - - - - +
+ + + + + + + +
+
-
+ ) } diff --git a/apps/web/components/landing/analysis-section.tsx b/apps/web/components/landing/analysis-section.tsx new file mode 100644 index 00000000..d6a59d86 --- /dev/null +++ b/apps/web/components/landing/analysis-section.tsx @@ -0,0 +1,66 @@ +"use client" + +import { motion } from "framer-motion" +import { AlertTriangle, GitCommitHorizontal } from "lucide-react" + +const actions = [ + { name: "impact", detail: "Bounded static blast radius from a persisted symbol." }, + { name: "import_cycles", detail: "Canonical cycles within one project root." }, + { name: "call_hierarchy", detail: "Direct callers, callees, or both." }, + { name: "dead_code", detail: "Unreferenced export candidates, not runtime proof." }, + { name: "hotspots", detail: "Change frequency ranked with complexity or degree." }, + { name: "change_coupling", detail: "Files that changed together in indexed history." }, + { name: "ownership", detail: "Per-file contributors ranked from indexed git authorship." }, +] + +export function AnalysisSection() { + return ( +
+
+
+
+

Analysis

+

Seven bounded answers, with their limits attached.

+

+ The analyze tool does not collapse uncertainty into a score. Responses include display-ready caveats and truncation metadata. Git-backed results also include historyCoverage. +

+ +
+
+
+

Static results do not prove runtime behavior. Ownership, hotspots, and coupling cover indexed history only.

+
+ +
+
+
+

+ First sync defaults to 365 days and at most 10,000 commits. Later requests are widen-only. MCP reindex, REST parse, and CLI extraction expose the history options. +

+
+
+ +
+ {actions.map((action, index) => ( + +

{action.name}

+

{action.detail}

+
+ ))} +
+
+
+
+ ) +} diff --git a/apps/web/components/landing/architecture-section.tsx b/apps/web/components/landing/architecture-section.tsx deleted file mode 100644 index 55922839..00000000 --- a/apps/web/components/landing/architecture-section.tsx +++ /dev/null @@ -1,96 +0,0 @@ -"use client" - -import { motion } from "framer-motion" -import { FileCode2, Layers, Database, Wrench, Monitor, ChevronRight, ChevronDown } from "lucide-react" -import { BenchmarksBlock } from "./benchmarks-block" - -// source: CLAUDE.md "Pipeline: vector embeddings → FalkorDB HNSW → cross-encoder reranking → graph enrichment" -const flowSteps = [ - { icon: FileCode2, label: "Your codebase", sublabel: "any language" }, - { icon: Layers, label: "Tree-sitter parser", sublabel: "5 tier-1 + ~30 generic" }, - { icon: Database, label: "FalkorDB / Lite", sublabel: "vector + graph" }, - { icon: Wrench, label: "MCP router", sublabel: "4 persona tools" }, - { icon: Monitor, label: "Your AI host", sublabel: "Claude, Cursor, etc." }, -] - -// source: CLAUDE.md "Graph DB: FalkorDB (Docker) or FalkorDBLite (embedded)" -const stackNotes = [ - "FalkorDB (Docker) or FalkorDBLite (embedded — no Docker, requires redis-server).", - "Embeddings: Voyage, OpenRouter, or local @huggingface/transformers (nomic-embed-text-v1.5).", - "Reranker: Jina or Voyage. Cross-encoder, MRR-aware.", - "Optional cloud APIs are pluggable; the embedded path is fully local.", -] - -export function ArchitectureSection() { - return ( -
-
- -

- Architecture -

-

- FalkorDB-backed graph, tree-sitter parsers, pluggable embeddings and reranker, MCP at the edge. -

-
- - {/* Flow */} - -
- {flowSteps.map((step, i) => ( -
-
-
- -
-
{step.label}
-
{step.sublabel}
-
- {i < flowSteps.length - 1 && ( - <> - - - - )} -
- ))} -
-
- - {/* Stack notes */} -
- -

Stack

-
    - {stackNotes.map((note) => ( -
  • - - {note} -
  • - ))} -
-
- -
-
-
- ) -} diff --git a/apps/web/components/landing/benchmarks-block.tsx b/apps/web/components/landing/benchmarks-block.tsx deleted file mode 100644 index a3d9b545..00000000 --- a/apps/web/components/landing/benchmarks-block.tsx +++ /dev/null @@ -1,51 +0,0 @@ -"use client" - -import { motion } from "framer-motion" -import { Activity } from "lucide-react" - -// All numbers source: MEMORY.md "Current baseline (v6 Chunk 1, 2026-04-26)" -const benchmarks = [ - { value: "0.969", label: "MRR" }, - { value: "94%", label: "S@1" }, - { value: "100%", label: "S@5" }, - { value: "447ms", label: "Latency" }, -] - -export function BenchmarksBlock() { - return ( - -
-
- -
-

Internal benchmark

-
-
- {benchmarks.map((b) => ( -
-
{b.value}
-
{b.label}
-
- ))} -
-

- 2,310-node test set, v6 Chunk 1 baseline (2026-04-26).{" "} - - CGBench v1 methodology and results - - . -

-
- ) -} diff --git a/apps/web/components/landing/code-block.tsx b/apps/web/components/landing/code-block.tsx deleted file mode 100644 index e032c9e3..00000000 --- a/apps/web/components/landing/code-block.tsx +++ /dev/null @@ -1,188 +0,0 @@ -"use client" - -import { useState } from "react" -import { Check, Copy, Terminal } from "lucide-react" -import { cn } from "@/lib/utils" - -interface CodeBlockProps { - code: string - language?: string - filename?: string - showLineNumbers?: boolean - className?: string -} - -export function CodeBlock({ - code, - language = "bash", - filename, - showLineNumbers = false, - className -}: CodeBlockProps) { - const [copied, setCopied] = useState(false) - - const copyToClipboard = async () => { - await navigator.clipboard.writeText(code) - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } - - const lines = code.split("\n") - - return ( -
- {filename && ( -
-
- - {filename} -
- -
- )} -
- {!filename && ( - - )} -
-          
-            {lines.map((line, i) => (
-              
- {showLineNumbers && ( - - {i + 1} - - )} - - - -
- ))} -
-
-
-
- ) -} - -function SyntaxHighlight({ line, language }: { line: string; language: string }) { - if (language === "json") { - return - } - if (language === "bash") { - return - } - return {line} -} - -function JsonHighlight({ line }: { line: string }) { - // Simple JSON syntax highlighting - const parts = line.split(/("(?:[^"\\]|\\.)*")/g) - - return ( - <> - {parts.map((part, i) => { - if (part.startsWith('"') && part.endsWith('"')) { - // Check if it's a key (followed by colon in original line) - const isKey = line.includes(`${part}:`) - return ( - - {part} - - ) - } - // Highlight keywords - return ( - - {part.split(/\b(true|false|null)\b/).map((subpart, j) => { - if (["true", "false", "null"].includes(subpart)) { - return {subpart} - } - return {subpart} - })} - - ) - })} - - ) -} - -function BashHighlight({ line }: { line: string }) { - // Simple bash syntax highlighting - if (line.startsWith("#")) { - return {line} - } - if (line.startsWith("$")) { - return ( - <> - $ - {line.slice(1)} - - ) - } - - const parts = line.split(/(\s+)/g) - return ( - <> - {parts.map((part, i) => { - if (i === 0 && !part.match(/^\s+$/)) { - return {part} - } - if (part.startsWith("--") || part.startsWith("-")) { - return {part} - } - if (part.startsWith('"') || part.startsWith("'")) { - return {part} - } - return {part} - })} - - ) -} - -// Terminal block with animated typing cursor -export function TerminalBlock({ - children, - title = "Terminal", - className -}: { - children: React.ReactNode - title?: string - className?: string -}) { - return ( -
-
-
-
-
-
-
- {title} -
-
- {children} -
-
- ) -} diff --git a/apps/web/components/landing/explorer-section.tsx b/apps/web/components/landing/explorer-section.tsx new file mode 100644 index 00000000..e84cac06 --- /dev/null +++ b/apps/web/components/landing/explorer-section.tsx @@ -0,0 +1,89 @@ +"use client" + +import Image from "next/image" +import { motion } from "framer-motion" +import { Expand, Layers3, Rows3 } from "lucide-react" + +const explorerDetails = [ + { + icon: Layers3, + title: "Choose the level", + copy: "Switch between Files and Symbols. Files mode adds an Externals visibility toggle for unresolved module nodes.", + }, + { + icon: Rows3, + title: "Move through exact totals", + copy: "Windows are ordered most connected first. Use Previous and Next for pages, or Load next to append another window without losing the current graph.", + }, + { + icon: Expand, + title: "Expand in place", + copy: "Select a node and add its neighbors around it. Existing positions, pan, and zoom stay intact so exploration keeps its spatial context.", + }, +] + +export function ExplorerSection() { + return ( +
+
+
+

Explorer proof

+

A large graph stays countable, pageable, and oriented.

+

+ CodeGraph reports exact totals while rendering bounded windows. On this final project-scoped index, the explorer counted 19,055 visible nodes. Its 1,000-node compact response was 305,248 bytes instead of 750,767 bytes, 59% smaller than the legacy wire format. +

+
+ +
+ {explorerDetails.map((detail, index) => ( + + + ))} +
+ +
+
+ CodeGraph Graph Explorer in Symbols mode with exact loaded and total counts, most-connected-first ordering, Previous and Next paging, and Load next controls +
Symbols mode over this repository, captured from the real dashboard.
+
+
+ CodeGraph Graph Explorer in Files mode with the Externals visibility toggle and exact file graph totals +
Files mode makes the Externals control explicit.
+
+
+ CodeGraph Graph Explorer after in-place neighbor expansion, with the selected node and its newly added neighbors visible in the preserved viewport +
Neighbor expansion adds context without resetting the viewport.
+
+
+
+
+ ) +} diff --git a/apps/web/components/landing/features-data.ts b/apps/web/components/landing/features-data.ts deleted file mode 100644 index ef70fc61..00000000 --- a/apps/web/components/landing/features-data.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Search, Clock, FileText, Users, Layers, Boxes } from "lucide-react" -import type { LucideIcon } from "lucide-react" - -export interface Feature { - icon: LucideIcon - title: string - description: string - snippet: string -} - -// All feature copy and snippets traced to CLAUDE.md tool reference. -export const features: Feature[] = [ - { - icon: Search, - title: "Search pipeline", - description: - "Vector embeddings → cross-encoder reranking → graph enrichment. Returns symbols with their callers, callees, complexity, and linked knowledge.", - snippet: `search({\n action: "find",\n query: "authentication"\n})`, - }, - { - icon: Clock, - title: "Bitemporal knowledge", - description: - "Every fact carries valid_at and invalid_at. Query the graph as it existed on a past date, see full timelines, watch supersession happen.", - snippet: `knowledge({\n action: "recall",\n text: "AuthModule",\n at: "2026-03-01T00:00:00Z"\n})`, - }, - { - icon: FileText, - title: "Document ingestion", - description: - "Drop a PDF, DOCX, HTML, CSV, or URL into knowledge.add(). It chunks, embeds, extracts entities, and links them into the same graph as the code.", - snippet: `knowledge({\n action: "add",\n input: "/path/to/spec.pdf"\n})`, - }, - { - icon: Users, - title: "Speaker entities", - description: - "Ingest a multi-turn conversation; CodeGraph creates Person nodes with SAID edges to facts. Ask 'what has Alice said about retries?' and get an answer.", - snippet: `knowledge({\n action: "ingest_conversation",\n text: "Alice: let's use Redis...",\n source: "standup"\n})`, - }, - { - icon: Layers, - title: "MCP App UI panel", - description: - "The graph_explorer MCP tool ships as an App UI panel that renders the Graph Explorer canvas inside Claude Desktop or Cursor — interactive, in-conversation.", - snippet: `// Surfaced automatically when CodeGraph\n// is configured as an MCP server`, - }, - { - icon: Boxes, - title: "Drop-in middleware", - description: - "Wrap any Vercel AI SDK model with withCodeGraph(); register a Mastra processor with createCodeGraphProcessor(). Your existing agent gets graph-aware context.", - snippet: `import { withCodeGraph }\n from "@codegraph/tools/vercel"\n\nconst model = withCodeGraph(\n openai("gpt-4o")\n)`, - }, -] diff --git a/apps/web/components/landing/features-grid-section.tsx b/apps/web/components/landing/features-grid-section.tsx deleted file mode 100644 index ba1fcc55..00000000 --- a/apps/web/components/landing/features-grid-section.tsx +++ /dev/null @@ -1,66 +0,0 @@ -"use client" - -import { motion } from "framer-motion" -import { features } from "./features-data" -export { features } from "./features-data" - -interface FeaturesGridSectionProps { - highlighted: string[] -} - -export function FeaturesGridSection({ highlighted }: FeaturesGridSectionProps) { - return ( -
-
- -

- Everything an agent needs to navigate your codebase. -

-

- Six capabilities, one graph. Each one exposed through MCP, the AI SDK, or both. -

-
- -
- {features.map((feature, i) => { - const Icon = feature.icon - return ( - -
- -
-

- {feature.title} -

-

- {feature.description} -

-
${feature.snippet}` }} - /> - - ) - })} -
-
-
- ) -} diff --git a/apps/web/components/landing/footer-section.tsx b/apps/web/components/landing/footer-section.tsx index 27d5a6eb..14ad1148 100644 --- a/apps/web/components/landing/footer-section.tsx +++ b/apps/web/components/landing/footer-section.tsx @@ -1,90 +1,72 @@ "use client" import { motion } from "framer-motion" -import { Github, FileText, GitGraph } from "lucide-react" +import { FileText, Github, GitGraph, LockKeyhole, Scale, ShieldAlert } from "lucide-react" -// source: MEMORY.md "v6 Chunk 1 baseline (2026-04-26)"; CLAUDE.md "5 tier-1 language plugins" -const techStats = [ - "5 tier-1 languages + ~30 via tree-sitter", - "MRR 0.969 on internal benchmark", - "Bitemporal knowledge graph", - "MCP App UI panel", - "Vercel AI SDK + Mastra middleware", +const technicalDetails = [ + "5 MCP tool groups", + "25 actions", + "TypeScript, Python, Go, Rust, Markdown", + "Generic tree-sitter coverage", "MIT licensed", ] - const footerLinks = [ - { label: "GitHub", href: "https://github.com/Phoenixrr2113/codebase-graph", icon: Github }, - { label: "Docs (CLAUDE.md)", href: "https://github.com/Phoenixrr2113/codebase-graph/blob/main/CLAUDE.md", icon: FileText }, + { label: "Source", href: "https://github.com/Phoenixrr2113/codebase-graph", icon: Github }, + { label: "README", href: "https://github.com/Phoenixrr2113/codebase-graph/blob/main/README.md", icon: FileText }, + { label: "Issues", href: "https://github.com/Phoenixrr2113/codebase-graph/issues", icon: ShieldAlert }, + { label: "Security", href: "https://github.com/Phoenixrr2113/codebase-graph/blob/main/SECURITY.md", icon: LockKeyhole }, + { label: "License", href: "https://github.com/Phoenixrr2113/codebase-graph/blob/main/LICENSE", icon: Scale }, ] -export function TechCredibilityBar() { +export function TechnicalBar() { return ( - -
-
- {techStats.map((stat, i) => ( - - {i > 0 && |} - {stat} - - ))} -
+
+
+ {technicalDetails.map((detail, index) => ( + + {index > 0 && } + {detail} + + ))}
- +
) } export function Footer() { return ( -