Skip to content

feat: add DeepSeek Harness (dsh) support - #2144

Open
codeAnqiang-ma wants to merge 3 commits into
obra:devfrom
codeAnqiang-ma:feat/dsh-harness-support
Open

feat: add DeepSeek Harness (dsh) support#2144
codeAnqiang-ma wants to merge 3 commits into
obra:devfrom
codeAnqiang-ma:feat/dsh-harness-support

Conversation

@codeAnqiang-ma

@codeAnqiang-ma codeAnqiang-ma commented Aug 13, 2026

Copy link
Copy Markdown

Who is submitting this PR? (required)

Field Value
Your model + version Claude Opus 5 (extended thinking) wrote the diff; the acceptance session ran on deepseek-v4-flash
Harness + version Cursor 3.15.19 (macOS 26.5.2) for authoring; DeepSeek Harness dsh 0.1.0-rc.6 for every dsh claim below
All plugins installed dsh acceptance profile: @deepseek-ai/dsh-base, @deepseek-ai/dsh-headless, and superpowers (this branch) — nothing else. Authoring environment: Cursor's stock toolset plus local MCP servers, none of which touch this repo.
Human partner who reviewed this diff Anqiang Ma (@codeAnqiang-ma)

This adaptation was prepared with AI assistance; I verified the installation, the acceptance run, and every claim below locally on macOS.

What problem are you trying to solve?

I use DeepSeek Harness (dsh) daily. The README does not cover it. The expected install command exits 0, but installs the repo as a plain dependency instead of a profile layer:

$ dsh plugin --profile spdshbase add github:obra/superpowers
dependencies:
+ superpowers github:obra/superpowers
dsh: warning: superpowers declares no dsh.bundle — installed as a plain dependency, not a profile layer (a later update that gains one activates it automatically)

dsh already has a skill registry and a native skill tool. Without skill registration and the using-superpowers bootstrap, a dsh session does not know Superpowers is installed. Against unmodified dev, the acceptance prompt scaffolded and built a Vite app without asking a question. The baseline transcript is under Evaluation.

What does this PR change?

This PR adds a dsh plugin (.dsh/plugins/superpowers.js), the bundle patch and root-package.json field required for dsh plugin add to recognize this repo as a profile layer, install docs, and tests. The plugin registers this repo's skills/ through ctx.skills.register() and adds the using-superpowers bootstrap as an order-50 system-prompt section.

Is this change appropriate for the core library?

Yes. The contributor rules allow new harness support. This implementation uses only Node builtins, adds zero runtime dependencies, and writes nothing outside the installed profile. It does not modify skills/: no skill body, references/ file, or Platform Adaptation entry changes. dsh exposes a native tool for every action named by the skills, so I tested whether correct operation required a dsh-tools.md. It does not, and the acceptance run passes without one. This matches #1847 and the resolution of #1995.

What alternatives did you consider?

  • Inject the bootstrap as a user message, as prescribed by Shape B. dsh's equivalent is ctx.systemPrompt.context(), a durable user-role snapshot. I chose .section() for the reasons below and can switch if requested.
  • Keep the separate package. I published a standalone adapter (dsh-superpowers on npm) before writing this. It is not the install path here because routing dsh users through my repo would keep them from receiving your updates. This PR installs from obra/superpowers and nothing else. I will archive the standalone package if this lands.
  • Reuse an existing manifest. dsh reads dsh.bundle only from the installed package.json, so it cannot discover any existing manifest in the repo.
  • Add a build step. dsh loads the .js as-is, so no transpilation or dev dependency is required.

The one deliberate deviation from the guide

docs/porting-to-a-new-harness.md Part 5 says Shape B injects the bootstrap as a user message. It cites #750 (tokens grow when a system message repeats every turn) and #894 (multiple system messages break some models). I use a system-prompt section for dsh because:

  • dsh renders every registered section into one system message. The Opencode: multiple system messages in request break compatibility with qwen3.5 models #894 failure mode therefore does not apply.
  • A static section stays in the stable request prefix and is KV-cached. It is not appended to history each turn, which is the growth Superpowers consume a lot of tokens in Opencode with Codex #750 describes.
  • dsh reassembles the system prompt before every model step. The bootstrap survives compaction without a dedup guard, an injectBootstrap flag, or re-injection after compaction.
  • dsh's user-role path (ctx.systemPrompt.context()) is for dynamic runtime context. The includeRuntimeContext config gates it, and any plugin can switch it off with suppressRuntimeContext(). A bootstrap required in every session should not depend on that switch.

This differs from an explicit instruction in the guide. If maintainers prefer context(), I will move it and add the required deduplication and post-compaction handling.

Does this PR contain multiple unrelated changes?

No. The change covers one harness. Every touched file is required by the porting guide: entry point, manifest field, install docs, README, the Codex sync exclude for the new dotdir (Part 6), and tests.

Existing PRs

Environment tested

Harness (e.g. Claude Code, Cursor) Harness version Model Model version/ID
DeepSeek Harness (dsh) 0.1.0-rc.6 DeepSeek V4 Flash deepseek-v4-flash (provider opencode-go)

I tested only macOS 26.5.2 (arm64) and the model listed above. dsh is a developer preview, so every version is pinned. I have not tested Linux or Windows, and dsh's plugin surface may still move.

New harness support (required if this PR adds a new harness)

I installed this PR's branch with dsh's own command into a fresh profile (spdshacc). The working directory was empty. DSH_AGENTS_HOME pointed at an empty directory, so the catalog contained only the 14 bundled skills and nothing personal.

$ dsh plugin --profile spdshacc add github:codeAnqiang-ma/superpowers#feat/dsh-harness-support
dependencies:
+ superpowers github:codeAnqiang-ma/superpowers#feat/dsh-harness-support

$ dsh --profile spdshacc --dump-config | grep -A1 'id: superpowers'
- id: superpowers
  name: superpowers/.dsh/plugins/superpowers.js

dsh plugin added the layer by itself, off the dsh.bundle declaration in the installed manifest.

Result: PASS. The first action of the session was skill("brainstorming") — before any exploration, any shell command, and any file write. The directory was still empty when the turn ended.

Smoke check — "What are your superpowers?"
$ DSH_AGENTS_HOME=/tmp/dsh-clean-agents dsh --profile spdshacc "What are your superpowers?"

**Superpowers** are a collection of skills I carry into any task — reusable, task-specific
playbooks I invoke before acting. Here's what's available to me right now:

### Process skills (how I approach work)
- **Brainstorming** — exploring your intent, requirements, and design *before* building anything creative
- **Writing plans** — turning a spec into a step-by-step implementation plan before touching code
- **Executing plans** — carrying out a written plan with review checkpoints along the way
- **Using git worktrees** — keeping feature work isolated from your main workspace
- **Finishing a development branch** — deciding how to integrate completed work
- **Dispatching parallel agents** — fanning out 2+ independent tasks without sequential dependencies
- **Subagent-driven development** — executing implementation plans with independent tasks in-session

### Quality & engineering practices
- **Test-driven development** — writing tests before implementation code
- **Systematic debugging** — a disciplined method for bugs, test failures, and unexpected behavior
- **Requesting code review** — verifying work meets requirements before merging
- **Receiving code review** — rigorously evaluating feedback rather than blindly agreeing
- **Verification before completion** — proving work is done with real command output, never assertions

### Meta
- **Using superpowers** — the "master" skill that governs when/how I find and apply the others
  (I've loaded this already)

---

**The rule:** if a task names a skill or clearly matches one's description, I invoke it *before*
responding or acting — even for simple questions or before exploring the codebase. For example,
"Let's build X" → brainstorming first; "Fix this bug" → systematic-debugging first.
Clean-session transcript for "Let's make a react todo list"
$ ls -la /tmp/superpowers-dsh-react-todo
total 0
drwxr-xr-x@   2 anchor  wheel     64 Aug 14 00:31 .
drwxrwxrwt  837 root    wheel  26784 Aug 14 00:31 ..

$ cd /tmp/superpowers-dsh-react-todo
$ DSH_AGENTS_HOME=/tmp/dsh-clean-agents dsh --profile spdshacc "Let's make a react todo list"

--- SYSTEM PROMPT ACTUALLY SENT (verbatim, from the session log's request/header) ---

This is the recorded request, not an assertion about it. The plugin's section is
the <EXTREMELY_IMPORTANT> block, contributed at order 50 — after dsh's persona
(order 0), before its tool guidance (100-199). Truncated after the block; what
follows is dsh's own stock tool guidance.

You are an AI agent powered by DeepSeek Harness.

You are a coding agent powered by the deepseek-v4-flash model. Your working directory is /private/tmp/superpowers-dsh-react-todo.

<EXTREMELY_IMPORTANT>
You have superpowers.

The using-superpowers skill content is included below and is already loaded for this session. Follow it now. Do not load using-superpowers again with the skill tool.

<SUBAGENT-STOP>
If you were dispatched as a subagent to execute a specific task, ignore this skill.
</SUBAGENT-STOP>

<EXTREMELY-IMPORTANT>
If you think there is even a 1% chance a skill might apply to what you are doing, you ABSOLUTELY MUST invoke the skill.

IF A SKILL APPLIES TO YOUR TASK, YOU DO NOT HAVE A CHOICE. YOU MUST USE IT.

This is not negotiable. You cannot rationalize your way out of this.
</EXTREMELY-IMPORTANT>

## The Rule

**Invoke relevant or requested skills BEFORE any response or action** — including clarifying questions, exploring the codebase, or checking files. If it turns out wrong for the situation, you don't have to use it.

**Before entering plan mode:** if you haven't already brainstormed, invoke the brainstorming skill first.

Then announce "Using [skill] to [purpose]" and follow the skill exactly. If it has a checklist, create a todo per item.

## Skill Priority

When multiple skills apply, process skills come first — they set the approach, then implementation skills (frontend-design, etc.) carry it out. Brainstorming and systematic-debugging are Superpowers' most common process skills, but the rule holds for any of them.

- "Let's build X" → superpowers:brainstorming first, then implementation skills.
- "Fix this bug" → superpowers:systematic-debugging first, then domain skills.

## Red Flags

These thoughts mean STOP—you're rationalizing:

| Thought | Reality |
|---------|---------|
| "This is just a simple question" | Questions are tasks. Check for skills. |
| "I need more context first" | Skill check comes BEFORE clarifying questions. |
| "Let me explore the codebase first" | Skills tell you HOW to explore. Check first. |
| "I can check git/files quickly" | Files lack conversation context. Check for skills. |
| "Let me gather information first" | Skills tell you HOW to gather information. |
| "This doesn't need a formal skill" | If a skill exists, use it. |
| "I remember this skill" | Skills evolve. Read current version. |
| "This doesn't count as a task" | Action = task. Check for skills. |
| "The skill is overkill" | Simple things become complex. Use it. |
| "I'll just do this one thing first" | Check BEFORE doing anything. |
| "This feels productive" | Undisciplined action wastes time. Skills prevent this. |
| "I know what that means" | Knowing the concept ≠ using the skill. Invoke it. |

## Platform Adaptation

If your harness appears here, read its reference file for special instructions:

- Codex: `references/codex-tools.md`
- Pi: `references/pi-tools.md`
- Antigravity: `references/antigravity-tools.md`
- Hermes Agent: `references/hermes-tools.md`

## User Instructions

User instructions (CLAUDE.md, AGENTS.md, GEMINI.md, etc, direct requests) take precedence over skills, which in turn override default behavior. Only skip skill workflows or instructions when your human partner has explicitly told you to.
</EXTREMELY_IMPORTANT>

[dsh's own tool guidance follows, unchanged]

--- TOOLS OFFERED IN THAT REQUEST ---

bash, create_goal, edit, exit_plan_mode, get_goal, glob, grep, interrupt_agent,
job_kill, job_list, job_output, list_agents, ralph, read, read_image, send_message,
skill, str_replace_editor, subagent, subagent_fork, todo_write, update_goal,
web_search, workflow, write

--- SKILL CATALOG IN THAT SESSION (user-role <system-reminder> from dsh's skill registry) ---

<system-reminder>
A skill is a reusable set of task-specific instructions. The following skills are available in this session:

<available_skills>
- `brainstorming`: You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.
- `dispatching-parallel-agents`: Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
- `executing-plans`: Use when you have a written implementation plan to execute in a separate session with review checkpoints
- `finishing-a-development-branch`: Use when implementation is complete, all tests pass, and you need to decide how to integrate the work
- `receiving-code-review`: Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires technical rigor and verification, not performative agreement or blind implementation
- `requesting-code-review`: Use when completing tasks, implementing major features, or before merging to verify work meets requirements
- `subagent-driven-development`: Use when executing implementation plans with independent tasks in the current session
- `systematic-debugging`: Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
- `test-driven-development`: Use when implementing any feature or bugfix, before writing implementation code
- `using-git-worktrees`: Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback
- `using-superpowers`: Use when starting any conversation - establishes how to find and use skills, requiring skill invocation before ANY response including clarifying questions
- `verification-before-completion`: Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always
- `writing-plans`: Use when you have a spec or requirements for a multi-step task, before touching code
- `writing-skills`: Use when creating new skills, editing existing skills, or verifying skills work before deployment
</available_skills>
</system-reminder>

--- CONVERSATION ---

USER:

Let's make a react todo list


ASSISTANT (turn 1, step 1):

I'll start by using the brainstorming skill, since you want to build a new feature.
Let me load it first.


TOOL CALL (turn 1, step 1) — the first action of the session:

skill {"name":"brainstorming"}


TOOL RESULT (turn 1, step 1) — 15502 characters, the full brainstorming skill body:

<skill_content name="brainstorming">
<skill_resources>
Base directory for this skill: /Users/anchor/.dsh/profiles/spdshacc/node_modules/superpowers/skills/brainstorming
Resolve relative paths mentioned in the skill against this base directory.
</skill_resources>
… (truncated; the full body is skills/brainstorming/SKILL.md)


ASSISTANT (turn 1, step 2):

This is a new project with no existing code to change, so this is an
**architectural** task. Let me first explore the current state of the directory.


TOOL CALL (turn 1, step 2):

bash {"command":"ls -la /private/tmp/superpowers-dsh-react-todo && echo \"---\" && git -C /private/tmp/superpowers-dsh-react-todo log --oneline -5 2>/dev/null || echo \"no git history\"","description":"List directory and check git history"}


TOOL RESULT (turn 1, step 2):

total 0
drwxr-xr-x@   2 anchor  wheel     64 Aug 14 00:31 .
drwxrwxrwt  837 root    wheel  26784 Aug 14 00:31 ..
---
no git history


ASSISTANT (turn 1, step 3, final):

The directory is empty — a fresh start. This is an **architectural** task (new
project, no existing flow to change).

Rather than plunging into a heavy formal spec for a greenfield todo list, let me
ask a few clarifying questions to understand what you have in mind. This looks
like a fun project, so I want to get the scope right before designing.

Let me start with the most important question first.

**What kind of todo list do you have in mind?** A few options:

1. **Minimal classic** — just add, toggle complete, delete. Clean, single-file
   React component, no persistence. Fast to build.
2. **Feature-rich** — add/delete/edit, mark complete, filter (all/active/completed),
   clear completed, and counter. LocalStorage persistence so items survive refresh.
3. **Something else entirely** — tags, due dates, priorities, drag-and-drop, a
   backend, user accounts, etc.

Which direction appeals to you? My default recommendation would be option 2 —
it's the classic TodoMVC-style scope that's a great demo of React fundamentals
without ballooning.

The session ends there: dsh's headless surface answers one task and exits, and brainstorming's next move is a question for the human partner.

$ ls -laR /tmp/superpowers-dsh-react-todo
total 0
drwxr-xr-x@   2 anchor  wheel     64 Aug 14 00:31 .
drwxrwxrwt  837 root    wheel  26784 Aug 14 00:31 ..

Evaluation

  • Initial prompt that led to this change: none. The work started after an install exited 0 without activating Superpowers; it did not start from an agent session. See the before/after below.
  • Sessions run after the change: 4. I ran the exact prompt twice: once against the working tree linked into a profile and once against the pushed branch installed with dsh plugin add github:…. The latter run is transcribed above. I also ran two smoke checks. All four loaded the bootstrap; both acceptance runs called skill("brainstorming") as the session's first action and wrote nothing.
  • Before vs. after: I ran the same prompt on today's dev for the baseline. The profile shape, model, prompt, and empty directory matched the passing run; the only difference was this PR. Baseline: 27 tool calls, 0 of them skill, 8 writes, and a built Vite app before any question reached me. With the plugin: skill("brainstorming") first, 1 read-only ls, 0 files. A later repeat of both runs gave 17 calls / 9 writes for the baseline and 3 calls / 0 writes with the plugin — the counts move between runs, and on that repeat the baseline did ask a question, but only after it had finished building. What is stable across runs is the ordering: without the plugin the first action is bash, with it the first action is skill("brainstorming").
Baseline on unmodified dev
$ dsh plugin --profile spdshbase add github:obra/superpowers
dependencies:
+ superpowers github:obra/superpowers
dsh: warning: superpowers declares no dsh.bundle — installed as a plain dependency, not a profile layer (a later update that gains one activates it automatically)

The profile manifest confirms it never became a layer:

"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-headless"] } }
$ cd /tmp/superpowers-dsh-baseline    # empty
$ DSH_AGENTS_HOME=/tmp/dsh-clean-agents dsh --profile spdshbase "Let's make a react todo list"

$ ls /tmp/superpowers-dsh-baseline
dist  index.html  node_modules  package-lock.json  package.json  src  vite.config.js

From that session's log: system prompt 4029 chars with no EXTREMELY_IMPORTANT block (7162 chars with it, in the passing run), and the tool sequence was

bash, bash, todo_write, bash, bash, bash, bash, bash, write ×8, bash, todo_write,
bash ×5, job_output, job_kill, bash, todo_write
  • A caveat the runs taught me: with a user's own ~/.agents/skills present, the session catalog is dominated by personal skills and the smoke answer gets vague. The bootstrap still loads and brainstorming still triggers, but I isolated DSH_AGENTS_HOME for the transcript so the evidence is about this PR and not about my machine.
  • Automated tests: bash tests/dsh/run-tests.sh — 10 unit tests against a faked Cordis context (registration, bootstrap section name/order/content, no cross-apply state, malformed-skill skipping, missing bootstrap, missing skills dir) plus an install check that packs the repo and asserts the packed tree alone satisfies the bundle declaration with no runtime dependencies. tests/pi/, tests/codex-plugin-sync/, and scripts/lint-shell.sh still pass.

Rigor

  • If this is a skills change: I used superpowers:writing-skills and completed adversarial pressure testing (paste results below) — N/A: this PR does not touch skills/ at all.
  • This change was tested adversarially, not just on the happy path — the unit tests cover a missing skills/ directory, a missing using-superpowers, skills with no frontmatter / no description / an empty body, and repeated apply(); the install test proves the packed tree, not the working tree.
  • I did not modify carefully-tuned content (Red Flags table, rationalizations, "human partner" language) without extensive evals showing the change is an improvement — no skill content was modified.

Human review

  • A human has reviewed the COMPLETE proposed diff before submission

DeepSeek Harness ships a skill registry and a native `skill` tool, but
`dsh plugin add github:obra/superpowers` failed with "declares no
dsh.bundle": the repo had no profile-layer declaration, so nothing
registered the skills and nothing injected the `using-superpowers`
bootstrap. Skills that a session never hears about never trigger.

The plugin is a Cordis module that injects `skills` and `systemPrompt`:
it registers this repo's own `skills/` through `ctx.skills.register()`
and contributes the bootstrap as an order-50 system-prompt section. dsh
reassembles the system prompt before every model step, so the bootstrap
loads on the first request and survives compaction with no dedup guard
and no per-session opt-in.

Node builtins only — a plugin resolved from a profile cannot see the
`@deepseek-ai/*` packages nested in the dsh installation, so both
registries are reached through the injected context alone.

No skill bodies change: dsh exposes a native tool for every action the
skills name, so the port needs no tool mapping.

@arittr arittr left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for doing this properly — the dsh plugin install path is exactly what was asked for when #1586 closed, and the before/after eval + install-pack test are the strongest parts. Two observations, one substantive and one minor.

1. The "no tool mapping needed" claim only covers the brainstorming path

The PR argues a dsh-tools.md reference is unnecessary because "dsh exposes a native tool for every action named by the skills." That's true for the actions your acceptance transcript exercises, but not for subagent dispatch, which the porting guide's tool-mapping step specifically calls out ("dispatch a subagent, including how to pass the agent type").

dispatching-parallel-agents, subagent-driven-development, and the code-review skills name specific subagent types (Explore, Plan, reviewer archetypes, etc.). dsh's subagent/subagent_fork tools have no subagent-type parameter — the role and instructions must be written into the prompt itself, and a plain subagent sees none of the parent conversation, so skills that expect a typed dispatch need that translation spelled out somewhere. Nothing in the injected bootstrap or the skill bodies provides it, and no run in the PR (or that I've seen) exercises any typed-subagent skill on dsh.

Suggest adding either a short mapping block appended inside the injected section, or a skills/using-superpowers/references/dsh-tools.md linked from the Platform Adaptation list (pi maintains both places; either alone satisfies the guide). It only needs to cover the deltas: subagent dispatch (no named types → prompt preamble; subagent_fork for inheriting context), todo_write whole-list replacement, plan mode via exit_plan_mode, and that dsh's skill catalog renders plain names (brainstorming), never the superpowers:-prefixed forms used in skill prose. It's not load-bearing for brainstorming — your transcript proves that — but it is the difference between "the process skills work" and "every skill works," and the guide's definition of done asks for it.

2. Minor: the precedence sentence in docs/README.dsh.md is surface-dependent as written

Superpowers skills are registered as bundled, so a skill of the same name in any of those roots wins.

Two inaccuracies, checked against dsh's skill registry source (rc.6):

  • ctx.skills.register() registers runtime entries (rank 250), not bundled entries (rank 600) — source: 'bundled' is display metadata and doesn't change the rank.
  • Within one registry layer, lower rank wins: project roots (100/200) > runtime (250) > user roots (400/500) > bundled (600). In the presetless headless profile (the one you tested), the filesystem provider and this plugin share the global layer, so a project skill of the same name wins over Superpowers but a user-root skill loses. In preset-based profiles the layering changes it again (preset-layer entries win a duplicate outright). So "any of those roots wins" is wrong for at least one supported surface; worth a one-line correction (or just deleting the sentence).

Neither point blocks the approach — the mechanism is right and the acceptance run is real. Happy to follow up with a concrete mapping-file draft if useful.

arittr added 2 commits August 13, 2026 13:33
dsh has no named subagent types, so skills that dispatch typed subagents
need the translation spelled out. Inline the dsh deltas in the bootstrap
section and ship the full mapping as references/dsh-tools.md, linked from
the Platform Adaptation list. Tests assert both copies stay in sync.
Skills registered via ctx.skills.register() are runtime entries (rank 250),
not bundled entries (600), and precedence over local roots depends on the
profile shape rather than 'any of those roots wins'.
@arittr

arittr commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Pushed two follow-up commits to this branch (maintainer edits) covering the mapping gap and the precedence note:

835a845 — feat(dsh): add tool mapping for typed subagents, todos, and plan mode

  • .dsh/plugins/superpowers.js: the bootstrap section now inlines the dsh-specific deltas the skills cannot name themselves — prompt-only subagents (no named types → role goes in the prompt), todo_write whole-list replacement, plan mode via exit_plan_mode, and plain catalog skill names (never the superpowers:-prefixed forms).
  • skills/using-superpowers/references/dsh-tools.md: the full mapping (new file).
  • skills/using-superpowers/SKILL.md: one pointer line added to Platform Adaptation (the single SKILL.md edit a port may make).
  • tests/dsh/test-dsh-plugin.mjs: assertions that the inline mapping travels with the bootstrap and that the reference file and inline copy agree on the subagent delta, so the two places can't drift apart.

e53b7ab — docs(dsh): correct skill precedence note

ctx.skills.register() registers runtime entries (rank 250), not bundled entries (600), so "a skill of the same name in any of those roots wins" was wrong for user roots in a presetless profile. Reworded to describe the actual rank/layer behavior.

Full suite still green: tests/dsh/run-tests.sh — 11 unit tests + the install-pack check. Happy to adjust anything here.

@JFWaskin

Copy link
Copy Markdown

Hi! I'm filing a separate, narrower ask-PR at #2154 — same routing, smaller diff. No coordination beyond this comment.

The difference is mainly: #2154 ships the manifest, the runtime doc, a compat matrix, and a manifest test — no dsh.bundle field in package.json, no .dsh/plugins/superpowers.js plugin file. The opt-in story is "the user adds the customSkillDirs line in their cordis.yml overlay and the skills are discoverable" rather than "the user runs dsh plugin add and dsh recognizes the repo as a profile layer".

I haven't talked to you about this directly because coordination between the two PRs belongs in the PR threads where maintainers can see it. If maintainers prefer your fuller shape (with the dsh.bundle plumbing), #2154 is closed without prejudice. If they prefer the narrower shape, #2154 lands and yours can be a complementary install path or also close.

Either way — the eval evidence you collected (especially the clean-session transcript with deepseek-v4-flash triggering skill("brainstorming") as the first action) is the strongest existing evidence that the routing shape works. Thank you for doing that work and posting it; it's what gave me confidence the ask-PR was worth filing.

Two small things I can offer to your PR if useful (separate commits, not cross-mingled):

  • A docs/compatibility.md row for dsh (with the same status legend as the other 12 runtimes)
  • A tests/dsh/test-dsh-plugin.sh shell test (mirrors tests/devin/test-devin-plugin.sh)

Let me know if either would be welcome; I won't push them uninvited.

— JFWaskin

@WODE25500

Copy link
Copy Markdown

Sharing an empirical observation from testing a dsh-based Superpowers integration, in case it's useful for the acceptance guidance on this runtime.

Model tested: deepseek-v4-flash-vision-exp (via deepseek-official provider) on dsh 0.1.0-rc.8, headless profile with only the Superpowers plugin plus base.

What worked:

  • The using-superpowers bootstrap injected every session via dsh's systemPrompt.section (the model can quote the <EXTREMELY_IMPORTANT> block and the "Invoke relevant or requested skills BEFORE any response" rule back to us).
  • All 14 Superpowers skills appeared in dsh's <available_skills> and were loadable - dsh exposes a native skill tool, and the model confirmed it can call it by name.
  • When explicitly asked what it should do first, the model correctly identified that brainstorming must run before implementation skills and started asking clarifying questions.

What it did NOT do (the gap):

  • On the plain acceptance prompt "Let's make a react todo list", the model verbally simulated brainstorming (asked clarifying scope/stack/location questions) instead of calling the skill tool to load brainstorming. Asked directly "did you call the skill tool?", it answered no.

So with this model, the bootstrap is understood but the actual skill-tool invocation is skipped - it follows the instructions textually rather than triggering the skill via the tool. Worth noting this is deepseek-v4-flash-vision-exp specifically; the acceptance runs above used deepseek-v4-flash, and the tool-invocation behavior may differ between the two. Hope this helps calibrate the acceptance-test guidance for dsh.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants