skill
opencode-pstack
pstack for OpenCode v2: native port of cursor/plugins pstack (56 skills, 23 agents, 56 commands), with verification gates
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/bitgineer/opencode-pstack itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 26, 2026pstack for OpenCode v2
pstack is an engineering style for agents: playbooks for the work, principles that settle
tradeoffs, and verification against the real artifact. This repository is a native OpenCode v2
port of cursor/plugins pstack (v0.15.29,
upstream 190d287). It is expressed in OpenCode's own primitives: skills, agents, commands, and
config. There is no OpenCode fork, no vendored runtime, and no plugin shim; the files are the
port.
What you get
- 56 skills under
skills/pstack/<name>/SKILL.md, with their playbooks, references, and scripts. - 23 subagents under
agents/pstack/<role>.md, every onemode: subagentwith its ownmodel:line. - 56 commands, one per skill, under
commands/pstack/<name>.md, typed as/pstack/<name>. pstack-docs/, the installed guide and the OpenCode adapter.
Install
git clone https://github.com/bitgineer/opencode-pstack opencode-pstack
cd opencode-pstack
node scripts/install.mjs --dry-run # print the plan, write nothing
node scripts/install.mjs # -> ~/.config/opencode
node scripts/install.mjs --project # -> ./.opencode in the current directory
node scripts/install.mjs --check # exit 0 only if the install matches this tree
Add --dest <dir> to target an explicit config directory. Add --project or --dest to
--check as well, so the check reads the same destination the install wrote.
Installing through an agent? docs/AGENT-INSTALL.md is the same
procedure written as a runbook: preconditions, the destination decision, the exact output each
step should print, and the failure table. It also covers the two traps in this install — a v1
binary shadowing v2 on PATH, and running verify-port.mjs without the destination flag, which
makes it inspect a directory with no install and still exit 0.
The installer owns four paths and replaces each whole: skills/pstack, agents/pstack,
commands/pstack, and pstack-docs. Nothing else in the config directory is touched, and
nothing this port does not own is removed. A re-run after an update converges, so a skill
deleted upstream does not survive in the installed copy.
If the OpenCode server was already running, restart it so the new skills, agents, and commands are registered:
opencode service restart
Use
/pstack/setup-pstack # optional: pick a model for each role
/pstack/poteto-mode # start work that needs rigor
/pstack/poteto-help # which skill fits this request
/pstack/<name> # any skill directly, e.g. /pstack/unslop
A skill's ID is its directory name, so skills/pstack/unslop/ is the skill unslop. The model
loads a skill with the skill tool by that bare ID; there is no @ prefix. Slash commands are
the path you type, and each one loads its skill and passes the rest of the line through.
poteto-mode sets disable-model-invocation: true, so it never appears in the model's skill
list and starts only when you type /pstack/poteto-mode. Every other skill is advertised by ID,
which is what lets the model choose unslop, how, why, tdd, or a principle-* skill on
its own. The gate fails if any other skill hides.
How it maps to OpenCode
| Piece | Location | ID or invocation |
|---|---|---|
| Skill | ~/.config/opencode/skills/pstack/<name>/SKILL.md, or .opencode/skills/pstack/<name>/ | directory name, e.g. unslop |
| Agent | ~/.config/opencode/agents/pstack/<role>.md, or .opencode/agents/pstack/<role>.md | path under agents/, e.g. pstack/code |
| Command | ~/.config/opencode/commands/pstack/<name>.md | /pstack/<name> |
| Model | the model: line in each agent file | one model per role; no line inherits the parent session |
| Docs | ~/.config/opencode/pstack-docs/, or .opencode/pstack-docs/ | guide/, harness/opencode.md |
What is different from Cursor pstack
- Role models are agent files, not a rules file.
~/.cursor/rules/pstack-models.mdcbecomes themodel:line of eachagents/pstack/<role>.md, written by/pstack/setup-pstackfromopencode models. The agent is the unit of model choice, so the old reasoning-level guidance ("raise the effort a step, drop-fast") has no target and is gone. - No todo tool. OpenCode v2 has none, so the plan lives at the top of the reply and is updated as each step lands.
- Cursor-only features skip with a substitute. Automations, Bugbot-as-a-service, cloud
agents, Custom Modes,
/loop, andcursor-team-kitdo not exist here. A step that needs one writesSkipped in OpenCode: <step>. <reason>.and continues. Review threads become ordinary GitHub review threads, and cloud agents become worktrees. opencode rundoes not expand slash commands. The TUI sendsPOST /api/session/<id>/command, and the server writes the command's expanded text into the prompt.opencode run "/pstack/bro ..."passes the string through as ordinary text, so use it for prose prompts and the TUI or the command endpoint for/pstack/<name>.
The full mapping, including every tool name and skip line, is pstack-docs/harness/opencode.md
in the installed copy.
Verification
node scripts/verify-port.mjs is the static gate. It checks, and exits non-zero on any failure:
| Check | What it proves |
|---|---|
skill | every skill has frontmatter, its ID matches its directory, it has a description |
discovery | only poteto-mode hides from the model; 55 skills are advertised |
description | no advertised description exceeds 300 characters |
command | 56 commands, each loading a skill that exists |
roles | the role table in setup-pstack/references/roles.md names only agents that exist |
agent | 23 agents, all mode: subagent, all with descriptions |
cursor-name | no Cursor paths, tool names, model slugs, or stale pstack- prefixes in prose |
link | every relative markdown link resolves |
install | the installed copy has all 56 skills, 23 agents, 56 commands |
collision | no other installed skill claims a pstack skill ID |
Both gates are reproducible from a clean clone:
node scripts/install.mjs --dest /tmp/oc
node scripts/verify-port.mjs --dest /tmp/oc # 10 checks passed, 0 failed
node scripts/install.mjs --check --dest /tmp/oc # check: install matches the port
docs/AGENT-INSTALL.md is the same procedure as a runbook: preconditions, the destination
decision, the exact output each gate prints, the live smoke checks (debug agents, a skill load
by bare ID, and /pstack/<name> through the command endpoint), the failure table, and a report
template. Every claim on this page can be reproduced with a v2 opencode binary and the commands
above.
Re-porting
Upstream changes are re-ported and the artifacts regenerated with the pipeline in the private
opencode-pstack-maintainers repository. This repository ships only the ported result.
Provenance
Upstream pstack is by Lauren Tan (poteto), MIT licensed, at cursor/plugins/pstack, tag
v0.15.29, commit 190d287. This port keeps the MIT license and keeps the original skill text
wherever OpenCode has an equivalent; the edits are names, locations, and the passages that
describe Cursor-only mechanisms. pstack-docs/ is the upstream guide, adapted to the OpenCode
adapter in pstack-docs/harness/opencode.md.
License
MIT. See LICENSE. Copyright (c) 2026 Lauren Tan.