DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Reaper — DSH Plugin for DeepSeek Harness
← Plugins
R

dsh-reaper

Reaper

Orphan process and port reaper for DeepSeek Harness: find the dev servers, watchers and background processes an agent left behind, attribute them to a workspace, preview the blast radius, and reclaim the ports.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:11111353535/dsh-reaper#b0412244e623d54fbf0bded66cba5203de8c85c4
READMECompatibilityVersions

Compatibility and provenance

Reaper is published as dsh-reaper and currently resolves to version 0.1.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
github
Registry updated
10/17/2026

Versions

0.1.0stable
10/17/2026

Related plugins

Loading related plugins…

Latest
0.1.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
any
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
10/17/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in

Related plugins

More verified plugins in productivity-workflow.

Acp App@deepseek-ai/dsh-acp-appThe dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-baseExperimental Schedule Bundle@deepseek-ai/dsh-experimental-schedule-bundleOptional bundle that adds Schedule, its task page, and time context to the Web compositionClient Ui Task Board@linxin666/dsh-client-ui-task-boardHost-authoritative task board for the DSH Web GUI with real session execution, Host cron scheduling, and optional cross-platform idle-sleep protection; mounted without DSH source changes.Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / git-graph / pet / remote-web-ui / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。

README

dsh-reaper

Reclaim the ports your agent forgot to give back.

An agent starts vite, next dev, a watcher, a tunnel. The turn ends. The session ends. The process does not — it keeps holding 5173, and the next run dies with EADDRINUSE while you go hunting through Task Manager for a node.exe you cannot identify.

dsh-reaper inventories every listening endpoint on the machine, attributes each holder to this session, shows you exactly what it would kill, and only then — when you say confirm: true — reclaims the ports.

$ /reap

dsh-reaper · win32 · 2026-10-16T10:57:26.626Z
workspace: E:\work\shop-frontend

51 listening endpoint(s) · 432 process(es) · 3 reclaimable

 5173  tcp  agent-spawned  pid   8899   18m  node.exe
      node E:\work\shop-frontend\node_modules\.bin\vite --host
 3001  tcp  workspace      pid   9120   42m  node.exe
      node E:\work\shop-frontend\server.js
 3306  tcp  system         pid   9168  9h29m  mysqld.exe
      ↳ port 3306 is a well-known service port
19387  tcp  protected      pid  11664   2h9m  DeepSeek Harness.exe
      ↳ holds the harness process tree

Why it is not just "kill by port"

Port tools tell you what holds a port. The hard part is deciding whether you are allowed to kill it, and that answer depends on facts a port number does not carry:

  • Did this process descend from the harness that is running the scan? Killing it takes down the session.
  • Is it the machine's own infrastructure — mysqld on 3306, nginx on 80?
  • Is it a leftover dev server with no session tie at all?
  • Is it something the user explicitly said to leave alone?

dsh-reaper answers that per endpoint and grades the result, so a --all sweep can be safe:

verdictmeaningauto-selected by all: true
agent-spawneddescends from the harness host process✅
workspacecommand line names the current workspace✅
dev-serverlooks like a dev server, watcher or tunnel❌
unattributedlistening, but nothing ties it to this session❌
systemOS process, or holds a well-known service port❌
protectedmatched neverKill / protectPorts, or holds the harness tree❌

Two rules make that table trustworthy:

  1. The harness never kills itself. The scan walks up from its own pid and refuses the whole ancestor chain, plus the process tree it is running inside.
  2. Infrastructure is not "unattributed". A holder of a well-known service port is graded system — the same hands-off grade as an OS process — so all: true never reaches it, and its note says left alone rather than hinting at an override.

Safety properties

Reaping is destructive, so the defaults are conservative and the refusals are absolute:

  • Nothing is signalled without confirm: true. The default call computes the plan and returns it.
  • The plan is the full descendant closure. Killing an npm run dev shim without its child leaves the port held — the exact failure this plugin exists to prevent. Descendants are ordered deepest-first so children die before their parents.
  • Refusals cannot be overridden by naming a pid. The harness process tree, pid 0–4, neverKill matches and protectPorts holders are refused even when passed explicitly, with the reason reported.
  • SIGTERM first, SIGKILL only if you ask. force: true escalates, and even then survivors are reported rather than hidden.
  • The result is verified, not assumed. After signalling, the plugin re-probes each freed port and reports ports confirmed free or ports still held.

Install

dsh plugin add https://github.com/11111353535/dsh-reaper

From a checkout instead of a git host, pass the absolute path:

dsh plugin add /absolute/path/to/dsh-reaper

The package declares no dsh-* peer dependency on purpose: it imports only node:* plus @deepseek-ai/dsh-tools, which the harness resolves from its own installation. Nothing is bundled that could shadow the host's copy.

To tune it per profile, add a config block to the row the installer inserted in ~/.dsh/profiles/<profile>/cordis.patch.yml:

- insert:
    - id: reaper
      name: 'dsh-reaper'
      config:
        neverKill: ['my-precious-daemon']
        protectPorts: [80, 443, 19387]
        includeUdp: false
        graceMs: 3000
        scanTimeoutMs: 20000
keydefaultmeaning
neverKill[]Process-name or command-line substrings that must never be signalled.
protectPorts[]Ports whose holder is refused even when named explicitly. The harness's own web port is added automatically.
includeUdpfalseAlso enumerate UDP endpoints. Off by default: dev servers are TCP.
graceMs3000How long SIGTERM gets before the process is reported as surviving.
scanTimeoutMs20000Wall-clock ceiling for one system enumeration.

Tools

reaper_scan

Read-only inventory. Signals nothing. Grades every listening endpoint and returns the full scan.

argumenttypemeaning
includeUdpbooleanAlso enumerate UDP endpoints.
workspacestringWorkspace root used for attribution. Defaults to the session workspace.

reaper_reap

Compute a plan and, only with confirm: true, execute it.

argumenttypemeaning
pidsinteger[]Explicit root pids. Their descendants are included automatically.
portsinteger[]Reap whatever holds these ports.
allbooleanAlso select every endpoint confidently attributable to this session (agent-spawned and workspace only).
forcebooleanEscalate to SIGKILL for processes that ignore SIGTERM.
confirmbooleanActually signal the plan. Defaults to false.

reaper_free_port

Reclaim one specific port. If the port is already free it says so and does nothing; if the holder cannot be attributed or is protected, it reports why instead of guessing.

argumenttypemeaning
portinteger (required)The TCP port to reclaim.
forcebooleanEscalate to SIGKILL if SIGTERM is ignored.
confirmbooleanActually signal the holder. Defaults to false.

Slash command

/reap                  # inventory
/reap --all            # preview everything confidently attributable to this session
/reap --all --confirm  # and actually do it
/reap 5173             # preview reclaiming one port
/reap 5173 3001 --confirm --force

How the scan works

platformendpointsprocess table
WindowsGet-NetTCPConnection -State Listen (+ Get-NetUDPEndpoint)Get-CimInstance Win32_Process
Windows (fallback)netstat -anotasklist /FO CSV /NH
Linuxss -H -ltnpps -eo pid=,ppid=,comm=,etimes=,args=
macOSlsof -nP -iTCP -sTCP:LISTEN -Fpcnps

Every probe is best-effort: a missing binary or a failed command degrades that one source and is reported in degraded: ... at the end of the scan. A scan that falls back to netstat still works — it just loses command lines, and therefore attribution gets weaker, which the report tells you.

One process listening on both :: and 0.0.0.0 is one problem, not two: dual-stack bindings are collapsed into a single row per protocol/port/pid, with every address kept in addresses.

Development

npm test          # 42 unit tests, no harness needed
npm run test:live # a real read-only scan of this machine
npm run setup:deps

lib/ is plain ESM JavaScript with no build step, and the unit tests cover the parsers against recorded fixtures — Windows and BSD netstat tables, ss, lsof, ps, tasklist, the classifier, the plan builder, and the renderers. test:live covers what fixtures cannot: that the real enumeration works on the host you are on. It signals nothing.

setup:deps links the three host packages lib/ imports (cordis, dsh-tools, schemastery) into a local node_modules so a bare checkout can run the tests. Set DSH_HOST_NODE_MODULES if the harness is not in a standard location.

License

MIT