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.

Shell Progress — DSH Plugin for DeepSeek Harness
← Plugins
S

dsh-shell-progress

Shell Progress

DeepSeek Harness plugin: a segmented progress bar for multi-step PowerShell tool calls

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

npx -y @deepseek-ai/dsh plugin --profile web add github:9087/dsh-shell-progress#30dea8b79dbc29dc496b38d3bc6dce7a3e41fead
READMECompatibilityVersions

Compatibility and provenance

Shell Progress is published as dsh-shell-progress and currently resolves to version 0.4.2. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
10/16/2026

Versions

0.4.2stable
10/16/2026
0.4.0stable
10/16/2026
0.3.0stable
10/16/2026
Show 3 more versionsCollapse versions
0.2.0stable
10/15/2026
0.1.1stable
10/14/2026
0.1.0stable
10/14/2026

Related plugins

Loading related plugins…

Latest
0.4.2
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
10/16/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 ui-customization.

Whale Widgetdsh-whale-widgetDeepSeek balance whale widget in the bottom-right corner of the DSH Web interface: balance/today’s usage/peak-off-peak pricing, customizable bubble click sequence (text/balance/today/peak-off-peak/image/random phrases and parallel weighted selection), per-line styles and fonts, floating quick editinClient Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH skill center: browse loaded skills by source (bundled / project / user / custom / runtime), enable or disable, create and delete, in a web GUI panel.Remote Web Ui@linxin666/dsh-remote-web-uiScan-to-pair remote access for the dsh web GUI that shares one official interface: a QR beside the settings button pairs phones and PCs into the same Web GUI (a portrait-touch adaptation layer for phones, full desktop on PCs) through one-time tokens and rClient 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.

README

dsh-shell-progress

English | 中文

A DeepSeek Harness plugin that shows where a multi-step shell command is right now, as a segmented progress bar inside the tool-call card.

One call, one card — photographed mid-run, not drawn by hand:

The card while a four-step command runs: a partly filled segmented bar with the step in flight and its clock, the finished step's output beneath it, and the steps still to come

The real card, expanded, with 1/4 done and step 2 in flight.

The question it answers is "is this command still working, or is it stuck?" — so the live position is the feature, not a bonus. The bar lives in the collapsed card: a glance at the transcript is the whole point, and hiding it behind a disclosure would make it a two-step interaction.

Install

dsh plugin --profile web add dsh-shell-progress

Or mount it by hand in the profile's cordis.patch.yml:

- insert:
    - id: shell-progress
      name: dsh-shell-progress

Then restart dsh web (the host loads the plugin once, at start-up).

What the model sees

Nothing new. shell_progress registers a tool whose model-visible text is byte-identical to what the pwsh tool returns for the same command — same stdout, same [stderr] section, same [exit code: N] markers. Step data never enters the conversation; it travels in the tool result's presentationMeta, which the harness persists on the tool/result event.

There is no nonce, no marker and no reordering anywhere the model can read.

Configuration

- insert:
    - id: shell-progress
      name: dsh-shell-progress
      config:
        enabled: true
        pollIntervalMs: 120
        maxStepOutputChars: 8192
        maxSteps: 400
        liveRetentionMs: 300000
FieldDefaultMeaning
enabledtrueRegister the shell_progress tool.
pollIntervalMs120How often the host reads the running process's output.
maxStepOutputChars8192Per-step output kept in the persisted progress.
maxSteps400A command split into more steps than this runs unmodified.
liveRetentionMs300000How long a settled call's live record is kept for a late poll.

When a step's output passes maxStepOutputChars, the lines that do not fit are dropped from the CARD's copy, and that step's output is followed by the number of characters that are missing — in the step list and in the segment's hover card alike. Without it a truncated step reads exactly like a quiet one. The budget is the card's memory, not the tool result: the model-visible stdout comes from the shell seam and is unaffected by it (the seam's own truncated / spillPath reporting applies as it always does).

How it works

  1. Split. The command is cut into top-level steps: non-empty lines that start at column 0, do not start with }, and sit at brace depth 0. Brace counting skips single-quoted strings, double-quoted strings (with the backtick escape) and # comments. Loop bodies are never steps, so one iteration cannot produce a marker.
  2. Instrument. Each step's own line gets an inlined marker prefixed to it — never a new line, so the line count and every other line stay untouched.
  3. Run. The instrumented text goes through ctx.shell, exactly as the pwsh tool runs a command, with the same timeout, sandbox policy, managed environment and cancellation.
  4. Follow. While the process runs, the host reads its incremental output and turns each marker into "the current step", stamping a monotonic timestamp.
  5. Persist. The final per-step timings and output ride output.presentationMeta, so a reloaded session rebuilds the whole card from the session log alone.

The marker must stay inlined

src/instrument.ts carries the long version; the short one is that a PowerShell function call is itself a command, and running it overwrites $?. A marker written as a helper therefore clobbers the automatic variable it was asked to preserve — and the caller's $? afterwards reports the helper's success, so even a helper that captures and restores the value internally cannot fix it. Measured on this host (Windows PowerShell 5.1, which is what the shell seam resolves to when PowerShell 7 is not installed):

Marker shape$? after a failed command
none (control)False ✅
helper function, capture + restore insideTrue ❌
inlined capture + restoreFalse ✅

tests/powershell.spec.ts runs both shapes against a real shell and asserts the difference, so a future refactor into a helper fails the suite.

When it does not track

The command runs unmodified — and no marker is written — when any of these hold:

  • the splitter meets something it cannot decide (unterminated quote, block comment, here-string, line continuation, unbalanced braces or parentheses);
  • the command already contains a step-marker shape, or already uses $__ok;
  • the resolved sandbox mode is read-only;
  • the command splits into more than maxSteps steps.

A refused call's card is the plain one: the command and everything it printed, with no bar, no counter and no step rows. There is nothing to draw — no marker was written, so no step has a time or an output of its own, and the planner's best-effort step list is dropped rather than rendered as rows that could only ever read "pending". The reason for the refusal goes to the host log (shell-progress: running the command unmodified — …), not onto the card.

A command with one step is uninstrumented too — there is no order to keep, so there is nothing to mark — but its card is not degraded: the host stamps that step's own start and end, so the bar draws its single segment and it goes pending → running → done with the command's clock beside it.

None of these is an error: the model gets exactly what pwsh would have given.

Layout

HalfSourceRuns in
Hostsrc/index.ts (+ the pure modules beside it)the DSH host process (Node)
Clientsrc/client/* (React)the browser

The two halves share src/types.ts and src/split.ts and nothing else.

The live channel is a poll, not a push. A plugin installed outside the DSH tree cannot receive host events — the forwarded-event allowlist is a static array inside the DSH build — so the browser polls /shell-progress (an authenticated request/response channel this plugin owns) every 250ms — the store's default cadence — while a call is in flight. The settled state never needs the poll: it is already in the session log.

Development

pnpm install
pnpm run typecheck
pnpm test
pnpm run build

The three workflow badges at the top are these:

WorkflowWhat it does
ci.ymlTypechecks, builds and runs the unit suite against the harness versions pinned in devDependencies — ONE host version, the one this repository declares.
harness-matrix.ymlRe-runs the three suites that cross the plugin/host seam (the registered tool driven through apply, the pwsh planner, the bash planner) once per published harness version — the only real answer to "will this still work after the host upgrades". A version inside the declared peer range blocks the build; the newest published version rides along as a non-blocking probe.
release.ymlOn a v* tag: the same gate, then npm publish --provenance through Trusted Publishing (OIDC — no token anywhere), then a GitHub Release.

See DEVELOP.md and PUBLISH.md.

License

MIT