mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
The commits section read numbers that were typed into scripts/sync-oss.ts (5,420 repositories, 214 orgs, 784 pushes a day, 245,417 commits, each contributor's count), a day's count scaled by a made-up factor, and a star count that began at 1,420. The forge's database holds 1,150 repositories and 46 orgs; none of that was read. Its panels were tinted rgba over a stylesheet, DualStarButton showed its guess before GitHub answered, and BulkStarModal said "successfully starred" over a forge PUT. scripts/sync-oss.ts (was .mjs) now counts GitHub's public activity for the orgs we publish: commits a day, the year, the week, active repositories and the newest commits, written at each build with the moment it was read. A figure the snapshot does not hold is not drawn. The grid, bars and repository card are @hanzo/ui/marketing (8.29.19); the showcase stylesheet and DayActivityModal are deleted. The org and repo pages lose their typed "velocity" banners. Design lint is zero in components/oss, home/OpenSource and ForgeBetaBanner. e2e/gates/activity.spec.ts holds each figure to the snapshot, the cards to one fill and edge in both schemes, a card's name, line and foot to their own rows, and the phone to no sideways scroll. Claude-Session: https://claude.ai/code/session_017vrVus6PPBgP5YRzKV1iqW
295 lines
10 KiB
TypeScript
295 lines
10 KiB
TypeScript
'use client'
|
|
|
|
import React, { useState, useEffect } from 'react'
|
|
import Link from 'next/link'
|
|
import { getRepoDetail } from '@/lib/oss'
|
|
import { superAdmin } from '@hanzo/app/lib/session'
|
|
import { useHydrated } from '@hanzo/app/lib/hydrated'
|
|
import { mix } from '@hanzo/app/lib/mix'
|
|
import { Page, PageHero, Section } from '@/components/marketing/page-kit'
|
|
import { Box, Button, Text, View, XStack, YStack } from '@hanzo/ui'
|
|
import { Grid } from '@hanzo/ui/grid'
|
|
import { Chip, Display, Lede, Title, Leaf, Line } from '@hanzo/ui/marketing'
|
|
import { Github } from '@/components/brand'
|
|
import {
|
|
ArrowLeft,
|
|
Check,
|
|
Copy,
|
|
ExternalLink,
|
|
GitBranch,
|
|
Lock,
|
|
Rocket,
|
|
Shield,
|
|
Star,
|
|
Terminal,
|
|
Zap,
|
|
} from 'lucide-react'
|
|
|
|
const MUTED = 'var(--muted-foreground)'
|
|
const INK = 'var(--foreground)'
|
|
const BORDER = 'var(--border)'
|
|
|
|
export function RepoView({ orgSlug, repoSlug }: { orgSlug: string; repoSlug: string }) {
|
|
const repo = getRepoDetail(orgSlug, repoSlug)
|
|
const hydrated = useHydrated()
|
|
const [isAdmin, setIsAdmin] = useState(false)
|
|
const [cloneMode, setCloneMode] = useState<'ssh' | 'forge' | 'github'>('ssh')
|
|
const [copied, setCopied] = useState(false)
|
|
const [starred, setStarred] = useState(false)
|
|
const [starCount, setStarCount] = useState(repo.stars)
|
|
|
|
useEffect(() => {
|
|
if (hydrated) {
|
|
try {
|
|
setIsAdmin(superAdmin())
|
|
} catch {
|
|
setIsAdmin(false)
|
|
}
|
|
try {
|
|
const stored = localStorage.getItem(`star:${repo.fullName}`)
|
|
if (stored === 'true') {
|
|
setStarred(true)
|
|
setStarCount((prev) => prev + 1)
|
|
}
|
|
} catch {}
|
|
}
|
|
}, [hydrated, repo.fullName])
|
|
|
|
const toggleStar = () => {
|
|
const next = !starred
|
|
setStarred(next)
|
|
setStarCount((c) => (next ? c + 1 : Math.max(0, c - 1)))
|
|
try {
|
|
localStorage.setItem(`star:${repo.fullName}`, String(next))
|
|
} catch {}
|
|
}
|
|
|
|
const cloneCommand =
|
|
cloneMode === 'ssh'
|
|
? repo.cloneSsh
|
|
: cloneMode === 'forge'
|
|
? repo.cloneHttps
|
|
: repo.cloneGithub
|
|
|
|
const copyClone = async () => {
|
|
try {
|
|
await navigator.clipboard.writeText(`git clone ${cloneCommand}`)
|
|
setCopied(true)
|
|
setTimeout(() => setCopied(false), 2000)
|
|
} catch {}
|
|
}
|
|
|
|
const isRestricted = repo.isPrivate && !isAdmin
|
|
|
|
return (
|
|
<Page>
|
|
<PageHero
|
|
eyebrow={`REPOSITORY / ${repo.org.toUpperCase()}`}
|
|
title={`${repo.org} / ${repo.name}`}
|
|
lede={repo.description}
|
|
>
|
|
<XStack flexWrap="wrap" items="center" gap={12}>
|
|
{/* Interactive Star button */}
|
|
<Button
|
|
size="sm"
|
|
variant={starred ? 'default' : 'outline'}
|
|
onClick={toggleStar}
|
|
cursor="pointer"
|
|
>
|
|
<Star size={14} fill={starred ? 'currentColor' : 'none'} />
|
|
{starred ? 'Starred' : 'Star'} ({starCount})
|
|
</Button>
|
|
|
|
{/* Direct Forge link */}
|
|
<Button size="sm" asChild>
|
|
<a href={repo.forgeUrl} target="_blank" rel="noopener noreferrer">
|
|
<Terminal size={14} />
|
|
git.hanzo.ai ↗
|
|
</a>
|
|
</Button>
|
|
|
|
{/* GitHub mirror */}
|
|
<Button size="sm" variant="outline" asChild>
|
|
<a href={repo.githubUrl} target="_blank" rel="noopener noreferrer">
|
|
<Github width={14} height={14} />
|
|
GitHub Mirror ↗
|
|
</a>
|
|
</Button>
|
|
|
|
{repo.deployUrl && (
|
|
<Button size="sm" variant="outline" asChild>
|
|
<a href={repo.deployUrl} target="_blank" rel="noopener noreferrer">
|
|
<Rocket size={14} />
|
|
Deploy
|
|
</a>
|
|
</Button>
|
|
)}
|
|
|
|
<Button size="sm" variant="ghost" asChild>
|
|
<Link href={`/oss/${repo.org}`}>
|
|
<ArrowLeft size={14} />
|
|
{repo.org} Organization
|
|
</Link>
|
|
</Button>
|
|
</XStack>
|
|
</PageHero>
|
|
|
|
{/* Access Gate for Private Infrastructure */}
|
|
{isRestricted ? (
|
|
<Section title="Restricted Internal Repository">
|
|
<Box
|
|
p={24}
|
|
rounded="$5"
|
|
borderWidth={1}
|
|
borderColor={BORDER}
|
|
bg={mix('var(--foreground)', 3, 'srgb')}
|
|
>
|
|
<XStack items="center" gap={12} mb={10}>
|
|
<Lock size={20} color="var(--muted-foreground)" />
|
|
<Text fontWeight="600" color={INK} fontSize="$3">
|
|
Proprietary Production Infrastructure
|
|
</Text>
|
|
</XStack>
|
|
<Text color={MUTED} fontSize="$2" mb={16} maxW={720}>
|
|
This repository contains Hanzo internal production backend architecture, encrypted credentials, or cluster orchestration logic.
|
|
Access to the full commit log, tree, and deployment pipelines requires authentication as a Hanzo SuperAdmin (<code>owner == 'admin'</code>).
|
|
</Text>
|
|
<XStack items="center" gap={12}>
|
|
<Button size="sm" asChild>
|
|
<Link href="/auth/login">
|
|
Sign in with SuperAdmin
|
|
</Link>
|
|
</Button>
|
|
<Button size="sm" variant="outline" asChild>
|
|
<Link href="/open-source">
|
|
Browse Public Ecosystem
|
|
</Link>
|
|
</Button>
|
|
</XStack>
|
|
</Box>
|
|
</Section>
|
|
) : (
|
|
<>
|
|
{/* SuperAdmin Banner if elevated */}
|
|
{repo.isPrivate && isAdmin && (
|
|
<Section title="SuperAdmin Access Verified">
|
|
<Box
|
|
p={20}
|
|
rounded="$5"
|
|
borderWidth={1}
|
|
borderColor="var(--primary)"
|
|
bg={mix('var(--primary)', 10, 'srgb')}
|
|
>
|
|
<XStack items="center" gap={10} mb={6}>
|
|
<Shield size={18} color="var(--primary)" />
|
|
<Text fontWeight="600" color={INK} fontSize="$2">
|
|
SuperAdmin Authenticated (owner == 'admin')
|
|
</Text>
|
|
</XStack>
|
|
<Text color={MUTED} fontSize="$1">
|
|
Full read/write permissions active. Internal forge target: <code>{repo.cloneSsh}</code>
|
|
</Text>
|
|
</Box>
|
|
</Section>
|
|
)}
|
|
|
|
{/* Quickstart & Clone Snippet */}
|
|
<Section title="Clone & Install">
|
|
<Box
|
|
p={20}
|
|
rounded="$5"
|
|
borderWidth={1}
|
|
borderColor={BORDER}
|
|
bg={mix('var(--foreground)', 2, 'srgb')}
|
|
>
|
|
<XStack items="center" justify="space-between" flexWrap="wrap" gap={12} mb={14}>
|
|
<XStack gap={6}>
|
|
<Button
|
|
size="xs"
|
|
variant={cloneMode === 'ssh' ? 'default' : 'outline'}
|
|
onClick={() => setCloneMode('ssh')}
|
|
>
|
|
SSH (git.hanzo.ai)
|
|
</Button>
|
|
<Button
|
|
size="xs"
|
|
variant={cloneMode === 'forge' ? 'default' : 'outline'}
|
|
onClick={() => setCloneMode('forge')}
|
|
>
|
|
HTTPS (git.hanzo.ai)
|
|
</Button>
|
|
<Button
|
|
size="xs"
|
|
variant={cloneMode === 'github' ? 'default' : 'outline'}
|
|
onClick={() => setCloneMode('github')}
|
|
>
|
|
GitHub Mirror
|
|
</Button>
|
|
</XStack>
|
|
|
|
<Button size="xs" variant="outline" onClick={copyClone}>
|
|
{copied ? <Check size={13} color="var(--primary)" /> : <Copy size={13} />}
|
|
{copied ? 'Copied' : 'Copy'}
|
|
</Button>
|
|
</XStack>
|
|
|
|
<Box
|
|
p={14}
|
|
rounded="$3"
|
|
bg="var(--background)"
|
|
borderWidth={1}
|
|
borderColor={BORDER}
|
|
$platform-web={{ overflow: 'auto' }}
|
|
>
|
|
<Text fontFamily="$mono" fontSize="$2" color={INK}>
|
|
git clone {cloneCommand}
|
|
</Text>
|
|
</Box>
|
|
</Box>
|
|
</Section>
|
|
|
|
{/* Details & Architecture */}
|
|
<Section title="Overview & Architecture">
|
|
<Grid columns={{ min: 260, max: 3 }} gap={16}>
|
|
<Box p={20} rounded="$4" borderWidth={1} borderColor={BORDER} bg="var(--background)">
|
|
<Text fontSize="$1" fontWeight="600" color={MUTED} letterSpacing={1} textTransform="uppercase" mb={8}>
|
|
Languages & Runtimes
|
|
</Text>
|
|
<XStack flexWrap="wrap" gap={6}>
|
|
{repo.languages.map((l) => (
|
|
<Chip key={l} fontSize="$1" px={8} py={4} rounded="$2" bg="$hover" color={INK}>
|
|
{l}
|
|
</Chip>
|
|
))}
|
|
</XStack>
|
|
</Box>
|
|
|
|
<Box p={20} rounded="$4" borderWidth={1} borderColor={BORDER} bg="var(--background)">
|
|
<Text fontSize="$1" fontWeight="600" color={MUTED} letterSpacing={1} textTransform="uppercase" mb={8}>
|
|
Ecosystem Domains
|
|
</Text>
|
|
<XStack flexWrap="wrap" gap={6}>
|
|
{repo.categories.map((c) => (
|
|
<Chip key={c} fontSize="$1" px={8} py={4} rounded="$2" bg="$hover" color={INK}>
|
|
{c}
|
|
</Chip>
|
|
))}
|
|
</XStack>
|
|
</Box>
|
|
|
|
<Box p={20} rounded="$4" borderWidth={1} borderColor={BORDER} bg="var(--background)">
|
|
<Text fontSize="$1" fontWeight="600" color={MUTED} letterSpacing={1} textTransform="uppercase" mb={8}>
|
|
Open Source Royalty
|
|
</Text>
|
|
<Text fontSize="$2" color={MUTED}>
|
|
Earns 20% royalty of metered spend from every org that deploys projects built from this codebase.
|
|
</Text>
|
|
</Box>
|
|
</Grid>
|
|
</Section>
|
|
</>
|
|
)}
|
|
</Page>
|
|
)
|
|
}
|