release: 0.2.0 (#168)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Yaowei Zheng
2026-08-03 21:22:05 +08:00
committed by GitHub
parent 2e8389f438
commit 4d5d55d15a
27 changed files with 171 additions and 15 deletions
+1
View File
@@ -2,6 +2,7 @@
One brief line per release. Per-release detail lives in [`changelog/<version>/`](changelog/).
- **0.2.0** — 2026-08-03. One sealed installer bundle per target serving online and offline installs alike — now mirrored to Alibaba Cloud OSS with automatic fallback — truncated tool output recovered from the Session scratchpad, chat navigation for long conversations (shell-style ↑ input recall, stacked sticky run headers, a minimap tick rail with hover previews), steering that survives reloads and carries file attachments, a DB-served session list with paged sidebar groups, and the refreshed qianwenai / OpenRouter model catalog defaulting to deepseek-v4-flash. ([details](changelog/0.2.0/README.md))
- **0.1.5** — 2026-07-30. Self-contained offline installer bundles for all five platforms (with MinGit bundled on Windows), composer attachments of any file type with images reaching steering and goal objectives, in-run recovery for every LLM failure short of a rejected credential, a tenth-shorter default system prompt, the paper-editorial web-design theme with thinking/image guidance in the SDK skill, and a refreshed README/landing install story. ([details](changelog/0.1.5/README.md))
- **0.1.4** — 2026-07-27. Carries the whole 0.1.3 feature set to npm, which 0.1.3 itself never reached: its publish job failed on a version-endpoint test asserting a hard-coded build date, and only the release jobs stamp one. Plus blog images hosted in the sibling community repo rather than in this clone. ([details](changelog/0.1.4/README.md))
- **0.1.3** — 2026-07-27. Windows support (shell selection, `install.ps1`, a win-x64 package), goal mode looping Tasks until an objective completes, a docked subagents panel with a live call graph, LLM-error reconnects with a visible countdown, and in-app version display with update checks and admin self-update. ([details](changelog/0.1.3/README.md))
@@ -0,0 +1,8 @@
# Tooling: Alibaba Cloud OSS distribution for Release assets
Release downloads no longer depend on GitHub's reachability alone (#166).
- A new `mirror-oss` release job downloads the exact assets attached to the GitHub Release, re-verifies their checksums, and mirrors the same bytes to an Alibaba Cloud OSS bucket; `latest.json` is uploaded last and only after every asset landed, so the mirror never advertises a partially mirrored version. The job reads its provider/role ARNs and bucket settings from the `oss-production` environment and fails fast with a named error when one is missing.
- `install.sh` / `install.ps1` gain a download-source switch: `PENGUIN_DOWNLOAD_SOURCE=auto` (default) prefers the OSS mirror and falls back to the same version on GitHub when the mirror is unavailable; `oss` and `github` pin one source. `PENGUIN_DOWNLOAD_BASE_URL` / `PENGUIN_DOWNLOAD_FALLBACK_BASE_URL` override the asset directories directly (https-validated), and download progress names the source it is actually using.
- An `oss-staging` workflow plus `scripts/publish-release-to-oss.sh`, `scripts/install-ossutil.sh` and `scripts/test-oss-staging.sh` exercise the mirror path end to end before production, and the hermetic installer tests cover the source switch on both platforms.
- The installation docs document the download-source row for both languages.
@@ -1,6 +1,8 @@
# Unreleased
# Version 0.2.0
Changes since v0.1.5. The version number is assigned at release, when this folder is renamed.
Released on 2026-08-03.
- [2026-08-03] Tooling: Release assets are mirrored to Alibaba Cloud OSS — the mirror-oss release job re-uploads the exact checksum-verified GitHub Release artifacts (`latest.json` last, only after every asset landed), and the installers gain a download-source switch (`PENGUIN_DOWNLOAD_SOURCE=auto|oss|github`, auto preferring OSS with a same-version GitHub fallback) plus validated `PENGUIN_DOWNLOAD_BASE_URL` overrides, with a staging workflow and installer tests covering the mirror path. ([details](2026-08-03-oss-distribution.md))
- [2026-08-03] Web App: three chat-navigation aids — ↑ recalls the session's previous inputs shell-style in the composer, the "Reasoning & Tools" header and the current thinking/tool row stick to the top of the stream stacked by level so long runs collapse from anywhere inside them, and a zero-width tick-rail minimap over the stream's left gutter previews every exchange on hover (question + truncated answer) for one-click jumps. ([details](2026-08-03-web-chat-navigation.md))
+48
View File
@@ -0,0 +1,48 @@
PenguinHarness 0.2.0 — one sealed installer bundle per platform (now also served from an OSS mirror), tool output that survives truncation, and long conversations you can actually navigate.
## Install
```sh
curl -fsSL https://penguin.ooo/install.sh | sh
penguin web
```
Windows (PowerShell):
```powershell
irm https://penguin.ooo/install.ps1 | iex
penguin web
```
Linux, macOS and Windows, with a bundled Node runtime. Or via npm (needs Node >= 24):
```sh
npm install -g @prismshadow/penguin-cli
```
**One artifact per target.** Each Release now attaches exactly one file per platform — `penguin-{linux,darwin}-{x64,arm64}.tar.gz`, `penguin-universal.tar.gz`, `penguin-win32-x64.zip` — a flat installer bundle sealing the native installer, the program payload and its checksum. The same file serves online and offline installation: download it anywhere, copy it to the target, extract, and run the bundled `install.sh` / `install.cmd`; checksums are verified unconditionally at both layers. **New download source:** the installers now prefer an Alibaba Cloud OSS mirror carrying the exact same bytes and fall back to GitHub automatically (`PENGUIN_DOWNLOAD_SOURCE=auto|oss|github`).
## Highlights
**Long conversations became navigable.** The composer recalls this session's previous inputs with ↑/↓, shell-style — edits end recall, multi-line entries walk the caret first, IME candidates are untouched. The "Reasoning & Tools" header and the currently scrolled thinking/tool row stick to the top of the stream stacked by level, so a long run collapses from anywhere inside it, per section or as a whole. And a zero-width minimap tick rail overlays the stream's left gutter — one tick per exchange, hover for a question-plus-answer preview card, click to jump — moving into a top-right toolbar dropdown whenever the gutter (or a hover pointer) isn't there.
**Truncated tool output is recoverable.** Output that exceeds the per-call cap in an Agent Session is saved to the Session scratchpad, and the recovery path rides the same truncated result the model and both frontends see — no new tool, no protocol change. Every model-visible path core composes now shares one forward-slash spelling on Windows, and the file tools keep accepting both spellings.
**Steering that survives everything, and a session list that scales.** Mid-run steering messages survive reloads with their content visible, retire exactly once delivered, and now carry file attachments just like images. Tool-card subtitles render once fully formed instead of jittering while arguments stream. The sidebar session list is served straight from the database by default — CLI sessions become an opt-in toggle — and both the lists and the groups themselves page, so many agents and workspaces stay scannable.
**A current model catalog.** The qianwenai groups move to the current lineup (qwen3.8-max and deepseek-v4-flash-0731 in), OpenRouter gains deepseek/deepseek-v4-flash-0731 and openai/gpt-5.6-luna, every gateway row's prices are re-read from the models API, and new Projects default to deepseek-v4-flash — existing Projects keep their stored models and default.
## Notable in this release
- **Installs and upgrades hardened.** In-place upgrades survive filesystems that pin in-use directories, the Windows payload drops its policy-blocked `penguin.ps1` launcher (typing `penguin` is unaffected), the installer broadcasts the user-Path change so new terminals find `penguin`, and hermetic installer tests run in CI.
- **File tools diagnose missing paths.** `read_file` / `edit_file` report the deepest existing ancestor, the first missing segment and nearest-named entries instead of a bare "File not found".
- **Update checks report every outcome.** The manual "Check for updates" row shows a busy spinner, success toasts for both up-to-date and update-found, and the existing failure notices.
- **Evaluation Center case details.** Target-agent task materials are separated from project-member-visible scoring rubrics, Score charts use a padded dynamic axis, and the benchmark Skills write YAML-safe Scoreboard summaries.
- **File summaries move to the Task boundary.** One card per completed Task scanning all of its assistant text; negative existence results are no longer cached, so later Tasks can surface newly created paths.
- **Backward compatibility, recorded once.** The installers keep a content-probed legacy path so pre-0.2.0 releases stay installable; installer scripts saved from older releases break loudly against new assets by design — re-fetch them. See [the batch's compatibility notes](https://github.com/Prism-Shadow/penguin-harness/blob/main/changelog/0.2.0/2026-07-31-backward-compatibility.md).
## Requirements
Linux or macOS (x64 / arm64), or Windows 10+ (x64). The installers bundle their own Node runtime; installing from npm needs Node >= 24. All data stays under `~/.penguin/data`.
Full detail: [changelog/0.2.0/](https://github.com/Prism-Shadow/penguin-harness/tree/main/changelog/0.2.0).
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "penguin-harness",
"version": "0.1.5",
"version": "0.2.0",
"private": true,
"type": "module",
"description": "PenguinHarness — TypeScript AI Agent (SDK + CLI).",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-cli",
"version": "0.1.5",
"version": "0.2.0",
"type": "module",
"description": "PenguinHarness CLI: interactive REPL and single-task runner over @prismshadow/penguin-core.",
"license": "Apache-2.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-core",
"version": "0.1.5",
"version": "0.2.0",
"type": "module",
"description": "PenguinHarness core SDK: context_engine, OmniMessage protocol, LLM/Environment interfaces.",
"license": "Apache-2.0",
+1 -1
View File
@@ -59,7 +59,7 @@ export { Agent, createAgent } from "./agent.js";
export type { CreateAgentOptions, CreateSessionOptions, ResumeSessionOptions } from "./agent.js";
/** SDK version number. */
export const VERSION = "0.1.5";
export const VERSION = "0.2.0";
/** Release build date (UTC yyyy-mm-dd), stamped by the release workflow next to VERSION; null in a dev/source build. */
export const BUILD_DATE: string | null = null;
// Version-string helpers (shared by the CLI's `penguin update` and the server's update check).
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-docs",
"version": "0.1.5",
"version": "0.2.0",
"private": true,
"type": "module",
"description": "PenguinHarness documentation site (React + Vite + Tailwind CSS): bilingual zh/en Markdown pages with light/dark themes and per-page Copy Markdown, deployed to GitHub Pages under /docs/ next to the landing page.",
@@ -0,0 +1,47 @@
---
title: "PenguinHarness 0.2.0: navigable chats, recoverable output, installs from anywhere"
date: 2026-08-03
category: news
excerpt: 0.2.0 makes long agent runs livable. The chat gains shell-style input recall, stacked sticky run headers and a minimap tick rail; tool output that blows past the cap is saved and recoverable instead of gone; steering survives reloads and carries files; the session list scales to many agents; each Release ships one sealed installer bundle per platform, now mirrored to Alibaba Cloud OSS; and the model catalog moves to the current qianwenai lineup. Here is what shipped.
---
PenguinHarness 0.2.0 is out. The theme is long-running work: conversations you can move through instead of scrolling past, tool output that cannot be lost to a cap, and a distribution pipe that reaches machines GitHub does not. Feature by feature:
## Navigate long conversations
Three navigation aids land on the chat page together.
**↑ recalls your previous inputs, shell-style.** With an empty composer, ↑ steps back through everything you typed into this session, newest first; ↓ walks forward again and restores whatever draft you had. Editing a recalled entry hands the arrows back to the caret, multi-line entries move the caret line by line first, and IME candidate navigation is untouched.
**Sticky run headers, stacked by level.** The "Reasoning & Tools" header pins to the top of the stream while its run is in view, and the thinking or tool row you are actually scrolled inside pins right below it — the bar above the content is always the section being read, never a skipped level. A twenty-screen tool dump collapses from anywhere inside it, per section or as a whole, and collapsing lands you back on the section instead of somewhere unrelated.
**A minimap for the whole conversation.** A zero-width tick rail overlays the left gutter — one tick per exchange, the reading position emphasized. Hovering a tick pops a preview card (your question in bold over a truncated reply), clicking jumps straight to the turn. On phones, or whenever a docked panel eats the gutter, the same index moves to a top-right toolbar dropdown, so navigation stays reachable in every layout.
## Tool output that survives truncation
Output exceeding the per-call cap in an Agent Session is written to the Session scratchpad, and the recovery path is appended to the same truncated result the model and both frontends see. The model reads the rest by path when it matters — no new tool, no protocol change, and the visible cap stays. Alongside it, every model-visible path core composes now shares one forward-slash spelling on Windows.
## Steering and a session list built for scale
Mid-run steering messages now survive reloads with their content visible and land exactly once — and file attachments steer just like images do. Tool-card subtitles render once fully formed instead of jittering while arguments stream. The sidebar session list is served straight from the database by default (CLI sessions become an opt-in toggle), and both the per-group lists and the groups themselves page, so a Project with many agents and workspaces stays fast and scannable.
## One installer artifact per platform — mirrored
Each Release attaches exactly one file per target: a flat installer bundle sealing the native installer, the program payload and its checksum. The same file serves online and offline installs, with checksums verified unconditionally at both layers. New in the pipe: the exact same bytes are mirrored to Alibaba Cloud OSS, and the installers prefer the mirror with an automatic same-version GitHub fallback (`PENGUIN_DOWNLOAD_SOURCE=auto|oss|github`). In-place upgrades also survive filesystems that pin in-use directories, and the Windows payload drops its policy-blocked `penguin.ps1` launcher — typing `penguin` is unaffected.
## A current model catalog
The qianwenai groups move to the current lineup — qwen3.8-max and deepseek-v4-flash-0731 in, the retired previews out — OpenRouter gains deepseek/deepseek-v4-flash-0731 and openai/gpt-5.6-luna, every gateway row's prices are re-read from the models API, and new Projects default to deepseek-v4-flash. Existing Projects keep their stored models and default.
## And the rest
`read_file` / `edit_file` diagnose a missing path (deepest existing ancestor, first missing segment, nearest names) instead of a bare "File not found". The manual update check reports every outcome — busy, up to date, update found, failed. Evaluation Center case details separate the target agent's task materials from reviewer-facing rubrics. File summaries move to the Task boundary, one card per completed Task. The full list, entry by entry: [changelog/0.2.0](https://github.com/Prism-Shadow/penguin-harness/tree/main/changelog/0.2.0).
## Install or upgrade
```sh
curl -fsSL https://penguin.ooo/install.sh | sh
penguin web
```
Windows (PowerShell): `irm https://penguin.ooo/install.ps1 | iex` — or `npm install -g @prismshadow/penguin-cli` with Node >= 24. Upgrading is re-running the installer, or `penguin update` from 0.1.3+.
@@ -0,0 +1,47 @@
---
title: "PenguinHarness 0.2.0:长对话导航、可找回的工具输出、随处可装"
date: 2026-08-03
category: news
excerpt: 0.2.0 让长时间运行的 Agent 用起来更顺手:对话页新增命令行式输入回填、分层吸顶的运行标题栏和迷你刻度导航;超长工具输出落盘可找回而不再丢失;插话在刷新后仍在、还能带文件附件;会话列表按数据库直出、支撑大量 Agent;每个 Release 只发一个平台安装包,并镜像到阿里云 OSS;模型目录换到 qianwenai 当前阵容。逐项看看。
---
PenguinHarness 0.2.0 发布了。这一版围绕"长时间运行的工作":对话可以导航而不是一路滚动、工具输出不会被截断上限吞掉、分发管道能到达 GitHub 不可达的机器。逐项说明:
## 长对话导航
对话页一次落地三件导航能力。
**↑ 命令行式回填历史输入。** 输入框为空时按 ↑,从最新一条开始逐条回填本会话输入过的内容;↓ 反向走回并恢复原来的草稿。编辑过的回填立即把方向键还给光标,多行条目先逐行移动光标,输入法候选导航不受影响。
**运行标题栏分层吸顶。**「Reasoning & Tools」组头钉在消息流顶部,你正滚动阅读的思考 / 工具行紧贴其下再钉一层——内容正上方的横条永远是它所属的段落,不跨层级。二十屏长的工具输出滚到任何位置都能一键收起所在段或整组,收起后视图落回该段本身。
**整场对话的迷你地图。** 一列零宽度的刻度线覆在消息流左侧留白上,每轮问答一条、当前所读加长加深;悬停弹出预览卡(问题加粗 + 截断的回答),点击直达该轮。手机上或侧面板挤占留白时,同一份索引移到右上角工具栏下拉菜单——任何布局下导航都可达。
## 截断的工具输出可找回
Agent 会话中超过单次上限的工具输出会写入会话 scratchpad,找回路径附在模型与两个前端看到的同一条截断结果末尾;需要时模型按路径读取其余部分——没有新工具、协议不变、可见上限不变。同批改动里,core 组装的所有模型可见路径在 Windows 上统一为正斜杠拼写。
## 插话与会话列表的规模化
运行中的插话现在刷新后仍在、内容可见、恰好送达一次——文件附件也能随插话送出,与图片同规。工具卡副标题不再随参数流式渲染而抖动。侧栏会话列表默认由数据库直出(CLI 会话变为可选开关),分组内列表与分组本身都分页,大量 Agent 与 Workspace 的 Project 依然快而可扫。
## 每平台一个安装包,且有镜像
每个 Release 每个平台只附一个文件:一个扁平安装包,内封原生安装器、程序负载与校验和。同一个文件同时服务在线与离线安装,两层校验无条件执行。管道新增:完全相同的字节镜像到阿里云 OSS,安装器优先走镜像、自动回退同版本 GitHub(`PENGUIN_DOWNLOAD_SOURCE=auto|oss|github`)。原地升级也能在钉住占用目录的文件系统上完成,Windows 包移除了会被执行策略拦下的 `penguin.ps1` 启动器——直接敲 `penguin` 不受影响。
## 跟上时代的模型目录
qianwenai 分组换到当前阵容——qwen3.8-max 与 deepseek-v4-flash-0731 上架,退役的 preview 下架——OpenRouter 新增 deepseek/deepseek-v4-flash-0731 与 openai/gpt-5.6-luna,各网关行价格按模型 API 重新读取,新 Project 默认 deepseek-v4-flash。已有 Project 保持原有模型与默认值不变。
## 其余改进
`read_file` / `edit_file` 对缺失路径给出诊断(最深存在的祖先、第一个缺失段、邻近同名项)而不是一句 "File not found"。手动检查更新汇报每种结果——检查中、已最新、发现新版、失败。评估中心的 Case 详情把目标 Agent 的任务材料与评审侧评分标准分开。文件摘要移到任务边界,每个完成的任务一张卡。完整清单逐条见 [changelog/0.2.0](https://github.com/Prism-Shadow/penguin-harness/tree/main/changelog/0.2.0)。
## 安装或升级
```sh
curl -fsSL https://penguin.ooo/install.sh | sh
penguin web
```
Windows(PowerShell):`irm https://penguin.ooo/install.ps1 | iex`;或在 Node >= 24 下 `npm install -g @prismshadow/penguin-cli`。升级即重跑安装器,0.1.3+ 也可直接 `penguin update`。
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-landing",
"version": "0.1.5",
"version": "0.2.0",
"private": true,
"type": "module",
"description": "PenguinHarness landing page (React + Vite + Tailwind CSS): multilingual, light/dark themes, benchmark showcase, and a local Markdown blog, deployed to GitHub Pages via GitHub Actions.",
+2 -1
View File
@@ -96,7 +96,7 @@ describe("frontmatter mapping (author / pinned / category)", () => {
it("reads the pinned flag and sorts the pinned post first", () => {
for (const locale of ["en", "zh"] as const) {
const posts = postsFor(locale);
expect(posts.length).toBe(13);
expect(posts.length).toBe(14);
// The launch post stays the single pinned post; newer posts sort under it by date.
expect(posts.filter((p) => p.pinned).map((p) => p.slug)).toEqual([
"introducing-penguinharness",
@@ -120,6 +120,7 @@ describe("frontmatter mapping (author / pinned / category)", () => {
it("filters by the news category, newest first", () => {
expect(postsFor("en", "news").map((p) => p.slug)).toEqual([
"introducing-penguinharness",
"penguinharness-0-2-0",
"penguinharness-0-1-5",
"penguinharness-0-1-4",
"free-models-in-penguin-harness",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-server",
"version": "0.1.5",
"version": "0.2.0",
"type": "module",
"description": "PenguinHarness web server: multi-user authentication and authorization, Session execution with SSE streaming, and usage accounting, built on @prismshadow/penguin-core.",
"license": "Apache-2.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-skills",
"version": "0.1.5",
"version": "0.2.0",
"type": "module",
"description": "PenguinHarness skill library: built-in SKILL.md documents and skill groups, decoupled from core.",
"license": "Apache-2.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@prismshadow/penguin-web",
"version": "0.1.5",
"version": "0.2.0",
"private": true,
"type": "module",
"description": "PenguinHarness web frontend SPA: React + Vite + Tailwind CSS, rendering conversations streamed over the OmniMessage protocol, plus Agent configuration, model configuration, usage stats, and Traces.",
@@ -28,9 +28,11 @@ const WIDTH_STORAGE_KEY = "penguin.panelWidth";
* to be wide. The migration deletes the keys as it reads, so it is already dead code for anyone
* who has opened the app once since this shipped.
*
* REMOVAL: delete this constant and storedWidth()'s legacy branch in the release AFTER the one
* shipping this change, as part of preparing that release. Nothing else in the repo reads these
* keys, so it is a pure deletion. See changelog/0.1.5/2026-07-30-backward-compatibility.md.
* REMOVAL: delete this constant and storedWidth()'s legacy branch while preparing the release
* AFTER 0.2.0 — the 0.1.5 backward-compatibility entry schedules it for the second release
* after the one shipping this change (0.2.0 was the first and deliberately kept it). Nothing
* else in the repo reads these keys, so it is a pure deletion.
* See changelog/0.1.5/2026-07-30-backward-compatibility.md.
*/
const LEGACY_WIDTH_KEYS = ["penguin.filesPanelWidth", "penguin.subagentsPanelWidth"] as const;