Commit Graph

58 Commits

Author SHA1 Message Date
CodeWhale Bot e9bce3db9d fix(web): ground FAQ and getting-started copy in the 0.9.5/0.9.6 runtime contract
- FAQ: replace the two-binary codewhale/codewhale-tui answer with the
  one-runtime contract — codew is a byte-identical short name, the updater
  refreshes legacy codewhale-tui paths from the same bytes, and the tui
  crate now compiles into codewhale-cli; drop the separate codewhale-tui
  cargo install line (EN+ZH).
- FAQ: add Mistral AI to the provider sample list (EN+ZH).
- FAQ: codewhale doctor prints its report to stdout — the claimed
  ~/.codewhale/doctor.log file does not exist (EN+ZH).
- FAQ: drop the audit.log sentence; no runtime writer for it exists (EN+ZH).
- FAQ: OpenRouter setup uses the documented route form — --provider
  openrouter plus OpenRouter's own model slugs; no provider/model prefix
  parsing exists (EN+ZH).
- getting-started: step 4 becomes 'Set up your ideal fleet' — add every
  provider, then /fleet setup, the documented authoring wizard; drop
  codewhale fleet init, which only prints the ledger path.
- fleet docs: drop codewhale fleet init from the CLI verb block.
- home dictionaries + guide: align the four-step lede with the new step 4
  (EN+ZH).
2026-08-09 13:58:32 -07:00
CodeWhale Bot 5bdfeb7146 fix(web): keep localized navigation interactive
Move translated layouts onto the compact navigation until xl, reserve wide companion labels for 2xl, and keep every masthead control inside the viewport.

Portal the compact menu to a true viewport modal with inert background roots, contained keyboard focus, an in-dialog close control, and immediate cleanup when a resize crosses the desktop breakpoint.

Verified with all 254 web tests, ESLint, TypeScript, responsive width probes, and live English, Chinese, and Spanish pointer, keyboard, focus, resize, and navigation checks.
2026-08-07 22:17:12 -07:00
CodeWhale Bot eb5faf754b web: sharpen EN copy, real nav icon buttons, native locale rewrites
Three fixes on the newspaper-ocean site:

- Nav: baseline-align the Han secondary labels with the Latin primary
  (inline-flex items-baseline + matching line-height), and give the
  masthead real brand buttons — GitHub mark before the star count,
  Discord logo icon-only — with a .site-discord-link rule matching
  .site-github-link and a shared .brand-mark size.
- EN copy: hero/meta/footer sharpened around "Codewhale dives into the
  deep so you don't have to"; every "local-first" claim dropped in
  favor of "any model, on your machine". heroIntro keeps the {brand}
  token the lede split and dictionary tests require.
- Locales: home/chrome rewritten natively in all nine non-English
  packs (zh, ja, ko, vi, ru, uk, es, id, pt-BR) instead of machine
  translation. zh hero uses the 一入码门深似海 allusion per community
  feedback. Key parity, template tokens, and ru/uk script purity all
  hold; check:locales and dictionaries.test.ts pass.

Verified: npm ci && prebuild && check:facts && check:docs &&
check:locales && vitest (250/250) && eslint && tsc --noEmit && build.

Agent-assisted (Kimi Code); copy reviewed against the en reference.
2026-08-07 21:46:00 -07:00
CodeWhale Bot dd61f99b1d feat(web): motion and depth within the editorial design language
Entrance reveals on scroll, considered hover/focus states, restrained depth
on the terminal and card surfaces, and feedback on state changes — sized to
a print object coming to life rather than a landing page.

Every effect has a reduced-motion path written alongside it, not bolted on:
all four components check `prefers-reduced-motion` and the CSS carries its
own block. That block also avoids the usual reduced-motion bug — freezing
the ticker would strand every entry past the fold, so the track stops
moving and becomes scrollable instead of simply halting.

No animation library. `package.json` is untouched; this is CSS transitions,
the Web Animations API, and IntersectionObserver.

Nothing animated triggers layout. The properties in play are transform,
color, border-color, and background-size (underline draws) — all paint, so
cumulative layout shift stays zero. The brief asked for transform/opacity
only; the paint-only additions keep that intent.

The accessibility work from the previous pass is intact and re-checked:
the white/55 contrast value, the roving tabindex and aria-controls wiring,
and the mobile-menu focus return all survive.

Known, judged acceptable: focus stays inside the menu during its 170ms exit
fade and returns to the toggle on unmount; pointer interaction is disabled
for that window.

Drafted by Kimi K3 in Codewhale exec on an isolated worktree. Gates re-run
here: 250 tests, eslint clean.
2026-08-06 16:42:09 -07:00
CodeWhale Bot 74b5192110 fix(web): accessibility, structured data, and metadata defects
Defect fixes ahead of relaunch — no redesign, no new copy, no media.

Accessibility:
- The mobile menu declares `aria-modal`, which promises the dialog owns
  interaction, but focus never entered it and never came back. Focus now
  moves inside on open and returns to the toggle on close. The toggle node
  is captured before cleanup rather than read from the ref inside it, which
  would race React clearing it.
- The terminal player had `role="tablist"` with none of the pattern behind
  it. Adds arrow-key/Home/End movement, a roving tabindex, and
  aria-controls/aria-labelledby wiring between each tab and the panel.
- Context text ran at white/45 on ink — 4.32:1, below the 4.5:1 WCAG AA
  floor for normal text. Now white/55, 5.78:1.

Metadata:
- SoftwareApplication JSON-LD on the home page. Every field traces to a
  repo-sourced fact already rendered on the page; `softwareVersion` is
  omitted rather than guessed when facts carry none.
- `id` was missing from the OpenGraph locale map, so Indonesian pages
  emitted no og:locale.

Drafted by Kimi K3 in Codewhale exec, reviewed here. The claimed contrast
ratio was recomputed independently (5.78:1 vs its stated 5.75:1 — a
rounding difference against the exact ink token, and the before value does
genuinely fail AA). Gates re-run here: 250 tests, eslint clean.

Note for follow-up, not introduced by this change: `npm audit` in web/ now
reports 1 high-severity js-yaml advisory. The release contract requires 0.
2026-08-06 16:11:31 -07:00
Hmbown 667133a887 web: trim homepage and getting-started copy for v0.9.4
Shorten dense hero, proof, decides, meta, and start lede across all ten
locale dictionaries; tighten EN/ZH getting-started step bodies and thinking
trace context while preserving key and token parity.
2026-08-04 23:40:12 -07:00
Hmbown 36dcdd4b5b feat(web): put contributors on the homepage wire
The ticker printed `ISS #1234 title · 3h` for whatever the issues and pulls
endpoints last touched. It proved the repo was awake and nothing else: no
merges, no releases, no names, and English chrome on nine translated pages.

It now reports events, in the reader's language, with the person who did the
work named:

- Merged pull requests carry the contributor's handle. `merged_at`,
  `author_association`, and the login all arrive in the list payload we
  already fetch, so naming @bistack or @shenjackyuanjie beside their merge
  costs nothing extra.
- Opened and closed issues carry who filed them.
- Releases appear. That is the one added endpoint — `/releases?per_page=5`,
  cached an hour, ~1 request/hour. Three cached calls total, ~13 req/h
  unauthenticated against GitHub's 60/h/IP, and no per-item follow-ups.
- GitHub's own FIRST_TIME_CONTRIBUTOR verdict marks a newcomer's
  contribution. Copied verbatim, never inferred from the size of the window
  we happened to fetch, and it stops on its own as GitHub recomputes it.

Two honesty fixes the live render forced:

Each verb is now dated by its own event — `merged_at`, `closed_at`,
`published_at` — not by `updatedAt`. An issue opened in March and commented
on this morning was reading as "opened, 12 minutes ago".

Drafts are gone from the strip. A draft is its author's own not-ready
marker, and on this repo agents open them in batches: five of the twenty
items in the first live check were draft PRs from one bot, crowding out the
merges. They return the moment they are opened or merged.

A busy week could also bury the newest release entirely, so a release
published in the last sixty days keeps a slot — carrying its real date, so a
quiet quarter still reads as a quiet quarter rather than pinning an old tag
beside today's merges.

Verbs, the by-line, the first-contribution mark, and the strip's aria-label
are dictionary keys in all ten locales; titles, tags, and handles are the
repository's own record and stay verbatim. Ages format through CLDR off the
locale's existing `dateLocale`, the same way the masthead already sets its
date, with the compact English form as fallback where Intl data is missing.

Empty stays empty: an unreachable or fully-filtered feed removes the strip
rather than rendering a skeleton. Reduced motion now lets the frozen track
scroll instead of clipping every entry past the fold.

Verified: tsc, check:locales, check:facts, check:docs, 248 tests, lint, and a
288-page production build all clean. Live `next dev` against the real repo
rendered 15 entries on /en and /zh — merges by @Inference1 and @h3c-hexin,
issues by @vFONGv, @bistack, @shenjackyuanjie, @rafaelcavalheri, the v0.9.3
release, Chinese verbs and relative times throughout. Pointed at an
unreachable repo, both locales render fully with no ticker and no leaked
dictionary tokens.
2026-08-03 23:43:20 -07:00
Hmbown 88167ed7b7 fix(web): correct locale-inverted headings, stale provider list, and dead components
Shortcut facts (this is why the contract test moved):
docs/public-surface-facts.json declared both `Tab` and `Shift+Tab` as
`when: "composer idle"`, and web/lib/public-surface-contract.test.ts pinned
that string into README.md and docs/KEYBINDINGS.md. Both halves are false —
crates/tui/src/tui/ui.rs:6978 gates Tab on `!app.input.is_empty()`, and
ui.rs:6363-6367 gates Shift+Tab only on the modal stack. The matrix now says
"composer empty" / "always (suppressed only under a non-Config modal)" and the
test asserts the corrected wording plus a negative guard so the idle claim
cannot come back. docs/MODES.md:24 already said "when the composer is empty";
it was the matrix and the test that were stale.

/runtime rendered the Chinese-primary H1 for every locale:
web/app/[locale]/runtime/page.tsx:84-88 had two byte-identical ternary
branches, both `Runtime & 集成 Integrations`. That contradicts
web/lib/i18n/dictionaries/types.ts:33-46 ("Never hardcode Han characters at a
call site") and docs/LOCALIZATION.md:80-82 ("no locale renders another
language's script by accident"). Every other page follows the correct pattern
(constitution/page.tsx:60-65). Fixed both branches; same class, smaller blast
radius, in feed/page.tsx:114 ("Section 03 · 动态" hardcoded in the EN branch).

FAQ provider list was 25 hand-maintained names against 40 real routes:
web/lib/facts.generated.ts derives 40 providers from `pub enum ApiProvider`,
and models/page.tsx already renders `facts.providers.length`. The FAQ omitted
15, including xAI, Baidu Qianfan, Meta Model API, and all four Model Studio
routes. Because ja/ko/ru/es/pt-BR/uk/vi/id fall back to English page bodies,
9 of 10 locales saw the stale list. The count is now derived from FACTS and
the enumeration is explicitly a sample ("including …") pointing at /models.

Other corrected claims:
- docs/subagents/page.tsx omitted the `consultant` role. It is one of the eight
  in FLEET_ROLE_SCHEMA_VALUES (crates/tui/src/tools/subagent/mod.rs:376-385),
  advertised to the model, and already in web/lib/content/vocabulary.ts:183-186.
- lib/media-manifest.ts:99-100 promised a recording "from the v0.9.2 release
  candidate" on a live page (/docs/guide via components/session-media.tsx:47).
  v0.9.2 and v0.9.3 both shipped; restated against 0.9.4.
- lib/docs-map.ts:39-40 advertised Nix and Scoop as contents of /install. Both
  are real (docs/INSTALL.md:356, :507) but the site page has neither; the
  description now names what the page actually contains.
- web/README.md:99/101/122/127 — "en / zh, every page is bilingual" (10 locales
  route and non-zh get English bodies), a home-page section list naming four
  sections that do not exist, and "EN ↔ ZH toggle" for what
  components/locale-switcher.tsx:13-14 builds as an N-locale dropdown.
- docs/LOCALIZATION.md stated three different TUI key counts (1248 in the table,
  1,153 at :234). `python3 scripts/check-tui-locale-parity.py` prints 1299 for
  every pack. The zh-Hant row claimed 499/1248 "missing keys fall back to
  English at runtime" — it is 1299/1299, so nothing falls back; the row now says
  so and flags the PARTIAL_PACKS promotion as an open decision. The web
  reference shape said 51/60 keys twenty-three lines above its own correct
  52/62; check:locales prints 52/62.

Deleted (verified zero importers, no barrel, no glob loader, no CI reference):
- components/stat-grid.tsx — pulled from community/page.tsx in c268cc375, which
  added the guard at lib/public-copy.test.ts:141 asserting the page must NOT
  use it. That guard reads page source as a string and is kept.
- components/mermaid-diagram.tsx — its only consumer was removed in 5abe250f3e
  ("Cut: … the Mermaid architecture diagram"). Removed with it: the dead
  `.mermaid-frame` rules in app/globals.css and the `mermaid` production
  dependency, via `npm uninstall mermaid` so package-lock.json stays consistent
  with package.json (CI runs `npm ci`, which hard-fails on drift).

Verified in web/: npm test exit=0 (28 files, 235 tests), check:facts exit=0,
check:locales exit=0, check:docs exit=0, lint exit=0.
2026-08-03 22:48:21 -07:00
Hmbown cc20f407f3 feat: link the Codewhale Discord from the README and the site
Adds https://discord.gg/37gfS3ksug in the places someone actually looks for
a community: a badge in the first badge row and an entry on the language/link
line of all ten READMEs, a Discord action in the site nav beside the star
badge, an entry in the footer Project column, and a link in the homepage
community section.

"Discord" is a brand name, so it is a literal rather than a dictionary key —
it needs no translation and every routed locale gets the identical link shape.
The one exception is the zh README's nav line, which reads "Discord 社区" so
the word is a noun phrase in context rather than a bare English token.

docs-ia.test.ts pins the footer project routes in exact locale-swap parity, so
its expectation is extended rather than relaxed — a new footer link still has
to appear in every locale or the test fails.

Receipts: cd web && npx tsc --noEmit exit=0; npm test -> 28 files, 235 tests
passed; npm run lint exit=0.
2026-08-03 22:35:58 -07:00
Hmbown 6403d0a9a5 feat(web): two ambient effects, both opt-in, and nothing else
The TUI's ambient life — fish, jellyfish, bubbles, the whale cameo — stays out
of scope. Two orders of magnitude separate web-native "ocean motion" from what
this product has ever shipped, and this page quotes the product's restraint
doctrine in its own copy. The whole site now has four keyframes; these are two
of them.

M1, the column breath: one overlay on `.ocean-column` animating OPACITY ONLY
between 0 and 0.045 on a 90s cycle — the TUI's authored 0.018–0.055 phase bias
as the same fraction of a mix. Opacity is the only property that cannot cause
layout work on an element four bands tall. No position change, no hue shift,
no filter.

M2, the caustic: ~1.3s of ice light crossing the footer whale, parked
off-canvas for the remaining ~2.7s, peak 0.33, sine-in-out — `ambient_life.rs`
at its literal amplitude and cadence. One whale only; two caustics is chrome.
It is clipped to the mark, so it lands on the whale and never on a rectangle
of footer behind it, and `Whale` takes it as an opt-in prop.

The clip sits on a static <g> with the highlight moving inside it. Clipping the
moving rect instead slides the whale-shaped window along with the light, which
is a very quiet way to render nothing at all — caught by screenshotting a
frozen frame rather than by reading the markup.

Both effects are gated behind `prefers-reduced-motion: no-preference` rather
than overridden under `reduce`: an override can be defeated by specificity, a
gate cannot. Verified under emulated `reduce` — the breath overlay does not
exist, the caustic has no animation and stays parked, and the column's field
is still there. Reduced motion freezes the field; it never removes it.

No new strings. Verified: npx tsc --noEmit, npm test (235), npm run lint,
by eye at /en 1440px including a frozen mid-sweep frame.
2026-08-03 21:28:49 -07:00
Hmbown dcf98dbbb9 feat(web): drive the newspaper homepage and chrome from dictionaries in every locale (#4934)
FINISH-0.9.4 §0A Phase 1. The homepage, nav, footer, and layout were an
EN/ZH special case with a thin foreign fallback: English and Chinese copy
lived inline in the TSX behind isZh ternaries, and the eight routed partial
locales fell through to English for anything the dictionaries did not cover.

- HomeDict/ChromeDict extended to cover every visible homepage and shared
  chrome string (chrome 51->52 keys, home 60->62).
- New web/lib/i18n/dictionaries/zh/{chrome,home}.ts, extracted faithfully
  from the existing inline Chinese rather than retranslated.
- Real translations to exact key parity for ja, vi, ko, ru, uk, es, pt-BR
  and id. {token} placeholders preserved; no sentence is concatenated
  around a variable.
- Homepage, nav, footer and layout consume getHome(locale)/getChrome(locale)
  for all ten locales. Every isZh/foreign user-copy branch on those surfaces
  is deleted rather than left running alongside the new path.
- Footer link sets generate from the dictionaries via the new
  web/lib/i18n/links.ts instead of hardcoded per-locale arrays.

Closes a real gap found on the way: app/[locale]/layout.tsx still carried an
isZh branch governing the skip-to-content link, which renders on every page
of every locale, and the home route's metadata title and description. Eight
locales were serving an English skip link and an English <title> behind
fully translated chrome.

Honesty: zh stays `shipped` because its first-class pages (install, FAQ,
community, contribute, models, runtime, roadmap, constitution) really are
translated — chrome alone never earns it, and config.ts now records that as
the reason. The other eight stay `partial` with a localized badge;
install/faq/community/contribute still fork on isZh, which is Phase 2 scope
and is exactly what keeps those locales partial.

Contract tests strengthened, not relaxed: public-copy and
public-surface-contract now assert the rendered contract and the EN
dictionary value instead of matching raw TSX strings, and the footer's
account-copy ban is asserted across all ten locales rather than the TSX alone.

Receipts, all exit 0: npm run prebuild, check:facts, check:locales,
check:docs, test, lint, build. Ten locales fetched from a dev server and the
markup inspected: no rendered dictionary keys; masthead, 深 seal,
ocean-framed codewhale-tui.png and the partial badge intact in every locale.
2026-08-03 18:27:46 -07:00
Hmbown 095588c52e fix(web): keep shared branding locale-neutral
Use universal product labels for the new shell chrome and remove color overrides made obsolete by the two-tone Signal Current mark. Update the Blue Stage contract test to pin the mark fill directly.
2026-07-27 21:22:43 -07:00
Hmbown 62ffd434dd feat(web): align landing with managed product
Adopt the Signal Current mark and the quiet navy shell used by the managed Codewhale app. Remove decorative CSS creatures, frame the real terminal capture, keep its published version truthful, and preserve mobile navigation at 390px.
2026-07-27 21:13:55 -07:00
Hmbown f77d6dfdc5 feat(web): surface the getting-started path in the homepage, nav, and footer
The homepage gains a four-step getting-started band rendered from the shared
content module, plus links to the guide and vocabulary pages. Nav and footer
add Start/Getting started and FAQ entries so the new-user path and the answers
page are reachable without digging.

Accessibility: a skip-to-main-content link ahead of the nav, a labeled main
landmark, and an accessible name on the primary navigation.
2026-07-27 18:00:32 -07:00
Hmbown 35bca1fd71 feat(web): add /docs/guide and /docs/vocabulary routes
The guide topic flips hasPage true and gains a real page instead of linking
out to the repository; vocabulary is a new core-concepts topic. Both are
registered in docs-map.ts and app/sitemap.ts, so the docs index, navigation,
and sitemap stay in agreement.

/docs/guide renders the shared four-step path and the pending real-session
media slot. /docs/vocabulary renders the execution nouns, modes and permission
postures, route-identity provenance fields, the Consultant advisory role, and
the measurement principles — including the explicit statement that this site
publishes no benchmark leaderboard.

docs/fleet now reads its vocabulary from the shared module rather than an
inline copy, so the definitions cannot drift between pages.

Tests: docs-ia.test.ts covers information architecture; docs-navigation.test.ts
is updated for guide's new local-page routing.

Harvested from the #3413 web-maturity lane.
2026-07-27 17:59:56 -07:00
Hmbown 610a575a2d feat(web): add the real-session media manifest in its pending state
media-manifest.ts declares the one real-session slot and its budgets;
session-media.tsx renders it. The single entry ships as `pending`: no poster,
no video, no captions, no GIF, and no files under web/public/media/. The
component renders a visible "Recording pending release candidate" panel
instead of any placeholder, staged, or recycled footage, and the test suite
enforces that a pending entry stays asset-free on disk and in the manifest.

The reduced-motion contract is structural rather than a media query patch:
preload="none", no autoplay attribute anywhere, static poster default, GIF
offered only as a link.

docs/releases/v0.9.2-media-plan.md documents the post-dogfood recording
procedure. It publishes nothing and authorizes nothing; flipping an entry to
`published` still requires the complete asset set and the enforceable checks.

Harvested from the #3413 web-maturity lane.
2026-07-27 17:59:55 -07:00
Hmbown aff2cf782c feat(web): localize the site chrome and home page for eight locales
Extracts the marketing site's hard-coded English copy into per-locale
dictionaries (19 chrome keys + 40 home keys for en, es, ja, ko, pt-BR,
ru, uk, vi) and routes nav, footer, locale switcher, sitemap, and the
home page through them.

Also:

- `lib/i18n/detect.ts` pulls Accept-Language negotiation out of
  middleware into a tested module. This fixes the pt-BR bug: a browser
  sending `pt-BR` was matched on the bare `pt` prefix against the wrong
  candidate and could land on the English page.
- page-meta derives hreflang alternates from the locale registry instead
  of a hand-maintained list, so a new locale can no longer ship without
  its alternates.
- `web/scripts/check-locales.mjs` is a new CI gate: it holds every locale
  dictionary at exact key parity with `en` and fails if a translation
  drops a `{template}` token. Wired into ci.yml and `npm run
  check:locales`.

Gates: `npm test` 168 passed (24 files), `npx tsc --noEmit` clean, `npm
run lint` clean, `node web/scripts/check-locales.mjs` PASS.

Harvested from the v0.9.2 localization lane (#3092, #4749, #4791).
2026-07-27 02:41:03 -07:00
Hunter B 4b80259c67 docs(public): align release facts with runtime
Derive website sandbox facts from explicit runtime capability markers instead of source filenames. Document actual platform wrappers, narrow model and audit claims, and make two-package/three-command installs exact.

Verify release assets under their manifest filenames before renaming them, with an executable contract test for every Unix snippet. Refresh localized README receipts and keep source-candidate toolCount at 66.

Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-21 18:38:16 -07:00
Hunter B 3714b8a425 fix(web): enforce source-backed public facts
Align English and Chinese public copy with the canonical tools, permission labels, privacy boundary, candidate/release split, roadmap state, and install channels. Expand the machine-readable matrix and drift tests, add verifiable FAQ source links, and cover canonical/hreflang/Open Graph/Twitter metadata on previously incomplete routes.

Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-21 17:20:37 -07:00
Hunter Bown 8e34589f25 docs(web): align the public surface with Blue Stage (#4587)
* docs(web): align the public surface with Blue Stage

Carry the TUI's semantic Blue Stage palette into the website, keep Signal Gold on the whale and human-attention accents, and enforce the cross-surface token contract in tests. Route existing Install and Providers topics to their first-party pages and document the loopback-only browser client's real bootstrap and authentication boundaries.

Signed-off-by: Hunter B <hmbown@gmail.com>

* docs: keep translated READMEs in public-surface parity

Mirror the browser-client command and guide link across all six translated READMEs, with the source stamp updated to the exact English README. This restores the repository translation gate without translating or reordering executable commands.

Signed-off-by: Hunter B <hmbown@gmail.com>

---------

Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-19 18:26:49 -05:00
Hunter B 9e3e8368bd web: remove unreleased managed-app surfaces from public site
Drop the footer App preview links to app.codewhale.net (en and zh)
while that surface is not intentionally public, remove the managed
app preview roadmap tease, and cut the managed-app aside from the
runtime trust-boundary copy. Update the public-copy contract test to
assert these surfaces stay out of the site.

The local-runtime story is unchanged: no account required, Runtime
API stays loopback by default.

Prepared with agent assistance for the 0.9.1 public-surface pass;
verified with vitest (76 passed), eslint, and next build.

Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-18 16:54:34 -07:00
Hunter B d5bd2b4cf6 feat(release): publish native Windows ARM64 artifacts
Build and smoke the complete Windows ARM64 binary family on GitHub native runners, wire npm, updater, bundle, website, and release inventory support, and preserve the originating contributor credit.

Move Linux ARM64 releases off the slower cross-link path, remove redundant matrix target installs, and update actionlint for the hosted ARM runner label.

Refs #4267.

Co-authored-by: w1w218 <6767665+w1w218@users.noreply.github.com>
Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-17 15:31:46 -07:00
Hunter B c268cc3756 fix(web): simplify community and mobile docs surfaces
Replace the pre-redesign community ticker, stats, empty dispatch, and duplicate closer with the documentation portal's quieter section grammar. Keep issue and pull-request entry points prominent and preserve the complete current-release contributor ledger.

Collapse the repeated docs index to one mobile return link, add an honest app preview footer link, and apply strict CJK heading line breaking so punctuation does not orphan at narrow reading widths.
2026-07-15 17:34:20 -07:00
Hunter B 5f57094458 web: harden docs navigation and dark mode
Make dedicated docs pages expose a route-derived current state, replace dead runtime anchors with canonical source-document links, and add theme-scoped AA contrast tokens for dark docs controls.

Add contract coverage for navigation semantics, source targets, and both automatic and explicit dark-theme contrast.
2026-07-14 14:20:19 -07:00
Hunter B 1556d36d50 web: center docs and community in the public site
Replace the old almanac-style documentation shell with a compact ocean portal and source-led topic rows. Move issue, pull-request, and translation paths to the front of the community and contribution pages, and remove the long opinionated contribution prompt.

Correct the public roadmap, ACP, VS Code, and provider copy so the optional managed app is not ruled out or overstated and implemented runtime capabilities remain explicit.

Verified with the website facts/docs gates, 46 Vitest cases, ESLint, a production Next.js build, HTTP route smoke checks, and desktop/mobile headless Chrome captures.
2026-07-14 14:09:28 -07:00
Claude 24e1e0c9f1 fix(web): align site brand strings and tidy redesign leftovers
Follow-ups to the #4362 documentation-led redesign, addressing the four
non-blocking findings from its review:

- Align user-visible brand strings across all web pages to the
  "Codewhale" wordmark the redesign introduced (repo URLs and the
  Hmbown/CodeWhale slug are untouched).
- Deduplicate the homepage topic special-cases: topicHref() and
  TopicList now share one TOPIC_PAGE_OVERRIDES map instead of two
  hardcoded id lists that could drift.
- Replace the stale pre-rebrand ink rgba(14,14,16,...) with the
  palette ink rgb(27,34,48) in globals.css and the mobile menu divider.
- Remove the dead .site-install-link CSS now that the desktop nav no
  longer renders an Install button.

Verified with eslint, 42 web tests, check-docs, and a full Next.js
production build (39 pages).

Prepared with agent assistance.
2026-07-14 04:48:31 +00:00
Claude c220abd3b7 Merge pull request #4364 from idling11/feat/web-keyword-search
feat(web): add keyword search to docs hub and FAQ pages

Resolved a generatedAt-timestamp conflict in web/lib/facts.generated.ts
against the post-#4362 main; both sides already agreed on toolCount 85.
2026-07-14 04:39:02 +00:00
Hanmiao Li a2239001d9 feat(web): add keyword search to docs hub and FAQ pages
Add client-side keyword search to two of the most content-heavy pages
on codewhale.net:

Docs hub (/docs):
- New DocsSearch client component with real-time filtering across all
  doc topics (label, description, source files, category — in both EN
  and ZH)
- Search input with / keyboard shortcut to focus, clear button, result
  count, and no-results state
- Matched text is highlighted inline
- The topic grid and category sections update live as you type

FAQ page (/faq):
- New FaqSearch client component wrapping the existing FAQ item list
- Full-text matching across question text, answer content (extracted
  from React nodes), and source citations
- Same UX patterns: / shortcut, highlight, result count

Shared logic:
- web/lib/search-utils.ts extracts the pure filtering functions for
  unit testability
- web/lib/search-utils.test.ts: 19 tests covering haystack building,
  locale-cross-matching, case-insensitivity, and edge cases

Styling:
- .search-input and mark.search-highlight classes in globals.css,
  using existing CSS variables for consistency with the site theme
2026-07-14 11:08:30 +08:00
Hunter B 9f348500a7 feat(web): make the public site documentation-led
Replace the oversized marketing sequence with a compact documentation portal, repository-derived quickstart facts, and direct topic navigation.

Keep the underwater identity restrained, align typography and controls with CWC, and give the international contributor community clear issue and pull-request paths.

Verified with facts/docs checks, 23 web tests, lint, a 39-page production build, and responsive browser QA.

Signed-off-by: Hunter B <hmbown@gmail.com>
2026-07-13 19:03:22 -07:00
Hunter B 737ac98728 ci(release): pause riscv64 artifacts for v0.8.67
Sync to CNB / sync (push) Has been cancelled
Release / parity (push) Has been cancelled
Release / resolve (push) Has been cancelled
Release / build (codewhale-linux-arm64, codewhale, ubuntu-latest, linux-arm64, codew-linux-arm64, codew, aarch64-unknown-linux-gnu, codewhale-tui-linux-arm64, codewhale-tui) (push) Has been cancelled
Release / build (codewhale-linux-x64, codewhale, ubuntu-latest, linux-x64, codew-linux-x64, codew, x86_64-unknown-linux-musl, codewhale-tui-linux-x64, codewhale-tui) (push) Has been cancelled
Release / build (codewhale-macos-arm64, codewhale, macos-latest, macos-arm64, codew-macos-arm64, codew, aarch64-apple-darwin, codewhale-tui-macos-arm64, codewhale-tui) (push) Has been cancelled
Release / build (codewhale-macos-x64, codewhale, macos-latest, macos-x64, codew-macos-x64, codew, x86_64-apple-darwin, codewhale-tui-macos-x64, codewhale-tui) (push) Has been cancelled
Release / build (codewhale-windows-x64.exe, codewhale.exe, windows-latest, windows-x64, codew-windows-x64.exe, codew.exe, x86_64-pc-windows-msvc, codewhale-tui-windows-x64.exe, codewhale-tui.exe) (push) Has been cancelled
Release / bundle (push) Has been cancelled
Release / windows-installer (push) Has been cancelled
Release / docker (push) Has been cancelled
Release / release (push) Has been cancelled
Release / homebrew (push) Has been cancelled
2026-07-07 00:40:02 -07:00
idling11 a41db7b759 feat(i18n): define localization matrix with locale registry and drift checks (#3090)
- docs/LOCALIZATION.md: canonical tracking document for shipped,
  planned, and deferred locales across website and README surfaces.
  Includes Russian as next-priority and Arabic as RTL deferred.
- web/lib/i18n/config.ts: expand locale config with ALL_LOCALES
  registry (9 tracked locales, 2 shipped) and LocaleStatus types.
  Active `locales` array now derived from shipped status, enabling
  >2 locale support without hard-coded arrays.
- web/components/locale-switcher.tsx: rewrite from hard-coded en↔zh
  toggle to support any number of shipped locales (2 = toggle,
  3+ = dropdown). Reads from ALL_LOCALES.
- web/middleware.ts: Accept-Language detection now matches against all
  shipped locales instead of hard-coding Chinese-only detection.
- scripts/check-readme-locales.sh: symmetry check verifying main
  README links all locale READMEs and no orphaned locale files exist.

Harvested from PR #3763 by @idling11

Co-authored-by: idling11 <8055620+idling11@users.noreply.github.com>
2026-07-02 03:42:55 -07:00
Hunter B 4f6d062879 fix(web): point the Community nav link at the community hub
The header nav sent "Community" / "社区" to /feed, the raw activity list,
while the footer already links the same word to the /community hub built to
be the community landing page. Point the nav at /community too so the two
navigations agree and visitors land on the hub (which itself links out to the
feed, digest, roadmap, and contribute pages).

Tests: cd web && npm run lint && npm test && npm run check:facts && npm run build
2026-07-02 03:04:33 -07:00
Hunter B d0de1646d3 feat(web): dark mode for the docs routes
Add a dark theme scoped to /docs — the reference-site minimum. A full
site-wide inversion is unsafe: several marketing surfaces are deliberately
dark (bg-ink text-paper — the hero closer, the terminal player, the LIVE
ticker badge) and a naive token swap would flip them into light blocks.

Mechanism: the surface/ink Tailwind tokens (paper, paper-deep, paper-edge,
ink, ink-soft, ink-mute) now resolve through rgb(var(--c-*) / <alpha-value>)
channels; :root carries the exact light values, so light output is
unchanged. The dark values are set only on the .docs-theme wrapper, so the
docs subtree re-themes while the shared nav and footer stay light. Default
follows prefers-color-scheme; an explicit data-theme on <html> wins.

Add an Auto/Light/Dark toggle in the date strip that persists to
localStorage and only renders on docs routes (it would be a no-op control
elsewhere). An inline pre-paint script applies the stored choice to avoid a
theme flash.

Contrast audit: hairlines, the col/double rules, the code-block border, and
inline-code border route through a --hairline var that lightens in dark;
the code panel raises to --code-bg (#17181e) above the page so it stays
distinct; the CJK seal inverts to a light stamp with dark glyph (legible);
the indigo accent is preserved. No mermaid/code blocks currently live in
the docs pages; the code surfaces are handled for when they do.

Tests: cd web && npm run lint && npm test && npm run check:facts && npm run build — all pass
2026-07-02 00:11:37 -07:00
Hunter B 137b74c2e0 feat(web): community hub + homepage non-goals
Add a /community route that gathers the community story as an addition,
not the headline: it composes the existing Ticker and StatGrid, renders
the cron-curated dispatch, and links out to the activity feed, weekly
digest, roadmap, contribute guide, and release credits under the frame
"Stewarded, not just shipped" (both en and zh, native-register).

Add a compact "What CodeWhale doesn't do" section to the homepage before
the closer. Each non-goal was verified true against the codebase: no
cloud account, no code telemetry (only an opt-out release check), BYOK
with no inference markup, no CLA, no silent model switching, and the
load-bearing one — the constitution never overrides runtime approval /
sandbox / network / trust, which the harness enforces in code.

Wire Community into the footer (both locales) and add /community to
sitemap.ts. Nav stays at five items.

Tests: cd web && npm run lint && npm test && npm run check:facts && npm run build — all pass
2026-07-02 00:06:55 -07:00
Hunter B 00c38aec5e feat(web): models page generated from the provider registry
Add /models (en + zh), rendered from the derived facts accessor
(getFacts, KV-overridable): a first-class DeepSeek card (default
provider and model, api.deepseek.com reachable from mainland China
without a proxy — the existing mirrors copy), a no-key local-runtimes
card (vLLM / SGLang / Ollama), an OpenRouter card, and the remaining
providers as peer cards with id and env credentials. The framing row
states only what the codebase supports: keys stored locally via
codewhale auth set, no billing-path relay, and explicit /provider +
/model routes per README 'How instructions are ranked' and the
provider section.

On the homepage, retitle the 'Where things stand' status box to
'Any model, honestly' (S4) with a one-line provider-honesty framing
and a link to /models, so live status reads as provider honesty
rather than a hero warning. Add Models to both footer Product columns
and the sitemap; the top nav stays at its five-item cap.

Tests: cd web && npm run lint && npm test && npm run check:facts && npm run build
2026-07-01 23:16:49 -07:00
Hunter B d14d82f73d feat(web): constitution thesis page and homepage three-layers section
Add /constitution (en + zh), the marketing-level thesis page for the
nested constitution: the three-layer card row (bundled base law,
/constitution standing law at $CODEWHALE_HOME/constitution.json, repo
law at .codewhale/constitution.json), the v0.8.67 constitution-first
setup framing (first launch walks language, model, posture, and your
constitution; /setup any time; model drafts, user ratifies), the
honest boundary line (approval/sandbox/network/trust enforced in
code), a ThinkingTrace mount for the real session excerpts, and links
out to /docs/constitution and /install.

On the homepage, insert a compact three-layers section (S3) between
the ticker and the stats band — three cards, the v0.8.67 pill, one
boundary line, and a link to the new page. Add Constitution to the
top nav (between Install and Docs, keeping the nav at five items),
the footer Product column, and the sitemap.

All claims match README 'How instructions are ranked' and the
SetupStep wizard in crates/tui (Language, ProviderModel, TrustSandbox,
Constitution, Verification) plus the /setup command.

Tests: cd web && npm run lint && npm test && npm run check:facts && npm run build
2026-07-01 23:12:57 -07:00
Hunter B 5a38e20599 feat(web): terminal player for the real constitution traces
New components/terminal-player.tsx renders the previously orphaned
thinking-trace scenes inside a dark terminal chrome (traffic-light
dots, "codewhale - thinking" title bar) with scene tabs and a
progressive typing animation ending in a blinking caret.

SSG-safe by construction: the server render emits the complete static
trace (also the no-JS experience); the animation only starts inside a
client effect, so there is no hydration mismatch and no Date.now in
render paths. prefers-reduced-motion users keep the full static text.
Pure React + CSS, zero media assets.

thinking-trace.tsx now exports SCENES and Scene and adds short en/zh
tab labels per scene; the existing card component is untouched.
globals.css gains the caret blink keyframes plus a reduced-motion rule
that also stills the activity ticker.

Tests: cd web && npm run lint (pass); npm test (3 files, 23 tests
passed); npm run check:facts (OK); npm run build (pass). Run on the
full phase-1 tree.
2026-07-01 22:49:39 -07:00
Hunter B 28efab313f feat(web): live star badge, live version, trimmed top nav
Show a live GitHub star count in the nav ("* 39.3k" style) via the
already-cached fetchRepoStats path, with a plain "GitHub" fallback when
the API is unreachable at build time. The "Issue YYYY-MM-DD" date strip
now reads the real version from lib/facts.generated.ts (FACTS.version)
instead of the hardcoded "v0.8.x". formatStars lives in lib/github.ts
so the homepage can reuse it.

Top nav trims to Install / Docs / Community / FAQ; Community points at
the existing /feed page (no new pages this phase). Runtime and
Community Digest move into the footer columns (en and zh) so
Roadmap/Digest/Contribute/Runtime all stay reachable.

Tests: cd web && npm run lint (pass); npm test (3 files, 23 tests
passed); npm run check:facts (OK — matches workspace); npm run build
(pass, all locale routes SSG). Run on the full phase-1 tree.
2026-07-01 22:49:30 -07:00
Matt Van Horn d5520b7d1f fix: address self-review findings (keep nav server-rendered, isolate active-link state) 2026-06-26 00:29:25 -07:00
Matt Van Horn dfd504f3c9 feat: surface weekly community digest in sitemap and navigation 2026-06-26 00:24:17 -07:00
CodeWhale Agent 51047e972b docs: update public security contact
Point public vulnerability reporting contact surfaces at hmbown@gmail.com after the codewhale.net security mailbox bounced. Keep the release guard aligned so CI rejects stale security@codewhale.net references in SECURITY.md.
2026-06-24 12:55:51 -07:00
Hunter Bown 76e09ed10d docs(web): add provenance / source-of-truth copy (footer, install, CNB) (#3514)
State plainly that GitHub is the sole canonical source across the site:
- footer: a Provenance section shown on all locales (was a zh-only mirror
  list), starring the official GitHub link and noting that mirrors are
  China-network accelerators (link labels localized for EN/ZH)
- install: an "Official source" label on the Mainland China network section
- docs/CNB_MIRROR.md: a Provenance section that accurately describes the
  CNB-built SHA256 manifest, with a verification path

Harvested from PR #3440 by @donglovejava. Dropped that branch's unrelated
churn (stray working files, workflow edits, and a SECURITY.md contact change
that regresses the current address) and preserved the current Gitee URL.


Claude-Session: https://claude.ai/code/session_01991fnUqBbWSgiUFw33L8XX

Co-authored-by: donglovejava <211940267+donglovejava@users.noreply.github.com>
2026-06-23 17:27:54 -07:00
Hunter Bown 61cc1cb813 feat(web): publish install script (#3482)
Co-authored-by: CodeWhale Agent <codewhale-agent@hmbown.local>
2026-06-23 10:51:50 -07:00
Saieswar c75dba8338 feat: publish weekly community digest archive route #3420 (#3476) 2026-06-23 10:26:43 -07:00
Hanmiao Li d5d8b2d3ec feat(web): add runtime and integrations page to codewhale.net (#3419) (#3435)
Adds a public /runtime page covering all CodeWhale integration surfaces:

- HTTP/SSE Runtime API (127.0.0.1:7878)

- ACP (Agent Communication Protocol)

- MCP (Model Context Protocol) servers

- VS Code Extension

- Telegram Bridge

- Feishu / Lark Bridge

- Weixin Bridge (experimental)

Includes a Trust boundary section (local-first, auth required, permissions user-controlled, open protocols) and bilingual EN/ZH copy. Added to navigation and sitemap.
2026-06-22 22:56:52 -07:00
Hanmiao Li 69d6609050 feat(web): add provenance and mirror trust copy to codewhale.net (#3421) (#3436)
Adds official-site provenance information across three surfaces:

- Install page: new 'Provenance & mirrors' section (§07) covering official sites, GitHub Releases, CNB mirror, TUNA mirrors, and self-deployed copies

- FAQ: new EN+ZH entry 'Is codewhale.net the official site?' with mirror trust boundaries

- Footer: 'codewhale.net — the only official site' provenance line

Bilingual EN/ZH copy throughout.
2026-06-22 22:56:40 -07:00
Hunter B a70d5c9e12 docs(web): harvest README + website refresh onto main (0.8.61)
Richer README front door (open-models-first framing, '## The Idea' constitution essay,
accurate 24-provider list) + website improvements (SEO opengraph/robots/sitemap routes,
nav/footer, facts-driven pages, coupled locale-layout), 3-way reconciled to 0.8.61:
provider count corrected 21->24 (verified vs crates/config), version/palette/dead-link fixes.
Conservatively deferred 3 heavily-conflicting web pages (page/faq/install) to preserve main's
richer versions. Verified: tsc --noEmit exit 0, eslint clean, cargo build clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 14:27:45 -07:00
Hunter B bb4d1e5744 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
2026-06-13 13:55:51 -07:00
Hunter B 5b3228cc4e docs(readme): renovate website hero + localized READMEs; nest contributors
- Home hero (web/app/[locale]/page.tsx): multi-model, community-first,
  'intent outranks everything' framing; replace DeepSeek-only positioning.
- Add 'See how it decides' section + thinking-trace.tsx: surfaces real
  reasoning traces (Article II/V citations) paired with the decision each
  produced — proof, not assertion, that the constitution operates.
- docs/CONTRIBUTORS.md: chronological collapsible bands (forward-track ->
  recurring/historical -> v0.8.48). Rebuilt by byte-copying verified HEAD
  content; handle diff confirms zero contributor drops.
- Localize README.zh-CN / ja-JP / vi to mirror the new English README
  (multi-model, community-first, constitution in its own section, concise
  Thanks linking to docs/CONTRIBUTORS.md).
2026-06-13 13:40:33 -07:00
Hunter B 2b69f4e041 chore: polish codewhale home defaults 2026-05-31 19:22:12 -07:00