@evoclock/pi-poteto-mode
v0.1.0
Published
A faithful port of Lauren Tan's pstack (v0.15.25) skills for the Pi coding agent.
Maintainers
Readme
@evoclock/pi-poteto-mode
The skills in this package are pstack by Lauren Tan (v0.15.25, MIT). Copyright stays with Lauren Tan. I adapted all 54 skills for the Pi coding agent to keep a port that is maintainable and close to the upstream text, and to cover the gaps I found in other Pi ports. This package holds only the adaptation; it adds no extensions or workflows of my own.
For what pstack is and how its workflows fit together, read Lauren Tan's upstream pstack README. This README covers the Pi skills package and shows how it fits into the wider coding system in which I use it. The surrounding integrations are separate projects and are still under active development.
System overview

Download the interactive HTML to explore it locally. The project-local role map belongs to the bot's working repository, not to a bot identity or a running service. OpenMausBot uses it for readiness checks; skills consult it for model roles. The shared resumability connections are agreed design work, not verified crash recovery.
Inside pi-poteto-mode

The six branches are common examples from upstream's poteto-mode guide; the full method has 23 playbooks. The principles are adapted from pstack; they are not built into Pi.
Install
pi install npm:@evoclock/pi-poteto-modeAdd -l to install it for the current project only. Remove it with
pi remove npm:@evoclock/pi-poteto-mode.
Set up roles
The skills never name a model. They ask for two roles, development and
independent-review, which you map once per project:
- Run
/skill:setup-pstack-pi, or copyconfig/pstack-model-roles.v1.example.jsonto.pi/pstack-model-roles.v1.jsonin your repository. - Set each role to an exact
provider/modelIdfrom your own Pi setup. The two roles must differ.
Keep that file out of version control if it names your own models. Until it is filled in, skills that need a role stop and tell you to run setup.
How this works in Pi
- Naming. Each upstream skill
namebecomesname-pi, for examplepoteto-modebecomespoteto-mode-pi. 52 of the 54 skills setdisable-model-invocation, so they run only when you call them, for example/skill:poteto-mode-pi. - Install.
pi install npm:@evoclock/pi-poteto-mode, orpi install <path>for a local checkout. Thepifield inpackage.jsonlists the 54 skill folders. The package ships no extensions and no install scripts. - Model roles. Skills never name a model. They look up
developmentandindependent-reviewin.pi/pstack-model-roles.v1.json. Copyconfig/pstack-model-roles.v1.example.json(placeholders only) or run/skill:setup-pstack-pi. - Sync script.
node scripts/sync-upstream.mjs <path-to-upstream-pstack>reads a local upstream copy and reports its version, upstream skills missing here, and skills here with no upstream match.
What's missing compared with upstream
docs/adaptation-guide.md lists every Cursor tool or feature the skills had to adapt, with the affected skills, the Pi handling and its status.
These upstream features do not map to Pi yet:
- Subagents. Upstream ships Cursor agents (
agents/poteto-agent.md,agents/comment-sicko.md) and fans work out to CursorTasksubagents. Pi has no built-in subagents, so the skills here only use workers when a separate, approved Pi dispatch route exists, and otherwise work sequentially. - Model roles. Upstream has many roles with effort budgets, model panels and
auto/inherit fallbacks. This port has two exact roles and no fallback. - Always-on mode. Upstream's Poteto mode is a Cursor custom mode. In Pi,
poteto-mode-piapplies only when you load it. - Automations. Upstream's
automations/folder and Cursor/loophave no Pi equivalent here.
My plan: first add a subagent mapping through a Pi extension in a separate package, so this one stays a skills-only port. Then extend the roles file when I can test more roles in Pi. I will add each piece only after it works in a real Pi session.
Maintenance
I pin each release to one upstream version, currently 0.15.25. When upstream
publishes a new version, I run the sync script against it, port new or changed
skills by hand, and keep the -pi names. The tests then check that every
upstream skill in the list is present, that frontmatter is valid and that no
model names or personal paths ship. Every change gets an independent review
before I merge it.
Comparison with other Pi ports
On 18 Oct 2026 I compared nine published Pi ports with upstream v0.15.25. None
covered all 54 skills; the most complete had 51. Two run postinstall scripts
that write outside their install folder, and several hardcode model ids. The
method and findings are in
docs/pstack-pi-ports-comparison.md.
| # | Package | Version / last publish | Skills (missing / added) | Identical SKILL.md | Pi mapping of subagents, hooks and model roles | Install scripts / notes | Stars / open issues / last push | Hardcoded model ids |
|---|---|---|---|---|---|---|---|---|
| 1 | pi-herdr-pstack (npm, pi.dev) | 0.3.2 / 16 Oct 2026 | 51 (missing in-your-own-words, ketchup, sharpen) | 13/51 | Pi extension for mode, setup and config; subagents through the pi-herdr-agents peer dependency | None; ships THIRD_PARTY_NOTICES and a changelog | 2 / 0 / 16 Oct 2026 | Almost none |
| 2 | @casualjim/pi-pstack (npm, pi.dev) | 0.1.14 / 17 Oct 2026 | 50 (missing in-your-own-words, make-bot-ui, setup-pstack, sharpen) | 19/50 | Model roles through a config-backed roles extension | None; tarball includes node_modules (about 37 MB, 1,182 files) | 12 / 1 / 17 Oct 2026 (repo casualjim/pi-mimir) | Some model family names |
| 3 | @mccune1224/pi-pstack (npm, pi.dev) | 0.2.0 / 13 Sep 2026 | 46 + 4 added (control-cli, control-ui, create-skill, deslop); 8 missing | 7/46 | Context guard, compaction and doctor extensions; upstream sync script and sync check | None | 2 / 2 / 13 Sep 2026 | Yes |
| 4 | @whamp/pi-pstack (npm, pi.dev) | 0.10.1 / 12 Oct 2026 | 46 + code-review, deslop; 8 missing | 10/46 | Configurable model roles; ask-user-question tool | postinstall symlinks skills into ~/.agents/skills (keeps existing entries; opt out with PI_PSTACK_SKIP_SKILL_LINKS=1) | 1 / 4 / 15 Oct 2026 | No |
| 5 | @zenspc/pi-pstack (npm, pi.dev) | 0.6.0 / 9 Sep 2026 | 46 + deslop; 8 missing | 6/46 | Config plus a skill-strip extension | None | 10 / 6 / 9 Sep 2026 | No |
| 6 | potetos-for-everyone (npm, pi.dev) | 0.1.0 / 10 Sep 2026 | 49 (adds triage-issue-reports, reproduce-and-fix-issues); 7 missing | 0/47 shared | Multi-agent installer with hooks and adapters rather than a native Pi package; based on upstream v0.15.0 | postinstall writes skills into the current project on a local install | 15 / 1 / 10 Sep 2026 | No |
| 7 | poteto-pi (npm, pi.dev) | 0.1.0 / 5 Sep 2026 | 44 + loop; 10 missing | 1/44 | Generates 37 subagent files; memory, todo and update-check extensions | None | 0 / 0 / 5 Sep 2026 | Yes, in every generated agent |
| 8 | @0xrsydn/pstack-pi (npm, pi.dev) | 0.15.1 / 27 Aug 2026 | 44; 10 missing | 1/44 | Own subagent extension | None; npm repository field points to cursor/plugins | 6 / not checked / 14 Oct 2026 | Yes |
| 9 | pi-pstack (npm, pi.dev) | 0.1.0 / 8 Aug 2026 | 44; 10 missing | 1/44 | Basic agents extension | None; no repository field on npm | 8 / not checked / 8 Aug 2026 | No |
Skills
Each skill carries a -pi suffix. Another package that ships skills with the
same names will clash: Pi keeps the first one it finds and warns. To load this
package's copies, exclude the other package's duplicates in your Pi settings,
for example { "source": "npm:other-package", "skills": ["!skills/*-pi"] }.
architect-piarena-piautomate-me-pibenchmark-checklist-piblast-radius-pibro-picorrect-picreate-verification-skill-pifigure-it-out-pihow-piin-your-own-words-piinterrogate-piketchup-pimaintain-verification-skill-pimake-bot-ui-pino-comments-pipoteto-help-pipoteto-mode-piprinciple-attack-the-premise-piprinciple-boundary-discipline-piprinciple-build-the-lever-piprinciple-encode-lessons-in-structure-piprinciple-exhaust-the-design-space-piprinciple-experience-first-piprinciple-explain-the-number-piprinciple-fix-root-causes-piprinciple-foundational-thinking-piprinciple-guard-the-context-window-piprinciple-laziness-protocol-piprinciple-make-operations-idempotent-piprinciple-migrate-callers-then-delete-legacy-apis-piprinciple-minimize-reader-load-piprinciple-model-the-domain-piprinciple-never-block-on-the-human-piprinciple-outcome-oriented-execution-piprinciple-prove-it-works-piprinciple-redesign-from-first-principles-piprinciple-separate-before-serializing-shared-state-piprinciple-sequence-verifiable-units-piprinciple-subtract-before-you-add-piprinciple-test-behavior-not-implementation-piprinciple-type-system-discipline-pirecall-pireflect-pisetup-pstack-pisharpen-pishow-me-your-work-piswarm-pitdd-piteach-pitechnical-writing-pitypescript-best-practices-piunslop-piwhy-pi
Keeping up with upstream
node scripts/sync-upstream.mjs <path-to-upstream-pstack> compares the port with
a local copy of upstream and lists missing or extra skills and the upstream
version. It only reads. I port upstream changes by hand and review each one.
Tests
npm test checks that every upstream skill is present, that frontmatter is
valid, that no model names or personal paths ship, and what npm pack would
publish.
How I use it
My preferred setup is open source and on-device: Pi, with Herdr panes for parallel work, and OpenMausBot for automated work in very much the same way you use Grok Bot. Much of pstack's power comes from running it inside a full bot like Grok Bot, with background workers, routines and memory around it. This port covers what Cursor can't for me: local models and a free choice of providers, set through the two model roles along with custom seams to other tools I run in my scientific and software development work.
Licence
MIT; see LICENSE. The upstream skills are by Lauren Tan, MIT; see NOTICE.
