Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
dfb5f1f
fix(remote): harden npm browse rate limits
ayagmar Jul 16, 2026
242e068
perf(packages): cache package entrypoint discovery
ayagmar Jul 16, 2026
30cede4
fix(network): enforce complete request timeouts
ayagmar Jul 16, 2026
f2f5c63
perf(cache): harden cache lifecycle
ayagmar Jul 16, 2026
cd81505
test(manager): cover package state and async races
ayagmar Jul 16, 2026
ba790f2
refactor(remote): replace recursive browser navigation
ayagmar Jul 16, 2026
cf9a48a
feat(manager): coordinate mutations and reload state
ayagmar Jul 16, 2026
a96fad8
fix(ui): stabilize loading, focus, and terminal rendering
ayagmar Jul 16, 2026
17aed02
feat(manager): expand package rows
ayagmar Jul 16, 2026
99edab8
feat(manager): add bulk selection and package toggles
ayagmar Jul 16, 2026
99ec7b9
feat(manager): compare and move package scopes
ayagmar Jul 16, 2026
24ecf0e
feat(manager): save views and improve empty states
ayagmar Jul 16, 2026
13557a5
feat(history): add package activity timelines
ayagmar Jul 16, 2026
7b918f4
feat(doctor): add runtime ownership explorer
ayagmar Jul 16, 2026
b11831e
feat(doctor): detect command and tool conflicts
ayagmar Jul 16, 2026
7e75580
feat(compatibility): validate Pi and Node compatibility
ayagmar Jul 16, 2026
7c88410
feat(profiles): add profile schema and exact package state
ayagmar Jul 16, 2026
af1df44
feat(profiles): export and dry-run apply
ayagmar Jul 16, 2026
1e60ee3
feat(profiles): compare profiles and add project policies
ayagmar Jul 16, 2026
a3629e5
feat(updates): preview and selectively update packages
ayagmar Jul 16, 2026
1858bde
feat(updates): add update policies and maintenance windows
ayagmar Jul 16, 2026
091d84d
feat(local): add trash and undo for local extensions
ayagmar Jul 16, 2026
9d91e64
feat(remote): add package sorting
ayagmar Jul 16, 2026
70d8908
feat(remote): show installed and update badges
ayagmar Jul 16, 2026
4fc63e6
feat(remote): inspect package metadata before install
ayagmar Jul 16, 2026
00cb133
feat(cli): improve extmgr command completion
ayagmar Jul 16, 2026
f6a01ed
feat(doctor): expose runtime diagnostics command
ayagmar Jul 16, 2026
4bc9971
feat(profiles): expose export and dry-run commands
ayagmar Jul 16, 2026
8464477
feat(local): wire trash and undo into removals
ayagmar Jul 16, 2026
2ffc17d
feat(remote): wire badges and sorting into browser
ayagmar Jul 16, 2026
61e4559
feat(remote): surface trust metadata in inspection
ayagmar Jul 16, 2026
8757ab7
feat(updates): expose preview and selective updates
ayagmar Jul 16, 2026
3b612c0
feat(history): surface timelines in package details
ayagmar Jul 16, 2026
a837489
feat(manager): toggle whole package extension state
ayagmar Jul 16, 2026
ef366e7
feat(reload): persist pending reload requirements
ayagmar Jul 16, 2026
2b2a3c6
feat(manager): wire saved views and favorites
ayagmar Jul 16, 2026
4b47b1e
fix(trash): persist collision-safe undo records
ayagmar Jul 16, 2026
27afe6f
feat(manager): expose safe package scope moves
ayagmar Jul 16, 2026
f524ddc
feat(profiles): persist and safely apply named profiles
ayagmar Jul 16, 2026
ad975d6
feat(doctor): diagnose installed package compatibility
ayagmar Jul 16, 2026
6a726d1
feat(remote): require consolidated install review
ayagmar Jul 16, 2026
505751c
feat(cli): complete local package and profile names
ayagmar Jul 16, 2026
70f659e
feat(manager): coordinate persistent bulk actions
ayagmar Jul 16, 2026
49607e6
fix(ui): suppress stale async rendering
ayagmar Jul 16, 2026
cf560a2
docs(manager): document persistence and safety behavior
ayagmar Jul 16, 2026
7a36142
fix(reload): restore persisted state across sessions
ayagmar Jul 16, 2026
cc821d7
feat(trash): expose persistent trash lifecycle commands
ayagmar Jul 16, 2026
ac74ee5
fix(remote): cancel cleared package detail requests
ayagmar Jul 16, 2026
479697c
fix(reload): persist declined reload decisions
ayagmar Jul 16, 2026
03aa234
fix(packages): preserve unknown filter settings
ayagmar Jul 16, 2026
9501220
fix(settings): reject unsafe mutation writes
ayagmar Jul 16, 2026
03f495e
fix(profiles): guard stores and partial applies
ayagmar Jul 16, 2026
e99240f
fix(trash): roll back unrecorded removals
ayagmar Jul 17, 2026
adf9423
docs(manager): clarify deferred update policy
ayagmar Jul 17, 2026
7be838f
perf(remote): avoid cached search loader flicker
ayagmar Jul 17, 2026
528defa
test(reload): assert persisted timestamp shape
ayagmar Jul 17, 2026
062302a
feat(ui): streamline extension manager hints
ayagmar Jul 17, 2026
bcc6e6a
test(manager): assert bulk outcome state
ayagmar Jul 17, 2026
c70e93c
fix(ui): harmonize help and trash actions
ayagmar Jul 17, 2026
d16c59f
fix(ui): honor configured selection bindings
ayagmar Jul 17, 2026
c86733f
fix(settings): preserve trust and public persistence semantics
ayagmar Jul 17, 2026
3ecd676
test(install): cover bounded download cleanup
ayagmar Jul 17, 2026
77c43dc
refactor(packages): prefer Pi resource resolution
ayagmar Jul 17, 2026
93cece3
refactor(ui): extract manager state and remote queries
ayagmar Jul 17, 2026
8e5f1a1
refactor(packages): isolate Pi extension resolution
ayagmar Jul 17, 2026
95d8675
test: isolate extmgr tests from host state
ayagmar Jul 20, 2026
a912ac5
feat(ui): split manager into task-oriented workspaces
ayagmar Jul 21, 2026
cc92038
docs(landing): showcase workspaces and refresh screenshot
ayagmar Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@

### Fixed

- Remote npm browsing fetches only the visible result page instead of crawling the full `pi-package` catalog, honors `Retry-After` on HTTP 429 responses, and reports exhausted rate limits inside the UI.
- Remote refresh bypasses both runtime and persistent search caches, community search stays scoped to `pi-package`, and author labels prefer usernames over fallback email addresses.
- Unified manager interactions keep staged changes, filters, and selection when returning from details, action menus, and stay-in-manager prompts.
- Disabled local extensions deduplicate correctly, manifest entrypoints only resolve real files, and npm author selection now prefers maintainer usernames before fallback emails.
- Metadata cache freshness no longer refreshes inherited stale fields.
Expand Down
50 changes: 35 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ version manager, or install project-local with `pi install npm:pi-extmgr -l`.
- **Unified manager UI**
- Local extensions (`~/.pi/agent/extensions`, `.pi/extensions`) and installed packages in one list
- Grouped sections for local extensions vs installed packages
- Compact rows with selected-item details below the list, so large extension sets stay scannable
- Responsive master/detail layout on wide terminals, with a compact stacked fallback on narrow terminals
- Focused primary filters and contextual one-line controls; secondary actions remain available through the command palette and help
- Built-in search and filter shortcuts for large extension sets
- Scope indicators (global/project), status indicators, update badges, and package sizes when known
- **Package extension configuration panel**
Expand All @@ -59,25 +60,32 @@ version manager, or install project-local with `pi install npm:pi-extmgr -l`.
- Unsaved-change guard when leaving (save/discard/stay)
- **Package management**
- Install, update, remove from UI and command line
- Quick actions (`A`, `u`, `X`) and bulk update (`U`)
- Quick actions (`A`, `u`, `X`) and coordinated bulk package actions (`B`)
- **Remote discovery and install**
- npm search/browse with pagination, inline browse search, and keyboard page navigation
- npm search/browse with server-side pagination, inline browse search, keyboard page navigation, and rate-limit-aware retries
- Weekly npm downloads in browse rows/details plus popularity sorting (`o` cycles sort modes)
- Path- and git-like queries are handled explicitly instead of surfacing unrelated npm results
- Install by source (`npm:`, `git:`, `https://`, `ssh://`, `git@...`, local path)
- Supports direct GitHub `.ts` installs and standalone local install for self-contained packages
- Search results render immediately; weekly download metrics hydrate in the background and update the visible rows
- Long-running discovery/detail screens now show dedicated loading UI, and cancellable reads can be aborted with `Esc`
- **Auto-update**
- **Scheduled update checks**
- Interactive wizard (`t` in manager, or `/extensions auto-update`)
- Persistent schedule restored on startup and session switch
- Background checks + status bar updates for installed npm + git packages
- **Task-oriented workspaces**
- Installed: local extensions, packages, updates, and staged changes
- Discover: community npm search, package inspection, downloads, and popularity sorting
- Profiles: inline current-vs-target diffs (scope, version, ref, filters, checksum); applying always passes through the review screen
- Health: runtime conflicts, compatibility, reload state, recoverable trash, conflict remediation, and a conservative “fix all safe issues” action (never removes packages)
- **Operational visibility**
- Session history (`/extensions history`)
- Cache controls (`/extensions clear-cache` clears persistent + runtime extmgr caches)
- Status line summary (`pkg count • auto-update • known updates`)
- History now records local extension deletions and auto-update configuration changes
- Status line summary (`pkg count • scheduled update checks • known updates`)
- History now records local extension deletions and scheduled update checks configuration changes
- **Interactive + non-interactive support**
- Works in TUI and non-UI modes
- Non-interactive commands for list/install/remove/update/auto-update
- Non-interactive commands for list/install/remove/update/scheduled update checks (checks discover updates; package updates remain explicit)

## Usage

Expand All @@ -91,24 +99,27 @@ Open the manager:

| Key | Action |
| ------------- | ----------------------------------------------------- |
| `Tab` / `Shift+Tab` | Next / previous workspace: Installed / Discover / Profiles / Health |
| `↑↓` | Navigate |
| `PageUp/Down` | Jump through longer lists |
| `Home/End` | Jump to top or bottom |
| `Space` | Toggle selected local extension on/off |
| `S` | Save local extension changes |
| `Enter` / `A` | Actions on selected item |
| `/` / `Ctrl+F`| Search visible items |
| `Tab` / `Shift+Tab` | Cycle filters |
| `1-5` | Filters: All / Local / Packages / Updates / Disabled |
| `1-7` | Filter: All / Local / Packages / Updates / Disabled / Favorites / Recent |
| `c` | Configure selected package extensions |
| `u` | Update selected package directly |
| `V` | View full details for selected item |
| `X` | Remove selected item (package/local extension) |
| `i` | Quick install by source |
| `f` | Remote package search |
| `B` | Bulk actions for selected packages |
| `W` / `L` / `D` | Save / load / delete manager views |
| `*` | Toggle favorite for selected item |
| `U` | Update all packages |
| `t` | Auto-update wizard |
| `P` / `M` | Quick actions palette |
| `t` | Scheduled update checks wizard |
| `P` / `M` | Workspace screens and actions |
| `R` | Browse remote packages |
| `?` / `H` | Help |
| `Esc` | Clear search or exit |
Expand All @@ -128,6 +139,12 @@ Open the manager:
/extensions uninstall [source] # Alias: remove
/extensions update [source] # Update one package (or all when omitted)
/extensions auto-update [every] # No arg opens wizard in UI; accepts 1d, 1w, 1mo, never, etc.
/extensions doctor # Inspect ownership and package compatibility
/extensions profile list # List named profiles
/extensions profile save <name> # Save the current package profile
/extensions profile apply <name|path> # Safely apply a profile
/extensions profile delete <name> # Delete a named profile
/extensions trash <list|restore|purge> # Manage local extension trash
/extensions history [options] # View change history (supports filters)
/extensions clear-cache # Clear persistent + runtime extmgr caches
```
Expand Down Expand Up @@ -190,13 +207,16 @@ Examples:
- **Package extension config**: Select a package and press `c` (or Enter/A → Configure) to enable/disable individual package entrypoints.
- After saving package extension config, run /reload to apply changes.
- **Two install modes**:
- **Managed** (npm): Auto-updates with `pi update`, stored in pi's package cache, supports Pi package manifest/convention loading
- **Managed** (npm): uses explicit `pi update` updates, stored in pi's package cache, supports Pi package manifest/convention loading
- **Local** (standalone): Copies to `~/.pi/agent/extensions/{package}/`, so it only accepts runnable standalone layouts (manifest-declared/root entrypoints), requires `tar` on `PATH`, and rejects packages whose runtime `dependencies` are not already bundled with the package contents
- **Auto-update schedule is persistent**: `/extensions auto-update 1d` stays active across future Pi sessions and is restored when switching sessions.
- **Auto-update/update badges cover npm + git packages**: extmgr now uses pi's package manager APIs for structured update detection instead of parsing `pi list` output.
- **Scheduled update-check schedule is persistent**: `/extensions auto-update 1d` stays active across future Pi sessions and is restored when switching sessions.
- **Scheduled update-check badges cover npm + git packages**: extmgr now uses pi's package manager APIs for structured update detection instead of parsing `pi list` output.
- **Settings/cache writes are hardened**: extmgr serializes writes and uses safe file replacement to reduce JSON corruption issues.
- **Invalid JSON is handled safely**: malformed `auto-update.json` / metadata cache files are backed up and reset; invalid `.pi/settings.json` is not overwritten during package-extension toggles.
- **Reload is built-in**: When extmgr asks to reload, it calls `ctx.reload()` directly.
- **Reload is built-in**: When extmgr asks to reload, it calls `ctx.reload()` directly. Successful mutations persist a versioned reload-required marker; cancellation and failure do not. The marker survives reopening the manager and clears after a successful reload.
- **Saved manager state**: Views, favorites, recent items, and bulk selections are stored atomically in `~/.pi/agent/.extmgr-cache/views-<project>.json`. Named profiles are stored in `profiles.json`; project policies load from `.pi/extmgr-policy.json`.
- **Trash lifecycle**: Local removals move to `~/.pi/agent/.extmgr-trash/` with persistent records. Undo refuses to overwrite a replacement file, and expired or missing records are cleaned up.
- **Metadata safety**: Missing compatibility, provenance, checksum, or target-version metadata is reported as `unknown`, never `safe`. Target-version previews, exact target badges, and update-policy/maintenance-window enforcement are intentionally deferred because Pi does not expose structured target metadata.

## License

Expand Down
Binary file removed docs/assets/extension-manager.png
Binary file not shown.
Binary file added docs/assets/installed-workspace.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading