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 -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;