pi-ui-extend 0.1.66 → 0.1.67

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/README.md CHANGED
@@ -1,332 +1,468 @@
1
- # Pix
2
-
3
- Pix is a terminal UI for the Pi coding agent. It uses the Pi agent and SDK, but replaces the default screen with a workspace-oriented interface: session tabs, compact tool calls, local shell commands, voice dictation, and a bundled `pi-tools-suite` extension pack.
1
+ <div align="center">
4
2
 
5
- The npm package is named `pi-ui-extend`; the installed command is `pix`.
3
+ # Pix
6
4
 
7
- ## Highlights
5
+ **A workspace-first terminal UI for [Pi](https://github.com/badlogic/pi-mono) — built for real coding sessions, not terminal log archaeology.**
8
6
 
9
- - Work with multiple workspace sessions in tabs and resume them after restart.
10
- - Read tool calls as compact rows; click a row to expand or collapse details.
11
- - Run local shell commands from chat with `!command`, or full TTY programs with `!!command`.
12
- - Dictate prompts locally with Vosk in Russian or English.
13
- - Improve a draft prompt with `/enhance`.
14
- - Undo the last supported workspace edit with `/undo`.
15
- - Search, import, export, clone, fork, and resume saved sessions.
16
- - See status widgets for todos, subagents, model selection, context usage, and compaction.
17
- - Use extensions that can show toasts, menus, and above-input widgets.
7
+ Tabs, readable tool activity, session navigation, local voice input, an interactive shell, and a bundled toolkit for repository-scale agent work.
18
8
 
19
- ## Requirements
9
+ [![npm version](https://img.shields.io/npm/v/pi-ui-extend?color=cb3837)](https://www.npmjs.com/package/pi-ui-extend)
10
+ [![npm downloads](https://img.shields.io/npm/dm/pi-ui-extend)](https://www.npmjs.com/package/pi-ui-extend)
11
+ [![check](https://github.com/dnaroid/pix/actions/workflows/check.yml/badge.svg)](https://github.com/dnaroid/pix/actions/workflows/check.yml)
12
+ [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D22.19-339933?logo=node.js&logoColor=white)](#requirements)
20
13
 
21
- - Node.js `>=22.19.0 <25`.
22
- - A terminal with good Unicode support.
23
- - Recommended font: JetBrainsMono Nerd Font. If icons render as squares, use the fallback icon theme.
24
- - On Linux, clipboard integration works best with one of: `wl-copy`, `xclip`, `xsel`, or `termux-clipboard-set`.
25
- - For voice dictation, install one recorder: SoX (`rec`/`sox`), `ffmpeg`, or `arecord` on Linux.
14
+ </div>
26
15
 
27
- ## Install
16
+ ![Pix workspace with tabs, compact thinking and tool activity, and live status](assets/screenshots/pix-overview.png)
28
17
 
29
- Fastest start:
18
+ ## Start in two commands
30
19
 
31
20
  ```bash
32
21
  npx pi-ui-extend install
22
+ npx pi-ui-extend --cwd .
33
23
  ```
34
24
 
35
- Then run Pix in your project:
25
+ The setup command checks the icon font, the `pi` CLI, and clipboard support. The second command opens the current project in Pix without requiring a global Pix install.
36
26
 
37
- ```bash
38
- npx pi-ui-extend --cwd /path/to/workspace
39
- ```
27
+ > Already installed globally? Run `pix --cwd .`.
40
28
 
41
- For regular use, install Pix globally from npm so the `pix` command is always available:
29
+ ## Why Pix?
42
30
 
43
- ```bash
44
- npm install -g pi-ui-extend --ignore-scripts
45
- ```
31
+ Pi provides the agent runtime, models, tools, skills, extensions, and persistent sessions. Pix keeps that SDK-native foundation and replaces the stock interface with a renderer designed around long, tool-heavy coding work.
46
32
 
47
- Check your installation and environment:
33
+ - **See the work, not the noise.** Thinking and tool calls are compact rows that expand on demand. Mutating tools, searches, failures, todos, and sub-agents are visually distinct.
34
+ - **Keep projects organized.** Tabs are scoped to the working directory and survive restarts. Search, resume, fork, clone, jump through, import, export, share, or delete sessions without leaving the terminal.
35
+ - **Stay in flow.** Run quick commands with `!`, open a raw interactive terminal with `!!`, paste images, follow file links, dictate in English or Russian, and improve a prompt before sending it.
36
+ - **Know what the agent is doing.** The status area exposes model, thinking level, context, usage, workspace, todos, sub-agents, voice state, and prompt actions — with mouse targets where useful.
37
+ - **Bring a serious toolkit.** Pix ships with `pi-tools-suite`: 17 integrated modules for indexed repository discovery, AST edits, LSP diagnostics, parallel agents, durable todos, context compression, web access, provider accounts, and more.
38
+ - **Use the models you want.** Pix runs on Pi's provider ecosystem and supports model switching, scoped model lists, per-model thinking levels, usage views, autocomplete, and fallback-aware helper workflows.
48
39
 
49
- ```bash
50
- pix install
51
- ```
40
+ Pix is not a separate agent protocol or an RPC wrapper around Pi. It runs on the Pi SDK, so the runtime, session format, extensions, skills, prompts, and tools remain part of the same ecosystem.
52
41
 
53
- To only print the report without changing anything:
42
+ ## The interface
54
43
 
55
- ```bash
56
- pix install --check
57
- ```
44
+ ### A workspace, not a transcript
58
45
 
59
- The published package includes the compiled JavaScript, the `pix` launcher, docs, and the bundled `pi-tools-suite` extension. End users do not need to clone this repository or build TypeScript.
46
+ - **Persistent tabs** for independent tasks in the same project.
47
+ - **Lazy session loading** so restoring a workspace does not eagerly start every runtime.
48
+ - **Compact activity rows** with configurable previews, colors, expansion, and output filtering.
49
+ - **Dedicated todo and sub-agent panels** instead of dumping orchestration state into chat.
50
+ - **Mouse-aware navigation** for tabs, status actions, scrolling, expandable blocks, menus, links, and the scrollbar.
51
+ - **Rich terminal content** including Markdown, code blocks, diffs, file links, images, toasts, widgets, dialogs, and custom extension UI.
52
+ - **Dark and light themes**, configurable model colors, and Nerd Font icons with graceful fallbacks.
60
53
 
61
- On startup, Pix also links the bundled `pi-tools-suite` into Pi's standard user extension directory:
54
+ ![Pix with three project-scoped session tabs](assets/screenshots/pix-tabs.png)
62
55
 
63
- ```text
64
- ~/.pi/agent/extensions/pi-tools-suite
65
- ```
56
+ ### Commands are searchable
66
57
 
67
- Pix will not overwrite a normal directory at that path. If the path is a symlink created by Pix, it is refreshed automatically.
58
+ Type `/` to open the command picker. Continue typing to filter built-in commands and commands contributed by extensions.
68
59
 
69
- ## First run
60
+ ![Pix searchable command picker](assets/screenshots/pix-command-menu.png)
70
61
 
71
- Open the project you want the agent to work in:
62
+ ### Agent activity stays readable
72
63
 
73
- ```bash
74
- pix --cwd /path/to/workspace
75
- ```
64
+ Pix gives different kinds of work different visual weight:
76
65
 
77
- If `--cwd` is omitted, Pix uses the current directory:
66
+ - thinking can remain collapsed until you need it;
67
+ - reads and searches show concise previews;
68
+ - edits and patches are expanded by default;
69
+ - long shell output can show its tail while the command runs;
70
+ - failures remain visible;
71
+ - tool rows can be expanded or collapsed with the mouse;
72
+ - todo and sub-agent state is rendered as structured UI.
78
73
 
79
- ```bash
80
- cd /path/to/workspace
81
- pix
82
- ```
74
+ All of this is configurable per exact tool name or wildcard such as `repo_*` and `ast_*`.
83
75
 
84
- Useful startup flags:
76
+ **Adaptive plans keep dependencies, blockers, ownership, and the active step visible:**
85
77
 
86
- - `--cwd <path>` workspace for files, settings, resources, and agent sessions.
87
- - `--no-session` — start a temporary in-memory session without persistence.
88
- - `--model <provider/model[:thinking]>` — choose the startup model, for example:
78
+ ![Pix adaptive todo plan with hierarchy and blockers](assets/screenshots/pix-adaptive-todo.png)
89
79
 
90
- ```bash
91
- pix --model anthropic/claude-sonnet-4-20250514:medium
92
- ```
80
+ **Parallel sub-agents report live status without taking over the main session:**
93
81
 
94
- ## Accounts and models
82
+ ![Pix running parallel sub-agents alongside the main implementation plan](assets/screenshots/pix-subagents.png)
95
83
 
96
- Pix uses Pi providers and accounts. After installation, you can usually import or add accounts from inside Pix:
84
+ ## Bundled: pi-tools-suite
97
85
 
98
- - `/opencode-import` import opencode accounts.
99
- - `/antigravity-import` — import Antigravity OAuth accounts.
100
- - `/antigravity-add-account` — add another Antigravity account.
101
- - `/model` — choose a model.
102
- - `/thinking` — choose a thinking level: `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `auto`.
103
- - `/scoped-models` — configure the model list used by the picker and quick switching.
86
+ On startup, Pix tries to link the bundled suite into the active Pi agent directory (normally `~/.pi/agent/extensions/pi-tools-suite`). An existing non-symlink installation is preserved. Suite modules are designed to work without Pix-specific UI where they are loaded; suite-spawned sub-agents intentionally use an isolated, minimal extension set.
104
87
 
105
- ## Common actions
88
+ | Capability | Included modules | What it adds |
89
+ | --- | --- | --- |
90
+ | Parallel work | `async-subagents` | Isolated asynchronous agents, presets, model fallback routing, result artifacts, `/ultrawork`, and `/hyperplan`. |
91
+ | Repository intelligence | `repo-discovery` | Indexed architecture, structure, AST, semantic search, symbol explanation, and dependency/caller tools when the repository has an `.indexer-cli` index. |
92
+ | Structural code changes | `ast-grep` | Language-aware AST search, rewrite previews, and explicit AST mutation tools. |
93
+ | Fast feedback | `lsp`, `comment-checker` | Project-trusted language-server diagnostics and a guard against low-quality AI-style code comments. |
94
+ | Durable planning | `todo` | Hierarchical todos with blockers, owners, persistence, scoped resumes, and per-task thinking levels. |
95
+ | Context control | `dcp` | Explicit compression and context pruning for long sessions, including sidecar state. |
96
+ | Local web access | `web-search` | Web search and page extraction through a local Ollama instance. |
97
+ | Providers and quotas | `antigravity-auth`, `opencode-import`, `usage` | Antigravity OAuth/account failover, OpenCode credential import, and multi-provider usage views. |
98
+ | Reusable workflows | `prompt-commands`, `skill-installer`, `session-name` | Prompt-command CRUD, skill installation/export, and session naming. |
99
+ | Model compatibility | `coding-discipline`, `model-tools`, `codex-reasoning-fix` | Model-specific discipline and vision lookup, compatibility aliases, and a Codex reasoning payload workaround. |
106
100
 
107
- ### Send a prompt
101
+ Every module can be disabled. Optional integrations only activate when their requirements are available — for example, repository tools require an index, web tools require local Ollama web search, and LSP servers must be configured and trusted.
108
102
 
109
- Type your request and press `Enter`.
103
+ Suite configuration is loaded from:
110
104
 
111
- ### Run a shell command
105
+ 1. `~/.config/pi/pi-tools-suite.jsonc`
106
+ 2. `$PI_CONFIG_DIR/pi-tools-suite.jsonc`, when set
107
+ 3. the nearest project `.pi/pi-tools-suite.jsonc`
112
108
 
113
- ```text
114
- !npm test
115
- ```
109
+ Later files override earlier ones. Disable modules with `disabledModules`, `PI_TOOLS_SUITE_DISABLED_MODULES`, or disable the entire suite with `PI_TOOLS_SUITE_DISABLED=1`. DCP settings are intentionally user-scoped and belong in the shared user configuration.
116
110
 
117
- The command runs locally and appears in the UI as a transient block. This output is not saved into the SDK session.
111
+ ## What you can build with it
118
112
 
119
- While a command is running:
113
+ | Workflow | Pix advantage |
114
+ | --- | --- |
115
+ | Explore an unfamiliar repository | Start with an indexed architecture map, search behavior semantically, inspect symbols, and trace dependencies without flooding context with entire files. |
116
+ | Run a large refactor | Combine repository discovery, AST-aware changes, LSP feedback, workspace undo, and a structured todo plan. |
117
+ | Investigate several hypotheses | Launch focused sub-agents in parallel, keep working, and inspect compact result artifacts when they finish. |
118
+ | Carry a task across many sessions | Persist tabs and todos, search session history, fork from an earlier message, and compress old context without losing the active objective. |
119
+ | Work across providers | Switch models and thinking levels, scope the model picker, import supported accounts, inspect quotas, and use fallback-aware sub-agent presets. |
120
+ | Keep your hands in the terminal | Run quick shell commands inline, use a full interactive TTY when needed, paste images, dictate prompts, and open file links directly. |
120
121
 
121
- - `Enter` sends the current editor text to the process stdin.
122
- - `Ctrl+C` interrupts the process.
122
+ ## Install
123
123
 
124
- ### Run an interactive TTY command
124
+ ### Requirements
125
125
 
126
- ```text
127
- !!top
128
- ```
126
+ - **Node.js `>=22.19.0 <25`**
127
+ - macOS, Linux, or Windows terminal with 256-color support
128
+ - npm or another way to run the published npm package
129
+ - provider credentials supported by Pi, unless you only use locally configured models
129
130
 
130
- Use `!!` for full-screen or interactive programs.
131
+ Recommended:
131
132
 
132
- ### Dictate a prompt
133
+ - **JetBrainsMono Nerd Font** for the intended icons; `pix install` can install it for the current user
134
+ - a terminal with mouse reporting and Kitty keyboard protocol support for the richest interaction
135
+ - Linux clipboard helper: `wl-clipboard` on Wayland or `xclip`/`xsel` on X11
133
136
 
134
- - `Ctrl+G` starts or stops local dictation.
135
- - Click the microphone/language widget on the right to toggle dictation or switch language.
137
+ Optional:
136
138
 
137
- On first use, Pix downloads small Vosk models:
139
+ - the `vosk` optional dependency for local voice input
140
+ - an audio recorder for dictation: SoX (`rec`/`sox`), `ffmpeg`, or `arecord` on Linux
141
+ - `tmux` and `rsvg-convert` only if you want to regenerate README screenshots
142
+ - Ollama with web search enabled for the bundled `web_search` and `web_fetch` tools
143
+ - language servers for the LSP module
138
144
 
139
- - Russian: `vosk-model-small-ru-0.22`
140
- - English: `vosk-model-small-en-us-0.15`
141
-
142
- Language and enabled models are configured in `~/.config/pi/pix.jsonc`.
145
+ ### One-shot use
143
146
 
144
- ### Undo the last supported edit
147
+ ```bash
148
+ # Check/install runtime helpers for this user
149
+ npx pi-ui-extend install
145
150
 
146
- ```text
147
- /undo
151
+ # Start Pix in a project
152
+ npx pi-ui-extend --cwd /path/to/project
148
153
  ```
149
154
 
150
- Undo is available for supported Pix file mutations.
155
+ ### Global install
151
156
 
152
- ## Keyboard shortcuts
157
+ ```bash
158
+ npm install -g pi-ui-extend --ignore-scripts
159
+ pix install
160
+ pix --cwd /path/to/project
161
+ ```
153
162
 
154
- - `Enter` send the prompt.
155
- - `Ctrl+C` — stop the current agent response; if the agent is idle, exit Pix.
156
- - `Ctrl+D` — exit when the input is empty.
157
- - `Ctrl+L` — redraw the screen.
158
- - `Ctrl+G` — start or stop voice dictation.
159
- - `PageUp` / `PageDown` — scroll history.
160
- - Mouse wheel — scroll history.
161
- - Click a tool row — expand or collapse tool output.
163
+ The package exposes both `pix` and `pi-ui-extend`; they launch the same application.
162
164
 
163
- Open the in-app shortcut help with:
165
+ ### Check without changing anything
164
166
 
165
- ```text
166
- /hotkeys
167
+ ```bash
168
+ npx pi-ui-extend install --check
169
+ # or, after a global install
170
+ pix install --check
167
171
  ```
168
172
 
169
- ## Slash commands
170
-
171
- Type `/` to open the command picker. Commands with arguments can also be typed directly.
172
-
173
- | Command | Purpose |
174
- |---|---|
175
- | `/settings` | Show current session settings, model, and theme. |
176
- | `/model` | Choose a model or set `provider/model[:thinking]`. |
177
- | `/thinking` | Choose a thinking level or `auto`. |
178
- | `/scoped-models` | Configure models for the picker and quick switching. |
179
- | `/enhance` | Improve the current draft prompt. |
180
- | `/copy` | Copy the last assistant response. |
181
- | `/name` | Rename the session or generate a name automatically. |
182
- | `/session` | Show session stats: messages, tokens, and cost. |
183
- | `/usage` | Show quota/account usage and context fill. |
184
- | `/export [path]` | Export the session. Default is HTML; `.jsonl` exports JSONL. |
185
- | `/import <path.jsonl>` | Import and continue a JSONL session. |
186
- | `/share` | Share the session as a private GitHub gist; requires the `gh` CLI. |
187
- | `/fork [entry-id]` | Fork the session from the latest or selected user message. |
188
- | `/clone` | Duplicate the current session at the current position. |
189
- | `/jump [query]` | Jump to a previous user message. |
190
- | `/search <text>` | Search saved sessions. |
191
- | `/resume [path\|query]` | Open another session. |
192
- | `/new` | Start a new session in the current tab. |
193
- | `/new_tab` | Start a new session in a new tab. |
194
- | `/compact [instructions]` | Compact context with optional instructions. |
195
- | `/reload` | Reload keybindings, extensions, skills, prompts, and themes. |
196
- | `/update` | Check Pix and global Pi compatibility; install from the shell with `pix update`. |
197
- | `/changelog` | Show the changelog for Pi packages. |
198
- | `/quit`, `/exit` | Exit Pix. |
199
-
200
- Extensions, prompt templates, and skills can add more commands to the same picker.
201
-
202
- ## Update
203
-
204
- Check for updates inside Pix:
173
+ ### Start options
205
174
 
206
175
  ```text
207
- /update
176
+ pix [--cwd <path>] [--no-session] [--session <path>]
177
+ [--theme dark|light] [--model <provider/model[:thinking]>]
208
178
  ```
209
179
 
210
- Check or install updates from the shell:
180
+ Examples:
211
181
 
212
182
  ```bash
213
- pix update --check
214
- pix update
183
+ pix --cwd .
184
+ pix --cwd ../pi-mono --theme light
185
+ pix --cwd . --model anthropic/claude-sonnet-4-20250514:medium
186
+ pix --cwd . --no-session
215
187
  ```
216
188
 
217
- Force reinstall:
189
+ ## Models and accounts
218
190
 
219
- ```bash
220
- pix update --force
221
- ```
191
+ Pix uses Pi's model and authentication stores. Environment-based API keys and credentials already configured for Pi are available to Pix.
222
192
 
223
- `pix update` updates the Pix npm package, then installs the global `pi` CLI at the exact Pi SDK version pinned by the updated Pix package. It also updates renderer-owned extensions and the bundled `pi-tools-suite`. On the next startup, Pix refreshes the extension symlink in `~/.pi/agent/extensions/pi-tools-suite`.
193
+ - Run the stock `pi` TUI when you need its provider login/logout dialogs, then use `/reload` in Pix.
194
+ - Run `/opencode-import` to import supported credentials from OpenCode.
195
+ - Run `/antigravity-add-account` to add an Antigravity OAuth account, then use `/antigravity-account` and `/antigravity-status` to manage it.
196
+ - Use `/model`, `/scoped-models`, and `/thinking` to control the active runtime.
197
+ - Use `/default-model`, `/default-thinking`, and `/autocomplete` to change defaults for new sessions.
198
+ - Use `/usage` or the clickable usage status to inspect locally available quota data.
224
199
 
225
- `pix update --check` reports both the Pix release status and whether global Pi in the same package-manager prefix matches Pix. `pix update --force` reinstalls both packages. If the active `pi` command comes from a different package-manager prefix, update that installation separately.
200
+ Provider availability and thinking levels depend on the selected model. Pix does not upload private repository data merely to populate the model or usage UI; normal model requests still follow the provider you choose.
226
201
 
227
- Update checks are disabled by any of these environment variables:
202
+ ## Everyday interaction
228
203
 
229
- - `PI_OFFLINE=1`
230
- - `PI_SKIP_VERSION_CHECK=1`
231
- - `PIX_SKIP_VERSION_CHECK=1`
204
+ ### Prompts
232
205
 
233
- Pi-managed extension packages remain separate from the global CLI synchronization:
206
+ - **Enter** sends the current prompt.
207
+ - **Shift+Enter** inserts a newline.
208
+ - **Tab** accepts autocomplete or the selected popup item.
209
+ - `/enhance` — or the status-bar magic wand — improves the current draft with the configured helper model.
210
+ - `/queue <message>` stores a delayed message you can send later from the queue menu.
211
+ - Prompt history is searchable with `/history` and navigable with Up/Down when no popup owns those keys.
234
212
 
235
- ```bash
236
- pi update --extensions
213
+ Pix can provide inline, model-backed autocomplete with configurable debounce, timeout, token budget, and recent-message context.
214
+
215
+ ### Local shell
216
+
217
+ ```text
218
+ !git status
219
+ !npm test
220
+ !!npm run dev
221
+ !!python
237
222
  ```
238
223
 
224
+ - `!command` runs a shell command and renders the result in chat. It is local UI activity and is not saved to the Pi session.
225
+ - While it runs, submit editor text to its stdin; use `Ctrl-C` to interrupt.
226
+ - `!!command` opens a raw interactive terminal for REPLs, TUIs, debuggers, and development servers. Exit it to return to Pix.
227
+
228
+ ### Images, clipboard, and files
229
+
230
+ - Paste an image from the clipboard with `Ctrl+V`/`Cmd+V` in supported terminals.
231
+ - Add image/file references to prompts and open detected file links from rendered output.
232
+ - `/copy` copies the last assistant message.
233
+ - Pix integrates with the native clipboard on macOS and Windows and common Wayland/X11 helpers on Linux.
234
+
235
+ ### Local voice input
236
+
237
+ Press `Ctrl+G` or click the microphone in the status area to start/stop dictation. Pix supports configurable local Vosk models and ships defaults for:
238
+
239
+ - English: `vosk-model-small-en-us-0.15`
240
+ - Russian: `vosk-model-small-ru-0.22`
241
+
242
+ The selected model is downloaded on first use. Recognition is local; the resulting text is inserted into the editor so you can review it before sending.
243
+
244
+ ### Workspace undo
245
+
246
+ Pix records supported agent file mutations against the user message that started them. Open that message's action menu and choose **Undo changes** to rewind the session branch and restore the recorded workspace changes. It is a safety net, not a replacement for version control.
247
+
248
+ ## Sessions and tabs
249
+
250
+ Pix stores a tab workspace per working directory. Reopening the same `--cwd` restores its tabs, active tab, drafts, queued messages, and session references.
251
+
252
+ - `/new_tab` opens a fresh session without replacing the current tab.
253
+ - `/resume` opens a session picker or accepts a session path.
254
+ - `/search` searches session contents and opens a match in a new tab.
255
+ - `/fork`, `/clone`, `/tree`, and `/jump` support branching and navigation inside session history.
256
+ - `/export` writes HTML by default or JSONL when given a `.jsonl` path.
257
+ - `/import` resumes a JSONL session; `/share` publishes a secret GitHub gist.
258
+ - `/compact` manually summarizes older context; the DCP suite module provides finer-grained context compression.
259
+ - `/delete` permanently removes a session and its DCP sidecar after confirmation.
260
+
261
+ Set `maxProjectSessions` in Pix configuration to prune old session files automatically for each project; `0` keeps them indefinitely.
262
+
263
+ ## Command reference
264
+
265
+ Type `/` for the live, searchable list. Extensions can add more commands than the core set below.
266
+
267
+ | Area | Commands |
268
+ | --- | --- |
269
+ | Renderer and resources | `/settings`, `/hotkeys`, `/reload`, `/changelog`, `/update` |
270
+ | Models | `/model`, `/default-model`, `/scoped-models`, `/thinking`, `/default-thinking`, `/autocomplete` |
271
+ | Project context | `/no-context-files`, `/compact` |
272
+ | Prompt workflow | `/enhance`, `/queue`, `/copy` |
273
+ | Sessions | `/new`, `/new_tab`, `/resume`, `/name`, `/session`, `/search`, `/history`, `/jump`, `/tree` |
274
+ | Branching and files | `/fork`, `/clone`, `/delete`, `/export`, `/import`, `/share` |
275
+ | Status | `/usage` |
276
+ | Process | `/quit`, `/exit` |
277
+
278
+ Useful suite commands include `/todos`, `/todos-persist`, `/todos-scope`, `/sub-status`, `/sub-stop`, `/ultrawork`, `/hyperplan`, `/subagent-preset`, `/usage`, `/dcp`, `/idx-init`, `/idx-update`, `/opencode-import`, `/antigravity-add-account`, `/install-skill`, and `/export-skill`.
279
+
280
+ ### Keyboard and mouse
281
+
282
+ | Input | Action |
283
+ | --- | --- |
284
+ | `Enter` | Send a message or run the selected command |
285
+ | `Shift+Enter` | Insert a newline |
286
+ | `Tab` | Accept autocomplete / selected popup item |
287
+ | `Esc` | Close a popup or abort running work |
288
+ | `Up` / `Down` | Navigate history or the active popup |
289
+ | `PageUp` / `PageDown` | Scroll the conversation by page |
290
+ | `Cmd+Up` / `Cmd+Down` | Alternative page scrolling in supported terminals |
291
+ | `Ctrl+C` | Interrupt running work; press again while an abort is in progress to stop Pix |
292
+ | `Ctrl+D` | Quit when the editor is empty |
293
+ | `Ctrl+L` | Redraw the screen |
294
+ | `Ctrl+G` | Toggle voice recording |
295
+ | `Ctrl+V` / `Cmd+V` | Paste a clipboard image when supported |
296
+ | Mouse wheel / scrollbar | Scroll the conversation or active popup |
297
+ | Click | Switch tabs; expand activity; follow links; activate visible status actions |
298
+
299
+ Use `/hotkeys` for the authoritative in-app summary for your installed version.
300
+
239
301
  ## Configuration
240
302
 
241
- User Pix config:
303
+ Pix creates a commented JSONC file on first launch:
242
304
 
243
305
  ```text
244
306
  ~/.config/pi/pix.jsonc
245
307
  ```
246
308
 
247
- Common settings:
309
+ A project can override it with:
310
+
311
+ ```text
312
+ <workspace>/.pi/pix.jsonc
313
+ ```
314
+
315
+ Both support the published schema:
248
316
 
249
317
  ```jsonc
250
318
  {
251
- "iconTheme": "fallback",
252
- "dictation": {
253
- "language": "en"
254
- }
319
+ "$schema": "https://unpkg.com/pi-ui-extend/schemas/pix.json",
320
+ "defaultModel": {
321
+ "modelRef": "openai-codex/gpt-5.6-sol",
322
+ "thinking": "medium"
323
+ },
324
+ "toolRenderer": {
325
+ "default": { "previewLines": 0 },
326
+ "tools": {
327
+ "shell": { "previewLines": 6, "direction": "tail" },
328
+ "repo_*": { "previewLines": 6, "direction": "head" },
329
+ "apply_patch": { "defaultExpanded": true }
330
+ }
331
+ },
332
+ "promptEnhancer": { "modelRef": "zai/glm-5-turbo" },
333
+ "autocomplete": {
334
+ "modelRef": "zai/glm-5-turbo",
335
+ "debounceMs": 350,
336
+ "timeoutMs": 3000
337
+ },
338
+ "dictation": { "language": "en" },
339
+ "ignoreContextFiles": false,
340
+ "maxProjectSessions": 0
255
341
  }
256
342
  ```
257
343
 
258
- Bundled `pi-tools-suite` config:
344
+ Configurable areas include:
259
345
 
260
- ```text
261
- ~/.config/pi/pi-tools-suite.jsonc
262
- ```
346
+ - default model and thinking level;
347
+ - scoped model selection and per-model colors;
348
+ - tool visibility, expansion, preview length/direction, and semantic colors;
349
+ - assistant output filters using globs or regex literals;
350
+ - autocomplete, prompt enhancement, and automatic session-title models;
351
+ - dictation languages and model download URLs;
352
+ - icon theme;
353
+ - loading of project `AGENTS.md`/`CLAUDE.md` files;
354
+ - per-project session retention.
263
355
 
264
- Use it to enable and configure LSP servers, sub-agent presets, and tool-suite modules.
356
+ Use `/settings` to inspect the effective settings summary and `/reload` after changing resources. Some command-driven settings update the relevant config file directly.
265
357
 
266
- Useful environment variables:
358
+ ## Updates
267
359
 
268
- - `PIX_USE_FALLBACK_ICONS=1` or `PIX_ICON_THEME=fallback` — use plain symbols instead of Nerd Font icons.
269
- - `PIX_ICON_THEME=nerdFont` — force Nerd Font icons.
270
- - `PIX_DISABLE_TERMINAL_OUTPUT_BUFFER=1` or `PIX_TERMINAL_OUTPUT_BUFFER=0` — disable the terminal output buffer region.
360
+ ```bash
361
+ # Check only
362
+ pix update --check
363
+
364
+ # Install the latest published Pix and align the global Pi CLI
365
+ pix update
366
+
367
+ # Reinstall even when the version appears current
368
+ pix update --force
369
+ ```
370
+
371
+ Inside Pix, `/update` performs a check and explains the shell command needed for installation. Restart Pix after an update.
271
372
 
272
373
  ## Troubleshooting
273
374
 
274
- ### Node is too old
375
+ ### Icons look wrong
275
376
 
276
- Pix requires Node.js `>=22.19.0 <25`. Upgrade Node with your version manager, for example:
377
+ Run `pix install`, configure your terminal to use **JetBrainsMono Nerd Font**, and restart the terminal. Pix falls back to plain glyphs, but the intended UI uses Nerd Font icons.
277
378
 
278
- ```bash
279
- nvm install 22
280
- nvm use 22
281
- ```
379
+ ### Clipboard images do not paste on Linux
282
380
 
283
- or:
381
+ Install `wl-clipboard` on Wayland or `xclip`/`xsel` on X11, then run `pix install --check`.
284
382
 
285
- ```bash
286
- mise install node@22.19.0
287
- mise use -g node@22.19.0
288
- ```
383
+ ### Voice input is unavailable
384
+
385
+ Ensure the optional `vosk` dependency installed successfully, the configured model URL is reachable for its first download, and an audio recorder is available: SoX (`rec`/`sox`), `ffmpeg`, or `arecord` on Linux. Voice support can be omitted without affecting the rest of Pix.
386
+
387
+ ### A provider login dialog is missing
289
388
 
290
- ### Icons are rendered as squares
389
+ Pix does not yet implement Pi's interactive `/login` and `/logout` dialogs. Authenticate in the stock `pi` TUI or configure the provider's supported environment/API-key storage, then run `/reload`.
291
390
 
292
- Start Pix with fallback icons:
391
+ ### Repository discovery tools are absent
392
+
393
+ Those tools register only when Pix is launched from a repository with an `.indexer-cli` index. Run `/idx-init` to initialize the current repository, then `/reload`. If Pix was started elsewhere with `--cwd`, restart it from the project directory first:
293
394
 
294
395
  ```bash
295
- PIX_USE_FALLBACK_ICONS=1 pix
396
+ cd /path/to/project
397
+ pix
296
398
  ```
297
399
 
298
- Or save the setting in `~/.config/pi/pix.jsonc`:
400
+ `/idx-update` updates the globally installed `indexer-cli`; it does not refresh a project's index.
299
401
 
300
- ```jsonc
301
- {
302
- "iconTheme": "fallback"
303
- }
402
+ ### An extension behaves differently
403
+
404
+ Pix supports Pi SDK extensions, including toasts, widgets, menus, dialogs, custom UI, and terminal input hooks. Extensions that assume private internals or a specific stock renderer may still need adaptation. Use `ctx.hasUI` guards for code that also runs headlessly.
405
+
406
+ ## For extension authors
407
+
408
+ The package exports the renderer-facing SDK from both entry points:
409
+
410
+ ```ts
411
+ import type { PixExtensionUIContext } from "pi-ui-extend";
412
+ // or
413
+ import type { PixExtensionUIContext } from "pi-ui-extend/sdk";
304
414
  ```
305
415
 
306
- ### Clipboard does not work on Linux
416
+ Pix implements the Pi extension UI surface for notifications, keyed toasts, widgets, above-input content, menus, dialogs, custom full-screen UI, editor text, terminal input hooks, theme helpers, and status updates. The published declarations are available in [`dist/sdk.d.ts`](dist/sdk.d.ts).
307
417
 
308
- Install one of the clipboard helpers: `wl-copy`, `xclip`, `xsel`, or `termux-clipboard-set`, then run:
418
+ ## Development
309
419
 
310
420
  ```bash
311
- pix install --check
421
+ git clone https://github.com/dnaroid/pix.git
422
+ cd pix
423
+ npm install
424
+
425
+ # Run from source
426
+ npm run dev -- --cwd /path/to/project
427
+
428
+ # Typecheck and test
429
+ npm run check
430
+
431
+ # Validate the bundled suite
432
+ npm run test:tools-suite
433
+
434
+ # Build the publishable renderer
435
+ npm run build:pix
312
436
  ```
313
437
 
314
- ### Voice dictation does not work
438
+ Regenerate the README screenshots without accounts or live model traffic:
315
439
 
316
- Check that one recorder is installed: SoX, `ffmpeg`, or `arecord`. Then restart Pix and press `Ctrl+G`.
440
+ ```bash
441
+ node --import tsx scripts/capture-readme-screenshots.ts
442
+ ```
317
443
 
318
- ## For developers and extension authors
444
+ The capture script runs the real renderer against the local test `MockModel` in an isolated tmux server and temporary home directory.
319
445
 
320
- This README focuses on installing and using Pix as an end user. If you want to develop Pix itself or write renderer-aware extensions, see the source tree, `docs/`, and the exported SDK entrypoint:
446
+ ## Project layout
321
447
 
322
- ```ts
323
- import type { PixExtensionUIContext } from "pi-ui-extend/sdk";
448
+ ```text
449
+ src/ Pix renderer and SDK bridge
450
+ external/pi-tools-suite/ bundled headless tools and extensions
451
+ schemas/ published JSON schemas
452
+ skills/ packaged agent skills
453
+ docs/ release documentation
454
+ tests/ unit, integration, and PTY tests
455
+ scripts/ build, release, sync, and capture tooling
324
456
  ```
325
457
 
326
- Local development from a source checkout usually starts with:
458
+ ---
459
+
460
+ <div align="center">
461
+
462
+ **If your coding agent lives in the terminal, give it a workspace.**
327
463
 
328
464
  ```bash
329
- npm install --ignore-scripts
330
- npm run dev -- --cwd /path/to/workspace
331
- npm run check
465
+ npx pi-ui-extend --cwd .
332
466
  ```
467
+
468
+ </div>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1036" height="534" viewBox="0 0 1036 534" role="img" aria-label="Pix · adaptive implementation plan">
3
+ <rect width="1036" height="534" rx="14" fill="#0f1218"/>
4
+ <rect x="1" y="1" width="1034" height="532" rx="13" fill="none" stroke="#303746"/>
5
+ <circle cx="22" cy="22" r="6" fill="#ff5f57"/><circle cx="42" cy="22" r="6" fill="#febc2e"/><circle cx="62" cy="22" r="6" fill="#28c840"/>
6
+ <text x="518" y="27" text-anchor="middle" fill="#7f8797" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="12">Pix · adaptive implementation plan</text>
7
+ <g><rect x="310" y="502" width="40" height="18" fill="rgb(48,54,61)"/></g>
8
+ <g font-family="JetBrainsMono Nerd Font Mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" font-variant-ligatures="none"><text x="22" y="66" xml:space="preserve"><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(255,255,255)"> Auth hardening: find the safest place to fix </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)" font-weight="700">󰐕</tspan><tspan fill="rgb(155,165,175)"> </tspan></text>
9
+ <text x="22" y="84" xml:space="preserve"><tspan fill="rgb(125,133,144)"> └──────────────────────────────────────────────────────────────────────────</tspan></text>
10
+ <text x="22" y="102" xml:space="preserve"><tspan fill="rgb(164,188,224)">guarded change. </tspan></text>
11
+ <text x="22" y="120" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
12
+ <text x="22" y="138" xml:space="preserve"><tspan fill="rgb(217,119,6)">Turn this into an adaptive implementation plan with explicit dependencies. </tspan></text>
13
+ <text x="22" y="156" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
14
+ <text x="22" y="174" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
15
+ <text x="22" y="192" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
16
+ <text x="22" y="210" xml:space="preserve"><tspan fill="rgb(164,188,224)">I’ll keep the plan small and update it as each dependency clears. </tspan></text>
17
+ <text x="22" y="228" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
18
+ <text x="22" y="246" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> todo</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">action=list nextId=6</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
19
+ <text x="22" y="264" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
20
+ <text x="22" y="282" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
21
+ <text x="22" y="300" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
22
+ <text x="22" y="318" xml:space="preserve"><tspan fill="rgb(164,188,224)">The implementation order is now explicit: coverage first, guarded change second, focused checks last. </tspan></text>
23
+ <text x="22" y="336" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
24
+ <text x="22" y="354" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
25
+ <text x="22" y="372" xml:space="preserve"><tspan fill="rgb(212,154,74)">󰔟</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">5.Harden expired sessions</tspan><tspan fill="rgb(214,222,235)"> — hardening expired sessions </tspan></text>
26
+ <text x="22" y="390" xml:space="preserve"><tspan fill="rgb(124,169,130)"> ↳ 󰗠</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">1.Trace the session boundary</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(214,222,235)">parent:#5</tspan><tspan fill="rgb(214,222,235)"> </tspan></text>
27
+ <text x="22" y="408" xml:space="preserve"><tspan fill="rgb(212,154,74)"> ↳ 󰔟</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">2.Add expiry regression coverage</tspan><tspan fill="rgb(214,222,235)"> — writing expiry regression tests parent:#5 </tspan></text>
28
+ <text x="22" y="426" xml:space="preserve"><tspan fill="rgb(125,133,144)"> ↳ 󰝦</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(212,154,74)">3.Guard the refresh path</tspan><tspan fill="rgb(214,222,235)"> parent:#5 blocked:#2 </tspan></text>
29
+ <text x="22" y="444" xml:space="preserve"><tspan fill="rgb(125,133,144)"> ↳ 󰝦</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(200,180,90)">4.Run focused checks</tspan><tspan fill="rgb(214,222,235)"> parent:#5 blocked:#3 </tspan></text>
30
+ <text x="22" y="462" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
31
+ <text x="22" y="480" xml:space="preserve"><tspan fill="rgb(217,119,6)"> </tspan></text>
32
+ <text x="22" y="498" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
33
+ <text x="22" y="516" xml:space="preserve"><tspan fill="rgb(48,54,61)">󰑊</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(200,180,90)">openai-codex/gpt-5.4</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(212,154,74)">󰌵 medium</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> 0%</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> </tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(255,255,255)">workspace</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰁨</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰀄</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰕾</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰌵</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍜</tspan><tspan fill="rgb(155,165,175)"> ↑ </tspan><tspan fill="rgb(125,133,144)">󰍬</tspan><tspan fill="rgb(155,165,175)"> EN</tspan></text></g>
34
+ </svg>
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1036" height="534" viewBox="0 0 1036 534" role="img" aria-label="Pix · commands and workflows">
3
+ <rect width="1036" height="534" rx="14" fill="#0f1218"/>
4
+ <rect x="1" y="1" width="1034" height="532" rx="13" fill="none" stroke="#303746"/>
5
+ <circle cx="22" cy="22" r="6" fill="#ff5f57"/><circle cx="42" cy="22" r="6" fill="#febc2e"/><circle cx="62" cy="22" r="6" fill="#28c840"/>
6
+ <text x="518" y="27" text-anchor="middle" fill="#7f8797" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="12">Pix · commands and workflows</text>
7
+ <g><rect x="22" y="322" width="16" height="18" fill="rgb(9,13,19)"/>
8
+ <rect x="38" y="322" width="960" height="18" fill="rgb(38,50,65)"/>
9
+ <rect x="998" y="322" width="16" height="18" fill="rgb(9,13,19)"/>
10
+ <rect x="38" y="340" width="960" height="18" fill="rgb(42,47,54)"/>
11
+ <rect x="998" y="340" width="16" height="18" fill="rgb(9,13,19)"/>
12
+ <rect x="38" y="358" width="960" height="18" fill="rgb(30,30,30)"/>
13
+ <rect x="998" y="358" width="16" height="18" fill="rgb(9,13,19)"/>
14
+ <rect x="38" y="376" width="960" height="18" fill="rgb(30,30,30)"/>
15
+ <rect x="998" y="376" width="16" height="18" fill="rgb(9,13,19)"/>
16
+ <rect x="38" y="394" width="960" height="18" fill="rgb(30,30,30)"/>
17
+ <rect x="998" y="394" width="16" height="18" fill="rgb(9,13,19)"/>
18
+ <rect x="38" y="412" width="960" height="18" fill="rgb(30,30,30)"/>
19
+ <rect x="998" y="412" width="16" height="18" fill="rgb(9,13,19)"/>
20
+ <rect x="38" y="430" width="960" height="18" fill="rgb(30,30,30)"/>
21
+ <rect x="998" y="430" width="16" height="18" fill="rgb(9,13,19)"/>
22
+ <rect x="310" y="502" width="40" height="18" fill="rgb(48,54,61)"/></g>
23
+ <g font-family="JetBrainsMono Nerd Font Mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" font-variant-ligatures="none"><text x="22" y="66" xml:space="preserve"><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(255,255,255)"> Auth hardening: find the safest place to fix </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)" font-weight="700">󰐕</tspan><tspan fill="rgb(155,165,175)"> </tspan></text>
24
+ <text x="22" y="84" xml:space="preserve"><tspan fill="rgb(125,133,144)"> └──────────────────────────────────────────────────────────────────────────</tspan></text>
25
+ <text x="22" y="102" xml:space="preserve"><tspan fill="rgb(217,119,6)">Auth hardening: find the safest place to fix expired sessions without widening the change. </tspan></text>
26
+ <text x="22" y="120" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
27
+ <text x="22" y="138" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
28
+ <text x="22" y="156" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
29
+ <text x="22" y="174" xml:space="preserve"><tspan fill="rgb(164,188,224)">I’ll trace the session boundary and verify the current behavior first. </tspan></text>
30
+ <text x="22" y="192" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
31
+ <text x="22" y="210" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> read</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">src/auth/session.ts</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
32
+ <text x="22" y="228" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
33
+ <text x="22" y="246" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
34
+ <text x="22" y="264" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
35
+ <text x="22" y="282" xml:space="preserve"><tspan fill="rgb(164,188,224)">The refresh path is isolated in </tspan><tspan fill="rgb(124,169,130)">`loadSession()`</tspan><tspan fill="rgb(164,188,224)">. Next I’d add an expiry regression test, then make the smallest </tspan></text>
36
+ <text x="22" y="300" xml:space="preserve"><tspan fill="#d8dee9">guarded change. </tspan></text>
37
+ <text x="22" y="318" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
38
+ <text x="22" y="336" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(122,162,214)"> Commands Esc </tspan><tspan fill="#d8dee9"> </tspan></text>
39
+ <text x="22" y="354" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)" font-weight="700">▶ /settings Show renderer and Pi settings summary </tspan><tspan fill="#d8dee9"> </tspan></text>
40
+ <text x="22" y="372" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)"> /model Select the active model </tspan><tspan fill="#d8dee9"> </tspan></text>
41
+ <text x="22" y="390" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)"> /default-model Set the default model for new sessions </tspan><tspan fill="#d8dee9"> </tspan></text>
42
+ <text x="22" y="408" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)"> /autocomplete Set inline autocomplete model, or empty to disable </tspan><tspan fill="#d8dee9"> </tspan></text>
43
+ <text x="22" y="426" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)"> /no-context-files Set project AGENTS.md/CLAUDE.md loading off or on </tspan><tspan fill="#d8dee9"> </tspan></text>
44
+ <text x="22" y="444" xml:space="preserve"><tspan fill="#d8dee9"> </tspan><tspan fill="rgb(230,237,243)"> /scoped-models Show or set models used by the model selector/cycling </tspan><tspan fill="#d8dee9"> </tspan></text>
45
+ <text x="22" y="462" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
46
+ <text x="22" y="480" xml:space="preserve"><tspan fill="rgb(217,119,6)">/ </tspan></text>
47
+ <text x="22" y="498" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
48
+ <text x="22" y="516" xml:space="preserve"><tspan fill="rgb(48,54,61)">󰑊</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(200,180,90)">openai-codex/gpt-5.4</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(212,154,74)">󰌵 medium</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> 0%</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> </tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(255,255,255)">workspace</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰔟</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰁨</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰀄</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰕾</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰌵</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍜</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍬</tspan><tspan fill="rgb(155,165,175)"> EN</tspan></text></g>
49
+ </svg>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1036" height="534" viewBox="0 0 1036 534" role="img" aria-label="Pix · agent workspace">
3
+ <rect width="1036" height="534" rx="14" fill="#0f1218"/>
4
+ <rect x="1" y="1" width="1034" height="532" rx="13" fill="none" stroke="#303746"/>
5
+ <circle cx="22" cy="22" r="6" fill="#ff5f57"/><circle cx="42" cy="22" r="6" fill="#febc2e"/><circle cx="62" cy="22" r="6" fill="#28c840"/>
6
+ <text x="518" y="27" text-anchor="middle" fill="#7f8797" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="12">Pix · agent workspace</text>
7
+ <g><rect x="310" y="502" width="40" height="18" fill="rgb(48,54,61)"/></g>
8
+ <g font-family="JetBrainsMono Nerd Font Mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" font-variant-ligatures="none"><text x="22" y="66" xml:space="preserve"><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(255,255,255)"> Auth hardening: find the safest place to fix </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)" font-weight="700">󰐕</tspan><tspan fill="rgb(155,165,175)"> </tspan></text>
9
+ <text x="22" y="84" xml:space="preserve"><tspan fill="rgb(125,133,144)"> └──────────────────────────────────────────────────────────────────────────</tspan></text>
10
+ <text x="22" y="102" xml:space="preserve"><tspan fill="rgb(217,119,6)">Auth hardening: find the safest place to fix expired sessions without widening the change. </tspan></text>
11
+ <text x="22" y="120" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
12
+ <text x="22" y="138" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
13
+ <text x="22" y="156" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
14
+ <text x="22" y="174" xml:space="preserve"><tspan fill="rgb(164,188,224)">I’ll trace the session boundary and verify the current behavior first. </tspan></text>
15
+ <text x="22" y="192" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
16
+ <text x="22" y="210" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> read</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">src/auth/session.ts</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
17
+ <text x="22" y="228" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
18
+ <text x="22" y="246" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(133,143,153)" font-weight="700"> thinking</tspan><tspan fill="rgb(133,143,153)"> </tspan><tspan fill="rgb(155,165,175)">(medium) 0s</tspan><tspan fill="rgb(133,143,153)"> </tspan></text>
19
+ <text x="22" y="264" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
20
+ <text x="22" y="282" xml:space="preserve"><tspan fill="rgb(164,188,224)">The refresh path is isolated in </tspan><tspan fill="rgb(124,169,130)">`loadSession()`</tspan><tspan fill="rgb(164,188,224)">. Next I’d add an expiry regression test, then make the smallest </tspan></text>
21
+ <text x="22" y="300" xml:space="preserve"><tspan fill="#d8dee9">guarded change. </tspan></text>
22
+ <text x="22" y="318" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
23
+ <text x="22" y="336" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
24
+ <text x="22" y="354" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
25
+ <text x="22" y="372" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
26
+ <text x="22" y="390" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
27
+ <text x="22" y="408" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
28
+ <text x="22" y="426" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
29
+ <text x="22" y="444" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
30
+ <text x="22" y="462" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
31
+ <text x="22" y="480" xml:space="preserve"><tspan fill="rgb(217,119,6)"> </tspan></text>
32
+ <text x="22" y="498" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
33
+ <text x="22" y="516" xml:space="preserve"><tspan fill="rgb(48,54,61)">󰑊</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(200,180,90)">openai-codex/gpt-5.4</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(212,154,74)">󰌵 medium</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> 0%</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> </tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(255,255,255)">workspace</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰁨</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰀄</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰕾</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰌵</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍜</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍬</tspan><tspan fill="rgb(155,165,175)"> EN</tspan></text></g>
34
+ </svg>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1036" height="534" viewBox="0 0 1036 534" role="img" aria-label="Pix · parallel sub-agents">
3
+ <rect width="1036" height="534" rx="14" fill="#0f1218"/>
4
+ <rect x="1" y="1" width="1034" height="532" rx="13" fill="none" stroke="#303746"/>
5
+ <circle cx="22" cy="22" r="6" fill="#ff5f57"/><circle cx="42" cy="22" r="6" fill="#febc2e"/><circle cx="62" cy="22" r="6" fill="#28c840"/>
6
+ <text x="518" y="27" text-anchor="middle" fill="#7f8797" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="12">Pix · parallel sub-agents</text>
7
+ <g><rect x="310" y="502" width="40" height="18" fill="rgb(48,54,61)"/></g>
8
+ <g font-family="JetBrainsMono Nerd Font Mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" font-variant-ligatures="none"><text x="22" y="66" xml:space="preserve"><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(255,255,255)"> Auth hardening: find the safest place to fix </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)" font-weight="700">󰐕</tspan><tspan fill="rgb(155,165,175)"> </tspan></text>
9
+ <text x="22" y="84" xml:space="preserve"><tspan fill="rgb(125,133,144)"> └──────────────────────────────────────────────────────────────────────────</tspan></text>
10
+ <text x="22" y="102" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
11
+ <text x="22" y="120" xml:space="preserve"><tspan fill="rgb(164,188,224)">The implementation order is now explicit: coverage first, guarded change second, focused checks last. </tspan></text>
12
+ <text x="22" y="138" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
13
+ <text x="22" y="156" xml:space="preserve"><tspan fill="rgb(217,119,6)">Run the independent review tracks in parallel while I keep the main implementation path. </tspan></text>
14
+ <text x="22" y="174" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
15
+ <text x="22" y="192" xml:space="preserve"><tspan fill="rgb(164,188,224)">I’ll split the independent review tracks and keep implementation in this session. </tspan></text>
16
+ <text x="22" y="210" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
17
+ <text x="22" y="228" xml:space="preserve"><tspan fill="rgb(124,169,130)" font-weight="700">󰗠</tspan><tspan fill="rgb(125,133,144)" font-weight="700"> subagents</tspan><tspan fill="rgb(125,133,144)"> </tspan><tspan fill="rgb(155,165,175)">mode=spawn started=3/3 run=readme-parallel-audit</tspan><tspan fill="rgb(125,133,144)"> </tspan></text>
18
+ <text x="22" y="246" xml:space="preserve"><tspan fill="rgb(48,54,61)">└</tspan><tspan fill="rgb(155,165,175)"> started 3/3 subagents — running:2 done:1 — run readme-parallel-audit </tspan></text>
19
+ <text x="22" y="264" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
20
+ <text x="22" y="282" xml:space="preserve"><tspan fill="rgb(164,188,224)">Two reviews are running in parallel; I’ll merge their findings before changing the refresh path. </tspan></text>
21
+ <text x="22" y="300" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
22
+ <text x="22" y="318" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
23
+ <text x="22" y="336" xml:space="preserve"><tspan fill="rgb(212,154,74)">󰔟</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">5.Harden expired sessions</tspan><tspan fill="rgb(214,222,235)"> — hardening expired sessions </tspan></text>
24
+ <text x="22" y="354" xml:space="preserve"><tspan fill="rgb(124,169,130)"> ↳ 󰗠</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">1.Trace the session boundary</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(214,222,235)">parent:#5</tspan><tspan fill="rgb(214,222,235)"> </tspan></text>
25
+ <text x="22" y="372" xml:space="preserve"><tspan fill="rgb(212,154,74)"> ↳ 󰔟</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(201,106,103)">2.Add expiry regression coverage</tspan><tspan fill="rgb(214,222,235)"> — writing expiry regression tests parent:#5 </tspan></text>
26
+ <text x="22" y="390" xml:space="preserve"><tspan fill="rgb(125,133,144)"> ↳ 󰝦</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(212,154,74)">3.Guard the refresh path</tspan><tspan fill="rgb(214,222,235)"> parent:#5 blocked:#2 </tspan></text>
27
+ <text x="22" y="408" xml:space="preserve"><tspan fill="rgb(125,133,144)"> ↳ 󰝦</tspan><tspan fill="rgb(214,222,235)"> </tspan><tspan fill="rgb(200,180,90)">4.Run focused checks</tspan><tspan fill="rgb(214,222,235)"> parent:#5 blocked:#3 </tspan></text>
28
+ <text x="22" y="426" xml:space="preserve"><tspan fill="rgb(127,179,200)" font-weight="700">󰔟</tspan><tspan fill="rgb(125,133,144)"> </tspan><tspan fill="rgb(122,162,214)" font-weight="700">test-review</tspan><tspan fill="rgb(125,133,144)"> </tspan><tspan fill="rgb(127,179,200)">claude-sonnet-4-6</tspan><tspan fill="rgb(125,133,144)"> Design expiry and race regression cases elapsed:— </tspan></text>
29
+ <text x="22" y="444" xml:space="preserve"><tspan fill="rgb(127,179,200)" font-weight="700">󰔟</tspan><tspan fill="rgb(125,133,144)"> </tspan><tspan fill="rgb(122,162,214)" font-weight="700">ux-audit</tspan><tspan fill="rgb(125,133,144)"> </tspan><tspan fill="rgb(127,179,200)">gemini-3.1-pro</tspan><tspan fill="rgb(125,133,144)"> Review user-visible recovery states elapsed:— </tspan></text>
30
+ <text x="22" y="462" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
31
+ <text x="22" y="480" xml:space="preserve"><tspan fill="rgb(217,119,6)"> </tspan></text>
32
+ <text x="22" y="498" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
33
+ <text x="22" y="516" xml:space="preserve"><tspan fill="rgb(48,54,61)">󰑊</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(200,180,90)">openai-codex/gpt-5.4</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(212,154,74)">󰌵 medium</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> 0%</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> </tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(255,255,255)">workspace</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰁨</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰀄</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰕾</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰌵</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍜</tspan><tspan fill="rgb(155,165,175)"> ↑ </tspan><tspan fill="rgb(125,133,144)">󰍬</tspan><tspan fill="rgb(155,165,175)"> EN</tspan></text></g>
34
+ </svg>
Binary file
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="1036" height="534" viewBox="0 0 1036 534" role="img" aria-label="Pix · project-scoped session tabs">
3
+ <rect width="1036" height="534" rx="14" fill="#0f1218"/>
4
+ <rect x="1" y="1" width="1034" height="532" rx="13" fill="none" stroke="#303746"/>
5
+ <circle cx="22" cy="22" r="6" fill="#ff5f57"/><circle cx="42" cy="22" r="6" fill="#febc2e"/><circle cx="62" cy="22" r="6" fill="#28c840"/>
6
+ <text x="518" y="27" text-anchor="middle" fill="#7f8797" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="12">Pix · project-scoped session tabs</text>
7
+ <g><rect x="310" y="502" width="40" height="18" fill="rgb(48,54,61)"/></g>
8
+ <g font-family="JetBrainsMono Nerd Font Mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="13" font-variant-ligatures="none"><text x="22" y="66" xml:space="preserve"><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(155,165,175)"> Auth hardening: find the safest p… </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(155,165,175)"> Renderer polish: audit compact to… </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)">󰗠</tspan><tspan fill="rgb(255,255,255)"> Release checks: compare CI across… </tspan><tspan fill="rgb(125,133,144)">󰅖</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">│</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)" font-weight="700">󰐕</tspan></text>
9
+ <text x="22" y="84" xml:space="preserve"><tspan fill="rgb(125,133,144)">───────────────────────────────────────┴────────────────────────────────────────┘ └──</tspan></text>
10
+ <text x="22" y="102" xml:space="preserve"><tspan fill="#d8dee9">system: Opened a new tab. cwd=~/projects/pix </tspan></text>
11
+ <text x="22" y="120" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
12
+ <text x="22" y="138" xml:space="preserve"><tspan fill="rgb(217,119,6)">Release checks: compare CI across Linux, macOS, and Windows before publishing. </tspan></text>
13
+ <text x="22" y="156" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
14
+ <text x="22" y="174" xml:space="preserve"><tspan fill="rgb(164,188,224)">I’ll compare the release checks across Linux, macOS, and Windows before publishing. </tspan></text>
15
+ <text x="22" y="192" xml:space="preserve"><tspan fill="rgb(214,222,235)"> </tspan></text>
16
+ <text x="22" y="210" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
17
+ <text x="22" y="228" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
18
+ <text x="22" y="246" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
19
+ <text x="22" y="264" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
20
+ <text x="22" y="282" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
21
+ <text x="22" y="300" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
22
+ <text x="22" y="318" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
23
+ <text x="22" y="336" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
24
+ <text x="22" y="354" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
25
+ <text x="22" y="372" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
26
+ <text x="22" y="390" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
27
+ <text x="22" y="408" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
28
+ <text x="22" y="426" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
29
+ <text x="22" y="444" xml:space="preserve"><tspan fill="#d8dee9"> </tspan></text>
30
+ <text x="22" y="462" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
31
+ <text x="22" y="480" xml:space="preserve"><tspan fill="rgb(217,119,6)"> </tspan></text>
32
+ <text x="22" y="498" xml:space="preserve"><tspan fill="rgb(125,133,144)">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</tspan></text>
33
+ <text x="22" y="516" xml:space="preserve"><tspan fill="rgb(48,54,61)">󰑊</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(200,180,90)">openai-codex/gpt-5.4</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(212,154,74)">󰌵 medium</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> 0%</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(124,169,130)"> </tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(255,255,255)">workspace</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰁨</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰀄</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(127,179,200)">󰕾</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰌵</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍜</tspan><tspan fill="rgb(155,165,175)"> </tspan><tspan fill="rgb(125,133,144)">󰍬</tspan><tspan fill="rgb(155,165,175)"> EN</tspan></text></g>
34
+ </svg>
package/package.json CHANGED
@@ -1,7 +1,16 @@
1
1
  {
2
2
  "name": "pi-ui-extend",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
+ "description": "Pix: a workspace-first terminal UI for Pi with tabs, readable tool activity, voice input, and bundled agent tools.",
4
5
  "private": false,
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/dnaroid/pix.git"
9
+ },
10
+ "homepage": "https://github.com/dnaroid/pix#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/dnaroid/pix/issues"
13
+ },
5
14
  "type": "module",
6
15
  "bin": {
7
16
  "pi-ui-extend": "./bin/pix.mjs",
@@ -20,6 +29,7 @@
20
29
  "./schemas/pi-tools-suite.json": "./schemas/pi-tools-suite.json"
21
30
  },
22
31
  "files": [
32
+ "assets/screenshots",
23
33
  "bin",
24
34
  "docs",
25
35
  "dist",