Files
penguin-harness/packages/landing
Yaowei Zheng d4faee3a1e Changelog, dev startup, README, AgentHub 0.4.0, model catalog, and landing site (#7)
Branch-length batch covering tooling, the model layer, the Web App and the public
surfaces. Highlights:

- Changelog: a per-release `changelog/<version>/` tree, grouped by the surface each
  change touches, with a root CHANGELOG.md holding one line per release.
- Dev startup: `scripts/dev-prebuild.mjs` serializes the skills+core prebuild behind a
  lock and keeps `pnpm install` current; `pnpm dev` runs server+web together.
- AgentHub 0.3.3 -> 0.4.0: OmniMessage complete payloads carry one opaque `fidelity`
  object in place of item-level `signature`/`phase`, threaded verbatim through Trace,
  replay and resume; malformed classification adapted to the new error types.
- Model layer: a model is always referenced by an explicit `(provider, model_id)` pair.
  The provider is never inferred, guessed or defaulted -- both the catalog inference and
  the unique-match config resolution are gone, and CLI, SDK, server routes and
  run_subagent all require the complete pair. Catalog gains the Qwen Token Plan, Qwen
  Pay-As-You-Go and Fireworks AI gateways, plus an expanded OpenRouter group.
- Web App: catalog preset sync and per-group speed test on the Models page, positional
  slash commands, a markdown renderer, skill-library update reminders, and a vertically
  centred draft page whose upward menus size themselves to the room available.
- Public surfaces: restructured READMEs, the penguin.ooo landing site and blog, refreshed
  benchmark results for both suites, and the demo videos playing on the landing page.

Includes the fixes from a full review of the branch: 23 confirmed findings, among them a
provider-inference bug that could send one vendor's API key to another vendor's endpoint,
and an Escape handler that destroyed the composer's contents unrecoverably.

Verified on the branch head: pnpm test (1127 passing, 7 packages), pnpm typecheck and
pnpm format:check clean, Playwright e2e 14/14.
2026-07-21 17:43:31 +08:00
..

@prismshadow/penguin-landing

The PenguinHarness product landing page (React + Vite + Tailwind CSS 4): bilingual (zh/en), light/dark themes, the feature matrix and CONTRACT.md showcase, benchmark charts, Playwright-captured product screenshots, and a local-Markdown blog (product news / release notes).

It deploys to GitHub Pages together with the docs site as one artifact: landing at the site root, docs under /docs/ (assembled by scripts/build-site.mjs at the repo root; the nav, footer and CTA link into /docs/).

Development

pnpm --filter @prismshadow/penguin-landing dev        # http://127.0.0.1:7366
pnpm --filter @prismshadow/penguin-landing build      # dist/ (with 404.html SPA fallback + .nojekyll)
pnpm --filter @prismshadow/penguin-landing typecheck
pnpm --filter @prismshadow/penguin-landing test

BASE_PATH=/ pnpm build:site                           # repo root: assemble landing + docs
pnpm --filter @prismshadow/penguin-landing preview    # serve the assembled tree

BASE_PATH controls the asset base (GitHub Pages project pages need /<repo>/; local default /). The Docs links resolve only in the assembled build — in plain dev they point at a path this dev server doesn't serve.

Deployment

.github/workflows/pages.yml builds landing + docs and deploys on pushes to main that touch either package (or on manual dispatch). First-time setup: repository Settings → Pages → Source = "GitHub Actions".

Blog

Posts live in content/blog/<slug>.<lang>.md (lang is zh / en; the two language versions of a slug fall back to each other). Frontmatter:

---
title: Post title
date: 2026-07-17
category: news | changelog
excerpt: One-line summary for the list page
---

Screenshots

pnpm --filter @prismshadow/penguin-landing shots regenerates src/assets/shots/: the script ships a scripted mock LLM (speaking both Anthropic SSE and OpenAI chat-completions streams), boots the Web service on a temp data root, drives a real "build an Agent app" conversation (tools actually execute in the Workspace), then captures the chat, trace and evaluation pages per UI language (zh/en, separate users) and theme (light/dark) — 12 shots (<page>-<lang>-<theme>.webp, re-encoded to WebP in Chromium to keep sizes down). The landing page always shows the shot matching the visitor's language and theme. Prereqs: build skills/core/server/web first, and have Playwright Chromium installed.

Part of PenguinHarness · Apache-2.0