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-adhdREADME
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
| Before | After |
|---|---|
| "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.
| Input | Effect |
|---|---|
| (nothing) | Ruleset active in every new session, in every profile that installs the row. Persists across restarts. |
/adhd off | Turns always-on off (persists false in ~/.dsh/i-have-adhd.json). On-demand /i-have-adhd still works. |
/adhd on | Turns always-on back on (persists true). |
/adhd status | Reports the always-on source and whether this session is active. |
stop adhd mode / normal mode | Disables always-on injection for this session only; the persisted setting is untouched. |
/i-have-adhd | Injects 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
- Open Settings -> Plugins in the DSH Web GUI.
- Install a local bundle from the package folder (or a packed
.tgz). - Enable I have ADHD if it is not enabled automatically.
- 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
| Piece | Registration |
|---|---|
| Skill | ctx.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 prompt | ctx.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. |
| Command | ctx.commands.register({ name: 'adhd', ... }); writes the state file atomically (temp file + rename). |
| Stop phrases | ctx.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 onwhen 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.