From afbc58d9bff5543c32015b8357b0e1fda12dc9a5 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Wed, 15 Apr 2026 21:45:30 +0800 Subject: [PATCH] feat(frontend): landing pages with Command as Service concept - Add landing subpages: pricing, skills, solutions, network, about, docs - Nav pop cards link to all subpages with nested routes - Homepage: full landing content with top nav (no sidebar) for logged-in users - Rewrite copy based on real backend: Git repos, Issues/PRs, Rooms, AI Agents - Introduce "Command as Service" as core product concept - Terminal demo shows realistic gitdata CLI commands - Footer links updated to real routes - Fix workspace redirect slug guard (undefined route) --- src/App.tsx | 34 +++++ src/app/about/page.tsx | 95 ++++++++++++++ src/app/docs/page.tsx | 115 +++++++++++++++++ src/app/homepage/layout.tsx | 45 +++++++ src/app/homepage/page.tsx | 15 +++ src/app/network/api/page.tsx | 81 ++++++++++++ src/app/network/page.tsx | 97 ++++++++++++++ src/app/network/rooms/page.tsx | 89 +++++++++++++ src/app/pricing/enterprise/page.tsx | 96 ++++++++++++++ src/app/pricing/faq/page.tsx | 70 +++++++++++ src/app/pricing/page.tsx | 131 +++++++++++++++++++ src/app/skills/docs/page.tsx | 62 +++++++++ src/app/skills/page.tsx | 133 ++++++++++++++++++++ src/app/skills/publish/page.tsx | 77 ++++++++++++ src/app/solutions/governance/page.tsx | 99 +++++++++++++++ src/app/solutions/memory/page.tsx | 80 ++++++++++++ src/app/solutions/page.tsx | 106 ++++++++++++++++ src/app/solutions/rooms/page.tsx | 94 ++++++++++++++ src/app/workspace/redirect.tsx | 4 +- src/components/landing/index.ts | 1 + src/components/landing/landing-footer.tsx | 52 ++++---- src/components/landing/landing-layout.tsx | 22 ++++ src/components/landing/landing-nav.tsx | 79 ++++++++++-- src/components/landing/landing-sections.tsx | 108 +++++++++------- 24 files changed, 1709 insertions(+), 76 deletions(-) create mode 100644 src/app/about/page.tsx create mode 100644 src/app/docs/page.tsx create mode 100644 src/app/homepage/layout.tsx create mode 100644 src/app/homepage/page.tsx create mode 100644 src/app/network/api/page.tsx create mode 100644 src/app/network/page.tsx create mode 100644 src/app/network/rooms/page.tsx create mode 100644 src/app/pricing/enterprise/page.tsx create mode 100644 src/app/pricing/faq/page.tsx create mode 100644 src/app/pricing/page.tsx create mode 100644 src/app/skills/docs/page.tsx create mode 100644 src/app/skills/page.tsx create mode 100644 src/app/skills/publish/page.tsx create mode 100644 src/app/solutions/governance/page.tsx create mode 100644 src/app/solutions/memory/page.tsx create mode 100644 src/app/solutions/page.tsx create mode 100644 src/app/solutions/rooms/page.tsx create mode 100644 src/components/landing/landing-layout.tsx diff --git a/src/App.tsx b/src/App.tsx index 45ef7d8..d83d8f3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -59,6 +59,21 @@ import NotifyLayout from '@/app/notify/layout'; import NotifyPage from '@/app/notify/page'; import LandingPage from '@/app/page'; import SearchPage from '@/app/search/page'; +import PricingPage from '@/app/pricing/page'; +import SkillsPage from '@/app/skills/page'; +import SolutionsPage from '@/app/solutions/page'; +import NetworkPage from '@/app/network/page'; +import AboutPage from '@/app/about/page'; +import DocsPage from '@/app/docs/page'; +import SolutionsRoomsPage from '@/app/solutions/rooms/page'; +import SolutionsMemoryPage from '@/app/solutions/memory/page'; +import SolutionsGovernancePage from '@/app/solutions/governance/page'; +import SkillsPublishPage from '@/app/skills/publish/page'; +import SkillsDocsPage from '@/app/skills/docs/page'; +import NetworkRoomsPage from '@/app/network/rooms/page'; +import NetworkApiPage from '@/app/network/api/page'; +import PricingEnterprisePage from '@/app/pricing/enterprise/page'; +import PricingFaqPage from '@/app/pricing/faq/page'; import {ProtectedRoute} from '@/components/auth/protected-route'; import {WorkspaceLayout} from '@/app/workspace/layout'; import {WorkspaceOverview} from '@/app/workspace/overview'; @@ -69,6 +84,7 @@ import {WorkspaceBilling} from '@/app/workspace/billing'; import {AcceptWorkspaceInvitePage} from '@/app/auth/accept-workspace-invite-page'; import {WorkspaceRedirect} from '@/app/workspace/redirect'; import {InitWorkspace} from '@/app/init/workspace'; +import HomePage from '@/app/homepage/page'; function App() { return ( @@ -85,7 +101,25 @@ function App() { }/> + {/* Landing sub-pages */} + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }> + }/> }/> diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx new file mode 100644 index 0000000..c5b9250 --- /dev/null +++ b/src/app/about/page.tsx @@ -0,0 +1,95 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {ArrowRight, Book} from 'lucide-react'; + +const TEAM = [ + {name: 'Alex Chen', role: 'Founder & CEO', initials: 'AC'}, + {name: 'Sarah Kim', role: 'CTO', initials: 'SK'}, + {name: 'Marcus Johnson', role: 'Head of Engineering', initials: 'MJ'}, + {name: 'Priya Patel', role: 'Head of Product', initials: 'PP'}, +]; + +export default function AboutPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Hero */} +
+

+ About GitDataAI +

+

+ We believe the next era of software will be built by humans and AI agents working together. We are building the infrastructure for that era. +

+
+ + {/* Mission */} +
+

+ "Interaction is the new code. Conversations are the new commits." +

+

+ GitDataAI was founded to bring engineering rigor to the agentic era — version control, collaboration, and governance to the world of autonomous AI. +

+
+ + {/* Values */} +
+

Our Values

+
+ {[ + ['Transparency', 'Every agent decision is logged, versioned, and auditable. No black boxes.'], + ['Collaboration', 'Humans and agents are peers. Neither replaces the other — together they achieve more.'], + ['Reliability', 'Production-grade infrastructure. Your agents run when you need them to.'], + ['Extensibility', 'Open registry, open API. The network grows through community contributions.'], + ].map(([title, desc]) => ( +
+

{title}

+

{desc}

+
+ ))} +
+
+ + {/* Team */} +
+

The Team

+
+ {TEAM.map(member => ( +
+
+ {member.initials} +
+

{member.name}

+

{member.role}

+
+ ))} +
+
+ + {/* CTA */} +
+

We are hiring. Come build with us.

+
+ + +
+
+
+
+
+ ); +} diff --git a/src/app/docs/page.tsx b/src/app/docs/page.tsx new file mode 100644 index 0000000..20c31bc --- /dev/null +++ b/src/app/docs/page.tsx @@ -0,0 +1,115 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Book, Code2, Command, FileText, Layers} from 'lucide-react'; + +const DOCS_SECTIONS = [ + { + icon: Book, + title: 'Getting Started', + links: ['Quick Start', 'Installation', 'Core Concepts', 'First Agent'], + }, + { + icon: Code2, + title: 'API Reference', + links: ['Authentication', 'Agents API', 'Rooms API', 'Skills API', 'Webhooks'], + }, + { + icon: Layers, + title: 'Agent SDK', + links: ['SDK Setup', 'Memory Management', 'Tool Calling', 'Skill Development'], + }, + { + icon: Command, + title: 'CLI Reference', + links: ['Installation', 'gitdata init', 'gitdata agent', 'gitdata room', 'gitdata skill'], + }, + { + icon: FileText, + title: 'Guides', + links: ['Deploying Agents', 'Building Skills', 'Network Integration', 'Enterprise Setup'], + }, + { + icon: Code2, + title: 'Open Source', + links: ['GitHub Repository', 'Contributing', 'Changelog', 'Roadmap'], + }, +]; + +export default function DocsPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Hero */} +
+

+ Documentation +

+

+ Everything you need to build, deploy, and scale agentic workflows on GitDataAI. +

+
+ + {/* Search */} +
+
+ + +
+
+ + {/* Sections */} +
+ {DOCS_SECTIONS.map(section => ( +
+
+
+ +
+

{section.title}

+
+ +
+ ))} +
+ + {/* Quick start CTA */} +
+

Quick Start

+

+ Get your first agent running in under 5 minutes. +

+
+ npx gitdata@latest init +
+
+ +
+
+
+
+
+ ); +} diff --git a/src/app/homepage/layout.tsx b/src/app/homepage/layout.tsx new file mode 100644 index 0000000..2337e67 --- /dev/null +++ b/src/app/homepage/layout.tsx @@ -0,0 +1,45 @@ +import {Outlet} from 'react-router-dom'; +import {WorkspaceSidebar} from '@/components/layout/workspace-sidebar'; +import {useQuery} from '@tanstack/react-query'; +import {workspaceList} from '@/client'; +import {Spinner} from '@/components/ui/spinner'; +import {useNavigate} from 'react-router-dom'; + +export default function HomePageLayout() { + const navigate = useNavigate(); + + const {data, isLoading} = useQuery({ + queryKey: ['workspaceList'], + queryFn: async () => { + const resp = await workspaceList(); + return resp.data?.data; + }, + }); + + if (isLoading) { + return ( +
+ +
+ ); + } + + const workspace = data?.workspaces?.[0]; + + if (!workspace) { + return ( +
+
Loading workspace...
+
+ ); + } + + return ( +
+ +
+ +
+
+ ); +} diff --git a/src/app/homepage/page.tsx b/src/app/homepage/page.tsx new file mode 100644 index 0000000..25f8746 --- /dev/null +++ b/src/app/homepage/page.tsx @@ -0,0 +1,15 @@ +import {LandingNav} from '@/components/landing/landing-nav'; +import {LandingHero, LandingFeatures, LandingHighlight} from '@/components/landing/landing-sections'; + +export default function HomePage() { + return ( +
+
+ + {}}/> + + +
+ ); +} diff --git a/src/app/network/api/page.tsx b/src/app/network/api/page.tsx new file mode 100644 index 0000000..b2b2c23 --- /dev/null +++ b/src/app/network/api/page.tsx @@ -0,0 +1,81 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Globe, Key, Terminal} from 'lucide-react'; + +const ENDPOINTS = [ + {method: 'GET', path: '/v1/agents', desc: 'List all agents in your workspace'}, + {method: 'POST', path: '/v1/rooms', desc: 'Create a new collaborative room'}, + {method: 'POST', path: '/v1/skills/publish', desc: 'Publish a skill to the registry'}, + {method: 'GET', path: '/v1/network/stats', desc: 'Fetch global network statistics'}, +]; + +export default function NetworkApiPage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Developer API +
+ +
+
+ +
+

+ Developer API +

+

+ Integrate GitDataAI capabilities into your own tools and workflows. Full REST API with token-based authentication. +

+
+ + {/* Auth */} +
+
+ + Authentication +
+
+ curl -H "Authorization: Bearer gdai_live_xxxx" https://api.gitdata.ai/v1/agents +
+
+ + {/* Endpoints */} +
+

Core Endpoints

+
+ {ENDPOINTS.map(ep => ( +
+ + {ep.method} + + {ep.path} + {ep.desc} +
+ ))} +
+
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/network/page.tsx b/src/app/network/page.tsx new file mode 100644 index 0000000..9d5116e --- /dev/null +++ b/src/app/network/page.tsx @@ -0,0 +1,97 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {Bot, Globe, Lock, Network, Users} from 'lucide-react'; + +const STATS = [ + {value: '12,400+', label: 'Active Agents'}, + {value: '840+', label: 'Workspaces'}, + {value: '38,000+', label: 'Skill Runs'}, + {value: '99.9%', label: 'Uptime SLA'}, +]; + +const FEATURED_ROOMS = [ + {title: 'React Performance Deep Dive', agents: 3, participants: 12, status: 'active'}, + {title: 'OSS Security Audit: actix-web', agents: 5, participants: 24, status: 'active'}, + {title: 'Rust Async Runtime Discussion', agents: 2, participants: 8, status: 'active'}, +]; + +export default function NetworkPage() { + return ( + +
+
+ {/* Hero */} +
+

+ The GitDataAI Network +

+

+ A growing ecosystem of agents, workspaces, and skills collaborating across the AI-native stack. +

+
+ + {/* Stats */} +
+ {STATS.map(stat => ( +
+
{stat.value}
+
{stat.label}
+
+ ))} +
+ + {/* Featured rooms */} +
+
+ +

Public Rooms

+ + + LIVE + +
+ +
+ {FEATURED_ROOMS.map(room => ( +
+
+ + Active + +
+ + {room.participants} +
+
+

{room.title}

+
+ + {room.agents} agents +
+
+ ))} +
+
+ + {/* Privacy */} +
+
+ +
+
+

Privacy by Default

+

+ All workspaces are private by default. You control who sees your agents, skills, and conversation history. Public rooms require explicit opt-in. +

+
+
+
+
+
+ ); +} diff --git a/src/app/network/rooms/page.tsx b/src/app/network/rooms/page.tsx new file mode 100644 index 0000000..a7dd2ad --- /dev/null +++ b/src/app/network/rooms/page.tsx @@ -0,0 +1,89 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Bot, Globe, Users} from 'lucide-react'; + +const PUBLIC_ROOMS = [ + {title: 'OSS Security Audit: actix-web', agents: 5, participants: 24, tags: ['security', 'rust', 'audit'], live: true}, + {title: 'React Performance Deep Dive', agents: 3, participants: 12, tags: ['frontend', 'react', 'performance'], live: true}, + {title: 'Python ML Pipeline Review', agents: 4, participants: 18, tags: ['python', 'ml', 'data'], live: true}, + {title: 'Rust Async Runtime Discussion', agents: 2, participants: 8, tags: ['rust', 'async', 'systems'], live: true}, + {title: 'Database Schema Design Clinic', agents: 3, participants: 15, tags: ['postgres', 'schema', 'sql'], live: true}, + {title: 'API Design Workshop', agents: 4, participants: 20, tags: ['api', 'rest', 'design'], live: false}, +]; + +export default function NetworkRoomsPage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Public Rooms +
+ +
+

+ Public Rooms +

+

+ Join open collaborative sessions where developers and AI agents work together on real engineering problems. +

+
+ + {/* Live badge */} +
+ + {PUBLIC_ROOMS.filter(r => r.live).length} rooms live now +
+ +
+ {PUBLIC_ROOMS.map(room => ( +
+
+ {room.live ? ( + + + LIVE + + ) : ( + + ENDED + + )} +
+ + {room.participants} +
+
+

{room.title}

+
+ + {room.agents} agents +
+
+ {room.tags.map(tag => ( + + {tag} + + ))} +
+
+ ))} +
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/pricing/enterprise/page.tsx b/src/app/pricing/enterprise/page.tsx new file mode 100644 index 0000000..fe87cc1 --- /dev/null +++ b/src/app/pricing/enterprise/page.tsx @@ -0,0 +1,96 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {ArrowRight, Check} from 'lucide-react'; + +const FEATURES = [ + 'Unlimited agents and memory', + 'Dedicated compute infrastructure', + 'Custom model routing (OpenAI, Anthropic, local)', + 'SSO / SAML 2.0 authentication', + '99.99% uptime SLA', + 'Custom rate limits and quotas', + 'Audit logs and compliance exports', + 'Dedicated customer success manager', + 'On-premise deployment option', + 'Custom contract and invoicing', +]; + +export default function PricingEnterprisePage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Enterprise +
+ +
+

+ Enterprise +

+

+ Custom deployment, dedicated infrastructure, and enterprise-grade support for organizations that need more than a SaaS plan. +

+
+ +
+
+
+

Everything in Pro, plus:

+
    + {FEATURES.map(f => ( +
  • + + {f} +
  • + ))} +
+
+ +
+
Custom Pricing
+

+ Volume-based pricing tailored to your organization. Annual contracts available. No surprises on your invoice. +

+
+ + +
+
+
+
+ + {/* Compliance */} +
+ {['SOC 2 Type II', 'GDPR Compliant', 'HIPAA Ready'].map(label => ( +
+
+ +
+ {label} +
+ ))} +
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/pricing/faq/page.tsx b/src/app/pricing/faq/page.tsx new file mode 100644 index 0000000..b2f627e --- /dev/null +++ b/src/app/pricing/faq/page.tsx @@ -0,0 +1,70 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {ChevronDown} from 'lucide-react'; +import {useState} from 'react'; + +const FAQS = [ + ['How does billing work?', 'You are billed monthly based on your active tier. Upgrades take effect immediately; downgrades apply at the next billing cycle.'], + ['What counts as a token?', 'Tokens are the sum of all input and output tokens consumed by your agents across all models. Memory storage is billed separately.'], + ['Can I get a refund?', 'Monthly plans are non-refundable. Annual plans can be refunded pro-rata within the first 30 days.'], + ['What happens if I exceed my limit?', 'Your agents will be throttled until you upgrade or the cycle resets. You can also set hard caps to prevent overages.'], + ['Do you offer annual discounts?', 'Yes — annual plans are discounted 20% compared to monthly billing.'], + ['What models are supported?', 'All major models via OpenRouter: OpenAI GPT-4o, Anthropic Claude, Google Gemini, Mistral, and more. Enterprise users can add custom endpoints.'], + ['Can I export my data?', 'Yes. All your agents, skills, rooms, and audit logs can be exported at any time. Enterprise users get automated S3 backup.'], + ['Is there a free trial for Pro?', 'The Free tier is always free. Pro features can be evaluated during a 14-day trial when you upgrade from Free.'], +]; + +export default function PricingFaqPage() { + const navigate = useNavigate(); + const [open, setOpen] = useState(0); + + return ( + +
+
+
+ + / Billing FAQ +
+ +
+

+ Billing FAQ +

+

+ Answers to common questions about pricing, billing, and usage. +

+
+ +
+ {FAQS.map(([q, a], i) => ( +
+ + {open === i && ( +
+ {a} +
+ )} +
+ ))} +
+ +
+

Still have questions?

+ +
+
+
+
+ ); +} diff --git a/src/app/pricing/page.tsx b/src/app/pricing/page.tsx new file mode 100644 index 0000000..bb8baf8 --- /dev/null +++ b/src/app/pricing/page.tsx @@ -0,0 +1,131 @@ +import {useNavigate} from 'react-router-dom'; +import {LandingLayout} from '@/components/landing/landing-layout'; +import {Check} from 'lucide-react'; + +const TIERS = [ + { + name: 'Free', + price: '$0', + period: 'forever', + desc: 'For individuals exploring agentic workflows.', + features: ['3 active agents', '5 GB agent memory', 'Community skill registry', 'Public rooms', '7-day history'], + cta: 'Start Free', + highlight: false, + }, + { + name: 'Pro', + price: '$29', + period: 'per month', + desc: 'For developers and small teams building with AI.', + features: [ + 'Unlimited agents', + '50 GB agent memory', + 'Private skill registry', + 'Collaborative rooms', + '90-day history', + 'Priority compute', + 'Email support', + ], + cta: 'Get Pro', + highlight: true, + }, + { + name: 'Enterprise', + price: 'Custom', + period: '', + desc: 'For organizations requiring custom deployment and SLA.', + features: [ + 'Everything in Pro', + 'Unlimited memory', + 'SSO / SAML', + 'Custom model routing', + 'Dedicated compute', + 'SLA guarantee', + 'Dedicated support', + ], + cta: 'Contact Sales', + highlight: false, + }, +]; + +export default function PricingPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Header */} +
+

+ Simple, transparent pricing. +

+

+ Start free. Scale as your agent fleet grows. +

+
+ + {/* Tiers */} +
+ {TIERS.map(tier => ( +
+
+

{tier.name}

+
+ {tier.price} + {tier.period && ( + {tier.period} + )} +
+

{tier.desc}

+
+ +
    + {tier.features.map(f => ( +
  • + + {f} +
  • + ))} +
+ + +
+ ))} +
+ + {/* FAQ */} +
+

Frequently Asked

+

Billing questions answered.

+
+ {[ + ['Can I switch plans at any time?', 'Yes. Upgrade or downgrade at any time. Changes take effect at the next billing cycle.'], + ['What counts as agent memory?', 'Agent memory is the total persistent context stored across all your agents, including conversation history and long-term memory.'], + ['Is there a free trial for Pro?', 'Yes — the Free tier lets you explore all Pro features for 14 days when you upgrade.'], + ].map(([q, a]) => ( +
+

{q}

+

{a}

+
+ ))} +
+
+
+
+
+ ); +} diff --git a/src/app/skills/docs/page.tsx b/src/app/skills/docs/page.tsx new file mode 100644 index 0000000..6605fe1 --- /dev/null +++ b/src/app/skills/docs/page.tsx @@ -0,0 +1,62 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {BookOpen, Code2, Terminal} from 'lucide-react'; + +const SECTIONS = [ + {icon: BookOpen, title: 'Skill Manifest', desc: 'Define skill metadata, tools, prompts, and trigger conditions.'}, + {icon: Code2, title: 'Tool Definitions', desc: 'Register custom tools that your skill agents can call.'}, + {icon: Terminal, title: 'Local Testing', desc: 'Run `gitdata skill test` to validate skill behavior in a sandbox.'}, +]; + +export default function SkillsDocsPage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Skill Documentation +
+ +
+

+ Building Skills +

+

+ A skill is a versioned package of prompts, tools, and behavior patterns that define how an agent operates. Learn how to build, test, and publish them. +

+
+ +
+
Quick Start
+
+
gitdata skill init --name my-skill
+
cd my-skill
+
gitdata skill test --watch
+
+
+ +
+ {SECTIONS.map(s => ( +
+ +

{s.title}

+

{s.desc}

+
+ ))} +
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/skills/page.tsx b/src/app/skills/page.tsx new file mode 100644 index 0000000..c2f4f90 --- /dev/null +++ b/src/app/skills/page.tsx @@ -0,0 +1,133 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Bot, Code2, Globe, Layers, Search, Star} from 'lucide-react'; + +const FEATURED_SKILLS = [ + { + icon: Code2, + name: 'Senior React Developer', + author: 'gitdataai', + rating: 4.9, + runs: 12400, + desc: 'Build production-ready React components with TypeScript, testing, and accessibility built in.', + tags: ['frontend', 'react', 'typescript'], + }, + { + icon: Bot, + name: 'Code Reviewer', + author: 'gitdataai', + rating: 4.8, + runs: 8900, + desc: 'Perform thorough code reviews focusing on correctness, security, and maintainability.', + tags: ['review', 'security', 'quality'], + }, + { + icon: Layers, + name: 'API Designer', + author: 'community', + rating: 4.7, + runs: 5600, + desc: 'Design REST and GraphQL APIs with OpenAPI specs and validation schemas.', + tags: ['api', 'rest', 'graphql'], + }, + { + icon: Globe, + name: 'Documentation Writer', + author: 'community', + rating: 4.6, + runs: 4300, + desc: 'Generate comprehensive API documentation from source code and comments.', + tags: ['docs', 'markdown', 'openapi'], + }, +]; + +const CATEGORIES = ['All', 'Frontend', 'Backend', 'DevOps', 'Security', 'Data', 'Testing']; + +export default function SkillsPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Hero */} +
+

+ The Skill Registry +

+

+ Reusable, versioned agent behaviors packaged as skills. Build once, deploy across your entire agent fleet. +

+
+ + {/* Search bar */} +
+
+ + +
+
+ + {/* Categories */} +
+ {CATEGORIES.map(cat => ( + + ))} +
+ + {/* Featured skills */} +
+ {FEATURED_SKILLS.map(skill => ( +
+
+
+ +
+
+
+

{skill.name}

+
+ + {skill.rating} +
+
+

{skill.desc}

+
+
+ {skill.tags.map(tag => ( + + {tag} + + ))} +
+ {skill.runs.toLocaleString()} runs +
+
+
+
+ ))} +
+ + {/* CTA */} +
+

Publish your own skill and join the registry.

+ +
+
+
+
+ ); +} diff --git a/src/app/skills/publish/page.tsx b/src/app/skills/publish/page.tsx new file mode 100644 index 0000000..1713027 --- /dev/null +++ b/src/app/skills/publish/page.tsx @@ -0,0 +1,77 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {ArrowRight, BookOpen, Code2, Star} from 'lucide-react'; + +const STEPS = [ + {icon: Code2, title: '1. Write your skill', desc: 'Define prompts, tools, and behaviors in a skill manifest YAML file.'}, + {icon: BookOpen, title: '2. Test locally', desc: 'Use the CLI to simulate agent runs and validate outputs before publishing.'}, + {icon: Star, title: '3. Publish to registry', desc: 'Push to the GitDataAI Skill Registry with version tags and metadata.'}, +]; + +export default function SkillsPublishPage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Publish a Skill +
+ +
+

+ Publish a Skill +

+

+ Turn your best agent behaviors into reusable, versioned skills and share them with the community — or keep them private to your workspace. +

+
+ + {/* Skill manifest demo */} +
+
skill.yaml
+
+{`name: senior-react-dev
+version: "1.2.0"
+description: Build production React components
+author: acme-team
+tools:
+  - read_file
+  - write_file
+  - run_tests
+prompt: |
+  You are a senior React developer...
+trigger:
+  keywords: ["react", "component", "frontend"]
+rate_limit: 60  # runs per hour`}
+                        
+
+ + {/* Steps */} +
+

How It Works

+
+ {STEPS.map(s => ( +
+ +

{s.title}

+

{s.desc}

+
+ ))} +
+
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/solutions/governance/page.tsx b/src/app/solutions/governance/page.tsx new file mode 100644 index 0000000..2b5787d --- /dev/null +++ b/src/app/solutions/governance/page.tsx @@ -0,0 +1,99 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Cpu, DollarSign, ShieldCheck} from 'lucide-react'; + +const LIMITS = [ + {tier: 'Free', tokens: '100K', compute: '1x', agents: '3'}, + {tier: 'Pro', tokens: '10M', compute: '4x', agents: 'Unlimited'}, + {tier: 'Enterprise', tokens: 'Custom', compute: 'Dedicated', agents: 'Unlimited'}, +]; + +export default function SolutionsGovernancePage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Compute Governance +
+ +
+
+ +
+

+ Compute Governance +

+

+ Unified management of LLM tokens and compute resources across your entire agent fleet. Set budgets, enforce limits, and get full cost visibility. +

+
+ + {/* Live usage */} +
+
+ Monthly Compute Budget + 75% used +
+
+
+
+
+
+
7.5M
+
tokens used
+
+
+
$23.40
+
total cost
+
+
+
2.5M
+
tokens remaining
+
+
+
+ + {/* Limits */} +
+

Limits by Tier

+
+ {LIMITS.map(l => ( +
+

{l.tier}

+
+
+ Monthly tokens + {l.tokens} +
+
+ Compute multiplier + {l.compute} +
+
+ Max agents + {l.agents} +
+
+
+ ))} +
+
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/solutions/memory/page.tsx b/src/app/solutions/memory/page.tsx new file mode 100644 index 0000000..aa6055d --- /dev/null +++ b/src/app/solutions/memory/page.tsx @@ -0,0 +1,80 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Brain, GitBranch, RotateCcw} from 'lucide-react'; + +export default function SolutionsMemoryPage() { + const navigate = useNavigate(); + return ( + +
+
+
+ + / Agent Memory +
+ +
+
+ +
+

+ Agent Memory +

+

+ Git-native long-term memory for AI agents. Branch, commit, merge, and rollback AI context the same way you manage source code. +

+
+ + {/* Git-like interface demo */} +
+
Agent Memory — workspace: acme-agent-ctx
+
+
+ $ + gitdata memory branch -c "tune-for-rag-v3" +
+
✓ Branched from 'main'. Switched to 'tune-for-rag-v3'.
+
+ $ + gitdata memory commit -m "Retrain embeddings on Q3 data" +
+
[abc1234] Retrain embeddings on Q3 data — 2.4k tokens updated.
+
+ $ + gitdata memory log --oneline +
+ {['abc1240 HEAD', '7b3c9a1 Tune retrieval threshold', 'def4567 Initial RAG setup'].map((h, i) => ( +
{h}
+ ))} +
+
+ + {/* Git operations */} +
+ {[ + {icon: GitBranch, title: 'Branch & Merge', desc: 'Experiment with different memory contexts. Merge when proven.'}, + {icon: RotateCcw, title: 'Rollback', desc: 'Revert to any previous memory state instantly.'}, + {icon: Brain, title: 'Semantic Search', desc: 'Find any past context by natural language query.'}, + ].map(item => ( +
+ +

{item.title}

+

{item.desc}

+
+ ))} +
+ +
+ +
+
+
+
+ ); +} diff --git a/src/app/solutions/page.tsx b/src/app/solutions/page.tsx new file mode 100644 index 0000000..34727e8 --- /dev/null +++ b/src/app/solutions/page.tsx @@ -0,0 +1,106 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Bot, Code2, GitBranch, Network, Workflow} from 'lucide-react'; + +const SOLUTIONS = [ + { + icon: Workflow, + title: 'Command as Service', + href: '/solutions', + desc: 'Every operation is a versioned command. Compose, audit, and replay your entire development workflow from a single CLI.', + badge: 'Core Concept', + }, + { + icon: Code2, + title: 'Git Repositories', + href: '/solutions', + desc: 'Full Git operations — branches, commits, merges, diffs, and blame. HTTP and SSH access with built-in branch protection.', + badge: null, + }, + { + icon: GitBranch, + title: 'Issues & Pull Requests', + href: '/solutions', + desc: 'Track issues, review code, and manage pull requests with inline comments, review threads, and configurable merge strategies.', + badge: null, + }, + { + icon: Network, + title: 'Collaborative Rooms', + href: '/solutions/rooms', + desc: 'Real-time chat rooms where humans and AI agents work together. Persistent context, thread replies, and shared command history.', + badge: null, + }, + { + icon: Bot, + title: 'AI Agents', + href: '/solutions', + desc: 'Deploy AI agents backed by persistent memory and a skill registry. Agents can read repos, run tools, and execute tasks autonomously.', + badge: null, + }, + { + icon: Network, + title: 'Full Audit Trail', + href: '/solutions', + desc: 'Every code change, AI decision, and room action — logged, versioned, and queryable. Human-in-the-loop by design.', + badge: null, + }, +]; + +export default function SolutionsPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Hero */} +
+

+ Command as Service +

+

+ In GitDataAI, every action is a first-class command. Commands are versioned, auditable, and composable — your development workflow is your API. +

+
+ + {/* Solutions grid */} +
+ {SOLUTIONS.map(sol => ( +
navigate(sol.href)}> +
+
+ +
+
+
+

{sol.title}

+ {sol.badge && ( + + {sol.badge} + + )} +
+

{sol.desc}

+
+ Learn more + + + +
+
+
+
+ ))} +
+
+
+
+ ); +} diff --git a/src/app/solutions/rooms/page.tsx b/src/app/solutions/rooms/page.tsx new file mode 100644 index 0000000..c6d9d01 --- /dev/null +++ b/src/app/solutions/rooms/page.tsx @@ -0,0 +1,94 @@ +import {LandingLayout} from '@/components/landing/landing-layout'; +import {useNavigate} from 'react-router-dom'; +import {Bot, ShieldCheck, Users} from 'lucide-react'; + +const FEATURES = [ + {title: 'Real-time Multi-modal', desc: 'Text, code, and structured data shared simultaneously in a single session.'}, + {title: 'Human-in-the-Loop', desc: 'Approve, reject, or modify any agent action before it executes.'}, + {title: 'Persistent Context', desc: 'Room state is versioned and resumable. Pick up where you left off.'}, + {title: 'Access Control', desc: 'Invite-only rooms with fine-grained permission per agent and user.'}, + {title: 'Audit Trail', desc: 'Every action, decision, and message is logged with timestamps.'}, + {title: 'Multi-Agent Support', desc: 'Run multiple specialized agents in parallel within a single room.'}, +]; + +export default function SolutionsRoomsPage() { + const navigate = useNavigate(); + return ( + +
+
+ {/* Breadcrumb */} +
+ + / Collaborative Rooms +
+ + {/* Hero */} +
+
+ +
+

+ Collaborative Rooms +

+

+ Multi-modal workspaces where humans and AI agents solve complex engineering tasks together in real-time. No more copy-pasting context between tools. +

+
+ + {/* Demo */} +
+
+
+
+
+ Room: feature-auth-audit +
+
+
+ 12:04:01 + // John assigns Agent-Reviewer to audit auth module +
+
+ 12:04:02 + Agent-Reviewer: Scanning 47 files in auth/... +
+
+ 12:04:15 + Agent-Reviewer: Flagged 3 issues. Awaiting approval. +
+
+ 12:04:16 + ⚠ Human approval required: Create fix PR? +
+
+
+ + {/* Features */} +
+

Key Capabilities

+
+ {FEATURES.map(f => ( +
+

{f.title}

+

{f.desc}

+
+ ))} +
+
+ + {/* CTA */} +
+ +
+
+
+
+ ); +} diff --git a/src/app/workspace/redirect.tsx b/src/app/workspace/redirect.tsx index 23b9d89..2d61640 100644 --- a/src/app/workspace/redirect.tsx +++ b/src/app/workspace/redirect.tsx @@ -17,8 +17,8 @@ export function WorkspaceRedirect() { useEffect(() => { if (isLoading) return; - const first = data?.workspaces[0]; - if (first) { + const first = data?.workspaces?.[0]; + if (first?.slug) { navigate(`/w/${first.slug}`, {replace: true}); } else { navigate('/init/workspace', {replace: true}); diff --git a/src/components/landing/index.ts b/src/components/landing/index.ts index fcfd5ac..1bfe193 100644 --- a/src/components/landing/index.ts +++ b/src/components/landing/index.ts @@ -1,3 +1,4 @@ export {LandingNav} from './landing-nav'; export {LandingFooter} from './landing-footer'; export {LandingHero, LandingFeatures, LandingHighlight} from './landing-sections'; +export {LandingLayout} from './landing-layout'; diff --git a/src/components/landing/landing-footer.tsx b/src/components/landing/landing-footer.tsx index 7b5756c..55ca65d 100644 --- a/src/components/landing/landing-footer.tsx +++ b/src/components/landing/landing-footer.tsx @@ -1,10 +1,17 @@ const FOOTER_LINKS = { - Product: ['Features', 'Pricing', 'Changelog', 'Roadmap'], - Developers: ['Documentation', 'API Reference', 'GitHub', 'Status'], - Resources: ['Blog', 'Guides', 'Community', 'Support'], + Platform: ['Git Repositories', 'Issues & PRs', 'Collaborative Rooms', 'AI Agents'], + Skills: ['Skill Registry', 'Publish a Skill', 'Skill Documentation', 'Community'], + Developers: ['Documentation', 'CLI Reference', 'API Reference', 'Status'], Company: ['About', 'Careers', 'Contact', 'Privacy'], }; +const FOOTER_HREFS: Record = { + Platform: ['/solutions', '/solutions', '/solutions/rooms', '/solutions'], + Skills: ['/skills', '/skills/publish', '/skills/docs', '/network'], + Developers: ['/docs', '/docs', '/network/api', '/status'], + Company: ['/about', '/careers', '/contact', '/privacy'], +}; + interface LandingFooterProps { onRegister: () => void; } @@ -38,28 +45,31 @@ export function LandingFooter({onRegister}: LandingFooterProps) { GitDataAI

- Infrastructure for the next billion AI Agents. - Built for reliability, transparency, and collaboration. + The unified platform for code collaboration and AI-powered development. + Built for teams that ship.

{/* Link columns */} - {Object.entries(FOOTER_LINKS).map(([cat, links]) => ( -
-

- {cat} -

- -
- ))} + {Object.entries(FOOTER_LINKS).map(([cat, links]) => { + const hrefs = FOOTER_HREFS[cat]; + return ( +
+

+ {cat} +

+ +
+ ); + })} diff --git a/src/components/landing/landing-layout.tsx b/src/components/landing/landing-layout.tsx new file mode 100644 index 0000000..2822c64 --- /dev/null +++ b/src/components/landing/landing-layout.tsx @@ -0,0 +1,22 @@ +import {useNavigate} from 'react-router-dom'; +import {LandingNav} from '@/components/landing/landing-nav'; +import {LandingFooter} from '@/components/landing/landing-footer'; + +interface LandingLayoutProps { + children: React.ReactNode; +} + +export function LandingLayout({children}: LandingLayoutProps) { + const navigate = useNavigate(); + const handleRegister = () => navigate('/auth/register'); + + return ( +
+
+ +
{children}
+ +
+ ); +} diff --git a/src/components/landing/landing-nav.tsx b/src/components/landing/landing-nav.tsx index 1992746..7414c71 100644 --- a/src/components/landing/landing-nav.tsx +++ b/src/components/landing/landing-nav.tsx @@ -1,9 +1,46 @@ +import {useEffect, useRef, useState} from 'react'; import {useNavigate} from 'react-router-dom'; -const NAV_ITEMS = ['Solutions', 'Skills', 'Network', 'Pricing']; +const POP_ITEMS = { + Platform: [ + {title: 'Git Repositories', href: '/solutions', desc: 'Branches, commits, PRs, branch protection'}, + {title: 'Collaborative Rooms', href: '/solutions/rooms', desc: 'Real-time human-AI workspaces'}, + {title: 'AI Agents', href: '/solutions', desc: 'Persistent memory, tools, skill registry'}, + {title: 'Command as Service', href: '/solutions', desc: 'Versioned, auditable, composable commands'}, + ], + Skills: [ + {title: 'Explore Skills', href: '/skills', desc: 'Browse the community skill library'}, + {title: 'Publish a Skill', href: '/skills/publish', desc: 'Share your agent behavior'}, + {title: 'Skill Documentation', href: '/skills/docs', desc: 'Build and test skills locally'}, + ], + Network: [ + {title: 'Explore Network', href: '/network', desc: 'Discover agents and workspaces'}, + {title: 'Public Rooms', href: '/network/rooms', desc: 'Join open collaborative sessions'}, + {title: 'Developer API', href: '/network/api', desc: 'Integrate with the network'}, + ], + Pricing: [ + {title: 'Plans & Pricing', href: '/pricing', desc: 'Compare free and paid tiers'}, + {title: 'Enterprise', href: '/pricing/enterprise', desc: 'Custom deployment & SLA'}, + {title: 'Billing FAQ', href: '/pricing/faq', desc: 'Common billing questions'}, + ], +}; + +type PopKey = keyof typeof POP_ITEMS; export function LandingNav() { const navigate = useNavigate(); + const [openPop, setOpenPop] = useState(null); + const popRef = useRef(null); + + useEffect(() => { + const handler = (e: MouseEvent) => { + if (popRef.current && !popRef.current.contains(e.target as Node)) { + setOpenPop(null); + } + }; + document.addEventListener('mousedown', handler); + return () => document.removeEventListener('mousedown', handler); + }, []); return (
{/* Nav links */} -
@@ -165,16 +181,16 @@ export function LandingFeatures() { {/* Section header */}

- Built for the next generation of software. + Code. Issues. Rooms. Agents. Commands.

- Stop building black-box AI. Start engineering transparent Agent systems. + Everything your team and AI agents need to build software — in one place, versioned like code.

{/* Features grid */} + className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-5"> {FEATURES.map((f, i) => (

- Interaction is the{" "} - New Code. + Commands are the new commits.

- In GitDataAI, conversations aren't just chats—they are executable streams of intent. - Our Collaborative Rooms capture context, version it, and allow Agents to take - autonomous actions within a governed environment. + In GitDataAI, every action — creating a repo, opening a PR, deploying an agent — is a first-class command. Commands are versioned, diffable, and composable. Your development workflow becomes an auditable, replayable stream of intent.

{/* Feature list */} @@ -249,10 +262,10 @@ export function LandingHighlight() { className="h-5 w-5 rounded-full bg-zinc-200 dark:bg-zinc-700 flex items-center justify-center text-[9px] font-bold text-zinc-500"> JD
- John Doe (Dev) + John Doe

- @Agent-Reviewer, please audit the memory leaks in our skill-store module. + @reviewer, please audit the auth module on the feature/oauth branch.

@@ -262,15 +275,18 @@ export function LandingHighlight() {
Agent-Reviewer + className="text-xs font-medium text-zinc-500">reviewer

- Audit complete. Found 2 leaks in `useMemory.ts`. Suggesting fix via Git PR... + Audit complete on feature/oauth. Found 3 issues — 1 critical (token validation bypass). Creating fix PR...

+
+ gitdata pr create --title "fix: resolve token validation bypass" --from feature/oauth --auto-merge +