Skip to main content
T

dsh-i-have-adhd

trevtravtrev/dsh-i-have-adhd

Shapes replies for a reader with ADHD: next action first, numbered steps, restated state, visible wins. On-demand with /i-have-adhd, always-on with /adhd on.

Install

dsh plugin --profile web add github:trevtravtrev/dsh-i-have-adhd

README

dsh-i-have-adhd

ADHD-friendly output for DeepSeek Harness. A DSH bundle port of ayghri/i-have-adhd: lead with the next action, number multi-step work, restate state, suppress tangents, give concrete time estimates, make wins visible. Always-on by default — mounted once, it shapes every session in every profile; /adhd off opts out.

The ruleset is copied verbatim from upstream commit 1ecea1993b7fce257ffbd686c070948b5e07eda6 (package version 0.4.1, MIT). See LICENSE and skills/i-have-adhd/SKILL.md.

What changes

BeforeAfter
"Great question! Let me think about this. Your auth flow has a few moving pieces...""Edit src/auth.ts:42 to update the token validation." then a numbered list, then one next step.

Use

Always-on is the default (alwaysOn: true in cordis.patch.yml): the ruleset is injected into every system prompt, in every profile that mounts the row — no gesture needed. /i-have-adhd remains available for sessions that were paused.

InputEffect
(nothing)Ruleset active in every new session, in every profile that installs the row. Persists across restarts.
/adhd offTurns always-on off (persists false in ~/.dsh/i-have-adhd.json). On-demand /i-have-adhd still works.
/adhd onTurns always-on back on (persists true).
/adhd statusReports the always-on source and whether this session is active.
stop adhd mode / normal modeDisables always-on injection for this session only; the persisted setting is untouched.
/i-have-adhdInjects the ruleset into the current conversation (also re-enables a session that said a stop phrase).

The skill is registered as user-invocable only (modelInvocable: false), matching upstream's disable-model-invocation: true: the model never auto-loads it, and /i-have-adhd is the entry point.

Install

Development source: C:\Users\trevo\Documents\deepseek-harness\plugins\dsh-i-have-adhd. The package is a DSH bundle: package.json declares dsh.bundle.patch, and cordis.patch.yml inserts one row (id: i-have-adhd, name: dsh-i-have-adhd). It has no runtime dependencies.

Path row (simplest, no pnpm needed)

Link the profile's plugins dir to this package, then point a patch row at it. Repeat for each profile that should carry it (dsh-tui, web, desktop, headless):

foreach ($profile in 'dsh-tui', 'web', 'desktop', 'headless') {
  New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\$profile\plugins\dsh-i-have-adhd" `
    -Target "C:\Users\trevo\Documents\deepseek-harness\plugins\dsh-i-have-adhd" -Force | Out-Null
}

Add to each %USERPROFILE%\.dsh\profiles\<profile>\cordis.patch.yml:

- insert:
    - id: i-have-adhd
      name: './plugins/dsh-i-have-adhd/lib/index.js'
      config:
        alwaysOn: true

A new module mounts at the next DSH start: HMR reloads patch edits live, but a never-loaded module file needs the restart.

From the Plugins page

  1. Open Settings -> Plugins in the DSH Web GUI.
  2. Install a local bundle from the package folder (or a packed .tgz).
  3. Enable I have ADHD if it is not enabled automatically.
  4. Restart DSH if the manager reports restart-required.

From the CLI (pnpm)

dsh plugin --profile web add "file:C:\Users\trevo\Documents\deepseek-harness\plugins\dsh-i-have-adhd"

Then add "dsh-i-have-adhd" to dsh.profile.bundles in %USERPROFILE%\.dsh\profiles\web\package.json (after @deepseek-ai/dsh-web-app), restart DSH, and confirm the row is composed:

dsh --profile web --dump-config | Select-String "i-have-adhd"

pnpm must be on PATH (npm install -g pnpm once; corepack enable hits Program Files permissions). Details: docs/dsh-internals.md.

Configure

alwaysOn defaults to true in this fork's bundle row (upstream ships false, on-demand only). Set it in the profile patch layer to change the default:

# ~/.dsh/profiles/<profile>/cordis.patch.yml
- id: i-have-adhd
  config:
    alwaysOn: true

A /adhd on or /adhd off choice is persisted in ~/.dsh/i-have-adhd.json and overrides the row config in both directions. Delete that file to fall back to the row config. statePath can point the state file elsewhere (useful for tests or per-profile state files):

- id: i-have-adhd
  config:
    alwaysOn: false
    statePath: 'C:\Users\trevo\.dsh\i-have-adhd-web.json'

How it works

PieceRegistration
Skillctx.skills.register({ name: 'i-have-adhd', invocation: { modelInvocable: false, userInvocable: true }, ... }) with the bundled SKILL.md body and its directory as resource base.
Always-on promptctx.systemPrompt.section({ name: 'i-have-adhd:rules', order: DEPLOYMENT_PERSONA_SUFFIX }). The section text is empty while always-on is off, so it contributes nothing to the prompt.
Commandctx.commands.register({ name: 'adhd', ... }); writes the state file atomically (temp file + rename).
Stop phrasesctx.on('agent/pre-step') marks the speaking agent as off for the session; a later /i-have-adhd token clears that session override.

The ruleset is injected once per system-prompt assembly while always-on is enabled, so it survives compaction and topic switches. On-demand mode relies on the conversation history the /i-have-adhd gesture creates.

Verify

cd C:\Users\trevo\Documents\deepseek-harness\plugins\dsh-i-have-adhd
node --test test/plugin.test.mjs

The suite covers skill registration and invocation flags, all ten rules, the always-on section, /adhd on|off|status, persisted state, malformed-state fallback, stop phrases, session re-enablement, and bundle packaging.

Limitations

  • The on-demand ruleset lives in conversation history; a compaction pass can summarize it away. Use /adhd on when that matters.
  • Always-on adds roughly 2.3k characters to every request. Turn it off when working on unrelated sessions.
  • Stop phrases are matched exactly (after trimming and lower-casing), matching upstream; they do not match prose like "please stop the ADHD mode now".
  • Always-on state is global to $DSH_HOME; the per-session stop-phrase override is in memory and resets when DSH restarts.
  • Rules and command output are English, like upstream.

Package layout

dsh-i-have-adhd/
  package.json          # bundle manifest (dsh.bundle.patch)
  cordis.patch.yml      # inserts the i-have-adhd row
  lib/index.js          # skill, prompt section, /adhd command, pre-step listener
  skills/i-have-adhd/SKILL.md
  locale/en.json        # Plugins page metadata
  icon.svg
  test/plugin.test.mjs
  docs/dsh-internals.md # install/verify research
  LICENSE

Credits

Rules and wording: ayghri/i-have-adhd, MIT, loosely based on The Adult ADHD Tool Kit by J. Russell Ramsay and Anthony L. Rostain. DSH bundle wiring: this package.

Related plugins