{"_id":"@aiwayds/pi-ext-fan","_rev":"6-66adac422388141e04becb1047ee5fd3","name":"@aiwayds/pi-ext-fan","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@aiwayds/pi-ext-fan","version":"0.1.0","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"author":{"name":"fan56"},"license":"MIT","_id":"@aiwayds/pi-ext-fan@0.1.0","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"homepage":"https://github.com/fan56/pi-ext-fan#readme","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"dist":{"shasum":"0110969f8c8c8227722f9819407f40d428aa6811","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.0.tgz","fileCount":4,"integrity":"sha512-TLKcUPmAeBdj1hjILp67SZCtBw4jASXjoJ/MZ5liqSocXI4tM2fQiZIOv2yY/CHbD4tQEv4oSXfENDPmXCgKoA==","signatures":[{"sig":"MEQCIAFUMIUBiR+rlWKGHHfdEov4kn7Y7K4kEsIdTUJVQI2HAiAShRCsYQu8n2B3gPdhoo6yfnc/fFkaj66SXbvNIugflw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20669},"main":"index.ts","engines":{"node":">=18"},"gitHead":"c4d1ed10b73ba94b08d1f14a75e5236d7414d6c1","scripts":{"typecheck":"tsc --noEmit"},"_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"11.17.0","description":"pi-coding-agent extension — @agent interception, /ext companion installer (interactive picker), /think command, /init shortcuts","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ext-fan_0.1.0_1785908445567_0.6340191464136526","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aiwayds/pi-ext-fan","version":"0.1.1","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"author":{"name":"fan56"},"license":"MIT","_id":"@aiwayds/pi-ext-fan@0.1.1","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"homepage":"https://github.com/fan56/pi-ext-fan#readme","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"pi":{"extensions":["index.ts"]},"dist":{"shasum":"b73581fe001ef3babcd6ef90522ac3fdda8c1d55","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.1.tgz","fileCount":4,"integrity":"sha512-AYomYy5QLX/Rv/KrRO694QqY5CHr+N3T5DT0piGEkUyfrDXmVKPpVJcSW/WmW+wgvTgSvkuq215oldu5mFbXOQ==","signatures":[{"sig":"MEUCIQD+3WQSeELX7HNDg08GpSaZAcgsJPqFifOCY0oS/MRGpAIgVN1Hdg1ZQfl9Het6zO/TSBjoXsIxWkXskDKtuGNkrJg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26896},"main":"index.ts","engines":{"node":">=18"},"gitHead":"6ade7b6a552b0a0f7c580caddab4c51b9166f692","scripts":{"smoke":"node smoke-test.cjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"11.17.0","description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ext-fan_0.1.1_1786949365424_0.9200038940944117","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aiwayds/pi-ext-fan","version":"0.1.2","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"author":{"name":"fan56"},"license":"MIT","_id":"@aiwayds/pi-ext-fan@0.1.2","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"homepage":"https://github.com/fan56/pi-ext-fan#readme","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"pi":{"extensions":["index.ts"]},"dist":{"shasum":"292833113633b24833498fdfa5a88a3ee4bbb33f","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.2.tgz","fileCount":4,"integrity":"sha512-6bDBc+qXYnV3hHRzszLQlywbPCWH+qHymiUsd/Pg4TE8bXimgk4a71oaXLKl4Gkd2k9YheVsCAW5y2VtvGlxaw==","signatures":[{"sig":"MEUCIFw/wk1IOG46d4kdP3tg4/FNOaZt7UZU+K9Gjy5a4dxVAiEA1cC8ksZPOzPu/Q0up8GgZRUwlPOxlg5DR5goq1KyPwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39623},"main":"index.ts","engines":{"node":">=18"},"gitHead":"105922d8e98a3edc0d9cf1108eb7a678b718e734","scripts":{"smoke":"node smoke-test.cjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"11.17.0","description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ext-fan_0.1.2_1786951316459_0.8749005269223693","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@aiwayds/pi-ext-fan","version":"0.1.3","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"author":{"name":"fan56"},"license":"MIT","_id":"@aiwayds/pi-ext-fan@0.1.3","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"homepage":"https://github.com/fan56/pi-ext-fan#readme","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"pi":{"extensions":["index.ts"]},"dist":{"shasum":"b2d8946c570c2f5fef21e5bc3b22a459bba8905d","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.3.tgz","fileCount":4,"integrity":"sha512-g7RYA7UR+C324JLyYl5KovWTvesZMNuvwzwNz/3FNZJYn+sBu58K8N9jOroUvWG8q1FUXA7+yipogYpWiHdlWQ==","signatures":[{"sig":"MEQCIGHkhNgyA8emCWhD0QyoOBjMKJL6Rz7eXSK87WYVVpWVAiBF1kxKppzC3rejEsmW3WOVwsBPkM2DOV/ywVB9sdEudA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38776},"main":"index.ts","engines":{"node":">=18"},"gitHead":"d66c45055626e0547b9ae2b38381c8e7c12fed20","scripts":{"smoke":"node smoke-test.cjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"11.17.0","description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ext-fan_0.1.3_1787901327039_0.9880134760122301","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aiwayds/pi-ext-fan","version":"0.1.4","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"author":{"name":"fan56"},"license":"MIT","_id":"@aiwayds/pi-ext-fan@0.1.4","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"homepage":"https://github.com/fan56/pi-ext-fan#readme","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"pi":{"extensions":["index.ts"]},"dist":{"shasum":"f2d0112301331a2e86ec3e3538b860b607157c16","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.4.tgz","fileCount":4,"integrity":"sha512-X5rUOqylby1yFrB0Sxi1BbJz/b8aWvN7DTlrnxzCEY0aiNGbLcJBiuUtsoRWNpOYoKXmvjLo065c9234BsN6Ew==","signatures":[{"sig":"MEQCIB5ODBafZf3U8C1W00N9WCQtLSczsEY4wXy41DUldRFtAiBAVrffaGaHNk9waTr+2fp/xAqZVDchWUZxKpA2j3ETyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD9OGPWv1ESjfHt/Ptnuwx9y/Ts+ooJW1cFKxVlrtX4DwIgJY938KPzsC9QvQNCKHInzl/4KsGvDxJ5Su8K2OrKg74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aiwayds%2fpi-ext-fan@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60942},"main":"index.ts","engines":{"node":">=18"},"gitHead":"e16376374d683b8b336c1e6e3a85e35ed58eb983","scripts":{"smoke":"node smoke-test.cjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"10.9.8","description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","directories":{},"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/pi-ext-fan_0.1.4_1789535756630_0.4104323179172198","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"pi":{"extensions":["index.ts"]},"_id":"@aiwayds/pi-ext-fan@0.1.5","bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"dist":{"shasum":"1430bc21cbf43599bfb7c1190f475e0478ea6dea","tarball":"https://registry.npmjs.org/@aiwayds/pi-ext-fan/-/pi-ext-fan-0.1.5.tgz","fileCount":4,"integrity":"sha512-MrzVBZmlTTcCOob1IXW60KyuTcUYixz2dEX0006ZM0wv9qt6gNXWDtnCZVCkZFNwYIAb02w3o3p6aOjWBOFZcQ==","signatures":[{"sig":"MEYCIQDCbqjWh9xdL2gn0tgg5v1nzkwgUJ1Ik6IDyUYubugCQwIhAO8NvOhpzypCkCVhUwq6PkQOHvuKwFRl/B004rOk2FIi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC06vvMawtYxRcDV/rGShv+eWJGx+V/l25f+jxsGZvszQIgHf2t2YNOzJE0UFfXJZSUkm4ZLbMJikUGPPiQL2ajs3M="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aiwayds%2fpi-ext-fan@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":61752},"main":"index.ts","name":"@aiwayds/pi-ext-fan","author":{"name":"fan56"},"engines":{"node":">=18"},"gitHead":"17500e8c5f4235ed57360f870a1f118b417b7277","license":"MIT","scripts":{"smoke":"node smoke-test.cjs","typecheck":"tsc --noEmit"},"version":"0.1.5","_npmUser":{"name":"aiwayds","email":"aiway.ds@qq.com"},"homepage":"https://github.com/fan56/pi-ext-fan#readme","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"_npmVersion":"10.9.8","description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","directories":{},"maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.4.0","typescript":"^5.6.0","@types/node":"^22.0.0","@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"peerDependencies":{"@earendil-works/pi-tui":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-ext-fan_0.1.5_1790735600405_0.45772993595711964"}}},"time":{"created":"2026-08-05T05:40:45.390Z","modified":"2026-09-30T02:33:20.840Z","0.1.0":"2026-08-05T05:40:45.708Z","0.1.1":"2026-08-17T06:49:25.562Z","0.1.2":"2026-08-17T07:21:56.593Z","0.1.3":"2026-08-28T07:15:27.170Z","0.1.4":"2026-09-16T05:15:56.704Z","0.1.5":"2026-09-30T02:33:20.506Z"},"bugs":{"url":"https://github.com/fan56/pi-ext-fan/issues"},"author":{"name":"fan56"},"license":"MIT","homepage":"https://github.com/fan56/pi-ext-fan#readme","keywords":["pi-package","pi-extension","agent","companion","think","tui"],"repository":{"url":"git+https://github.com/fan56/pi-ext-fan.git","type":"git"},"description":"pi-coding-agent extension — @agent interception, /ext family-bucket installer (/ext all, /ext setup, /ext status), /think command, /init shortcuts","maintainers":[{"name":"aiwayds","email":"aiway.ds@qq.com"}],"readme":"# pi-ext-fan\n\npi-coding-agent extension: **@agent interception + family-bucket companion installer**.\n\n## Features\n\n### 1. `@agent` syntax interception + autocomplete\n\nType `@<agent-name> <task>` in the input box to dispatch to a sub-agent:\n\n- `@workhorse \"write the tests\"` → transforms into `/run workhorse \"write the tests\"`\n- Autocomplete for agent names on `@` (from built-in + `~/.pi/agent/agents` + `~/.agents`)\n- Toggle with `/ext on` / `/ext off` (or `/ext at-agent [on|off]`)\n\n### 2. `/ext` command surface\n\nBare `/ext` (or `/ext help`) prints the subcommand summary:\n\n```\n/ext commands:\n  help                                  show this help\n  status | list | ls                    at-agent state + companion install status\n  install-all                           install every companion in dependency order\n  setup [name ...]                      interactive picker (or run named companions)\n  uninstall [name ...]                  picker of installed pi-type, or `pi remove` named\n                                        (copy/check types are not uninstallable)\n  on | off                              enable / disable @agent interception\n  at-agent [on|off]                     toggle (default) or set @agent interception\n```\n\n- `/ext status` (alias: `/ext list`, `/ext ls`) — at-agent state + companion\n  install status, **grouped by `aiwayds` / `rpiv` / `ecosystem`** with per-line\n  ✅/❌. The three names share a single handler, so output is identical.\n- `/ext on` / `/ext off` — enable / disable `@agent` interception directly.\n- `/ext at-agent [on|off]` — alias-set (`at-agent` / `at_agent` / `atagent`)\n  that accepts an optional `on` / `off` argument, defaulting to a toggle.\n- Unknown subcommands print the help text plus a one-line error pointing at\n  `/ext help` — no silent no-op, no crash.\n\n### 3. Family-bucket installer (`/ext install-all` / `/ext setup`)\n\nThe family bucket covers **18 companions in 3 groups**. Each entry is one of\nthree action types:\n\n- **`pi`** — installed via `pi install <source>` (tracked to `latest`)\n- **`copy`** — agent `.md` files synced into `~/.pi/agent/agents` (copied only\n  when the target file does **not** already exist, so local customizations like\n  a hand-tuned `oldfox.md` are never overwritten)\n- **`check`** — probes a CLI (`command -v …`); when missing it only prints an\n  install hint, it never runs an installer\n\n#### `aiwayds` group (9, all `pi`)\n\n| Key | Label | Source |\n| ----- | ------- | -------- |\n| `sidebar` | Sidebar Panel | `npm:@aiwayds/pi-sidebar-panel` |\n| `footbar` | Powerline Footer | `npm:@aiwayds/pi-powerline-footer` |\n| `cron` | Kimi Cron | `npm:@aiwayds/pi-kimi-cron` |\n| `think-panel` | Think Panel | `npm:@aiwayds/pi-think-panel` |\n| `jarvis` | Jarvis Sphere | `npm:@aiwayds/pi-jarvis-sphere` |\n| `model-favs` | Model Favorites | `npm:@aiwayds/pi-model-favorites` |\n| `topic-memory` | Topic Memory | `npm:@aiwayds/pi-topic-memory` |\n| `fun-agent` | Fun Agent | `npm:@aiwayds/pi-fun-agent` |\n\n#### `rpiv` group (5, all `pi`)\n\n| Key | Label | Source |\n| ----- | ------- | -------- |\n| `rpiv-ask-user-question` | RPIV Ask User Question | `npm:@juicesharp/rpiv-ask-user-question` |\n| `rpiv-todo` | RPIV Todo | `npm:@juicesharp/rpiv-todo` |\n| `rpiv-advisor` | RPIV Advisor | `npm:@juicesharp/rpiv-advisor` |\n| `rpiv-i18n` | RPIV i18n | `npm:@juicesharp/rpiv-i18n` |\n| `rpiv-btw` | RPIV By The Way | `npm:@juicesharp/rpiv-btw` |\n\n#### `ecosystem` group (4)\n\n| Key | Label | Type | Detail |\n| ----- | ------- | ------ | -------- |\n| `lean-ctx` | lean-ctx (pi extension) | `pi` | `npm:pi-lean-ctx` |\n| `lean-ctx-cli` | lean-ctx CLI | `check` | probes `command -v lean-ctx`; hint: `cargo install lean-ctx` (or `brew tap yvgude/lean-ctx && brew install lean-ctx`) |\n| `agents` | Agents (auto-sync) | `copy` | syncs fun-agent's `agents/*.md` → `~/.pi/agent/agents/` (skip-if-exists) |\n| `pi-subagents` | Subagents | `pi` | `npm:@tintinweb/pi-subagents` |\n\nBoth `/ext install-all` and `/ext setup` share the same sequential runner.\nItems execute in strict dependency order — **all `pi` installs first**, then\nthe `copy` sync (depends on fun-agent's agents being on disk), then the\n`check` probes — and within each phase the list order is preserved (never\nconcurrent).\n\n`/ext uninstall` and `/ext uninstall <name>...` share the same runner with\nthe `action=\"uninstall\"` flag. The dependency order is preserved (pi-type\nattempts come first), but the per-phase handling diverges:\n\n- `pi`-type — `pi remove <source>` is invoked only for currently installed\n  items; not-installed items are skipped.\n- `copy`-type — **skipped (not uninstallable)**. The synced agent files in\n  `~/.pi/agent/agents/` may carry user customizations, so deleting them\n  would be destructive. This version never removes them.\n- `check`-type — **skipped (not uninstallable)**. These entries describe\n  external CLIs (`lean-ctx`, etc.) with no installed artefact on disk; the\n  user is expected to uninstall the CLI through its own package manager.\n\nBoth operations share a single in-flight latch: an `/ext install-all` (or\n`/ext setup`) started while `/ext uninstall` is running (and vice versa) is\nrejected with a notify naming whichever action is currently in flight.\n\nPer-item progress is rendered in an editor widget above the input, updated\nin place after each item. The widget shows a 1-line counter header (e.g.\n`Installing 12/18 · installed=5 skipped=3 failed=1` or\n`Uninstalling 3/8 · removed=2 skipped=1 failed=0`) followed by the **last 9\nlines** — the most recent results plus the current in-progress row. Older\nresults scroll off the top as the run continues; the full list and a final\n`Done.` summary arrive in the notify once the run completes.\n\nLine shapes (install):\n\n- `[3/18] Sidebar Panel …` — starting\n- `[3/18] Sidebar Panel ✅ installed (2.1s)` — `pi` install succeeded\n- `[3/18] Sidebar Panel ⏭ skipped (already installed)` — `pi` already present\n- `[3/18] Agents (auto-sync) ⏭ skipped (target exists)` — `copy` target already present\n- `[3/18] lean-ctx CLI ℹ hint: cargo install lean-ctx` — `check` probe missed\n- `[3/18] Sidebar Panel ❌ failed: <error>` — non-zero exit / thrown exception\n\nLine shapes (uninstall):\n\n- `[3/8] Sidebar Panel …` — starting\n- `[3/8] Sidebar Panel ✅ removed (1.8s)` — `pi remove` succeeded\n- `[3/8] Sidebar Panel ⏭ skipped (not installed)` — `pi` not currently installed\n- `[3/8] Agents (auto-sync) ⏭ skipped (not uninstallable: copy targets may be user-edited)` — `copy` type refused\n- `[3/8] lean-ctx CLI ⏭ skipped (not uninstallable: check entries are CLI probes only)` — `check` type refused\n- `[3/8] Sidebar Panel ❌ failed: <error>` — non-zero exit / thrown exception\n\nA single failure never aborts the run; subsequent items continue. When the\nlast item finishes, the widget clears and a single notify summarises\n`Done. installed=X skipped=Y failed=Z (total N)` (install) or\n`Done. removed=X skipped=Y failed=Z (total N)` (uninstall), followed by the\nfull result list and an action-specific reload reminder — install runs\n`Reload pi (/reload) to activate new extensions`, uninstall runs\n`run /reload to apply`.\n\n- `/ext install-all` — **one-shot setup**: installs every missing pi-type\n  companion, re-syncs `agents` (idempotent, skips existing files), probes the\n  CLI checks. No picker, no prompts.\n- `/ext all` — **deprecated alias** for `/ext install-all`; prints a warning\n  notify (`'all' is deprecated — use '/ext install-all'`) and then runs the\n  same one-shot path. Kept so existing muscle memory still works.\n- `/ext setup` — interactive checkbox picker (all selected by default,\n  grouped): space toggles a row, `a` selects all/none, enter runs the checked\n  ones, esc cancels.\n- `/ext setup <name> [<name>...]` — run named companions directly (still uses\n  the sequential runner and the same per-item progress widget).\n- `/ext uninstall` — interactive picker of **currently installed `pi`-type**\n  companions only (copy/check are filtered out — they're not uninstallable).\n  Same space/`a`/enter/esc keys as `/ext setup`; same progress widget and\n  summary format with `removed=` instead of `installed=`.\n- `/ext uninstall <name> [<name>...]` — `pi remove` named items directly.\n  `copy` and `check` items are accepted at the dispatch layer (so muscle\n  memory like `/ext uninstall agents` doesn't error) but skipped in the\n  runner with a clear reason; unknown names are rejected up front.\n\n### 4. `/think` — cycle/set thinking level\n\n`/think` cycles `off → minimal → low → medium → high → xhigh → max`;\n`/think high` sets a specific level.\n\n### 5. Skill shortcuts\n\n- `/init` → forwards to `/skill:init` (root AGENTS.md)\n- `/init-deep` → forwards to `/skill:init-deep` (.architect shadow tree)\n\n## Install (fresh environment, three steps)\n\n```bash\npi install npm:@aiwayds/pi-ext-fan\n```\n\nThen, inside the pi session:\n\n```\n/ext install-all    ← full setup: installs every missing companion, syncs agents, probes CLIs\n/reload             ← activates the newly installed extensions\n```\n\nThat's it — `/ext install-all` skips anything already installed, re-syncs\n`agents` without touching existing files, and only *reports* a hint for\nmissing CLIs. It's idempotent and safe to re-run anytime a companion is\nmissing or a new agent file should be picked up.\n\nPrefer a manual pick? Use `/ext setup` (interactive checkbox list) or\n`/ext setup <name>` for a single package. Check what's present with\n`/ext status` (or its `list` / `ls` aliases).\n\n## Release\n\n**Publishing flow.** Push a `v*` tag to trigger GitHub Actions, which runs\n`npm publish --provenance` automatically. A post-publish verify step then\npolls the npm registry for several minutes (≈5 min window) to confirm the\nnew version is actually visible — npm propagation can lag, and this guard\nturns a late-arriving red status into green before downstream consumers\npick the build up.\n\n**Token rotation.** The repository secret `NPM_TOKEN` and the maintainer's\nlocal `~/.npmrc` currently point at the same npm token. When rotating,\nupdate **both** in lockstep; rotating only one side leaves publishes\nauthenticated against a stale credential and fails with `E401`.\n\n**Local development.** pi installs this package from the published npm\nversion (`npm:@aiwayds/pi-ext-fan`), so edits inside this repo do **not**\ntake effect immediately in a running session. To try local changes, install\nthe absolute path of this checkout instead (e.g.\n`pi install /Users/fliu56/github/pi-ext-fan`), validate, then switch back\nto the npm source for everyday use.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}