pi-one-ui 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,39 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.3.0] - 2026-08-30
10
+
11
+ ### Added
12
+
13
+ - Added a maintained English README with bidirectional language navigation.
14
+
15
+ ### Changed
16
+
17
+ - Use `~/.pi/agent/pi-one-ui.json` as the only configuration source.
18
+ - Persist settings with the canonical v1 `components` and `renderer` structure.
19
+
20
+ ### Removed
21
+
22
+ - Removed automatic loading and migration of `pi-mine-ui.json`, `zentui.json`, and `claude-code-style.json`.
23
+ - Removed legacy flat configuration fields, old style identifiers, and WorkingLine aliases.
24
+ - Removed the legacy `enableWorkingMessage` renderer option.
25
+
26
+ ### Migration
27
+
28
+ - Before upgrading, recreate or translate supported settings into the canonical `components` and `renderer` structure in `~/.pi/agent/pi-one-ui.json`.
29
+ - Use `/oneui` to write settings in the canonical format, then run `/reload`.
30
+
31
+ ## [0.2.2] - 2026-08-29
32
+
33
+ ### Fixed
34
+
35
+ - Reduced rendering lag when expanding settled tool groups by reusing cached child output.
36
+
37
+ [Unreleased]: https://github.com/kerolt/pi-one-ui/compare/v0.3.0...HEAD
38
+ [0.3.0]: https://github.com/kerolt/pi-one-ui/compare/v0.2.2...v0.3.0
39
+ [0.2.2]: https://github.com/kerolt/pi-one-ui/compare/v0.2.1...v0.2.2
package/README.en.md ADDED
@@ -0,0 +1,256 @@
1
+ # pi-one-ui
2
+
3
+ [![npm version](https://img.shields.io/npm/v/pi-one-ui?style=flat-square)](https://www.npmjs.com/package/pi-one-ui)
4
+ [![Node.js](https://img.shields.io/badge/Node.js-%E2%89%A522.19-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org/)
5
+ [![License](https://img.shields.io/github/license/kerolt/pi-one-ui?style=flat-square)](./LICENSE)
6
+
7
+ [简体中文](./README.md) | English
8
+
9
+ `pi-one-ui` is a unified TUI extension package for [Pi](https://pi.dev). It started as an effort to build a simple and polished terminal interface by combining, at the source level:
10
+
11
+ - the terminal shell capabilities of [pi-zentui](https://github.com/lmilojevicc/pi-zentui)
12
+ - the conversation rendering and productivity features of [pi-cc-extensions](https://github.com/minuque/pi-cc-extensions)
13
+
14
+ The result is a single installable and configurable Pi package that continues to evolve through module refactoring, tighter ownership, and independent improvements.
15
+
16
+ ## Features
17
+
18
+ ### Unified interface layout
19
+
20
+ `pi-one-ui` organizes the Pi interface into the following layouts:
21
+
22
+ ```text
23
+ Header → Context → WorkingLine → Editor → Footer
24
+ ```
25
+
26
+ - **Header**: startup information, logo, and shortcut hints.
27
+ - **Context**: the conversation area, including user messages, assistant messages, thinking, tools, diffs, Markdown, and summaries.
28
+ - **WorkingLine**: working state, spinner, token/thought/elapsed information, and turn summaries.
29
+ - **Editor**: input editor, completion, metadata, Accent Rail, and Minimalist styles.
30
+ - **Footer**: current directory, Git, runtime, token, cost, and extension status information.
31
+ - **Overlay**: temporary interfaces such as the settings panel and Context Inspector, managed by a shared OverlayManager.
32
+
33
+ ### Built-in functionality
34
+
35
+ | Feature | Description | Entry point |
36
+ | --- | --- | --- |
37
+ | Unified settings panel | Organizes settings by Header, Context, WorkingLine, Editor, Footer, and Features | `/oneui` |
38
+ | Context Inspector | Shows context usage and previews the system prompt, memory, skills, tools, and messages | `/context` |
39
+ | Session reference | Searches previous Pi sessions or SubAgents and injects their useful context | `@` completion |
40
+ | Subagent autocomplete | Completes SubAgent names and delegation hints | `@` completion |
41
+ | Tool / Diff renderer | Provides unified rendering for tool calls, results, collapsed content, and Edit/Write diffs | Automatic |
42
+ | Markdown enhancement | Adds Mermaid, admonitions, URL linking, and related rendering improvements | Automatic |
43
+ | Built-in themes | Provides CC Dark and CC Light themes | `/theme` |
44
+ | Compatibility aliases | Optionally provides common command aliases | `/clear`, `/exit` |
45
+
46
+ ## Quick start
47
+
48
+ ### Requirements
49
+
50
+ - Node.js `>=22.19.0`
51
+ - Pi and related runtime packages `>=0.84.0`
52
+
53
+ ### Install from npm
54
+
55
+ ```bash
56
+ pi install npm:pi-one-ui
57
+ ```
58
+
59
+ ### Install from GitHub
60
+
61
+ ```bash
62
+ pi install git:github.com/kerolt/pi-one-ui
63
+ ```
64
+
65
+ After installation, reload extensions in Pi:
66
+
67
+ ```text
68
+ /reload
69
+ ```
70
+
71
+ Then open the unified settings panel:
72
+
73
+ ```text
74
+ /oneui
75
+ ```
76
+
77
+ ## Configuration
78
+
79
+ The configuration file is located at:
80
+
81
+ ```text
82
+ ~/.pi/agent/pi-one-ui.json
83
+ ```
84
+
85
+ Using the `/oneui` settings panel is recommended. The current configuration uses the v1 structure, for example:
86
+
87
+ ```json
88
+ {
89
+ "version": 1,
90
+ "components": {
91
+ "editor": {
92
+ "enabled": true,
93
+ "style": "opencode"
94
+ },
95
+ "userMessages": {
96
+ "enabled": true,
97
+ "style": "framed"
98
+ },
99
+ "workingLine": {
100
+ "enabled": true
101
+ },
102
+ "footer": {
103
+ "style": "starship"
104
+ }
105
+ },
106
+ "renderer": {
107
+ "mode": "on",
108
+ "diffViewMode": "auto"
109
+ }
110
+ }
111
+ ```
112
+
113
+ Available layout and renderer options may change between versions, so prefer configuring them through `/oneui`.
114
+
115
+ ### Canonical configuration policy
116
+
117
+ `pi-one-ui` reads and writes only:
118
+
119
+ ```text
120
+ ~/.pi/agent/pi-one-ui.json
121
+ ```
122
+
123
+ It does not automatically read, merge, or migrate historical configuration files, and it does not parse legacy flat fields or old style identifiers. If the file does not exist, runtime defaults are used in memory. The file is created only after the first settings change through `/oneui`. All persisted changes use the current v1 `components` and `renderer` structure.
124
+
125
+ ## Upstream origins and project evolution
126
+
127
+ `pi-one-ui` originally combined source from the following open-source projects. Many thanks to their maintainers and contributors for providing the initial foundation.
128
+
129
+ | Upstream project | Capabilities incorporated into `pi-one-ui` | Reference baseline |
130
+ | --- | --- | --- |
131
+ | [pi-zentui](https://github.com/lmilojevicc/pi-zentui) | Starship-style Footer, Opencode-style Editor, layouts, and shell capabilities | v0.21.0, commit `5341b38` |
132
+ | [pi-cc-extensions](https://github.com/minuque/pi-cc-extensions) | Claude Code-style Context renderer, Tool/Diff rendering, Context Inspector, and references | v0.8.67, commit `dba37e5` |
133
+
134
+ Production code lives in `extensions/`. The project has since unified its entry point, configuration storage, lifecycle, layout ownership, overlays, and input routing. The current implementation is no longer equivalent to either upstream project and does not automatically track upstream changes.
135
+
136
+ The upstream projects provided the original foundation. Continued development focuses on turning these capabilities into one coherent product with clear seams and sustainable maintenance.
137
+
138
+ See [ARCHITECTURE.md](./ARCHITECTURE.md) for detailed module boundaries, event flow, and ownership conventions.
139
+
140
+ ## Local development
141
+
142
+ ### Clone the repository
143
+
144
+ ```bash
145
+ git clone https://github.com/kerolt/pi-one-ui.git
146
+ cd pi-one-ui
147
+ npm install
148
+ ```
149
+
150
+ Node.js `>=22.19.0` is required. If multiple Node.js versions are installed, switch to a compatible version first.
151
+
152
+ ### Run in development mode
153
+
154
+ Start Pi directly with the current source:
155
+
156
+ ```bash
157
+ npm run pi:dev
158
+ ```
159
+
160
+ This is equivalent to:
161
+
162
+ ```bash
163
+ pi --no-extensions -e ./extensions/index.ts
164
+ ```
165
+
166
+ You can also install the current package as a local link:
167
+
168
+ ```bash
169
+ npm run pi:install-local
170
+ ```
171
+
172
+ After changing the source, run the following command in Pi:
173
+
174
+ ```text
175
+ /reload
176
+ ```
177
+
178
+ ### Development commands
179
+
180
+ | Command | Purpose |
181
+ | --- | --- |
182
+ | `npm install` | Install dependencies |
183
+ | `npm run format` | Format source, tests, and configuration files |
184
+ | `npm run format:check` | Check formatting without modifying files |
185
+ | `npm run lint` | Run Biome checks |
186
+ | `npm run typecheck` | Run TypeScript type checking |
187
+ | `npm test` | Run all tests |
188
+ | `npm run test:node` | Run Node.js test runner tests |
189
+ | `npm run test:vitest` | Run Vitest tests |
190
+ | `npm run pack:check` | Preview the npm package contents |
191
+ | `npm run verify` | Run formatting, lint, type checking, and all tests |
192
+
193
+ Before submitting changes, run at least:
194
+
195
+ ```bash
196
+ npm run verify
197
+ npm run pack:check
198
+ ```
199
+
200
+ ### Test organization
201
+
202
+ Tests are grouped by domain:
203
+
204
+ - `tests/context-*`: Context content, tools, diffs, thinking, and mouse interaction.
205
+ - `tests/working-line-*`: WorkingLine and turn summaries.
206
+ - `tests/editor-*`: Editor, completion, metadata, transfer, and Accent Rail.
207
+ - `tests/footer-*`: Footer rendering, formatting, layout, and status.
208
+ - `tests/services-*`: Git, runtime, project, session, and telemetry data.
209
+ - `tests/shell-*`: Remaining layout lifecycle glue and standalone compatibility.
210
+
211
+ Changes involving the TUI lifecycle should specifically cover reloads, session tree rebuilds, compaction, regular/fullscreen TUI modes, headless mode, overlays, and third-party patch ownership.
212
+
213
+ ## Releases
214
+
215
+ User-visible changes and upgrade notes are maintained in [CHANGELOG.md](./CHANGELOG.md). Changes under development belong in `Unreleased` and are moved to a versioned section only during a release.
216
+
217
+ The project uses GitHub Actions for continuous integration and npm publishing:
218
+
219
+ - [`.github/workflows/ci.yml`](./.github/workflows/ci.yml) runs complete verification for pull requests and pushes to `main`.
220
+ - [`.github/workflows/publish.yml`](./.github/workflows/publish.yml) publishes to npm when a `v*.*.*` tag is pushed.
221
+
222
+ To publish a new version:
223
+
224
+ ```bash
225
+ # Ensure main is checked out and up to date
226
+ git switch main
227
+ git pull --ff-only origin main
228
+
229
+ # Run release checks
230
+ npm ci
231
+ npm run verify
232
+ npm run pack:check
233
+
234
+ # Select the SemVer increment
235
+ npm version patch # Backward-compatible fixes, for example 0.2.1 -> 0.2.2
236
+ # npm version minor # New features or breaking changes while the project is on 0.x
237
+ # npm version major # Breaking changes after a stable 1.x release
238
+
239
+ # Push the release commit and tag
240
+ git push origin main --follow-tags
241
+ ```
242
+
243
+ After the tag is pushed, the publish workflow verifies that the tag matches `package.json`, runs the full verification suite again, and publishes the public package through npm Trusted Publishing with provenance. Published npm versions cannot be overwritten, so never reuse an existing version or tag.
244
+
245
+ ## Contributing
246
+
247
+ GitHub issues and contributions are welcome. When submitting changes:
248
+
249
+ 1. Keep each commit focused on one primary purpose.
250
+ 2. Use a concise Conventional Commit message, for example `fix: prevent settings panel freeze after editor toggle`.
251
+ 3. Add or update tests for behavioral changes.
252
+ 4. Run `npm run verify` and `npm run pack:check` before submitting.
253
+
254
+ ## License
255
+
256
+ This project is released under the [MIT License](./LICENSE).
package/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
  [![Node.js](https://img.shields.io/badge/Node.js-%E2%89%A522.19-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org/)
5
5
  [![License](https://img.shields.io/github/license/kerolt/pi-one-ui?style=flat-square)](./LICENSE)
6
6
 
7
+ 简体中文 | [English](./README.en.md)
8
+
7
9
  `pi-one-ui` 是一个面向 [Pi](https://pi.dev) 的统一 TUI 扩展包。项目的初衷是希望打造一个简单美观的 TUI 界面,最初通过源码级融合,将:
8
10
 
9
11
  - [pi-zentui](https://github.com/lmilojevicc/pi-zentui)`pi-zentui` 的终端外壳能力
@@ -103,25 +105,22 @@ pi install git:github.com/kerolt/pi-one-ui
103
105
  },
104
106
  "renderer": {
105
107
  "mode": "on",
106
- "diffViewMode": "auto",
107
- "enableWorkingMessage": false
108
+ "diffViewMode": "auto"
108
109
  }
109
110
  }
110
111
  ```
111
112
 
112
113
  不同布局和渲染器的可用选项会随版本变化,建议优先使用 `/oneui` 面板进行配置。
113
114
 
114
- ### 配置迁移与兼容
115
+ ### Canonical 配置约定
115
116
 
116
- `pi-one-ui` 通过统一的 `ConfigStore` 读取和写入配置,并兼容读取以下历史配置文件:
117
+ `pi-one-ui` 只读取和写入:
117
118
 
118
119
  ```text
119
- ~/.pi/agent/zentui.json
120
- ~/.pi/agent/claude-code-style.json
121
- ~/.pi/agent/pi-mine-ui.json
120
+ ~/.pi/agent/pi-one-ui.json
122
121
  ```
123
122
 
124
- 历史配置只作为兼容输入;新的配置写入统一使用 `pi-one-ui.json`。`enableWorkingMessage` 仍可以从旧配置中读取,但统一运行时不会注册第二套 Working Message 实现,WorkingLine 是该 UI seam 的唯一 owner。
123
+ 不会自动读取、合并或迁移其他历史配置文件,也不会解析旧版扁平字段和旧 style 名称。配置文件不存在时,运行时直接使用内置默认值;首次通过 `/oneui` 修改设置时才创建文件。所有持久化修改统一写入当前 v1 的 `components` 和 `renderer` 结构。
125
124
 
126
125
  ## 上游来源与项目演进
127
126
 
@@ -213,6 +212,8 @@ npm run pack:check
213
212
 
214
213
  ## 发布
215
214
 
215
+ 用户可见变更和升级说明统一记录在 [CHANGELOG.md](./CHANGELOG.md)。开发中的变更先写入 `Unreleased`,正式发版时再归档到对应版本。
216
+
216
217
  项目使用 GitHub Actions 进行持续集成和 npm 发布:
217
218
 
218
219
  - [`.github/workflows/ci.yml`](./.github/workflows/ci.yml):在 Pull Request 和 `main` 分支提交时执行完整验证。
@@ -231,9 +232,9 @@ npm run verify
231
232
  npm run pack:check
232
233
 
233
234
  # 按 SemVer 升级版本
234
- npm version patch # Bug 修复,例如 0.2.1 -> 0.2.2
235
- # npm version minor # 新增兼容功能
236
- # npm version major # 破坏性变更
235
+ npm version patch # 向后兼容的修复,例如 0.2.1 -> 0.2.2
236
+ # npm version minor # 0.x 阶段的新功能或破坏性变更
237
+ # npm version major # 进入稳定 1.x 后的破坏性变更
237
238
 
238
239
  # 推送版本 commit 和 tag
239
240
  git push origin main --follow-tags
@@ -61,7 +61,6 @@ export type Config = {
61
61
  enableSubagentAutocomplete: boolean;
62
62
  enableContextCommand: boolean;
63
63
  enableAgentSummary: boolean;
64
- enableWorkingMessage: boolean;
65
64
  enableAliases: boolean;
66
65
  };
67
66
 
@@ -69,7 +68,7 @@ function rendererConfigFrom(record: ConfigRecord): ConfigRecord {
69
68
  const renderer = record.renderer;
70
69
  return renderer && typeof renderer === "object" && !Array.isArray(renderer)
71
70
  ? (renderer as ConfigRecord)
72
- : record;
71
+ : {};
73
72
  }
74
73
 
75
74
  export const DIFF_VIEW_MODES: DiffViewMode[] = ["auto", "split", "unified"];
@@ -166,8 +165,6 @@ export const DEFAULT_CONFIG: Config = {
166
165
  enableSubagentAutocomplete: true,
167
166
  enableContextCommand: true,
168
167
  enableAgentSummary: true,
169
- // Zentui is the sole owner of Pi's unkeyed working row in pi-one-ui.
170
- enableWorkingMessage: false,
171
168
  enableAliases: true,
172
169
  };
173
170
 
@@ -218,15 +215,8 @@ export function normalizeConfig(input: unknown): Config {
218
215
  unknown
219
216
  >;
220
217
  const mode = source.mode;
221
- // 旧 `enabled: boolean` 配置迁移;compact 已恢复为受支持模式,不再回退 on。
222
- const migratedMode: CompactStyleMode =
223
- mode === "on" || mode === "compact" || mode === "off"
224
- ? mode
225
- : typeof source.enabled === "boolean"
226
- ? source.enabled
227
- ? "on"
228
- : "off"
229
- : "on";
218
+ const normalizedMode: CompactStyleMode =
219
+ mode === "on" || mode === "compact" || mode === "off" ? mode : "on";
230
220
  const excludeRenderers = Array.isArray(source.excludeRenderers)
231
221
  ? [
232
222
  ...new Set(
@@ -238,7 +228,7 @@ export function normalizeConfig(input: unknown): Config {
238
228
  ]
239
229
  : [];
240
230
  return {
241
- mode: migratedMode,
231
+ mode: normalizedMode,
242
232
  excludeRenderers,
243
233
  diffViewMode: pickEnum(
244
234
  source.diffViewMode,
@@ -257,7 +247,7 @@ export function normalizeConfig(input: unknown): Config {
257
247
  300,
258
248
  ),
259
249
  editDiffCollapsedLines: pickPositiveInt(
260
- source.editDiffCollapsedLines ?? source.diffCollapsedLines,
250
+ source.editDiffCollapsedLines,
261
251
  DEFAULT_CONFIG.editDiffCollapsedLines,
262
252
  1,
263
253
  500,
@@ -305,7 +295,6 @@ export function normalizeConfig(input: unknown): Config {
305
295
  enableSubagentAutocomplete: source.enableSubagentAutocomplete !== false,
306
296
  enableContextCommand: source.enableContextCommand !== false,
307
297
  enableAgentSummary: source.enableAgentSummary !== false,
308
- enableWorkingMessage: source.enableWorkingMessage === true,
309
298
  enableAliases: source.enableAliases !== false,
310
299
  };
311
300
  }
@@ -360,7 +349,6 @@ export function formatConfigStatus(source: Config = config): string {
360
349
  `subagentAuto=${source.enableSubagentAutocomplete ? "on" : "off"}`,
361
350
  `context=${source.enableContextCommand ? "on" : "off"}`,
362
351
  `agentSummary=${source.enableAgentSummary ? "on" : "off"}`,
363
- `workingMsg=${source.enableWorkingMessage ? "on" : "off"}`,
364
352
  `aliases=${source.enableAliases ? "on" : "off"}`,
365
353
  ].join(" · ");
366
354
  }