refactor(web): restrain homepage + tighten contribute around the 100-to-1 spine
Restructured the homepage so "What it actually is" sits directly before "100-to-1", putting the spine back-to-back. Cut the redundant "Open model platform" section (duplicated the provider chip list), the fabricated "34k+ Stars / 98+ Contributors" cells in the Join block (now uses real version / providers / license from facts.generated), defensive "DeepSeek is not deprecated" copy, the speculative Unsloth roadmap line, the stale hardcoded 2026-05-24 eyebrow, the margin glyph, and a couple of hero pills. Today's Dispatch moves below the diagram as a single editorial column (the live ticker already covers recent activity). Contribute page drops the arbitrary "Section 05" eyebrow and the double-language h1; recursive-harness intro mirrors the homepage spine. EN/ZH parity preserved (6 sections home, 5 contribute, identical CTA structure). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import Link from "next/link";
|
||||
import { InstallCodeBlock } from "@/components/install-code-block";
|
||||
import { Seal } from "@/components/seal";
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) {
|
||||
@@ -74,10 +75,45 @@ const stepsZh = [
|
||||
},
|
||||
];
|
||||
|
||||
const recursivePromptEn = `You are running inside CodeWhale on DeepSeek V4 Pro.
|
||||
|
||||
Improve CodeWhale itself by finding exactly one small, reviewable friction point in the harness, docs, tests, or contributor workflow.
|
||||
|
||||
Prefer bug fixes, regression tests, clearer docs, sharper error messages, or one narrow contributor-experience improvement. Do not change product direction, provider policy, telemetry, sponsorship, branding, auth, sandbox, release/publishing, or global prompts unless the maintainer explicitly asked for that exact scope.
|
||||
|
||||
Working rules:
|
||||
1. Inspect the repo and current open issues before editing.
|
||||
2. Choose one issue, TODO, failing test, docs ambiguity, confusing error, or repeated papercut.
|
||||
3. State the exact target and why it is small enough to review.
|
||||
4. Reproduce the problem when possible.
|
||||
5. Make the minimum patch.
|
||||
6. Run the smallest relevant checks first.
|
||||
7. Stop after one patch.
|
||||
|
||||
Output: issue summary, files changed, checks run, risks or follow-up, and a suggested PR title.`;
|
||||
|
||||
const recursivePromptZh = `你正在 DeepSeek V4 Pro 驱动的 CodeWhale 中运行。
|
||||
|
||||
请改进 CodeWhale 本身:只找一个很小、可审查的摩擦点,范围可以是智能体框架、文档、测试或贡献流程。
|
||||
|
||||
优先处理 bug 修复、回归测试、文档澄清、错误信息改进,或一个很窄的贡献者体验问题。除非维护者明确要求,否则不要改产品方向、提供商策略、遥测、赞助、品牌、认证、沙箱、发布流程或全局提示词。
|
||||
|
||||
工作规则:
|
||||
1. 编辑前先阅读仓库和当前 open issues。
|
||||
2. 只选择一个 issue、TODO、失败测试、文档歧义、错误信息或重复出现的小摩擦点。
|
||||
3. 先说明目标是什么,以及为什么它足够小、适合审查。
|
||||
4. 尽可能复现问题。
|
||||
5. 写最小补丁。
|
||||
6. 先运行最小相关检查。
|
||||
7. 一个补丁完成后就停止。
|
||||
|
||||
输出:发现的问题摘要、修改文件、已运行检查、风险或后续事项,以及建议的 PR 标题。`;
|
||||
|
||||
export default async function ContributePage({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params;
|
||||
const isZh = locale === "zh";
|
||||
const steps = isZh ? stepsZh : stepsEn;
|
||||
const recursivePrompt = isZh ? recursivePromptZh : recursivePromptEn;
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -86,14 +122,11 @@ export default async function ContributePage({ params }: { params: Promise<{ loc
|
||||
<section className="mx-auto max-w-[1400px] px-6 pt-12 pb-8">
|
||||
<div className="flex items-baseline gap-4 mb-3">
|
||||
<Seal char="参" />
|
||||
<div className="eyebrow">Section 05 · 参与</div>
|
||||
<div className="eyebrow">参与 · Contribute</div>
|
||||
</div>
|
||||
<h1 className="font-display tracking-crisp">
|
||||
参与贡献 <span className="font-cjk text-indigo text-5xl ml-2">Contribute</span>
|
||||
</h1>
|
||||
<h1 className="font-display tracking-crisp">参与贡献</h1>
|
||||
<p className="mt-5 max-w-3xl text-ink-soft text-lg leading-[1.9] tracking-wide">
|
||||
无需签署 CLA。没有赞助商优先通道。维护者只有一人;请成为你希望收到的那种贡献者:
|
||||
小而聚焦的 PR、真实的测试覆盖、以及能告诉审查者你在想什么的文字。
|
||||
无 CLA,无赞助商优先通道,维护者只有一人。小而聚焦的 PR 最容易合并——附上真实测试,以及能告诉审查者你在想什么的文字。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -113,6 +146,23 @@ export default async function ContributePage({ params }: { params: Promise<{ loc
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section id="recursive-harness" className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10 min-w-0">
|
||||
<div className="lg:col-span-4 min-w-0">
|
||||
<Seal char="递" />
|
||||
<div className="eyebrow mt-5 mb-3">100:1 模型 · Recursive harness</div>
|
||||
<h2 className="font-display text-3xl">让 CodeWhale 改进 CodeWhale</h2>
|
||||
<p className="mt-4 text-ink-soft leading-[1.9] tracking-wide">
|
||||
100:1 提示词把 DeepSeek V4 Pro 的缓存注意力、工具调用与子智能体,凝结为一个可审查的小补丁——而不是一堆点子。
|
||||
</p>
|
||||
<Link href="https://github.com/Hmbown/CodeWhale/blob/main/docs/RECURSIVE_SELF_IMPROVEMENT.md" className="inline-block mt-5 font-mono text-[0.72rem] uppercase tracking-wider text-indigo hover:underline">
|
||||
完整多语言提示词 →
|
||||
</Link>
|
||||
</div>
|
||||
<div className="lg:col-span-8 min-w-0">
|
||||
<InstallCodeBlock cmd={recursivePrompt} copyLabel="复制" copiedLabel="已复制" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* 规约 */}
|
||||
<section className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10">
|
||||
<div className="lg:col-span-5">
|
||||
@@ -193,15 +243,11 @@ gh pr create --fill`}
|
||||
<section className="mx-auto max-w-[1400px] px-6 pt-12 pb-8">
|
||||
<div className="flex items-baseline gap-4 mb-3">
|
||||
<Seal char="参" />
|
||||
<div className="eyebrow">Section 05 · 参与</div>
|
||||
<div className="eyebrow">Contribute · 参与</div>
|
||||
</div>
|
||||
<h1 className="font-display tracking-crisp">
|
||||
Contribute <span className="font-cjk text-indigo text-5xl ml-2">参与</span>
|
||||
</h1>
|
||||
<h1 className="font-display tracking-crisp">Contribute</h1>
|
||||
<p className="mt-5 max-w-3xl text-ink-soft text-lg leading-relaxed">
|
||||
No CLA. No sponsor lockouts. The maintainer is one person; please be the kind of contributor
|
||||
you'd want to receive. Specifically: small focused PRs, real test coverage, and prose that
|
||||
tells the reviewer what you were thinking.
|
||||
No CLA. No sponsor lockouts. One maintainer. Small, focused PRs land fastest — please bring real test coverage and prose that tells the reviewer what you were thinking.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -221,6 +267,23 @@ gh pr create --fill`}
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section id="recursive-harness" className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10 min-w-0">
|
||||
<div className="lg:col-span-4 min-w-0">
|
||||
<Seal char="递" />
|
||||
<div className="eyebrow mt-5 mb-3">100-to-1 model · 递归框架</div>
|
||||
<h2 className="font-display text-3xl">Let CodeWhale improve CodeWhale</h2>
|
||||
<p className="mt-4 text-ink-soft leading-relaxed">
|
||||
The 100-to-1 prompt turns DeepSeek V4 Pro's cached attention, tool use, and sub-agents into one small, reviewable patch — not a pile of ideas.
|
||||
</p>
|
||||
<Link href="https://github.com/Hmbown/CodeWhale/blob/main/docs/RECURSIVE_SELF_IMPROVEMENT.md" className="inline-block mt-5 font-mono text-[0.72rem] uppercase tracking-wider text-indigo hover:underline">
|
||||
Full multilingual prompt →
|
||||
</Link>
|
||||
</div>
|
||||
<div className="lg:col-span-8 min-w-0">
|
||||
<InstallCodeBlock cmd={recursivePrompt} />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10">
|
||||
<div className="lg:col-span-5">
|
||||
<Seal char="规" />
|
||||
|
||||
+206
-291
@@ -4,7 +4,6 @@ import { getDispatch, getEnv } from "@/lib/kv";
|
||||
import { getFacts } from "@/lib/facts";
|
||||
import { Ticker } from "@/components/ticker";
|
||||
import { StatGrid } from "@/components/stat-grid";
|
||||
import { FeedCard } from "@/components/feed-card";
|
||||
import { Seal } from "@/components/seal";
|
||||
import { MermaidDiagram } from "@/components/mermaid-diagram";
|
||||
import type { CuratedDispatch, FeedItem, RepoStats } from "@/lib/types";
|
||||
@@ -22,26 +21,26 @@ const FALLBACK_STATS: RepoStats = {
|
||||
|
||||
const FALLBACK_DISPATCH_EN: CuratedDispatch = {
|
||||
generatedAt: new Date().toISOString(),
|
||||
headline: "CodeWhale — the terminal coding agent for open models",
|
||||
headline: "Quiet release week — install paths and contributor guides up to date.",
|
||||
summary:
|
||||
"CodeWhale runs in your terminal, talks to DeepSeek V4 and other open-weight models through any provider, and respects your filesystem. The dispatch below is regenerated by DeepSeek V4-Flash on a six-hour cron — you'll see real repo activity here once the cron runs.",
|
||||
"This dispatch is regenerated by DeepSeek V4-Flash on a six-hour cron. Until the cron fills in fresh repo activity, the static links below are the best starting points.",
|
||||
highlights: [
|
||||
{ title: "Read the install guide", href: "/install", tag: "shipped", blurb: "npm, Cargo, Homebrew, direct download — pick your path." },
|
||||
{ title: "Browse open issues", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "Triaged on GitHub — start with anything labelled 'good first issue'." },
|
||||
{ title: "Review the roadmap", href: "/roadmap", tag: "discussion", blurb: "What's confirmed, what's being weighed, what's been ruled out." },
|
||||
{ title: "Install", href: "/install", tag: "shipped", blurb: "npm, Cargo, Homebrew, or a direct download." },
|
||||
{ title: "Open issues", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "Start with anything labelled good first issue." },
|
||||
{ title: "Roadmap", href: "/roadmap", tag: "discussion", blurb: "What is confirmed, what is being weighed, what is ruled out." },
|
||||
],
|
||||
movers: [],
|
||||
};
|
||||
|
||||
const FALLBACK_DISPATCH_ZH: CuratedDispatch = {
|
||||
generatedAt: new Date().toISOString(),
|
||||
headline: "CodeWhale — 面向开源模型的终端编程智能体",
|
||||
headline: "本周发布平稳——安装路径和贡献指南已同步。",
|
||||
summary:
|
||||
"CodeWhale 运行在你的终端中,接入 DeepSeek V4 等开源模型,对文件系统保持克制。以下「今日要闻」由 DeepSeek V4-Flash 每六小时自动生成——仓库有动态时会实时更新。",
|
||||
"本「今日要闻」由 DeepSeek V4-Flash 每六小时重新生成。在 cron 写入真实仓库动态之前,下面的固定链接是最实用的入口。",
|
||||
highlights: [
|
||||
{ title: "阅读安装指南", href: "/zh/install", tag: "shipped", blurb: "npm、Cargo、Homebrew、直接下载——任选其一。" },
|
||||
{ title: "浏览开放议题", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "在 GitHub 上查看——从标记为 good first issue 的议题开始。" },
|
||||
{ title: "查看路线图", href: "/zh/roadmap", tag: "discussion", blurb: "已确认、审议中、以及已排除的功能规划。" },
|
||||
{ title: "安装", href: "/zh/install", tag: "shipped", blurb: "npm、Cargo、Homebrew,或直接下载。" },
|
||||
{ title: "开放议题", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "从 good first issue 标签开始。" },
|
||||
{ title: "路线图", href: "/zh/roadmap", tag: "discussion", blurb: "已确认、审议中、以及已排除的功能。" },
|
||||
],
|
||||
movers: [],
|
||||
};
|
||||
@@ -72,33 +71,31 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
/* keep fallback */
|
||||
}
|
||||
|
||||
const highlights = isZh && dispatch.highlightsZh ? dispatch.highlightsZh : dispatch.highlights;
|
||||
|
||||
return (
|
||||
<>
|
||||
<Ticker items={feed} />
|
||||
|
||||
{/* HERO */}
|
||||
<section className="relative overflow-hidden">
|
||||
<div className="margin-glyph right-[-2rem] top-[2rem] hidden lg:block">深</div>
|
||||
|
||||
<section className="relative">
|
||||
<div className="mx-auto max-w-[1400px] px-4 sm:px-6 pt-10 sm:pt-14 pb-12 grid lg:grid-cols-12 gap-10">
|
||||
<div className="lg:col-span-8">
|
||||
<div className="flex items-center gap-2 sm:gap-3 mb-6 flex-wrap">
|
||||
<div className="lg:col-span-7">
|
||||
<div className="mb-6">
|
||||
<span className="pill pill-hot">DeepSeek V4 · 1M context</span>
|
||||
<span className="pill pill-jade">OpenRouter</span>
|
||||
<span className="pill pill-ghost">MIT licensed</span>
|
||||
</div>
|
||||
|
||||
<h1 className="font-display tracking-crisp">
|
||||
{isZh
|
||||
? "开源模型的终端编程智能体。"
|
||||
? "面向开源模型的终端编程智能体。"
|
||||
: "The terminal coding agent for open models."}
|
||||
</h1>
|
||||
|
||||
<p className="mt-6 text-lg text-ink-soft leading-relaxed max-w-2xl">
|
||||
<span className="font-cjk text-indigo font-semibold">CodeWhale</span>
|
||||
{isZh
|
||||
? " 是一个终端原生的编程智能体,面向 DeepSeek V4 及其他开源/开放权重模型。它编辑文件、执行 Shell、调用 MCP 服务器、协调子智能体——并在你的文件系统沙箱内运行。DeepSeek API 直连、OpenRouter、Hugging Face 推理端点、自托管——任选你的接入方式。"
|
||||
: " is a terminal-native coding agent for DeepSeek V4 and other open / open-weight models. It edits files, runs shells, calls MCP servers, coordinates sub-agents — and runs inside your filesystem sandbox. Native DeepSeek API, OpenRouter, Hugging Face inference, self-hosted — bring your own provider."}
|
||||
? " 是面向 DeepSeek V4 及其他开放权重模型的终端原生编程智能体。它读改文件、跑测试、调用 MCP 服务器,全程在你的文件系统沙箱内运行。"
|
||||
: " is a terminal-native coding agent for DeepSeek V4 and other open-weight models. It reads and edits files, runs tests, calls MCP servers — all inside your filesystem sandbox."}
|
||||
</p>
|
||||
|
||||
<div className="mt-8 flex flex-wrap items-stretch sm:items-center gap-3">
|
||||
@@ -120,15 +117,8 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
>
|
||||
{isZh ? "阅读文档" : "Docs"}
|
||||
</Link>
|
||||
<Link
|
||||
href="/roadmap"
|
||||
className="px-5 py-3 font-mono text-sm uppercase tracking-wider text-ink-mute hover:text-indigo transition-colors"
|
||||
>
|
||||
{isZh ? "路线图" : "Roadmap"}
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
{/* Trust signals */}
|
||||
<div className="mt-6 flex items-center gap-4 text-xs font-mono text-ink-mute flex-wrap">
|
||||
<span>{isZh ? "独立维护者 Hmbown" : "Maintained by Hmbown"}</span>
|
||||
<span className="hidden sm:inline">·</span>
|
||||
@@ -138,42 +128,29 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* hero side: install card */}
|
||||
<div className="lg:col-span-4">
|
||||
<div className="lg:col-span-5">
|
||||
<div className="hairline-t hairline-b hairline-l hairline-r bg-paper p-5 relative">
|
||||
<div className="absolute -top-3 left-4 bg-paper px-2 eyebrow">
|
||||
{isZh ? "开始使用 · 一行安装" : "get started · 开始使用"}
|
||||
{isZh ? "一行安装" : "one-line install"}
|
||||
</div>
|
||||
<pre className="code-block mt-2">
|
||||
{isZh ? (
|
||||
<>
|
||||
<span className="comment"># npm 安装(推荐,无需 Rust 工具链)</span>{"\n"}
|
||||
<span className="comment"># npm(推荐,无需 Rust 工具链)</span>{"\n"}
|
||||
<span className="prompt">$</span> npm install -g codewhale{"\n"}
|
||||
<span className="prompt">$</span> codewhale{"\n"}
|
||||
<br />
|
||||
<span className="comment"># 或 Cargo 安装</span>{"\n"}
|
||||
<span className="prompt">$</span> cargo install codewhale-cli --locked{"\n"}
|
||||
<span className="prompt">$</span> codewhale{"\n"}
|
||||
<br />
|
||||
<span className="comment"># 已安装?更新到最新版</span>{"\n"}
|
||||
<span className="prompt">$</span> codewhale update{"\n"}
|
||||
<br />
|
||||
<span className="comment"># 首次运行自动创建 <span className="key">~/.deepseek/</span></span>
|
||||
<span className="comment"># Cargo / Homebrew / 直接下载请见</span>{"\n"}
|
||||
<span className="comment"># <span className="key">/install</span></span>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<span className="comment"># npm install (recommended, no Rust toolchain)</span>{"\n"}
|
||||
<span className="comment"># npm — no Rust toolchain required</span>{"\n"}
|
||||
<span className="prompt">$</span> npm install -g codewhale{"\n"}
|
||||
<span className="prompt">$</span> codewhale{"\n"}
|
||||
<br />
|
||||
<span className="comment"># or Cargo install</span>{"\n"}
|
||||
<span className="prompt">$</span> cargo install codewhale-cli --locked{"\n"}
|
||||
<span className="prompt">$</span> codewhale{"\n"}
|
||||
<br />
|
||||
<span className="comment"># already installed? pull the latest</span>{"\n"}
|
||||
<span className="prompt">$</span> codewhale update{"\n"}
|
||||
<br />
|
||||
<span className="comment"># first run sets up <span className="key">~/.deepseek/</span></span>
|
||||
<span className="comment"># Cargo / Homebrew / direct download:</span>{"\n"}
|
||||
<span className="comment"># <span className="key">/install</span></span>
|
||||
</>
|
||||
)}
|
||||
</pre>
|
||||
@@ -188,163 +165,140 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
|
||||
<StatGrid stats={stats} />
|
||||
|
||||
{/* TODAY'S DISPATCH */}
|
||||
{/* WHAT IT IS */}
|
||||
<section className="mx-auto max-w-[1400px] px-6 py-16">
|
||||
<div className="flex items-end justify-between mb-6 hairline-b pb-4">
|
||||
<div>
|
||||
<div className="eyebrow mb-2">{isZh ? "今日要闻" : "Today's Dispatch · 今日要闻"}</div>
|
||||
<h2 className="font-display tabular text-ink-mute font-mono text-base">
|
||||
{new Date(dispatch.generatedAt).toISOString().slice(0, 10)}
|
||||
</h2>
|
||||
</div>
|
||||
<div className="text-right">
|
||||
<div className="eyebrow">{isZh ? "由 … 编辑" : "Curated by"}</div>
|
||||
<div className="font-mono text-sm">DeepSeek V4-Flash · 6h cron</div>
|
||||
</div>
|
||||
<div className="flex items-baseline gap-4 mb-8 hairline-b pb-4">
|
||||
<Seal char="是" />
|
||||
<h2 className="font-display">
|
||||
{isZh ? "它到底是什么" : "What it actually is"}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid lg:grid-cols-12 gap-10">
|
||||
{/* editorial */}
|
||||
<div className="lg:col-span-7">
|
||||
<article className="space-y-5">
|
||||
<h3 className="font-display text-3xl leading-tight">
|
||||
{isZh && dispatch.headlineZh ? dispatch.headlineZh : dispatch.headline}
|
||||
</h3>
|
||||
<p className={isZh ? "text-ink-soft leading-[1.9] tracking-wide text-[1.02rem]" : "text-ink-soft leading-relaxed text-[1.02rem]"}>
|
||||
{isZh && dispatch.summaryZh ? dispatch.summaryZh : dispatch.summary}
|
||||
</p>
|
||||
|
||||
<div className="hairline-t pt-5">
|
||||
<div className="eyebrow mb-3">{isZh ? "要点" : "Highlights · 要点"}</div>
|
||||
<ul className="divide-y divide-paper-line/40 hairline-t hairline-b">
|
||||
{(isZh && dispatch.highlightsZh ? dispatch.highlightsZh : dispatch.highlights).map((h, i) => (
|
||||
<li key={i} className="py-3 flex items-start gap-4">
|
||||
<span className="font-mono text-[0.7rem] text-indigo uppercase tracking-widest pt-1 w-20 shrink-0">
|
||||
{h.tag}
|
||||
</span>
|
||||
<div className="flex-1">
|
||||
<Link href={h.href} className="body-link font-display text-lg leading-snug">
|
||||
{h.title}
|
||||
</Link>
|
||||
<p className={`text-sm text-ink-soft mt-1 ${isZh ? "leading-[1.8]" : ""}`}>{h.blurb}</p>
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
<div className="grid md:grid-cols-3 gap-0 col-rule hairline-t hairline-b">
|
||||
{isZh ? (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">01 · 终端智能体</div>
|
||||
<h3 className="font-display text-xl mb-3">编程智能体,不是聊天框</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
与 Claude Code、Codex CLI 相同的循环:读、改、跑测试、回报。键盘驱动,住在终端里。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">02 · 开源模型优先</div>
|
||||
<h3 className="font-display text-xl mb-3">DeepSeek V4 深度集成</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
原生 DeepSeek API:推理流、缓存指标、思考力度控制。OpenRouter、NVIDIA NIM、vLLM、sglang 同时可选。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">03 · 沙箱边界</div>
|
||||
<h3 className="font-display text-xl mb-3">Plan、Agent、YOLO</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
Plan 只读;Agent 风险操作前确认;YOLO 全自动。沙箱:seatbelt(macOS)、landlock(Linux)、受限令牌(Windows)。
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">01 · terminal agent</div>
|
||||
<h3 className="font-display text-xl mb-3">A coding agent, not a chat box</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Same loop as Claude Code or Codex CLI: reads, edits, runs tests, reports back. Keyboard-driven, lives in your terminal.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">02 · open models first</div>
|
||||
<h3 className="font-display text-xl mb-3">DeepSeek V4, deeply integrated</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Native DeepSeek API: reasoning streaming, cache metrics, thinking-effort control. OpenRouter, NVIDIA NIM, vLLM, and sglang also supported.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">03 · sandboxed</div>
|
||||
<h3 className="font-display text-xl mb-3">Plan, Agent, YOLO</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Plan reads only. Agent asks before risky ops. YOLO auto-approves. Sandboxed via seatbelt (macOS), landlock (Linux), restricted tokens (Windows).
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{(isZh && dispatch.moversZh ? dispatch.moversZh : dispatch.movers).length > 0 && (
|
||||
<div className="pt-2">
|
||||
<div className="eyebrow mb-3">{isZh ? "进展" : "Movers · 进展"}</div>
|
||||
<ul className="space-y-2">
|
||||
{(isZh && dispatch.moversZh ? dispatch.moversZh : dispatch.movers).map((m) => (
|
||||
<li key={m.number} className="flex items-baseline gap-3 text-sm">
|
||||
<span className="font-mono text-indigo tabular">#{m.number}</span>
|
||||
<Link href={m.href} className="font-medium hover:text-indigo">{m.title}</Link>
|
||||
<span className="text-ink-mute">— {m.reason}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</article>
|
||||
<div className="mt-8 hairline-t pt-6 flex flex-wrap items-baseline gap-x-6 gap-y-3">
|
||||
<div className="eyebrow shrink-0">{isZh ? "内建提供商" : "Built-in providers"}</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{facts.providers.map((p) => (
|
||||
<span key={p.id} className="font-mono text-xs px-2 py-1 hairline-t hairline-b hairline-l hairline-r text-ink-soft">
|
||||
{p.label}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* recent activity column */}
|
||||
<aside className="lg:col-span-5">
|
||||
<div className="hairline-t hairline-b hairline-l hairline-r bg-paper">
|
||||
<div className="bg-ink text-paper px-4 py-2 flex items-center justify-between">
|
||||
<div className="font-cjk text-sm tracking-wider">{isZh ? "最新活动" : "最新活动 · Recent activity"}</div>
|
||||
<Link href={isZh ? "/zh/feed" : "/feed"} className="font-mono text-[0.7rem] uppercase tracking-wider hover:text-indigo">
|
||||
{isZh ? "全部 →" : "All →"}
|
||||
</Link>
|
||||
</div>
|
||||
<div className="px-4">
|
||||
{feed.slice(0, 5).map((item) => (
|
||||
<FeedCard key={item.url} item={item} />
|
||||
))}
|
||||
{feed.length === 0 && (
|
||||
<div className="py-8 text-center text-sm text-ink-mute font-mono">
|
||||
{isZh ? "暂无数据 · feed not loaded" : "feed not yet loaded · 暂无数据"}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* WHAT IT IS */}
|
||||
{/* 100-TO-1 MODEL */}
|
||||
<section className="bg-paper-deep hairline-t hairline-b">
|
||||
<div className="mx-auto max-w-[1400px] px-6 py-16">
|
||||
<div className="flex items-baseline gap-4 mb-8 hairline-b pb-4">
|
||||
<Seal char="是" />
|
||||
<h2 className="font-display">
|
||||
{isZh ? "它到底是什么" : "What it actually is"}
|
||||
</h2>
|
||||
</div>
|
||||
<div className="grid lg:grid-cols-12 gap-10 items-start">
|
||||
<div className="lg:col-span-5">
|
||||
<div className="flex items-baseline gap-4 mb-4">
|
||||
<Seal char="百" />
|
||||
<div className="eyebrow">{isZh ? "100:1 模型" : "100-to-1 model"}</div>
|
||||
</div>
|
||||
<h2 className="font-display">
|
||||
{isZh ? "递归自我改进的开源智能体框架" : "A recursive harness, modelled at 100-to-1"}
|
||||
</h2>
|
||||
<p className={`mt-5 text-ink-soft ${isZh ? "leading-[1.9] tracking-wide" : "leading-relaxed"}`}>
|
||||
{isZh
|
||||
? "1948 年,Ralph Bown 用 100:1 的晶体管模型,把微小的结构讲清楚。CodeWhale 借用同样的形状:一个清晰提示词,把 DeepSeek V4 Pro 的缓存注意力、工具调用与子智能体凝结为一个可审查的小补丁。"
|
||||
: "In 1948, Ralph Bown used a 100-to-1 model of the transistor to make a tiny structure legible. CodeWhale uses the same shape: one clear prompt turns DeepSeek V4 Pro's cached attention, tool use, and sub-agents into one small, reviewable patch."}
|
||||
</p>
|
||||
<p className={`mt-4 text-sm text-ink-mute ${isZh ? "leading-[1.9] tracking-wide" : "leading-relaxed"}`}>
|
||||
{isZh
|
||||
? "100:1 不是性能基准,而是贡献形状:一个提示词、许多智能体小时、一个小补丁、一次维护者审查。"
|
||||
: "100-to-1 is not a throughput benchmark. It is a contribution shape: one prompt, many agent-hours, one small patch, one maintainer review."}
|
||||
</p>
|
||||
<div className="mt-6 flex flex-wrap gap-3">
|
||||
<Link href={isZh ? "/zh/contribute#recursive-harness" : "/contribute#recursive-harness"} className="px-4 py-2 bg-ink text-paper font-mono text-sm uppercase tracking-wider hover:bg-indigo transition-colors">
|
||||
{isZh ? "运行提示词 →" : "Run the prompt →"}
|
||||
</Link>
|
||||
<Link href="https://api-docs.deepseek.com/quick_start/pricing" className="px-4 py-2 font-mono text-sm uppercase tracking-wider text-ink-mute hover:text-indigo transition-colors">
|
||||
{isZh ? "DeepSeek 价格 →" : "DeepSeek pricing →"}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-0 col-rule hairline-t hairline-b">
|
||||
{isZh ? (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">01 · 终端智能体</div>
|
||||
<h3 className="font-display text-xl mb-3">编程智能体,不是聊天框</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
与 Claude Code、Codex CLI 相同的循环。读、改、跑测试、汇报。键盘驱动,住在你的终端里。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">02 · 开源模型优先</div>
|
||||
<h3 className="font-display text-xl mb-3">DeepSeek V4 深度集成</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
DeepSeek 原生 API 为一级路径:推理块流式传输、缓存指标、思考力度选择。同时支持 OpenRouter、Hugging Face、自托管——任你选择。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">03 · 沙箱边界</div>
|
||||
<h3 className="font-display text-xl mb-3">Plan、Agent、YOLO</h3>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
Plan 只读调查,Agent 按需审批,YOLO 自动批准。沙箱:seatbelt (macOS)、landlock (Linux);Windows 受限令牌。
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">01 · 终端智能体</div>
|
||||
<h3 className="font-display text-xl mb-3">A coding agent, not a chat box</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Same loop as Claude Code or Codex CLI. Reads, edits, runs tests, reports back. Keyboard-driven, lives in your terminal.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">02 · 开源模型优先</div>
|
||||
<h3 className="font-display text-xl mb-3">DeepSeek V4, deeply integrated</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Native DeepSeek API is the first-class path: reasoning streaming, cache metrics, thinking effort control. OpenRouter, Hugging Face, self-hosted — your call.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="eyebrow mb-3">03 · 沙箱保护</div>
|
||||
<h3 className="font-display text-xl mb-3">Plan, Agent, YOLO</h3>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Plan reads only. Agent asks for approval on risky ops. YOLO auto-approves. Sandboxed via seatbelt (macOS), landlock (Linux); Windows restricted tokens.
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Provider quick list */}
|
||||
<div className="mt-8 hairline-t pt-6">
|
||||
<div className="eyebrow mb-4">{isZh ? "内建提供商" : "Built-in providers"}</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{facts.providers.map((p) => (
|
||||
<span key={p.id} className="font-mono text-xs px-2 py-1 hairline-t hairline-b hairline-l hairline-r text-ink-soft">
|
||||
{p.label}
|
||||
</span>
|
||||
))}
|
||||
<div className="lg:col-span-7 hairline-t hairline-b hairline-l hairline-r bg-paper">
|
||||
<div className="bg-ink text-paper px-4 py-3 flex items-center justify-between gap-4">
|
||||
<div className="font-mono text-sm uppercase tracking-widest">CodeWhale / 100:1</div>
|
||||
<div className="font-cjk text-sm text-paper-deep/80">{isZh ? "演示模型" : "demonstration model"}</div>
|
||||
</div>
|
||||
<div className="grid sm:grid-cols-2 gap-0 col-rule">
|
||||
{(isZh
|
||||
? [
|
||||
{ n: "01", t: "输入", d: "贡献者在 fork 中运行 CodeWhale,并给出递归改进提示词。" },
|
||||
{ n: "02", t: "相互作用", d: "DeepSeek V4 Pro 读取代码库、调用工具、协调子智能体,前缀缓存让长程注意力保持低成本。" },
|
||||
{ n: "03", t: "输出", d: "智能体返回一个可复现、可测试、可审查的小补丁。" },
|
||||
{ n: "04", t: "反馈", d: "维护者审查、合并、发布。下一轮在更好的框架上开始。" },
|
||||
]
|
||||
: [
|
||||
{ n: "01", t: "Input", d: "A contributor runs CodeWhale in a fork with the recursive harness prompt." },
|
||||
{ n: "02", t: "Interaction", d: "DeepSeek V4 Pro reads the repo, uses tools, coordinates sub-agents; prefix caching keeps long attention cheap." },
|
||||
{ n: "03", t: "Output", d: "The agent returns one reproducible, tested, reviewable patch." },
|
||||
{ n: "04", t: "Feedback", d: "The maintainer reviews, lands, releases. The next run starts from a better harness." },
|
||||
]
|
||||
).map((item) => (
|
||||
<div key={item.n} className="p-5">
|
||||
<div className="font-mono text-[0.7rem] text-indigo uppercase tracking-widest mb-2">{item.n}</div>
|
||||
<h3 className="font-display text-lg mb-2">{item.t}</h3>
|
||||
<p className={`text-sm text-ink-soft ${isZh ? "leading-[1.9] tracking-wide" : "leading-relaxed"}`}>
|
||||
{item.d}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -391,82 +345,48 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<p className="mt-3 text-xs font-mono text-ink-mute">
|
||||
{isZh
|
||||
? "示意图使用 Mermaid 标准格式渲染。"
|
||||
: "Rendered with Mermaid standard syntax."}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* OPEN MODEL PLATFORM */}
|
||||
{/* TODAY'S DISPATCH — slim editorial column */}
|
||||
<section className="bg-paper-deep hairline-t hairline-b">
|
||||
<div className="mx-auto max-w-[1400px] px-6 py-16">
|
||||
<div className="flex items-baseline gap-4 mb-8 hairline-b pb-4">
|
||||
<Seal char="开" />
|
||||
<h2 className="font-display">
|
||||
{isZh ? "开放模型平台" : "Open model platform"}
|
||||
</h2>
|
||||
<div className="mx-auto max-w-[1400px] px-6 py-14">
|
||||
<div className="flex items-end justify-between mb-6 hairline-b pb-4 flex-wrap gap-3">
|
||||
<div>
|
||||
<div className="eyebrow mb-2">{isZh ? "今日要闻" : "Today's Dispatch"}</div>
|
||||
<div className="font-mono text-sm tabular text-ink-mute">
|
||||
{new Date(dispatch.generatedAt).toISOString().slice(0, 10)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="font-mono text-xs text-ink-mute">DeepSeek V4-Flash · 6h cron</div>
|
||||
</div>
|
||||
|
||||
<p className="text-ink-soft max-w-3xl mb-8 leading-relaxed">
|
||||
{isZh
|
||||
? "CodeWhale 为 DeepSeek V4 构建了深度的一级集成——推理流、缓存指标、思考力度控制。同时,OpenRouter 已作为二级提供商就绪;Hugging Face 推理端点、自托管 OpenAI 兼容端点、本地模型服务也在规划中。目标明确:CodeWhale 应成为所有开放/开源编码模型的终端智能体。"
|
||||
: "CodeWhale ships with deep first-class integration for DeepSeek V4 — reasoning streams, cache metrics, thinking effort control. OpenRouter is ready as a secondary provider. Hugging Face inference endpoints, self-hosted OpenAI-compatible endpoints, and local model serving are on the roadmap. The direction is clear: CodeWhale should be THE terminal agent for all open / open-weight coding models."}
|
||||
</p>
|
||||
<article className="grid lg:grid-cols-12 gap-x-10 gap-y-6 max-w-[1100px]">
|
||||
<h3 className="lg:col-span-12 font-display text-2xl sm:text-3xl leading-tight">
|
||||
{isZh && dispatch.headlineZh ? dispatch.headlineZh : dispatch.headline}
|
||||
</h3>
|
||||
<p className={`lg:col-span-7 text-ink-soft ${isZh ? "leading-[1.9] tracking-wide" : "leading-relaxed"}`}>
|
||||
{isZh && dispatch.summaryZh ? dispatch.summaryZh : dispatch.summary}
|
||||
</p>
|
||||
<ul className="lg:col-span-5 space-y-3">
|
||||
{highlights.slice(0, 3).map((h, i) => (
|
||||
<li key={i} className="flex items-baseline gap-3">
|
||||
<span className="font-mono text-[0.66rem] text-indigo uppercase tracking-widest w-16 shrink-0">
|
||||
{h.tag}
|
||||
</span>
|
||||
<div>
|
||||
<Link href={h.href} className="body-link font-display text-base leading-snug">
|
||||
{h.title}
|
||||
</Link>
|
||||
<p className={`text-sm text-ink-soft mt-0.5 ${isZh ? "leading-[1.8]" : ""}`}>{h.blurb}</p>
|
||||
</div>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-0 col-rule hairline-t hairline-b">
|
||||
{isZh ? (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">DeepSeek · 一级</div>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
原生 DeepSeek API 直连。推理内容流式传输、缓存命中指标、模型自动路由(Fin)。DeepSeek 不会被弃用。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">OpenRouter · 就绪</div>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
通过 OpenRouter 接入 DeepSeek 模型及更多。统一 API 层,按使用量计费。设置 OPENROUTER_API_KEY 即可。
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">更多 · 规划中</div>
|
||||
<p className="text-sm text-ink-soft leading-[1.9]">
|
||||
Hugging Face 推理端点、自托管(vLLM / sglang / Ollama)、Unsloth 微调适配——这些是平台路线图的一部分,尚未完全实现。
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">DeepSeek · first-class</div>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Native DeepSeek API direct. Reasoning streaming, cache hit metrics, model auto-routing (Fin). DeepSeek is not deprecated.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">OpenRouter · ready</div>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Access DeepSeek models and more through OpenRouter. Unified API layer, usage-based billing. Set OPENROUTER_API_KEY and go.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<div className="font-display text-xl mb-2 text-indigo">More · planned</div>
|
||||
<p className="text-sm text-ink-soft leading-relaxed">
|
||||
Hugging Face inference, self-hosted (vLLM / sglang / Ollama), Unsloth fine-tune adapters — on the platform roadmap, not fully implemented yet.
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="mt-8 hairline-t pt-6 flex items-center gap-4">
|
||||
<Link href="/roadmap" className="font-mono text-sm uppercase tracking-wider text-indigo hover:underline">
|
||||
{isZh ? "查看完整路线图 →" : "Full roadmap →"}
|
||||
</Link>
|
||||
<Link href="/docs" className="font-mono text-sm uppercase tracking-wider text-ink-mute hover:text-indigo transition-colors">
|
||||
{isZh ? "提供商配置文档 →" : "Provider config docs →"}
|
||||
<div className="mt-8 hairline-t pt-4">
|
||||
<Link href={isZh ? "/zh/feed" : "/feed"} className="font-mono text-xs uppercase tracking-wider text-indigo hover:underline">
|
||||
{isZh ? "全部活动 →" : "All activity →"}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
@@ -474,26 +394,26 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
|
||||
{/* JOIN IN */}
|
||||
<section className="bg-ink text-paper">
|
||||
<div className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10">
|
||||
<div className="lg:col-span-5">
|
||||
<div className="mx-auto max-w-[1400px] px-6 py-16 grid lg:grid-cols-12 gap-10 items-center">
|
||||
<div className="lg:col-span-8">
|
||||
<div className="eyebrow text-paper-deep/70 mb-3">{isZh ? "加入" : "Join in"}</div>
|
||||
<h2 className="font-display text-paper text-4xl leading-tight">
|
||||
{isZh ? "这是一个小项目。你的每个补丁都很重要。" : "This is a small project. Your patch matters."}
|
||||
{isZh ? "小项目。你的每个补丁都重要。" : "A small project. Your patch matters."}
|
||||
</h2>
|
||||
<p className={`mt-5 text-paper-deep/80 ${isZh ? "leading-[1.9]" : "leading-relaxed"}`}>
|
||||
<p className={`mt-5 text-paper-deep/80 max-w-2xl ${isZh ? "leading-[1.9]" : "leading-relaxed"}`}>
|
||||
{isZh
|
||||
? "无 CLA,无赞助商锁定。维护者亲自阅读每一条内容。议题在公开环境下分类。版本从 main 分支发布。"
|
||||
: "No CLA. No sponsor lockouts. The maintainer reads everything personally. Issues triaged in the open. Releases cut from main."}
|
||||
? "无 CLA,无赞助商优先通道。维护者亲自阅读每一条内容,议题公开分类,版本从 main 分支发布。"
|
||||
: "No CLA. No sponsor lockouts. The maintainer reads everything personally, issues are triaged in the open, and releases cut from main."}
|
||||
</p>
|
||||
<div className="mt-6 flex items-center gap-3">
|
||||
<div className="mt-6 flex flex-wrap items-center gap-3">
|
||||
<Link
|
||||
href="https://github.com/Hmbown/CodeWhale"
|
||||
className="px-4 py-2 hairline-t hairline-b hairline-l hairline-r border-white/20 text-paper font-mono text-sm hover:bg-white/10 transition-colors"
|
||||
>
|
||||
★ Star on GitHub
|
||||
★ {isZh ? "Star on GitHub" : "Star on GitHub"}
|
||||
</Link>
|
||||
<Link
|
||||
href="/contribute"
|
||||
href={isZh ? "/zh/contribute" : "/contribute"}
|
||||
className="px-4 py-2 font-mono text-sm text-paper-deep/80 hover:text-paper transition-colors"
|
||||
>
|
||||
{isZh ? "参与贡献 →" : "Contribute →"}
|
||||
@@ -501,24 +421,19 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="lg:col-span-7 grid sm:grid-cols-3 gap-px bg-paper/15">
|
||||
{(isZh
|
||||
? [
|
||||
{ t: "34k+", d: "星标" },
|
||||
{ t: "98+", d: "贡献者" },
|
||||
{ t: `${facts.providers.length}+`, d: "提供商" },
|
||||
]
|
||||
: [
|
||||
{ t: "34k+", d: "Stars" },
|
||||
{ t: "98+", d: "Contributors" },
|
||||
{ t: `${facts.providers.length}+`, d: "Providers" },
|
||||
]
|
||||
).map((s) => (
|
||||
<div key={s.d} className="bg-ink p-6 text-center">
|
||||
<div className="font-display text-4xl mb-1 text-jade">{s.t}</div>
|
||||
<div className="font-cjk text-sm text-paper-deep/70">{s.d}</div>
|
||||
</div>
|
||||
))}
|
||||
<div className="lg:col-span-4 font-mono text-sm text-paper-deep/80 space-y-2">
|
||||
<div className="flex justify-between hairline-b border-white/15 pb-2">
|
||||
<span className="uppercase tracking-widest text-[0.66rem] text-paper-deep/60">{isZh ? "版本" : "version"}</span>
|
||||
<span className="tabular text-paper">{facts.version ?? "v0.8.x"}</span>
|
||||
</div>
|
||||
<div className="flex justify-between hairline-b border-white/15 pb-2">
|
||||
<span className="uppercase tracking-widest text-[0.66rem] text-paper-deep/60">{isZh ? "提供商" : "providers"}</span>
|
||||
<span className="tabular text-paper">{facts.providers.length}</span>
|
||||
</div>
|
||||
<div className="flex justify-between hairline-b border-white/15 pb-2">
|
||||
<span className="uppercase tracking-widest text-[0.66rem] text-paper-deep/60">{isZh ? "许可证" : "license"}</span>
|
||||
<span className="text-paper">{facts.license ?? "MIT"}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user