@pi-unipi/unipi 3.0.0-alpha.21 → 3.0.0-alpha.23

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.
Files changed (93) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +192 -158
  3. package/package.json +22 -22
  4. package/packages/ask-user/README.md +82 -39
  5. package/packages/ask-user/config.ts +12 -12
  6. package/packages/ask-user/index.ts +17 -2
  7. package/packages/ask-user/package.json +2 -2
  8. package/packages/ask-user/tools.ts +40 -6
  9. package/packages/autocomplete/README.md +46 -21
  10. package/packages/autocomplete/package.json +1 -1
  11. package/packages/autocomplete/src/settings.ts +1 -1
  12. package/packages/background-tasks/README.md +69 -67
  13. package/packages/background-tasks/package.json +2 -2
  14. package/packages/background-tasks/src/config.ts +5 -18
  15. package/packages/btw/README.md +59 -13
  16. package/packages/btw/package.json +2 -2
  17. package/packages/compactor/README.md +78 -61
  18. package/packages/compactor/package.json +3 -3
  19. package/packages/compactor/src/compaction/hooks.ts +3 -3
  20. package/packages/compactor/src/config/manager.ts +85 -30
  21. package/packages/compactor/src/config/schema.ts +20 -5
  22. package/packages/compactor/src/types.ts +2 -6
  23. package/packages/core/README.md +98 -94
  24. package/packages/core/package.json +1 -1
  25. package/packages/core/src/hints/index.ts +3 -3
  26. package/packages/core/src/jev/settings.ts +11 -10
  27. package/packages/core/src/settings/hub.ts +133 -1
  28. package/packages/core/src/settings/schema.ts +24 -5
  29. package/packages/core/src/tui/hub-kit.ts +10 -1
  30. package/packages/footer/README.md +73 -116
  31. package/packages/footer/package.json +3 -3
  32. package/packages/footer/src/config.ts +39 -19
  33. package/packages/fusion/README.md +83 -150
  34. package/packages/fusion/package.json +4 -4
  35. package/packages/fusion/src/preset.ts +5 -5
  36. package/packages/info-screen/README.md +81 -69
  37. package/packages/info-screen/config.ts +11 -6
  38. package/packages/info-screen/package.json +2 -2
  39. package/packages/input-shortcuts/README.md +47 -47
  40. package/packages/input-shortcuts/package.json +2 -2
  41. package/packages/input-shortcuts/src/settings.ts +4 -0
  42. package/packages/kanboard/README.md +98 -182
  43. package/packages/kanboard/package.json +7 -7
  44. package/packages/kanboard/src/settings.ts +36 -30
  45. package/packages/long-horizon/README.md +98 -16
  46. package/packages/long-horizon/package.json +2 -2
  47. package/packages/long-horizon/src/gate.ts +9 -0
  48. package/packages/long-horizon/src/settings.ts +16 -10
  49. package/packages/mcp/README.md +74 -62
  50. package/packages/mcp/package.json +2 -2
  51. package/packages/mcp/src/index.ts +1 -42
  52. package/packages/mcp/src/settings.ts +52 -0
  53. package/packages/memory/README.md +93 -118
  54. package/packages/memory/index.ts +2 -1
  55. package/packages/memory/package.json +3 -3
  56. package/packages/memory/settings.ts +103 -26
  57. package/packages/notify/README.md +85 -120
  58. package/packages/notify/package.json +2 -2
  59. package/packages/notify/settings.ts +58 -26
  60. package/packages/skill-registry/README.md +78 -44
  61. package/packages/skill-registry/package.json +2 -2
  62. package/packages/skill-registry/src/settings.ts +9 -9
  63. package/packages/subagents/README.md +77 -31
  64. package/packages/subagents/package.json +3 -3
  65. package/packages/subagents/src/index.ts +2 -1
  66. package/packages/unipi/bundled.js +1384 -943
  67. package/packages/updater/README.md +53 -55
  68. package/packages/updater/package.json +2 -2
  69. package/packages/updater/src/settings.ts +8 -2
  70. package/packages/utility/README.md +87 -78
  71. package/packages/utility/package.json +2 -2
  72. package/packages/utility/src/image/settings.ts +74 -22
  73. package/packages/utility/src/index.ts +12 -4
  74. package/packages/utility/src/render/delegated.ts +3 -0
  75. package/packages/utility/src/render/harness.ts +11 -2
  76. package/packages/utility/src/render/images.ts +51 -0
  77. package/packages/utility/src/render/reply-bg.ts +30 -2
  78. package/packages/utility/src/render/simple.ts +3 -0
  79. package/packages/utility/src/render/spacing.ts +13 -1
  80. package/packages/utility/src/settings.ts +18 -18
  81. package/packages/watchdog/README.md +66 -41
  82. package/packages/watchdog/package.json +3 -3
  83. package/packages/watchdog/src/config.ts +14 -13
  84. package/packages/web-api/README.md +78 -126
  85. package/packages/web-api/package.json +2 -2
  86. package/packages/web-api/src/index.ts +17 -1
  87. package/packages/web-api/src/settings.ts +27 -14
  88. package/packages/web-api/src/tools.ts +50 -40
  89. package/packages/workflow/README.md +80 -103
  90. package/packages/workflow/package.json +2 -2
  91. package/packages/workflow/src/permission/decide.ts +2 -3
  92. package/packages/workflow/src/permission/index.ts +0 -1
  93. package/packages/workflow/src/permission/settings.ts +10 -19
package/CHANGELOG.md CHANGED
@@ -6,6 +6,40 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [3.0.0-alpha.23] — 2026-10-04
10
+
11
+ ### Added
12
+ - `core`: the `/unipi:settings` hub explains the selected setting in a fixed 4-row info panel — wrapped description, the highlighted (or stored) enum option's meaning, and a meta line (`default … · range … · scope`). Enum and multiselect options carry their own descriptions, shown while the option list is open; number fields take `unit` (`6000 ms`, `80%`); option descriptions join the search haystack. (UNI-50)
13
+ - guard test (`tests/settings-metadata.test.ts`): every settings field and option must be described (labels ≤ 24 chars, sentences end with a period, units live in `unit`, option fragments don't) across all 23 namespaces.
14
+
15
+ ### Changed
16
+ - `web-api`: web tools that cannot work are no longer exposed to the agent — `web_search`/`web_llm_summarize` drop out of the active tools when no enabled provider can serve them (re-checked every prompt), `multi_web_content_read` always stays (smart-fetch is local). The phantom `llm-summarize` provider is gone and `web_llm_summarize` lost its useless `source` parameter. Tool failures now throw instead of returning ignored `isError` results. (UNI-72)
17
+ - settings: shorter labels (explanations moved into descriptions), and pruned knobs —
18
+ - `background-tasks`: removed `defaultTimeoutSeconds` (nothing read it).
19
+ - `compactor`: the nine `sections.*` booleans became one **Summary sections** multiselect (stored booleans still work); `cooldownMs`/`repeatMinGrowthTokens` fixed at their defaults; `debug` moved to `UNIPI_COMPACTOR_DEBUG=1`.
20
+ - `memory`: `recallAtStart` + `wakeUp` merged into one **Recall at start** enum (`off`/`reminder`/`wake-up`); stored booleans migrate per scope.
21
+ - `permission`: removed `jevJudge` — auto mode always consults jev.
22
+ - `footer`: classic-only options (`preset`, `separator`, `zoneSeparator`, `full labels`, `color mode`) moved under an advanced **Classic footer** section; preset list now offers the real presets (`compact`, `full`, `ascii` instead of the dead `dense`/`devops`/`zen`).
23
+ - `image`: custom endpoint fields moved into per-tool **Custom endpoint…** pages (summary shows `off` or the host).
24
+ - `web-api`: Smart fetch section is advanced; `os`/`batchConcurrency` removed from the schema (engine defaults remain).
25
+ - `kanboard`: reorganized into Agent / Housekeeping / **Board server** (advanced, plus open/stop/rotate-token actions); dead `blocking` setting deleted.
26
+
27
+ ### Docs
28
+ - README: dropped the "Why we have it" column from the Proof table.
29
+
30
+ ## [3.0.0-alpha.22] — 2026-10-03
31
+
32
+ ### Changed
33
+ - `utility`: harness annotations (e.g. the Fusion "delegate shell work" nudge) render once in simple mode instead of three rows.
34
+ - `utility`: simple mode hides tool-result images until Ctrl+O; images no longer overlap the text below them in any render style. (UNI-71)
35
+ - `utility`: simple mode spacing — text sits directly above its tool group, one blank row before the next text; same in sidekick/subagent panels. (UNI-45)
36
+ - `utility`: the transcript render style now defaults to `simple` (one collapsed line per tool call). Set `utility.render.style` to `regular` in `/unipi:settings` for Pi's own view. An unknown stored value now falls back to the default instead of `regular`.
37
+ - `ask-user`: `ask_user` is removed from the agent's tools while disabled in settings; the unavailable row says why (turned off vs no interactive UI). (UNI-69)
38
+ - `long-horizon`: `/unipi:regular` and goal stop update the footer mode immediately. (UNI-66)
39
+
40
+ ### Docs
41
+ - v3 docs rewritten in plain controlled English (README, package READMEs, guide, reference, architecture, Unicrab story), with screenshots.
42
+
9
43
  ## [3.0.0-alpha.21] — 2026-10-03
10
44
 
11
45
  ### Added
package/README.md CHANGED
@@ -1,126 +1,192 @@
1
- <p align="center"><img src="docs/assets/unipi-logo.png" width="200" alt="UniPi"></p>
1
+ <p align="center">
2
+ <img src="docs/assets/unipi-logo.png" width="220" alt="UniPi logo: Unicrab behind three terminal screens">
3
+ </p>
4
+
5
+ <h1 align="center">UniPi</h1>
6
+
7
+ <p align="center">
8
+ <b>Extensions that make the Pi coding agent finish long work, remember it and show it.</b>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/@pi-unipi/unipi"><img src="https://img.shields.io/npm/v/%40pi-unipi%2Funipi?label=npm&color=e8452c" alt="npm version"></a>
13
+ <a href="https://github.com/Neuron-Mr-White/unipi/actions/workflows/ci.yml"><img src="https://github.com/Neuron-Mr-White/unipi/actions/workflows/ci.yml/badge.svg" alt="CI status"></a>
14
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
15
+ <img src="https://img.shields.io/badge/pi-%5E0.87.1-555" alt="Pi 0.87.1 or later">
16
+ </p>
17
+
18
+ <p align="center">
19
+ <a href="docs/guide/getting-started.md">Getting started</a> ·
20
+ <a href="docs/README.md">Docs</a> ·
21
+ <a href="docs/architecture/README.md">Architecture</a> ·
22
+ <a href="docs/reference/commands.md">Commands</a> ·
23
+ <a href="docs/story/unicrab.md">Meet Unicrab</a> ·
24
+ <a href="CHANGELOG.md">Changelog</a>
25
+ </p>
26
+
27
+ ## Install
2
28
 
3
- # Unipi
4
-
5
- 23 workspace packages that turn Pi into a full development workstation. Structured workflows, persistent memory, parallel agents, web research, notifications, context management, command autocomplete, and a live status bar — all wired together through a shared event system.
6
-
7
- One command installs everything:
8
29
  ```bash
9
30
  pi install npm:@pi-unipi/unipi
10
31
  ```
11
32
 
12
- ## Requirements
13
-
14
- - **Pi (`@earendil-works/pi-coding-agent`) `^0.87.1`** — Unipi 3.0.0-alpha tracks the Pi 0.87 SDK (extension boundary events, `SessionManager`-canonical context, `TranscriptContext` custom-provider inputs, native prompt-cache warming). Older Pi releases still load most extensions, but npm will flag the peer dependency mismatch; pin `@pi-unipi/*@<3.0.0` if you must stay on an older Pi.
15
-
16
- ## What You Get
17
-
18
- **[Workflow](./packages/workflow/README.md)** — **plan mode** (`/unipi:plan`, `Alt+P`) and **permission modes** (`ask` · `auto` · `full`). Plan mode makes a session read-only except for its plan file; auto mode lets jev judge ambiguous bash before it runs.
19
-
20
- **[Long-Horizon](./packages/long-horizon/)** — Mode-gated long-horizon execution: `/goal` (one objective until verifiably true, propose+verify), `/ralph` (task-file iteration loops), `/swarm` (independent fan-out + synthesis), `/graph` (dependent multi-step work). A TypeSafe jev prompt judge routes each turn; one automation owner per session with park/resume; runaway-guard steering; token/turn/stall budgets.
21
-
22
- **[Memory](./packages/memory/README.md)** — Markdown files + [MemPalace](https://github.com/mempalace/mempalace) semantic search share a memory palace across pi, Devin, and zcode. Facts, preferences, and decisions persist across sessions; v2 data converts via `/unipi:memory migrate`.
23
-
24
- **[Compactor](./packages/compactor/README.md)** — Compaction that keeps work going. Lossless zero-LLM summaries (or Pi's model summary), rebuilt from the full session history, led by the live goal/ralph/kanboard state; the full history stays searchable with session recall.
25
-
26
- **[Prefix-cache architecture](./docs/prefix-cache-architecture.md)** — Append-only request discipline, explicit cache epochs, deterministic tools, privacy-safe diagnostics, provider limitations, and bounded cold-epoch output.
27
-
28
- **[Subagents](./packages/subagents/README.md)** — Parallel execution with file locking. Spawn background agents to research, fix, or build while the main agent keeps going.
29
-
30
- **[Fusion](./packages/fusion/README.md)** — Run two models as one: a frontier lead delegates to a cheaper persistent sidekick that keeps its own context and shells, and stays in the loop while the sidekick works. Pair them from `/unipi:model`; `/unipi:fusion-stats` shows what the sidekick saved you.
31
-
32
- **[Background Tasks](./packages/background-tasks/README.md)** — Long-running commands and delegate agents that survive the turn that started them, with a live dock, output capture, and a wake line while the agent waits on them.
33
-
34
- **[Web API](./packages/web-api/README.md)** — Web search, page reading, content summarization. Defaults to [wigolo](https://github.com/KnockOutEZ/wigolo), a local-first engine with multi-engine search and on-device reranking — $0/query, no API key. Plus a smart-fetch engine with browser-grade TLS fingerprinting. Paid providers as fallbacks, and auto-selection falls through when a provider is unavailable.
35
-
36
-
37
- **[MCP](./packages/mcp/README.md)** — Browse 7,800+ MCP servers, add them interactively. Tools from servers register automatically as Pi tools.
38
-
39
- **[Notify](./packages/notify/README.md)** — Push notifications to native OS, Gotify, Telegram, or ntfy. Per-event platform routing plus native focus suppression so alerts can stay quiet while Pi is already focused.
40
-
41
- **[Footer](./packages/footer/README.md)** — Persistent status bar showing live stats from every package. Now with the Glance footer: a framed input box with an animated rainbow brand, git branch title, and a live session strip (turns, wall/tool time, TTFT, tok/s, cache hit). Responsive layout, presets, per-segment toggling.
42
-
43
- **[BTW](./packages/btw/README.md)** — Inline side questions (`/unipi:btw`) answered by a fresh read-only session seeded from the current context — the main agent never sees them.
33
+ UniPi needs [Pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent)
34
+ `0.87.1` or later. This command installs 21 extension packages. Each package
35
+ also works alone.
36
+
37
+ <p align="center">
38
+ <img src="docs/assets/screenshots/simple-memory-glance.png" alt="A UniPi session in simple mode with memory recall, memory save and the glance footer">
39
+ </p>
40
+
41
+ This screenshot shows one turn in a demo session:
42
+
43
+ - **Simple mode** (the default) shows each tool call as one line.
44
+ - **Memory** finds the test setup from an earlier session and saves a new fact
45
+ for later sessions.
46
+ - **The glance footer** frames the input box. It shows the git branch, the
47
+ mode, the context use and the model. The strip below it shows turns, steps,
48
+ wall time, tool time, time to first token, tokens per second and cache hits.
49
+
50
+ ## Why UniPi
51
+
52
+ Pi is a small coding agent for the terminal. It reads files, edits files and
53
+ runs commands. UniPi adds the parts that a long session needs.
54
+
55
+ | UniPi gives you | How |
56
+ |---|---|
57
+ | **Memory between sessions** | Facts and decisions go to Markdown files and to a MemPalace index. |
58
+ | **Two models as one** | Fusion pairs a lead model with a sidekick model. |
59
+ | **Work that finishes** | `goal`, `ralph`, `swarm` and `graph` modes keep the agent on a long task. |
60
+ | **A warm prompt cache** | Changing state goes into new tail messages. The prefix stays the same. |
61
+ | **One driver for each turn** | A turn arbiter selects one continuation when the agent stops. |
62
+ | **Compaction with no model call** | The default `vcc` method rebuilds the summary from the full session history. |
63
+ | **Parallel hands** | Subagents and background tasks work while the lead continues. |
64
+ | **A board for deferred work** | Kanboard keeps tasks in Markdown files, with a web UI and a terminal UI. |
65
+ | **Hang detection** | Watchdog asks a small judge model about long tool calls. |
66
+ | **A short transcript** | Simple mode shows one line for each tool call. Ctrl+O expands it. |
67
+
68
+ ## Proof
69
+
70
+ Each feature below exists because published results support it. The numbers
71
+ come from the linked sources. They are not UniPi benchmarks.
72
+
73
+ | Feature | Benchmark | Source |
74
+ |---|---|---|
75
+ | **Memory** | 96.6% recall@5 on LongMemEval, with raw semantic search and 0 API calls. | [MemPalace](https://github.com/MemPalace/mempalace) · [LongMemEval](https://arxiv.org/abs/2410.10813) |
76
+ | **Fusion** | Frontier-level FrontierCode score at up to 60% lower cost. | [Devin Fusion](https://cognition.com/blog/devin-fusion) |
77
+ | **Fusion with two frontier models** | 69.0% on DRACO for two frontier models together. The best single model scored 65.3%. | [OpenRouter Fusion](https://openrouter.ai/blog/announcements/fusion-beats-frontier/) · [Mixture-of-Agents](https://arxiv.org/abs/2406.04692) |
78
+ | **Goal** | HumanEval pass@1 went from 80% to 91% with a loop on test feedback. | [Reflexion](https://arxiv.org/abs/2303.11366) · [Self-authored verification](https://arxiv.org/abs/2607.24300) |
79
+ | **Ralph** | Six repositories overnight for $297 in API cost (a reported hackathon result). | [Ralph loop](https://ghuntley.com/ralph/) · [YC hackathon report](https://paddo.dev/blog/ralph-wiggum-autonomous-loops/) |
80
+ | **Swarm** | 90.2% higher than a single agent on Anthropic's research eval. | [Anthropic multi-agent research](https://www.anthropic.com/engineering/multi-agent-research-system) |
81
+ | **Graph** | Up to 3.7× lower latency, 6.7× lower cost and about 9% higher accuracy than ReAct. | [LLMCompiler (ICML 2024)](https://arxiv.org/abs/2312.04511) |
82
+ | **Prefix cache** | Up to 90% lower cost and 85% lower latency for long prompts. | [Anthropic prompt caching](https://claude.com/blog/prompt-caching) · [Modular handbook](https://handbook.modular.com/inference-optimization/prefix-caching/) · [our cache study](docs/deepseek-cache-rate-research.md) |
83
+
84
+ Long work matters more each year. METR measured that the length of software
85
+ tasks that agents can finish doubles about every 7 months
86
+ ([METR](https://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/)).
87
+ UniPi gives these longer runs memory, budgets and a verifier.
88
+
89
+ Two notes on the sources. OpenRouter's Fusion uses a panel of models and a
90
+ judge. UniPi Fusion uses a lead and a sidekick. The Ralph numbers are a
91
+ reported result, not a controlled benchmark.
92
+
93
+ The [architecture pages](docs/architecture/README.md) show how each mechanism
94
+ works in UniPi, with the limits from the source.
95
+
96
+ ## Kanboard
97
+
98
+ Kanboard is a task board for each project. You and the agent use the same
99
+ board. The agent claims a task, works it, and sends it to review with a
100
+ summary. You approve it or send it back with a note.
101
+
102
+ <p align="center">
103
+ <img src="docs/assets/screenshots/kanboard-dashboard.png" alt="Kanboard dashboard: tasks waiting on you, running agents, ready tasks and a 14-day throughput chart">
104
+ </p>
105
+
106
+ The dashboard shows what needs you across all projects. You can approve a
107
+ review or answer a blocked question in one click.
108
+
109
+ <p align="center">
110
+ <img src="docs/assets/screenshots/kanboard-board.png" alt="Kanboard board view with Backlog, Todo, In Progress, Blocked, In Review and Done lanes">
111
+ </p>
112
+
113
+ - Run `/unipi:kanboard open` to open the board in your browser.
114
+ - Run `/unipi:kanboard-add <title>` to add a task without an agent turn.
115
+ - Run `/unipi:kanboard-do <request>` to give the agent a budget of tasks and
116
+ board writes.
117
+ - Run `/unipi:kanboard-autowork start` to let the agent work every ready task.
118
+
119
+ The screenshots use demo data. Read the [Kanboard README](packages/kanboard/README.md).
120
+
121
+ ## Harness architecture
122
+
123
+ UniPi adds these mechanisms to the Pi harness. Each page gives the problem, a
124
+ diagram, the limits from the source, and the files to read.
125
+
126
+ | Mechanism | Problem it solves |
127
+ |---|---|
128
+ | [Event bus](docs/architecture/event-bus.md) | 21 packages must work together without import-time coupling. |
129
+ | [Turn arbiter](docs/architecture/turn-arbiter.md) | Several packages want to continue the run when the agent stops. Only one may act. |
130
+ | [Prefix cache](docs/architecture/prefix-cache.md) | One changed byte in the request prefix makes the provider bill the full context again. |
131
+ | [Compaction](docs/architecture/compaction.md) | A summary must keep the live task, and it must not grow at each compaction. |
132
+ | [Long-horizon](docs/architecture/long-horizon.md) | Multi-turn work needs one driver, a separate judge and hard budgets. |
133
+ | [Delegation](docs/architecture/delegation.md) | Work goes to other models and processes. Each one needs a known context boundary. |
134
+ | [Harness messages](docs/architecture/harness-messages.md) | Text from the harness reaches the model as user text. The user must see where it came from. |
135
+ | [Watchdog](docs/architecture/watchdog.md) | A timer cannot tell a hung command from a slow build. |
136
+
137
+ ```mermaid
138
+ flowchart LR
139
+ stop(["agent stops"]) --> arb{"turn arbiter<br/>1 nudge maximum"}
140
+ arb -- "priority 100" --> lh["long-horizon<br/>goal · ralph · swarm · graph"]
141
+ arb -- "priority 50" --> claims["kanboard<br/>claimed task"]
142
+ arb -- "priority 40" --> auto["kanboard<br/>autowork"]
143
+ lh --> tail["new tail message<br/>(prefix stays cached)"]
144
+ claims --> tail
145
+ auto --> tail
146
+ tail --> next(["next turn"])
147
+ ```
44
148
 
45
- **[Ask User](./packages/ask-user/README.md)** — Structured input for decision gates. Single-select, multi-select, freeform. The agent asks instead of guessing.
149
+ ## Packages
46
150
 
47
- **[Kanboard](./packages/kanboard/README.md)** — Web UI and TUI overlay for kanban boards. Parses all workflow documents into cards with progress indicators.
151
+ | Area | Packages |
152
+ |---|---|
153
+ | Finish long work | [Long-Horizon](packages/long-horizon/README.md) · [Workflow](packages/workflow/README.md) · [Kanboard](packages/kanboard/README.md) |
154
+ | Keep context | [Compactor](packages/compactor/README.md) · [Memory](packages/memory/README.md) |
155
+ | Work in parallel | [Fusion](packages/fusion/README.md) · [Subagents](packages/subagents/README.md) · [Background Tasks](packages/background-tasks/README.md) · [BTW](packages/btw/README.md) |
156
+ | Reach outside | [Web API](packages/web-api/README.md) · [MCP](packages/mcp/README.md) · [Notify](packages/notify/README.md) |
157
+ | Stay safe | [Watchdog](packages/watchdog/README.md) · [Skill Registry](packages/skill-registry/README.md) · [Ask User](packages/ask-user/README.md) |
158
+ | See and control | [Footer](packages/footer/README.md) · [Info Screen](packages/info-screen/README.md) · [Input Shortcuts](packages/input-shortcuts/README.md) · [Command Enchantment](packages/autocomplete/README.md) |
159
+ | Maintain | [Utility](packages/utility/README.md) · [Updater](packages/updater/README.md) · [Core](packages/core/README.md) |
48
160
 
49
- **[Info Screen](./packages/info-screen/README.md)** — Dashboard overlay showing module status, tools, and custom data groups.
161
+ The [docs index](docs/README.md#packages) gives one line and the npm name for
162
+ each package.
50
163
 
51
- **[Utility](./packages/utility/README.md)** — Environment info, diagnostics, cleanup, name badge, and Shiki-powered diff rendering.
164
+ ## Meet Unicrab
52
165
 
53
- **[Updater](./packages/updater/README.md)** — Checks npm for new versions on session start. Changelog browser and readme browser in TUI overlays.
166
+ <img align="right" src="docs/assets/unicrab-pixel.png" width="120" alt="Unicrab pixel art">
54
167
 
55
- **[Input Shortcuts](./packages/input-shortcuts/README.md)** — Keyboard shortcuts via vim-style chord overlay. Stash/restore, undo/redo, clipboard, thinking toggle.
168
+ Unicrab is the UniPi mascot. It started as the author's pet crab. Now it says
169
+ hello when Pi starts and leaves hints above the input box. Press `Alt+H` for the
170
+ next hint.
56
171
 
57
- **[Command Enchantment](./packages/autocomplete/README.md)** — Enhanced `/unipi:*` autocomplete with full command names, package tags, descriptions, colors, and registry audits that catch stale command docs before release.
172
+ Read [The making of Unicrab](docs/story/unicrab.md): from a real crab, to pixel
173
+ art, to a terminal character that is 7 columns wide.
58
174
 
59
- ## Architecture
175
+ <p align="center">
176
+ <img src="docs/assets/screenshots/unicrab-start.png" alt="The UniPi start screen with Unicrab in half-block pixel art">
177
+ </p>
60
178
 
61
- Packages discover each other through events, not direct imports. Core defines the event types and constants. Every package emits `MODULE_READY` on load and subscribes to events it cares about.
179
+ ## Docs
62
180
 
63
- ```
64
- ┌─────────────────────────────────────────────────────────┐
65
- │ Core │
66
- │ Events, Constants, Utilities │
67
- └───────────────────────┬─────────────────────────────────┘
68
- │
69
- ┌───────────────────┼───────────────────┐
70
- │ │ │
71
- ▼ ▼ ▼
72
- ┌─────────┐ ┌──────────┐ ┌──────────┐
73
- │ Workflow │ │ Compactor│ │ Memory │
74
- │ Skills │ │ Engine │ │ Store │
75
- └────┬─────┘ └────┬─────┘ └────┬─────┘
76
- │ │ │
77
- └──────────────────┼──────────────────┘
78
- ▼
79
- ┌──────────┐
80
- │ Footer │ ← Subscribes to all events
81
- └──────────┘
82
- ```
181
+ - [Getting started](docs/guide/getting-started.md)
182
+ - [Commands](docs/reference/commands.md) · [Agent tools](docs/reference/tools.md) · [Shortcuts](docs/reference/shortcuts.md) · [Settings](docs/reference/settings.md) · [Glossary](docs/reference/glossary.md)
183
+ - [Architecture](docs/architecture/README.md)
184
+ - [All docs](docs/README.md)
83
185
 
84
- Coexists triggers enhance behavior when packages are installed together. Workflow skills detect subagents and inject parallel strategies. All skills get MCP tools when MCP is installed. Web-api adds web research to investigation skills. Each package works standalone.
85
-
86
- ## Commands (Brief)
87
-
88
- | Category | Prefix | Examples |
89
- |----------|--------|----------|
90
- | Workflow | `/unipi:` | plan (plan mode), permission (permission modes) |
91
- | Kanboard | `/unipi:` | kanboard (board: capture, work runner, web UI) |
92
- | Long-Horizon | `/unipi:goal`, `/unipi:ralph`, `/unipi:swarm`, `/unipi:graph` | <prompt>, start, stop, status, resume, clear |
93
- | Memory | `/unipi:memory-` | process, search, consolidate, forget |
94
- | Compactor | `/unipi:` | compact-vcc, compact-by-llm, session-recall, compact-stats, compact-doctor, compact-help |
95
- | Notify | `/unipi:notify-` | settings, test, set-tg, set-ntfy |
96
- | MCP | `/unipi:mcp-` | add, settings, sync, status |
97
- | Web | `/unipi:web-` | settings, cache-clear |
98
- | BTW | `/unipi:btw` | question |
99
- | Utility | `/unipi:` | env, doctor, status, cleanup, badge-name |
100
- | Kanboard | `/unipi:kanboard` | toggle, doctor |
101
- | Footer | `/unipi:footer` | toggle, settings |
102
- | Watchdog | `/unipi:settings` | jev judges long-running tools; kills or warns when stuck |
103
- | Updater | `/unipi:` | readme, changelog |
104
- | Info | `/unipi:info` | dashboard, settings |
105
-
106
- ## Agent Tools (Brief)
107
-
108
- | Tool | Package | What It Does |
109
- |------|---------|--------------|
110
- | `create_goal` / `get_goal` / `update_goal` | long-horizon | Goal propose+verify lifecycle |
111
- | `todowrite` | long-horizon | Visible session plan |
112
- | `ralph_done` / `loop_status` | long-horizon | Loop iteration + progress |
113
- | `swarm_report` / `swarm_status` / `swarm_yield` | long-horizon | Fan-out supervision |
114
- | `update_agent_graph` / `graph_output` / `view_agent_graph` | long-horizon | Dependent work graph |
115
- | `spawn_helper` / `get_helper_result` | subagents | Parallel agents |
116
- | `memory_store` / `memory_search` / `memory_delete` | memory | Memory CRUD |
117
- | `web_search` / `multi_web_content_read` / `web_llm_summarize` | web-api | Web research |
118
- | `image_generate` / `image_edit` / `image_recognize` | utility | Image generation, editing and vision (recognize hides while the session model has vision) |
119
- | `notify_user` | notify | Push notifications |
120
- | `sidekick` / `read_subagent` | fusion | Delegate to the persistent sidekick and collect its report |
121
- | `bg_run` / `bg_status` / `bg_logs` / `bg_kill` / `bg_delegate` / `bg_result` | background-tasks | Long-running commands and background delegate agents |
122
- | `ask_user` | ask-user | User input |
123
- | `session_recall` / `context_budget` | compactor | Context management |
186
+ The docs use STE-flavored English
187
+ ([ASD-STE100](https://www.asd-ste100.org/)): short sentences, active voice and
188
+ one meaning for each word. The [style guide](docs/contributing/docs-style.md)
189
+ gives the rules.
124
190
 
125
191
  ## Development
126
192
 
@@ -129,65 +195,33 @@ git clone https://github.com/Neuron-Mr-White/unipi.git
129
195
  cd unipi
130
196
  npm install
131
197
  npm run typecheck
198
+ npm test
132
199
  ```
133
200
 
134
- ### Project Structure
135
-
136
- ```
137
- unipi/
138
- ├── packages/
139
- │ ├── core/ # Shared constants, events, utilities
140
- │ ├── workflow/ # plan mode + permission modes
141
- │ ├── skill-registry/ # per-project skill on/off + jev-judged exposure
142
- │ ├── long-horizon/ # /goal /ralph /swarm /graph mode-gated execution
143
- │ ├── memory/ # SQLite + vector search
144
- │ ├── compactor/ # Context engine
145
- │ ├── subagents/ # Parallel execution
146
- │ ├── fusion/ # Lead + sidekick pairing
147
- │ ├── background-tasks/ # Long-running tasks and delegates
148
- │ ├── web-api/ # Web research
149
- │ ├── image/ # Image generation and vision
150
- │ ├── mcp/ # MCP server integration
151
- │ ├── notify/ # Push notifications
152
- │ ├── footer/ # Status bar
153
- │ ├── btw/ # Side conversations
154
- │ ├── ask-user/ # Structured input
155
- │ ├── kanboard/ # Kanban visualization
156
- │ ├── info-screen/ # Dashboard overlay
157
- │ ├── utility/ # Diagnostics, diff rendering
158
- │ ├── updater/ # Auto-update, browsers
159
- │ ├── input-shortcuts/ # Keyboard shortcuts
160
- │ ├── autocomplete/ # Enhanced command autocomplete
161
- │ └── unipi/ # Umbrella package
162
- ├── docs/ # Project documentation (specs, plans, fixes, …)
163
- ├── .unipi/ # Runtime data (config, sessions, ralph)
164
- └── CHANGELOG.md
165
- ```
166
-
167
- ### Adding a Package
168
-
169
- 1. Create `packages/your-package/` with `package.json` and `index.ts`
170
- 2. Depend on `@pi-unipi/core` for constants and events
171
- 3. Emit `MODULE_READY` on load
172
- 4. Add to umbrella package dependencies and imports
173
- 5. Run `npm run typecheck`
201
+ To add a package:
174
202
 
175
- ### Running Tests
203
+ 1. Create `packages/<name>/` with a `package.json` and an `index.ts`.
204
+ 2. Import events and constants from `@pi-unipi/core`.
205
+ 3. Emit `MODULE_READY` when the package loads.
206
+ 4. Add the package to `packages/unipi/index.ts` and to the root
207
+ `package.json`.
208
+ 5. Run `npm run typecheck` and `npm test`.
176
209
 
177
- ```bash
178
- npm test
179
- ```
210
+ Packages talk over events and shared state holders. Import from
211
+ `@pi-unipi/core`, not from a peer package. The
212
+ [event bus page](docs/architecture/event-bus.md) explains the rules.
180
213
 
181
214
  ## Contributing
182
215
 
183
- 1. Fork the repo
184
- 2. Create a feature branch
185
- 3. Make your changes
186
- 4. Run `npm run typecheck` and `npm test`
187
- 5. Submit a pull request
216
+ 1. Fork the repository.
217
+ 2. Create a branch.
218
+ 3. Make your change.
219
+ 4. Run `npm run typecheck` and `npm test`.
220
+ 5. Open a pull request.
188
221
 
189
- Keep packages focused. One package, one responsibility. Use events for cross-package communication — no direct imports between packages.
222
+ Keep one job in each package. For docs, follow the
223
+ [style guide](docs/contributing/docs-style.md).
190
224
 
191
225
  ## License
192
226
 
193
- MIT
227
+ MIT © Neuron Mr White
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/unipi",
3
- "version": "3.0.0-alpha.21",
3
+ "version": "3.0.0-alpha.23",
4
4
  "description": "All-in-one extension suite for Pi coding agent",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -27,7 +27,7 @@
27
27
  "prepare": "node scripts/build-bundle.mjs --if-missing",
28
28
  "prepublishOnly": "npm run build",
29
29
  "publish:all": "npm publish --workspaces --access public",
30
- "test": "npx tsx --test tests/*.test.js packages/memory/tests/*.test.ts && npm test --workspaces --if-present",
30
+ "test": "npx tsx --test tests/*.test.js tests/*.test.ts packages/memory/tests/*.test.ts && npm test --workspaces --if-present",
31
31
  "typecheck": "npx tsc --noEmit --skipLibCheck",
32
32
  "tui:gallery": "npx tsx scripts/tui-gallery/index.ts",
33
33
  "publish:kanboard": "node scripts/publish-kanboard-platforms.mjs"
@@ -82,26 +82,26 @@
82
82
  "typebox": "^1.1.38"
83
83
  },
84
84
  "dependencies": {
85
- "@pi-unipi/ask-user": "3.0.0-alpha.21",
86
- "@pi-unipi/background-tasks": "3.0.0-alpha.21",
87
- "@pi-unipi/btw": "3.0.0-alpha.21",
88
- "@pi-unipi/command-enchantment": "3.0.0-alpha.21",
89
- "@pi-unipi/compactor": "3.0.0-alpha.21",
90
- "@pi-unipi/core": "3.0.0-alpha.21",
91
- "@pi-unipi/footer": "3.0.0-alpha.21",
92
- "@pi-unipi/fusion": "3.0.0-alpha.21",
93
- "@pi-unipi/info-screen": "3.0.0-alpha.21",
94
- "@pi-unipi/input-shortcuts": "3.0.0-alpha.21",
95
- "@pi-unipi/kanboard": "3.0.0-alpha.21",
96
- "@pi-unipi/mcp": "3.0.0-alpha.21",
97
- "@pi-unipi/memory": "3.0.0-alpha.21",
98
- "@pi-unipi/notify": "3.0.0-alpha.21",
99
- "@pi-unipi/skill-registry": "3.0.0-alpha.21",
100
- "@pi-unipi/subagents": "3.0.0-alpha.21",
101
- "@pi-unipi/updater": "3.0.0-alpha.21",
102
- "@pi-unipi/utility": "3.0.0-alpha.21",
103
- "@pi-unipi/web-api": "3.0.0-alpha.21",
104
- "@pi-unipi/workflow": "3.0.0-alpha.21"
85
+ "@pi-unipi/ask-user": "3.0.0-alpha.23",
86
+ "@pi-unipi/background-tasks": "3.0.0-alpha.23",
87
+ "@pi-unipi/btw": "3.0.0-alpha.23",
88
+ "@pi-unipi/command-enchantment": "3.0.0-alpha.23",
89
+ "@pi-unipi/compactor": "3.0.0-alpha.23",
90
+ "@pi-unipi/core": "3.0.0-alpha.23",
91
+ "@pi-unipi/footer": "3.0.0-alpha.23",
92
+ "@pi-unipi/fusion": "3.0.0-alpha.23",
93
+ "@pi-unipi/info-screen": "3.0.0-alpha.23",
94
+ "@pi-unipi/input-shortcuts": "3.0.0-alpha.23",
95
+ "@pi-unipi/kanboard": "3.0.0-alpha.23",
96
+ "@pi-unipi/mcp": "3.0.0-alpha.23",
97
+ "@pi-unipi/memory": "3.0.0-alpha.23",
98
+ "@pi-unipi/notify": "3.0.0-alpha.23",
99
+ "@pi-unipi/skill-registry": "3.0.0-alpha.23",
100
+ "@pi-unipi/subagents": "3.0.0-alpha.23",
101
+ "@pi-unipi/updater": "3.0.0-alpha.23",
102
+ "@pi-unipi/utility": "3.0.0-alpha.23",
103
+ "@pi-unipi/web-api": "3.0.0-alpha.23",
104
+ "@pi-unipi/workflow": "3.0.0-alpha.23"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@earendil-works/pi-agent-core": "^0.87.1",