---
title: "Repository overview"
seo:
  description: "Repository notes, extension relationships, and development commands."
---

Highly opinionated Pi extensions. Browse them at <https://pi.henry.wang>.

![Pi extensions in use](https://raw.githubusercontent.com/HenryQW/pi-harness/main/example.png)

## Extensions

| Extension | Purpose |
| --- | --- |
| [`@henryqw/pi-add-dir`](/extensions/pi-add-dir) | Add external directories with context, skills, and file search. |
| [`@henryqw/pi-ask-question`](/extensions/pi-ask-question) | Ask user one interactive multiple-choice or free-text question. |
| [`@henryqw/pi-auto-compact`](/extensions/pi-auto-compact) | Compact context at the set threshold and resume current task. |
| [`@henryqw/pi-config-store`](/extensions/pi-config-store) | Create validated extension JSON stores with shared config homes. |
| [`@henryqw/pi-deps`](/extensions/pi-deps) | Prepare locked Node and uv dependencies for opted-in Git worktrees. |
| [`@henryqw/pi-footer`](/extensions/pi-footer) | Henry's opinionated Pi footer style for concise checkout and usage details. |
| [`@henryqw/pi-herdr`](/extensions/pi-herdr) | Run Herdr CLI commands through a shared thin client. |
| [`@henryqw/pi-herdr-btw`](/extensions/pi-herdr-btw) | Open and merge Pi side threads in Herdr panes. |
| [`@henryqw/pi-herdr-clone`](/extensions/pi-herdr-clone) | Clone the current Pi conversation path into a new Herdr tab. |
| [`@henryqw/pi-herdr-done`](/extensions/pi-herdr-done) | Close and remove current Herdr worktree. |
| [`@henryqw/pi-herdr-rename`](/extensions/pi-herdr-rename) | Generate short chat titles and rename current Herdr location. |
| [`@henryqw/pi-memory`](/extensions/pi-memory) | Maintain size-capped agent memory and user-profile stores across sessions. |
| [`@henryqw/pi-multi-codex`](/extensions/pi-multi-codex) | Use multiple ChatGPT Codex OAuth accounts in Pi. |
| [`@henryqw/pi-notes`](/extensions/pi-notes) | Keep persistent per-worktree notes visible in a Pi widget. |
| [`@henryqw/pi-open-in`](/extensions/pi-open-in) | Open current working directory with configurable command. |
| [`@henryqw/pi-pr`](/extensions/pi-pr) | Show current-branch PR lifecycle, CI, mergeability, and review state in Pi footer. |
| [`@henryqw/pi-session-recall`](/extensions/pi-session-recall) | Search past Pi sessions with local FTS5 and zero LLM calls. |
| [`@henryqw/pi-subagent`](/extensions/pi-subagent) | Delegate bounded single, parallel, chained, and extension-owned Git Flow work to isolated roles. |
| [`@henryqw/pi-task-models`](/extensions/pi-task-models) | Shared `fast`/`balanced`/`frontier` model profiles for HenryQW extensions. |

## Extension dependency graph

Each of the 19 extensions under `extensions/*` appears once below. Solid arrows (`-->`) show internal `@henryqw` npm runtime dependencies declared in `extensions/*/package.json`.

Dashed arrows (`-.->`) show direct runtime protocols or couplings without an internal npm dependency. They are evidenced by package behavior or documentation. Arrows point from the consumer or recognizer to the provider or producer.

![Extension dependency graph](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMTI4MCA5MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsbGVkYnk9ImV4dGVuc2lvbi1kZXBlbmRlbmN5LXRpdGxlIGV4dGVuc2lvbi1kZXBlbmRlbmN5LWRlc2MiPgogICAgICA8dGl0bGUgaWQ9ImV4dGVuc2lvbi1kZXBlbmRlbmN5LXRpdGxlIj5FeHRlbnNpb24gZGVwZW5kZW5jeSBncmFwaDwvdGl0bGU+CiAgICAgIDxkZXNjIGlkPSJleHRlbnNpb24tZGVwZW5kZW5jeS1kZXNjIj5EZXBlbmRlbmN5IGdyYXBoIHNob3dpbmcgbnBtIGRlcGVuZGVuY2llcyBhbmQgZGlyZWN0IHJ1bnRpbWUgY291cGxpbmdzIGFtb25nIGFsbCBuaW5ldGVlbiBIZW5yeSBQaSBIYXJuZXNzIGV4dGVuc2lvbnMsIGluY2x1ZGluZyB0d28gc3RhbmRhbG9uZSBleHRlbnNpb25zLjwvZGVzYz4KICAgICAgPGRlZnM+CiAgICAgICAgPHN0eWxlPgogICAgICAgICAgQGltcG9ydCB1cmwoJnF1b3Q7aHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1HZWlzdDp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZhbXA7ZmFtaWx5PUdlaXN0K01vbm86d2dodEA0MDA7NTAwOzYwMCZhbXA7ZGlzcGxheT1zd2FwJnF1b3Q7KTsKICAgICAgICAgIC56b25lIHsgZmlsbDogcmdiYSgxNiwyNCw0MCwuMDI1KTsgc3Ryb2tlOiByZ2JhKDE2LDI0LDQwLC4xNDEpOyBzdHJva2Utd2lkdGg6IDE7IH0KICAgICAgICAgIC56b25lLWxhYmVsIHsgZmlsbDogIzZhNzI4MjsgZm9udDogNTAwIDhweCAnR2Vpc3QgTW9ubycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IC4xOGVtOyB9CiAgICAgICAgICAubm9kZSB7IGZpbGw6ICNmZmY7IHN0cm9rZTogIzEwMTgyODsgc3Ryb2tlLXdpZHRoOiAxOyB9CiAgICAgICAgICAubm9kZS1odWIgeyBmaWxsOiByZ2JhKDI5LDc4LDIxNiwuMDgpOyBzdHJva2U6ICMxZDRlZDg7IHN0cm9rZS13aWR0aDogMS4yOyB9CiAgICAgICAgICAubm9kZS1sZWFmIHsgZmlsbDogcmdiYSgxNiwyNCw0MCwuMDMpOyBzdHJva2U6IHJnYmEoMTYsMjQsNDAsLjMyKTsgc3Ryb2tlLXdpZHRoOiAxOyB9CiAgICAgICAgICAubmFtZSB7IGZpbGw6ICMxMDE4Mjg7IGZvbnQ6IDYwMCAxMnB4ICdHZWlzdCcsIHNhbnMtc2VyaWY7IHRleHQtYW5jaG9yOiBtaWRkbGU7IH0KICAgICAgICAgIC5zdWIgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA0MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyB9CiAgICAgICAgICAuZWRnZSB7IGZpbGw6IG5vbmU7IHN0cm9rZTogIzRjNTY2NTsgc3Ryb2tlLXdpZHRoOiAxLjE7IG1hcmtlci1lbmQ6IHVybCgjYXJyb3cpOyB9CiAgICAgICAgICAuY291cGxpbmcgeyBmaWxsOiBub25lOyBzdHJva2U6ICM2YTcyODI7IHN0cm9rZS13aWR0aDogMTsgc3Ryb2tlLWRhc2hhcnJheTogNSA0OyBtYXJrZXItZW5kOiB1cmwoI2Fycm93KTsgfQogICAgICAgICAgLmxhYmVsLW1hc2sgeyBmaWxsOiAjZjBlZWU5OyB9CiAgICAgICAgICAubGFiZWwgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA1MDAgOHB4ICdHZWlzdCBNb25vJywgbW9ub3NwYWNlOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyBsZXR0ZXItc3BhY2luZzogLjA0ZW07IH0KICAgICAgICAgIC5sZWdlbmQgeyBmaWxsOiAjNGM1NjY1OyBmb250OiA0MDAgOHB4ICdHZWlzdCcsIHNhbnMtc2VyaWY7IH0KICAgICAgICA8L3N0eWxlPgogICAgICAgIDxtYXJrZXIgaWQ9ImFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiByZWZYPSI3IiByZWZZPSIzIiBvcmllbnQ9ImF1dG8iPjxwb2x5Z29uIHBvaW50cz0iMCAwLDggMywwIDYiIGZpbGw9IiM0YzU2NjUiLz48L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhcnJvdy1hY2NlbnQiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIHJlZlg9IjciIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+PHBvbHlnb24gcG9pbnRzPSIwIDAsOCAzLDAgNiIgZmlsbD0iIzFkNGVkOCIvPjwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgaWQ9ImFycm93LWxpbmsiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIHJlZlg9IjciIHJlZlk9IjMiIG9yaWVudD0iYXV0byI+PHBvbHlnb24gcG9pbnRzPSIwIDAsOCAzLDAgNiIgZmlsbD0iIzFkNGVkOCIvPjwvbWFya2VyPgogICAgICA8L2RlZnM+CgogICAgICA8cmVjdCB3aWR0aD0iMTI4MCIgaGVpZ2h0PSI5MDAiIGZpbGw9IiNmMGVlZTkiLz4KCiAgICAgIDwhLS0gWm9uZXMgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJ6b25lIiB4PSIyNCIgeT0iMzIiIHdpZHRoPSIxMjMyIiBoZWlnaHQ9IjIyNCIgcng9IjgiLz4KICAgICAgPHRleHQgY2xhc3M9InpvbmUtbGFiZWwiIHg9IjQwIiB5PSI1NiI+RU5UUlkgRVhURU5TSU9OUzwvdGV4dD4KICAgICAgPHJlY3QgY2xhc3M9InpvbmUiIHg9IjI0IiB5PSIyODgiIHdpZHRoPSIxMjMyIiBoZWlnaHQ9IjMwNCIgcng9IjgiLz4KICAgICAgPHRleHQgY2xhc3M9InpvbmUtbGFiZWwiIHg9IjQwIiB5PSIzMTIiPlNIQVJFRCBFWFRFTlNJT05TICsgUFJPVklERVJTPC90ZXh0PgogICAgICA8cmVjdCBjbGFzcz0iem9uZSIgeD0iMjQiIHk9IjYyNCIgd2lkdGg9IjEyMzIiIGhlaWdodD0iMTg0IiByeD0iOCIvPgogICAgICA8dGV4dCBjbGFzcz0iem9uZS1sYWJlbCIgeD0iNDAiIHk9IjY0OCI+Rk9VTkRBVElPTiArIFNUQU5EQUxPTkU8L3RleHQ+CgogICAgICA8IS0tIG5wbSBkZXBlbmRlbmN5IGVkZ2VzIC0tPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTExMiAxMjAgVjI2NCBRMTEyIDI3MiAxMjAgMjcyIEg2MzIgUTY0MCAyNzIgNjQwIDI4MCBWMzQ4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNNDggOTIgSDE2IFE4IDkyIDggMTAwIFY3MDQgUTggNzEyIDE2IDcxMiBINTkyIi8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNMzc2IDEyMCBWMzQ4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNNjA4IDEyMCBWMjgwIFE2MDggMjg4IDYwMCAyODggSDE3NiBRMTY4IDI4OCAxNjggMjk2IFY1MDgiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik04NTYgMTIwIFYyOTYgUTg1NiAzMDQgODQ4IDMwNCBIMTQ0IFExMzYgMzA0IDEzNiAzMTIgVjUwOCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTExMDQgMTIwIFYzMTIgUTExMDQgMzIwIDEwOTYgMzIwIEgxMTIgUTEwNCAzMjAgMTA0IDMyOCBWNTA4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNMTEzNiAxMjAgVjI2NCBRMTEzNiAyNzIgMTEyOCAyNzIgSDcwNCBRNjk2IDI3MiA2OTYgMjgwIFYzNDgiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik0xMjggMjE2IFYyNzIgUTEyOCAyODAgMTM2IDI4MCBINjA4IFE2MTYgMjgwIDYxNiAyODggVjM0OCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTE2MCAyMTYgVjI2NCBRMTYwIDI1NiAxNjggMjU2IEg5MjggUTkzNiAyNTYgOTM2IDI2NCBWNTA4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNNjQgMTg4IEgzMiBRMjQgMTg4IDI0IDE5NiBWNjk2IFEyNCA3MDQgMzIgNzA0IEg1OTIiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik0zNzYgMjE2IFY2MDggUTM3NiA2MTYgMzg0IDYxNiBINjA4IFE2MTYgNjE2IDYxNiA2MjQgVjY4OCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTYyNCAyMTYgVjY4OCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTgyNCAyMTYgVjMyOCBRODI0IDMzNiA4MTYgMzM2IEg3MzYgUTcyOCAzMzYgNzI4IDM0OCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTg1NiAyMTYgVjQ1NiBRODU2IDQ2NCA4NDggNDY0IEg3NjggUTc2MCA0NjQgNzYwIDQ3MiBWNTM2IFE3NjAgNTQ0IDc1MiA1NDQiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik04ODggMjE2IFY2NDAgUTg4OCA2NDggODgwIDY0OCBINzM2IFE3MjggNjQ4IDcyOCA2NTYgVjY4OCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTE3NiA0MDQgVjUwOCIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTIwOCAzNzYgSDU5MiIvPgogICAgICA8cGF0aCBjbGFzcz0iZWRnZSIgZD0iTTE5MiA0MDQgVjYwMCBRMTkyIDYwOCAyMDAgNjA4IEg2NDAgUTY0OCA2MDggNjQ4IDYxNiBWNjg4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNMzc2IDQwNCBWNjE2IFEzNzYgNjI0IDM4NCA2MjQgSDY1NiBRNjY0IDYyNCA2NjQgNjMyIFY2ODgiLz4KICAgICAgPHBhdGggY2xhc3M9ImVkZ2UiIGQ9Ik03MDQgNDA0IEg3NzYgUTc4NCA0MDQgNzg0IDQxMiBWNjU2IFE3ODQgNjY0IDc3NiA2NjQgSDcwNCBWNjg4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJlZGdlIiBkPSJNNjcyIDU2NCBWNjg4Ii8+CgogICAgICA8IS0tIGRpcmVjdCBydW50aW1lIGNvdXBsaW5ncyAtLT4KICAgICAgPHBhdGggY2xhc3M9ImNvdXBsaW5nIiBkPSJNNDA4IDkyIEgxMDA4IFExMDE2IDkyIDEwMTYgMTAwIFYzNDgiLz4KICAgICAgPHBhdGggY2xhc3M9ImNvdXBsaW5nIiBkPSJNMzYwIDEyMCBWMjY0IFEzNjAgMjcyIDM2OCAyNzIgSDU2MCBRNTY4IDI3MiA1NjggMjgwIFY0ODAgUTU2OCA0ODggNTc2IDQ4OCBINjI0IFY1MDgiLz4KICAgICAgPHBhdGggY2xhc3M9ImNvdXBsaW5nIiBkPSJNNjU2IDQwNCBWNTA4Ii8+CiAgICAgIDxwYXRoIGNsYXNzPSJjb3VwbGluZyIgZD0iTTE0NCAyMTYgVjM0OCIvPgogICAgICA8cGF0aCBjbGFzcz0iY291cGxpbmciIGQ9Ik05MjAgMjE2IFYzMjAgUTkyMCAzMjggOTI4IDMyOCBIOTUyIFE5NjAgMzI4IDk2MCAzMzYgVjUwOCIvPgoKICAgICAgPCEtLSBjb3VwbGluZyBsYWJlbHMgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJsYWJlbC1tYXNrIiB4PSI3MjAiIHk9IjcyIiB3aWR0aD0iNzIiIGhlaWdodD0iMTIiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJsYWJlbCIgeD0iNzU2IiB5PSI4MSI+UFIgU1RBVFVTPC90ZXh0PgogICAgICA8cmVjdCBjbGFzcz0ibGFiZWwtbWFzayIgeD0iNDI0IiB5PSIyNTIiIHdpZHRoPSI5NiIgaGVpZ2h0PSIxMiIgcng9IjIiLz4KICAgICAgPHRleHQgY2xhc3M9ImxhYmVsIiB4PSI0NzIiIHk9IjI2MSI+Q09ERVggU1RBVFVTPC90ZXh0PgogICAgICA8cmVjdCBjbGFzcz0ibGFiZWwtbWFzayIgeD0iNjY0IiB5PSI0NDgiIHdpZHRoPSIxMjgiIGhlaWdodD0iMTIiIHJ4PSIyIi8+CiAgICAgIDx0ZXh0IGNsYXNzPSJsYWJlbCIgeD0iNzI4IiB5PSI0NTciPlBST1ZJREVSIEFMSUFTRVM8L3RleHQ+CiAgICAgIDxyZWN0IGNsYXNzPSJsYWJlbC1tYXNrIiB4PSI2NCIgeT0iMjY4IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyIiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9IjEyOCIgeT0iMjc3Ij5CVFcgQ0hJTEQgUFJPQ0VTUzwvdGV4dD4KICAgICAgPHJlY3QgY2xhc3M9ImxhYmVsLW1hc2siIHg9Ijg5NiIgeT0iMjg0IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjEyIiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9Ijk1MiIgeT0iMjkzIj5UT09MIEVYQ0xVU0lPTjwvdGV4dD4KCiAgICAgIDwhLS0gRW50cnkgbm9kZXMgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlIiB4PSI0OCIgeT0iNzIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDgiIHJ4PSI2Ii8+CiAgICAgIDx0ZXh0IGNsYXNzPSJuYW1lIiB4PSIxMjgiIHk9IjEwMCI+cGktYXV0by1jb21wYWN0PC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMjgiIHk9IjExMiI+MiBERVBFTkRFTkNJRVM8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZSIgeD0iMjk2IiB5PSI3MiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0OCIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjM3NiIgeT0iMTAwIj5waS1mb290ZXI8L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJzdWIiIHg9IjM3NiIgeT0iMTEyIj5TVEFUVVMgQ09OU1VNRVI8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZSIgeD0iNTQ0IiB5PSI3MiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0OCIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjYyNCIgeT0iMTAwIj5waS1oZXJkci1jbG9uZTwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iNjI0IiB5PSIxMTIiPkhFUkRSIENPTU1BTkQ8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZSIgeD0iNzkyIiB5PSI3MiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0OCIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9Ijg3MiIgeT0iMTAwIj5waS1oZXJkci1kb25lPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI4NzIiIHk9IjExMiI+SEVSRFIgQ09NTUFORDwvdGV4dD4KCiAgICAgIDxyZWN0IGNsYXNzPSJub2RlIiB4PSIxMDQwIiB5PSI3MiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0OCIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjExMjAiIHk9IjEwMCI+cGktaGVyZHItcmVuYW1lPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMTIwIiB5PSIxMTIiPjIgREVQRU5ERU5DSUVTPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9IjQ4IiB5PSIxNjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDgiIHJ4PSI2Ii8+CiAgICAgIDx0ZXh0IGNsYXNzPSJuYW1lIiB4PSIxMjgiIHk9IjE5NiI+cGktbWVtb3J5PC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMjgiIHk9IjIwOCI+NCBSRUxBVElPTlNISVBTPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9IjI5NiIgeT0iMTY4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQ4IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iMzc2IiB5PSIxOTYiPnBpLW5vdGVzPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIzNzYiIHk9IjIwOCI+Q09ORklHIENPTlNVTUVSPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9IjU0NCIgeT0iMTY4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQ4IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iNjI0IiB5PSIxOTYiPnBpLXNlc3Npb24tcmVjYWxsPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI2MjQiIHk9IjIwOCI+Q09ORklHIENPTlNVTUVSPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9Ijc5MiIgeT0iMTY4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQ4IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iODcyIiB5PSIxOTYiPnBpLXN1YmFnZW50PC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI4NzIiIHk9IjIwOCI+NCBSRUxBVElPTlNISVBTPC90ZXh0PgoKICAgICAgPCEtLSBTaGFyZWQvcHJvdmlkZXIgbm9kZXMgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlIiB4PSI0OCIgeT0iMzQ4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjU2IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iMTI4IiB5PSIzNzYiPnBpLWhlcmRyLWJ0dzwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iMTI4IiB5PSIzOTIiPjMgREVQRU5ERU5DSUVTPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9IjI5NiIgeT0iMzQ4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjU2IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iMzc2IiB5PSIzNzYiPnBpLW9wZW4taW48L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJzdWIiIHg9IjM3NiIgeT0iMzkyIj5DT05GSUcgQ09OU1VNRVI8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZSIgeD0iNTkyIiB5PSIzNDgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNTYiIHJ4PSI2Ii8+CiAgICAgIDx0ZXh0IGNsYXNzPSJuYW1lIiB4PSI2NzIiIHk9IjM3NiI+cGktdGFzay1tb2RlbHM8L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJzdWIiIHg9IjY3MiIgeT0iMzkyIj41IENPTlNVTUVSUzwvdGV4dD4KCiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLWxlYWYiIHg9IjEwMDAiIHk9IjM0OCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI1NiIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjEwODAiIHk9IjM3NiI+cGktcHI8L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJzdWIiIHg9IjEwODAiIHk9IjM5MiI+UFIgU1RBVFVTIFBST1ZJREVSPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUtbGVhZiIgeD0iNDgiIHk9IjUwOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI1NiIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjEyOCIgeT0iNTM2Ij5waS1oZXJkcjwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iMTI4IiB5PSI1NTIiPjQgQ09OU1VNRVJTPC90ZXh0PgoKICAgICAgPHJlY3QgY2xhc3M9Im5vZGUiIHg9IjU5MiIgeT0iNTA4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjU2IiByeD0iNiIvPgogICAgICA8dGV4dCBjbGFzcz0ibmFtZSIgeD0iNjcyIiB5PSI1MzYiPnBpLW11bHRpLWNvZGV4PC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI2NzIiIHk9IjU1MiI+MyBDT05TVU1FUlM8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1sZWFmIiB4PSI4NDAiIHk9IjUwOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI1NiIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjkyMCIgeT0iNTM2Ij5waS1hc2stcXVlc3Rpb248L3RleHQ+CiAgICAgIDx0ZXh0IGNsYXNzPSJzdWIiIHg9IjkyMCIgeT0iNTUyIj4yIENPTlNVTUVSUzwvdGV4dD4KCiAgICAgIDwhLS0gRm91bmRhdGlvbiArIHN0YW5kYWxvbmUgLS0+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLWh1YiIgeD0iNTkyIiB5PSI2ODgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNTYiIHJ4PSI2Ii8+CiAgICAgIDx0ZXh0IGNsYXNzPSJuYW1lIiB4PSI2NzIiIHk9IjcxNiI+cGktY29uZmlnLXN0b3JlPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI2NzIiIHk9IjczMiI+OSBDT05TVU1FUlM8L3RleHQ+CgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1sZWFmIiB4PSI5MjAiIHk9IjY4OCIgd2lkdGg9IjEyOCIgaGVpZ2h0PSI1NiIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9Ijk4NCIgeT0iNzE2Ij5waS1hZGQtZGlyPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSI5ODQiIHk9IjczMiI+U1RBTkRBTE9ORTwvdGV4dD4KCiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLWxlYWYiIHg9IjEwNzIiIHk9IjY4OCIgd2lkdGg9IjEyOCIgaGVpZ2h0PSI1NiIgcng9IjYiLz4KICAgICAgPHRleHQgY2xhc3M9Im5hbWUiIHg9IjExMzYiIHk9IjcxNiI+cGktZGVwczwvdGV4dD4KICAgICAgPHRleHQgY2xhc3M9InN1YiIgeD0iMTEzNiIgeT0iNzMyIj5TVEFOREFMT05FPC90ZXh0PgoKICAgICAgPCEtLSBMZWdlbmQgLS0+CiAgICAgIDxsaW5lIHgxPSIyNCIgeTE9Ijg0MCIgeDI9IjEyNTYiIHkyPSI4NDAiIHN0cm9rZT0icmdiYSgxNiwyNCw0MCwuMTQxKSIgc3Ryb2tlLXdpZHRoPSIwLjgiLz4KICAgICAgPHRleHQgY2xhc3M9InpvbmUtbGFiZWwiIHg9IjI0IiB5PSI4NjAiPkxFR0VORDwvdGV4dD4KICAgICAgPGxpbmUgeDE9IjEyMCIgeTE9Ijg1NiIgeDI9IjE1NiIgeTI9Ijg1NiIgc3Ryb2tlPSIjNGM1NjY1IiBzdHJva2Utd2lkdGg9IjEuMSIgbWFya2VyLWVuZD0idXJsKCNhcnJvdykiLz4KICAgICAgPHRleHQgY2xhc3M9ImxlZ2VuZCIgeD0iMTY4IiB5PSI4NjAiPm5wbSBkZXBlbmRlbmN5PC90ZXh0PgogICAgICA8bGluZSB4MT0iMzA0IiB5MT0iODU2IiB4Mj0iMzQwIiB5Mj0iODU2IiBzdHJva2U9IiM2YTcyODIiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWRhc2hhcnJheT0iNSA0IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93KSIvPgogICAgICA8dGV4dCBjbGFzcz0ibGVnZW5kIiB4PSIzNTIiIHk9Ijg2MCI+RGlyZWN0IHJ1bnRpbWUgY291cGxpbmc8L3RleHQ+CiAgICAgIDxyZWN0IGNsYXNzPSJub2RlLWh1YiIgeD0iNTM2IiB5PSI4NDgiIHdpZHRoPSIyNCIgaGVpZ2h0PSIxMiIgcng9IjIiLz4KICAgICAgPHRleHQgY2xhc3M9ImxlZ2VuZCIgeD0iNTY4IiB5PSI4NjAiPkhpZ2hlc3QgZmFuLWluPC90ZXh0PgogICAgICA8cmVjdCBjbGFzcz0ibm9kZS1sZWFmIiB4PSI2ODgiIHk9Ijg0OCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjEyIiByeD0iMiIvPgogICAgICA8dGV4dCBjbGFzcz0ibGVnZW5kIiB4PSI3MjAiIHk9Ijg2MCI+UHJvdmlkZXIgLyBzdGFuZGFsb25lPC90ZXh0PgogICAgICA8dGV4dCBjbGFzcz0ic3ViIiB4PSIxMTIwIiB5PSI4NjAiPjE5IEVYVEVOU0lPTlMgwrcgMjYgUkVMQVRJT05TSElQUzwvdGV4dD4KICAgIDwvc3ZnPgo=)

## Deprecated

Retired extensions and their replacements are recorded under [`deprecated/`](/deprecated).

## Remove

```bash
pi remove npm:@henryqw/<extension>
```

Replace `<extension>` with the extension's unscoped name, for example `pi-subagent`.

Before removing `@henryqw/pi-deps`, disable each opted-in repository with `/deps`. Its copied hook is self-contained.

After removing `@henryqw/pi-session-recall`, delete its derived index to reclaim storage:

```bash
rm -rf ~/.pi/agent/config/pi-session-recall/
```

## Development

Requires Node.js `>=22.19.0` and pnpm `11.24.0`.

```bash
pnpm install --frozen-lockfile
pnpm test
pnpm run typecheck
pnpm run pack:check
```

Run live Pi integration tests only when authenticated model access is available:

```bash
pnpm run test:live
```

Live tests use real model requests. They can incur provider cost. They set a temporary small context window so compaction completes quickly.

Manual Pi TUI check for `@henryqw/pi-ask-question`:

```bash
pnpm --filter @henryqw/pi-ask-question run test:manual
```

`@henryqw/pi-auto-compact` live test needs real Pi and authenticated model access:

```bash
pnpm --filter @henryqw/pi-auto-compact run test:live
PI_AUTO_COMPACT_AUTH_FILE=/path/to/auth.json pnpm --filter @henryqw/pi-auto-compact run test:live
```

Set `PI_AUTO_COMPACT_AUTH_FILE` only when auth is not at `~/.pi/agent/auth.json`.

## Documentation site

The landing page uses workspace manifests. The overview and extension pages use their READMEs directly. The site publishes at <https://pi.henry.wang>.

```bash
pnpm run docs:dev
pnpm run docs:build
pnpm run docs:validate
```

`docs:dev` starts local development. `docs:build` writes static files to `website/dist/`.

## Release

See [`docs/releasing.md`](/docs/releasing). Each extension publishes independently as an npm package under the `@henryqw` scope.
