docs(web,readme): taste pass — fix stale refs, tighten design rhythm

Polish fixes (12):
- INSTALL.md: drop duplicate code block; doc CODEWHALE_VERSION canonical
  env var; fix example mirror URLs /DeepSeek-TUI/ → /CodeWhale/; remove
  stale "Once npm publication resumes" conditional
- footer.tsx: fix Gitee mirror URL deepseek-tui → CodeWhale
- globals.css: update seal CSS shadows from old cream rgba(244,241,232)
  to paper white rgba(255,255,255)
- web/README.md: update palette description cream #FAF6EE → white #FFFFFF
- nav.tsx: fix zh-only date strip (第…期) and API label (在线) — now
  "Edition …" / "API · Online" in en mode
- page.tsx: hardcoded v0.8.56 → dynamic facts.version
- README.md: merge duplicate Contributing sections
- README.ja-JP/vi: parenthesize untranslated Chinese thank-you blurbs

Design rhythm (9):
- ThinkingTrace section: py-16→py-20, bg-paper-deep, hairlines for reveal
- Judgment stack: py-16→py-12; middle cell bg-paper-deep for ABA rhythm
- Maintainer loop: py-16→py-14; step numbers grow 01→04
- How it works: py-16→py-12
- Join in closer: py-16→py-20 (dark section breathes)
- Ticker: LIVE label shrunk to annotation weight
This commit is contained in:
Hunter B
2026-06-13 13:55:51 -07:00
parent 5b3228cc4e
commit bb4d1e5744
10 changed files with 30 additions and 38 deletions
+2 -2
View File
@@ -142,8 +142,8 @@ CodeWhale は、エージェントが実際のワークスペースで**どう
CodeWhale が存在するのは、それを使い、壊し、直してくれる人たちのおかげです。
- **[DeepSeek](https://github.com/deepseek-ai)** ―― このプロジェクトを始められたモデルと支援。感謝 DeepSeek 提供模型与支持。
- **[DataWhale](https://github.com/datawhalechina)** 🐋 ―― 支援と、「鯨兄弟」ファミリーへの歓迎に感謝します。
- **[DeepSeek](https://github.com/deepseek-ai)** ―― このプロジェクトを始められたモデルと支援。感謝 DeepSeek 提供模型与支持。
- **[DataWhale](https://github.com/datawhalechina)** 🐋 ―― 支援と、「鯨兄弟」ファミリーへの歓迎に感謝します。(感谢 DataWhale 的支持。)
- **[OpenWarp](https://github.com/zerx-lab/warp)** と
**[Open Design](https://github.com/nexu-io/open-design)** ―― より良いターミナルエージェント体験の協業に感謝します。
- **すべてのコントリビューター** ―― PR ごとの完全な記録は
-6
View File
@@ -189,12 +189,6 @@ CodeWhale exists because of the people who use it, break it, and fix it.
- **Every contributor** — the full per-PR record lives in
[docs/CONTRIBUTORS.md](docs/CONTRIBUTORS.md). Thank you.
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md). Pull requests welcome — check the
[open issues](https://github.com/Hmbown/CodeWhale/issues) for good first
contributions.
## License
[MIT](LICENSE)
+2 -2
View File
@@ -180,9 +180,9 @@ nó và chỉ dùng các công cụ.
CodeWhale tồn tại nhờ những người dùng nó, làm hỏng nó, và sửa nó.
- **[DeepSeek](https://github.com/deepseek-ai)** — những mô hình và sự hỗ trợ đã
giúp dự án này khởi đầu. 感谢 DeepSeek 提供模型与支持。
giúp dự án này khởi đầu.感谢 DeepSeek 提供模型与支持。
- **[DataWhale](https://github.com/datawhalechina)** 🐋 — vì sự hỗ trợ và vì đã
đón chúng tôi vào gia đình Whale Brother. 感谢 DataWhale 的支持。
đón chúng tôi vào gia đình Whale Brother.感谢 DataWhale 的支持。
- **[OpenWarp](https://github.com/zerx-lab/warp)** và
**[Open Design](https://github.com/nexu-io/open-design)** — vì đã hợp tác xây
dựng một trải nghiệm terminal-agent tốt hơn.
+5 -9
View File
@@ -92,11 +92,6 @@ npm install -g codewhale
codewhale
```
```bash
npm install -g codewhale
codewhale
```
`postinstall` downloads the right pair of binaries from the matching GitHub
release, verifies a SHA-256 manifest, and exposes both `codewhale` and
`codewhale-tui` on your `PATH`.
@@ -105,14 +100,15 @@ Useful environment variables:
| Variable | Purpose |
| ----------------------------------- | -------------------------------------------------------------------------------------- |
| `DEEPSEEK_TUI_VERSION` | Pin which release the wrapper downloads (defaults to `deepseekBinaryVersion`) |
| `CODEWHALE_VERSION` | Pin which release the wrapper downloads (canonical) |
| `DEEPSEEK_TUI_VERSION` | Legacy alias for `CODEWHALE_VERSION` (defaults to `codewhaleBinaryVersion`) |
| `DEEPSEEK_TUI_GITHUB_REPO` | Point the downloader at a fork (`owner/repo`) |
| `DEEPSEEK_TUI_RELEASE_BASE_URL` | Override the download root (e.g. an internal mirror or release-asset proxy) |
| `DEEPSEEK_TUI_FORCE_DOWNLOAD=1` | Re-download even if a cached binary marker matches |
| `DEEPSEEK_TUI_DISABLE_INSTALL=1` | Skip the `postinstall` download entirely (CI smoke, vendored binaries) |
| `DEEPSEEK_TUI_OPTIONAL_INSTALL=1` | Don't fail `npm install` on download/extract errors — useful in CI matrices |
> **Slow npm download from mainland China?** Once npm publication resumes, if `npm install` itself is slow
> **Slow npm download from mainland China?** If `npm install` itself is slow
> (not just the postinstall binary download), use an npm registry mirror:
> ```bash
> npm config set registry https://registry.npmmirror.com
@@ -579,7 +575,7 @@ If you operate a binary asset mirror, `codewhale update` can use it directly:
```bash
DEEPSEEK_TUI_VERSION=X.Y.Z \
DEEPSEEK_TUI_RELEASE_BASE_URL=https://your-mirror.example.com/DeepSeek-TUI/vX.Y.Z/ \
DEEPSEEK_TUI_RELEASE_BASE_URL=https://your-mirror.example.com/CodeWhale/vX.Y.Z/ \
codewhale update
```
@@ -706,7 +702,7 @@ Use one of these paths:
2. Mirror the release assets internally and set `DEEPSEEK_TUI_RELEASE_BASE_URL`:
```bash
export DEEPSEEK_TUI_RELEASE_BASE_URL=https://your-mirror.example.com/DeepSeek-TUI/
export DEEPSEEK_TUI_RELEASE_BASE_URL=https://your-mirror.example.com/CodeWhale/
codewhale
```
+1 -1
View File
@@ -94,7 +94,7 @@ web/
"Yamen tech": Qing memorial document × WeChat news feed × Bloomberg terminal.
- **Palette**: cream paper `#FAF6EE`, ink `#0A2540`, cinnabar red `#C8102E`, aged gold, jade green, cobalt blue.
- **Palette**: white paper `#FFFFFF`, cool gray `#F4F6FB`, ink `#0E0E10`, indigo `#4D6BFE`, jade green, cobalt blue.
- **Type**: Fraunces (display), IBM Plex Sans (body), JetBrains Mono (UI/code), Noto Serif SC (decorative CJK anchors).
- **Structure**: hairline 1px dividers, multi-column grids, big tabular numbers, surgical use of red for "hot" markers, decorative Chinese-seal squares as section anchors.
+11 -9
View File
@@ -242,7 +242,8 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
<StatGrid stats={stats} />
{/* SEE HOW IT DECIDES — real reasoning traces prove the constitution operates */}
<section className="mx-auto max-w-[1400px] px-6 py-16">
<section className="bg-paper-deep hairline-t hairline-b">
<div className="mx-auto max-w-[1400px] px-6 py-20">
<div className="flex items-baseline gap-4 mb-3 hairline-b pb-4">
<Seal char="判" />
<h2 className="font-display">
@@ -260,10 +261,11 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
? "这些是真实推理的忠实摘录,非杜撰。宪法不是墙上的口号,而是模型决策时真正遵循的顺序。"
: "Faithful excerpts from real reasoning — not invented. The constitution isn't a poster on the wall; it's the order the model actually follows when it decides."}
</div>
</div>
</section>
{/* WHAT IT IS — the core ideas behind the harness */}
<section className="mx-auto max-w-[1400px] px-6 py-16">
<section className="mx-auto max-w-[1400px] px-6 py-12">
<div className="flex items-baseline gap-4 mb-2 hairline-b pb-4">
<Seal char="是" />
<h2 className="font-display">
@@ -286,7 +288,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
Agent
</p>
</div>
<div className="p-6">
<div className="p-6 bg-paper-deep">
<div className="eyebrow mb-3">02 · </div>
<h3 className="font-display text-xl mb-3"></h3>
<p className="text-sm text-ink-soft leading-[1.9]">
@@ -310,7 +312,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
The agent is not a model card or leaderboard score. It is an instance in this terminal, this workspace, this session. Give it an address before you ask it to act.
</p>
</div>
<div className="p-6">
<div className="p-6 bg-paper-deep">
<div className="eyebrow mb-3">02 · nested constitution</div>
<h3 className="font-display text-xl mb-3">Conflict has law</h3>
<p className="text-sm text-ink-soft leading-relaxed">
@@ -342,7 +344,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
{/* MAINTAINER LOOP */}
<section className="bg-paper-deep hairline-t hairline-b">
<div className="mx-auto max-w-[1400px] px-6 py-16">
<div className="mx-auto max-w-[1400px] px-6 py-14">
<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">
@@ -398,7 +400,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
]
).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>
<div className={`font-mono uppercase tracking-widest mb-2 ${item.n === "01" ? "text-[0.6rem] text-indigo/60" : item.n === "04" ? "text-[0.82rem] text-indigo font-semibold" : "text-[0.7rem] text-indigo"}`}>{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}
@@ -412,7 +414,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
</section>
{/* HOW IT WORKS */}
<section className="mx-auto max-w-[1400px] px-6 py-16">
<section className="mx-auto max-w-[1400px] px-6 py-12">
<div className="flex items-baseline gap-4 mb-8 hairline-b pb-4">
<Seal char="作" />
<h2 className="font-display">
@@ -504,7 +506,7 @@ export default async function HomePage({ params }: { params: Promise<{ locale: s
<div className="flex items-baseline gap-4 mb-5 hairline-b pb-4">
<Seal char="谢" />
<div>
<div className="eyebrow mb-2">{isZh ? "v0.8.56 致谢" : "v0.8.56 credits"}</div>
<div className="eyebrow mb-2">{isZh ? `v${facts.version} 致谢` : `v${facts.version} credits`}</div>
<h2 className="font-display text-3xl">
{isZh ? "每个补丁和报告都算数" : "Every patch and report counts"}
</h2>
@@ -556,7 +558,7 @@ 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 items-center">
<div className="mx-auto max-w-[1400px] px-6 py-20 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">
+3 -3
View File
@@ -155,7 +155,7 @@ h3 { font-size: 1.18rem; line-height: 1.25; }
border-radius: 1px;
letter-spacing: -0.04em;
box-shadow:
inset 0 0 0 1px rgba(244,241,232,0.18),
inset 0 0 0 1px rgba(255,255,255,0.18),
inset 0 0 0 3px var(--ink);
transform: rotate(-1.5deg);
position: relative;
@@ -165,7 +165,7 @@ h3 { font-size: 1.18rem; line-height: 1.25; }
position: absolute;
inset: -1px;
background:
radial-gradient(rgba(244,241,232,0.35) 1px, transparent 1px) 0 0 / 4px 4px;
radial-gradient(rgba(255,255,255,0.35) 1px, transparent 1px) 0 0 / 4px 4px;
mix-blend-mode: screen;
border-radius: 1px;
pointer-events: none;
@@ -175,7 +175,7 @@ h3 { font-size: 1.18rem; line-height: 1.25; }
.seal-indigo {
background: var(--indigo);
box-shadow:
inset 0 0 0 1px rgba(244,241,232,0.22),
inset 0 0 0 1px rgba(255,255,255,0.22),
inset 0 0 0 3px var(--indigo);
}
+1 -1
View File
@@ -99,7 +99,7 @@ export function Footer({ locale = "en" }: { locale?: Locale }) {
<div className="pt-2 border-t border-paper-line/20">
<div className="eyebrow mb-2 text-ink-mute"> / Mirror</div>
<div className="flex flex-wrap gap-3 text-xs">
{GITEE_ENABLED && <a href="https://gitee.com/Hmbown/deepseek-tui" className="text-indigo hover:underline" target="_blank" rel="noopener">Gitee </a>}
{GITEE_ENABLED && <a href="https://gitee.com/Hmbown/CodeWhale" className="text-indigo hover:underline" target="_blank" rel="noopener">Gitee </a>}
<a href="https://cnb.cool/codewhale.net/codewhale" className="text-indigo hover:underline" target="_blank" rel="noopener">CNB </a>
<a href="https://npmmirror.com/package/codewhale" className="text-indigo hover:underline" target="_blank" rel="noopener">npmmirror</a>
<a href="https://mirrors.tuna.tsinghua.edu.cn/help/crates.io-index.html" className="text-indigo hover:underline" target="_blank" rel="noopener">Tuna crates.io</a>
+2 -2
View File
@@ -33,14 +33,14 @@ export function Nav({ locale = "en" }: { locale?: Locale }) {
<div className="hairline-b">
<div className="mx-auto max-w-[1400px] px-6 py-1.5 flex items-center justify-between text-[0.66rem] font-mono uppercase tracking-[0.18em] text-ink-mute">
<div className="flex items-center gap-4">
<span>{isZh ? `${new Date().toISOString().slice(0, 10)}` : ` ${new Date().toISOString().slice(0, 10)}`}</span>
<span>{isZh ? `${new Date().toISOString().slice(0, 10)}` : `Edition ${new Date().toISOString().slice(0, 10)}`}</span>
<span className="hidden sm:inline">· {isZh ? new Date().toLocaleDateString("zh-CN", { weekday: "long", month: "long", day: "numeric" }) : new Date().toLocaleDateString("en-US", { weekday: "long", month: "long", day: "numeric" })}</span>
</div>
<div className="flex items-center gap-4">
<span className="hidden md:inline">codewhale.net</span>
<span className="inline-flex items-center gap-1.5">
<span className="w-1.5 h-1.5 bg-jade rounded-full inline-block animate-pulse" />
<span>{isZh ? "API · 在线" : "API · 在线"}</span>
<span>{isZh ? "API · 在线" : "API · Online"}</span>
</span>
</div>
</div>
+1 -1
View File
@@ -10,7 +10,7 @@ export function Ticker({ items }: { items: FeedItem[] }) {
<div className="bg-ink text-paper px-4 py-2 flex items-center shrink-0 gap-2">
<span className="w-1.5 h-1.5 bg-indigo rounded-full inline-block animate-pulse" />
<span className="font-cjk text-sm font-semibold tracking-wider"> </span>
<span className="font-mono text-[0.7rem] uppercase tracking-widest text-paper-deep">LIVE</span>
<span className="font-mono text-[0.55rem] uppercase tracking-widest text-paper-deep/60 ml-1 self-end mb-0.5">LIVE</span>
</div>
<div className="flex-1 overflow-hidden relative">
<div className="ticker-track py-2 font-mono text-[0.78rem]">