dsh-superpowers
Verified@dennisrongo/dsh-superpowers Β· v0.4.0 Β· MIT
Superpowers for dsh: injects the using-superpowers bootstrap as a persistent system-prompt section (session start + compaction-safe) and serves the Superpowers skills to the skill catalog, bundled so a machine with no clone still gets them
Install
dsh plugin add @dennisrongo/dsh-superpowers Confirm the layer applied with dsh --profile default --dump-config β see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
dsh-superpowers
npm: @dennisrongo/dsh-superpowers Β·
source: dennisrongo/dsh-plugins
Mind the scope. The unscoped
dsh-superpowerson npm is an unrelated plugin by another author, soadd dsh-superpowersfetches theirs, not this one.
Injects the Superpowers methodology bootstrap
(skills/using-superpowers/SKILL.md) into every dsh agent's system prompt as an ordered,
persistent section β and serves the 14 Superpowers skills to dsh's skill catalog, so
they work on a machine that has never cloned anything.
Upstream harnesses deliver the bootstrap via a SessionStart hook that must re-fire on
startup|clear|compact. dsh has no hook shell, but its system prompt is a layered, ordered
section registry that is reassembled after compaction β so a single registered section
covers all three upstream trigger points for the life of the session, with no gap between
session start and the first compaction.
Both halves are independent: neither a missing clone nor a profile without a skills service can take the other down, and neither stops dsh booting.
Where the skills come from
The plugin serves whichever it finds first β your clone if you have one, otherwise a pinned snapshot bundled with the package:
superpowersRoot config β SUPERPOWERS_ROOT β probe of ~/β¦ β bundled vendor/ snapshot
A real clone always wins, so git pull keeps working exactly as before. The snapshot is
only the floor that makes a fresh install work β without it, a machine with no clone gets a
silently empty catalog, since dsh reports a missing skills root as an empty list rather than
an error.
The bootstrap prose is vendored only in that snapshot
(obra/superpowers@b36e082, MIT Β© 2025 Jesse Vincent β see vendor/PROVENANCE). When the
plugin resolves your clone instead, nothing from upstream is vendored at all.
Already using
link-superpowers-skills.mjs? SetskillProvider: false, or the same 14 skills are listed twice β once by the junctions, once by this provider.
Updating the plugin
dsh plugin --profile <name> outdated
dsh plugin --profile <name> update @dennisrongo/dsh-superpowers
dsh plugin forwards to pnpm. This plugin is host-only, so a profile restart is required
β the section is read in apply(), and a browser refresh will not pick it up.
That updates the adapter. The methodology itself lives in your Superpowers clone and updates separately:
Updating from upstream
cd <your superpowers clone> && git pull
Two halves, and they are updated differently:
| Half | How it is consumed | After a pull |
|---|---|---|
| The bootstrap prompt section | read from <root>/skills/using-superpowers/SKILL.md at profile start |
restart the profile (read happens in apply(), not per session) |
| The skills catalog | discovered by dsh from <agentsHome>/skills |
nothing, if those entries are links β see below |
Link the clone's skills in once, and a pull updates them in place:
node scripts/link-superpowers-skills.mjs # from the repo root
node scripts/link-superpowers-skills.mjs --dry-run # preview
node scripts/link-superpowers-skills.mjs --restore # undo, restoring saved copies
Junctions on Windows, directory symlinks on macOS/Linux. Real directories already in place
are moved to <agentsHome>/skills-backup-superpowers before being replaced, so it is
reversible. Re-run it after a pull that adds a new upstream skill.
Locating the clone
Resolution order, first hit wins:
superpowersRootin the profile'scordis.patch.yml- the
SUPERPOWERS_ROOTenvironment variable - a probe of common clone locations under your home directory β
~/superpowers,~/src,~/code,~/dev,~/git,~/repos,~/Projects,~/Documents,~/Documents/GitHub, all derived fromhomedir()so they work on any platform - the bundled
vendor/snapshot, which is always present
Because step 4 always succeeds, you get the bootstrap and the skills with no
configuration at all. Set superpowersRoot when you want your own clone to be authoritative
β it takes precedence, and then git pull (plus a profile restart) is the whole update
path. The probe list is only a guess about where you keep clones.
The old "no superpowers clone found" warning is now reachable only when a root you configured explicitly is wrong.
Install (profile-level)
# <profile>/cordis.patch.yml β add one row
- id: superpowers
name: '@dennisrongo/dsh-superpowers'
config:
superpowersRoot: /absolute/path/to/superpowers
with pnpm add "file:/absolute/path/to/dsh-plugins/plugins/dsh-superpowers" in the profile,
or straight from GitHub:
dsh plugin --profile <name> add "github:dennisrongo/dsh-plugins#path:/plugins/dsh-superpowers"
The folder is plugins/dsh-superpowers but the package is @dennisrongo/dsh-superpowers, so
it installs under the scope. Mind the difference: the unscoped dsh-superpowers on npm is
an unrelated plugin by another author, so add dsh-superpowers fetches theirs, not this one.
Config
| key | default | meaning |
|---|---|---|
superpowersRoot |
"" β resolved (see above) |
repo root containing skills/using-superpowers/SKILL.md |
order |
-50 |
prompt section order (persona is 0; we sit before it) |
enabled |
true |
master switch; false silences every section and the skill provider |
askWithOptions |
true |
register the "offer choices as choices" section (below) |
askWithOptionsOrder |
-45 |
order for that section |
skillProvider |
true |
serve the skills to dsh's catalog; set false if you deliver them another way |
Also: "offer choices as choices"
A second, independent prompt section β hand-written here, nothing to do with the Superpowers clone, and registered whether or not that clone exists.
dsh can already render a real picker. ask_user_question accepts options[]
with a label and a one-line description, plus multi_select, and the shipped
question UI turns that into a radiogroup or a checkbox group. What it cannot do
is turn prose into controls: a structured surface exists only for an actual tool
call, and a tool call can only happen during a turn. So an answer that ends
"A or B?" in markdown stays markdown forever, and you pay for it by typing a
reply that the model then has to guess the meaning of.
This section asks the model to reach for the tool in exactly that moment β with
a recommended option first, and multi_select when more than one can apply. It
deliberately stands down in plan mode, where dsh's own rules make
exit_plan_mode the single interaction and say so in terms that override later
guidance.
Set askWithOptions: false to drop it without touching the bootstrap.
Tests
pnpm test # offline, no harness, no clone needed
Every failure mode in this plugin is silent by design β a missing clone, a bad root,
enabled: false, an absent skills service and a malformed skill bundle all register nothing
and let dsh boot normally. So a regression breaks nothing visibly; the bootstrap and the
catalog just stop reaching the model.
35 checks pin section identity and order, frontmatter stripping, the resolution precedence
(config > env > probe > vendored snapshot), the non-fatal warning path, the skill-provider
contract, and that registration goes through ctx.effect.
test/sabotage.mjs then breaks lib/index.js 16 different ways and requires the suite to go
red each time β a check that has never failed is decoration. Two checks escaped the first
run and were rewritten; see AGENTS.md.
Notes
- The bootstrap body has its YAML frontmatter stripped β the model needs the behavioural
mandate, not the trigger metadata. If upstream restructures
SKILL.md, that regex inlib/index.jsis the thing to check; failure is non-fatal and logs[dsh-superpowers] cannot read β¦, so watch profile stderr after a pull. @deepseek-ai/schemasteryand@deepseek-ai/cordisare peers, supplied by your dsh install. When this package is junctioned into a profile it resolves them through its ownnode_modules/@deepseek-ai/*β runscripts/dev-link.ps1to create those, or the harness fails to load the plugin withERR_MODULE_NOT_FOUND.
About the author
Plugins and walkthroughs on YouTube @codingmenace β I build AI coding tools in public, including DeepSeek Harness itself. More at dennisrongo.com.