Add ext-toggle extension and /ext slash command
extensions/ext-toggle.ts: /ext lists ~/.pi/agent/extensions/ with active/disabled markers and toggles individual extensions by renaming between name.ts and name.ts.off (pi only auto-discovers *.ts). Calls ctx.reload() so the change takes effect without restarting pi. Subdirectory-style extensions (name/index.ts) are listed read-only in v1 — toggling a directory cleanly is more work than the rename trick is worth. install.sh: --uninstall now matches both *.ts and *.ts.off symlinks pointing into this repo, so a disabled extension is still cleaned up. README.md / AGENTS.md: Document ext-toggle alongside the others; AGENTS notes the API surface used (registerCommand, ui.select/confirm/notify, reload) and the rename-not-delete design decision.
This commit is contained in:
@@ -161,9 +161,28 @@ pi --notify-min-secs 15 # only notify for tasks over 15 seconds
|
||||
pi --notify-min-secs 0 # notify on every agent completion
|
||||
```
|
||||
|
||||
### `ext-toggle.ts`
|
||||
|
||||
Registers `/ext` — a slash command that lists extensions in `~/.pi/agent/extensions/` and toggles individual ones on/off without leaving the TUI.
|
||||
|
||||
**How it works:** pi auto-discovers `*.ts` only. Toggling renames a file (or symlink) between `name.ts` and `name.ts.off`, so a disabled extension is invisible to the loader. After a toggle, the extension calls `ctx.reload()` so the change takes effect immediately — no restart needed.
|
||||
|
||||
**Usage:**
|
||||
|
||||
```
|
||||
/ext # opens a picker; ● = active, ○ = disabled
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Subdirectory-style extensions (`name/index.ts`) are listed read-only — v1 doesn't toggle them. Move the directory aside manually if needed.
|
||||
- `install.sh --uninstall` cleans up both `.ts` and `.ts.off` symlinks pointing into this repo, so a disabled extension won't be left behind.
|
||||
|
||||
## Adding a new extension
|
||||
|
||||
1. Drop a `.ts` file into `extensions/`
|
||||
2. Re-run `./install.sh` — it picks up the new file and symlinks it
|
||||
3. In a running pi session, `/reload` is enough; no restart needed
|
||||
4. (or, with `ext-toggle` installed: `/ext` to disable noisy ones at runtime)
|
||||
|
||||
Each extension is a TypeScript module loaded by [jiti](https://github.com/unjs/jiti) — no compilation step. See the [pi extensions docs](https://github.com/mariozechner/pi-coding-agent/blob/main/docs/extensions.md) and the [built-in examples](https://github.com/mariozechner/pi-coding-agent/tree/main/examples/extensions) for the API surface.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user