DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Plugin Trellis Statusline — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
P

dsh-plugin-trellis-statusline

Plugin Trellis Statusline

在 dsh 网页聊天中显示当前工作区的活动 Trellis 任务,包括父任务/子任务角色以及可点击的任务树。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:CJ-SH/dsh-plugin-trellis-statusline#90a4aa1db12efe008f570fbe4cf095da24497751
README兼容性版本

兼容性与来源证明

Plugin Trellis Statusline 以 dsh-plugin-trellis-statusline 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/16

版本

0.1.0stable
2026/9/16

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/16
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Codex Ui@michengai/dsh-codex-uiDSH Codex UI — 为 DeepSeek Harness Web 提供 Codex 风格侧栏、工作区会话树、全局搜索和轮次导航Dafeiyudsh-dafeiyu由 DeepSeek Harness 会话事件驱动的原生桌面端 BigFish companion。Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Usage Stats@ychris12138/dsh-usage-statsdsh Web GUI 的令牌使用热力图、提供商余额和订阅配额

README

dsh-plugin-trellis-statusline

Show the active Trellis task of the current workspace in the dsh web chat — the job the Claude Code statusline.py hook does in a terminal, and a statusline dsh's web shell does not have.

This one is a statusline: a single compact pill, always visible, in the chat you are already looking at.

[P2] Add the importer · 进行中
[P1] Release 0.2 · 进行中 · 父任务
[P2] Wire the importer · 进行中 · 子任务

What it is

Trellis keeps each piece of work as a task under .trellis/tasks/ and records which one a session is on. dsh's web shell shows the workspace and the model, but not the task — so you have to switch back to a terminal, or ask the agent, to find out what you are actually working on.

This plugin puts that fact in the chat:

  • the session header, right of the session-preset selector, as a compact pill;
  • the new-session view, for a session whose first message has not been sent yet.

It is a pure read: it never writes to Trellis, starts or archives nothing, and shows nothing at all when there is no task.

Requirements

dshwith the web profile. Verified against 0.1.5-rc.2; the seats it attaches to are internal, so a dsh upgrade may move them — see Troubleshooting
Node^22.19.0 || >=24.0.0
A Trellis-managed workspacedsh is Trellis' 22nd supported platform — run trellis init --dsh in the workspace (Trellis docs). The session's working directory then contains .trellis/, which is all this plugin reads

It needs no Python and no trellis CLI at runtime. Unlike plugins that drive task.py, this one only reads the JSON Trellis writes.

Install

This package is a dsh bundle: it declares dsh.bundle with a cordis.patch.yml, and installing it appends the bundle to the profile and applies its patch layer (official guide).

From npm — not published yet, this is the command once it is:

dsh plugin --profile web add dsh-plugin-trellis-statusline

Today, install straight from the repository. Either a clone:

git clone https://github.com/CJ-SH/dsh-plugin-trellis-statusline
dsh plugin --profile web add ./dsh-plugin-trellis-statusline

…or the git URL, which needs no clone of your own:

dsh plugin --profile web add github:CJ-SH/dsh-plugin-trellis-statusline

The git route works here without the usual prepare script and allowBuilds allowance, because there is nothing to build: lib/ is plain JavaScript committed to the repository, so a git install already fetches runnable artifacts. A plugin written in TypeScript would need both, and the allowance is permission to run its code on your machine at install time — see the official note.

Then check the row landed and restart dsh — loading a plugin happens at boot, and the restart ends any agent process, so run it yourself:

dsh --profile web --dump-config | grep trellis-statusline

A working install needs no configuration: the plugin reads the session it is rendered in and holds no settings.

Uninstall

dsh plugin --profile web remove dsh-plugin-trellis-statusline

It stores nothing, so uninstalling needs no cleanup.

No other bundle's row is touched

The patch inserts one loader row and nothing else. The Host half registers its own route on the composition's webServer and asks connection for the trust fence before every answer (requestRejection → 401/403, and 503 when that seam is missing) — the same shape the shipped dsh-host-open-in-app uses.

An earlier version widened the shipped connection row's inject instead. That is what connection.rpc.handle needs — it registers its physical route on that row's context — and it made this plugin's availability depend on a piece of another bundle's configuration and on layer order. Owning the route removes the coupling: nothing here can be silently taken away by a patch collision.

What you will see

The pill reads [priority] title · status. Three shapes, depending on the task:

The session's task isThe pill reads
standing alone[P2] Title · 进行中 — no role, no click target, no tab stop
the tree's root[P1] Title · 进行中 · 父任务
anywhere else in the tree[P2] Title · 进行中 · 子任务

Only two roles exist. The tree's top ancestor is the one and only 父任务; every other member — grandchildren included — is a 子任务. Depth never changes the wording, so a deep tree stays readable.

When the task is in a tree the pill becomes clickable. The dropdown shows the real structure (one indent level per depth, with a guide line) and highlights the session's task. A stand-alone task is not clickable at all — no button, no focus ring, no tab stop.

The display refreshes every 10 s, and immediately when the header switches to another session, so a task.py start or task.py archive shows up within one poll.

Where the task comes from

  1. The session's working directory — from the live session's own header, or from the workspace registry, which also covers sessions that are no longer live.
  2. The session pointer — .trellis/.runtime/sessions/dsh_<sessionId>.json, which task.py start writes. It wins whenever it names a real task.
  3. A scan of .trellis/tasks/*/task.json — in_progress before planning, and among equals the newest MM-DD- task. A scanned task must also have been started at least once, which a recorded branch proves.

That last rule earns its keep: trellis init leaves a scaffolding task (Bootstrap Guidelines) at status: in_progress with no branch, forever. Without the check, every fresh Trellis project would report it as active work — four of the five real workspaces this was built against had exactly that stale task. See design notes.

What it does not do

  • It never writes. The Host half imports node:fs/promises for readFile and readdir and holds no write path at all; the self-check proves a full read leaves .trellis/ byte-identical.
  • It does not start, switch or archive tasks — that stays task.py's job. The dropdown is a view, not a control: its rows are not clickable.
  • It does not repeat what dsh already shows (model, tokens, elapsed time).
  • It has nothing to show for a review task found by the scan (the pointer still displays it, as 审核中 / in review). Widen RUNNING_STATUSES in lib/index.js to change that.

Troubleshooting

Nothing appears at all. In order of likelihood: the workspace has no .trellis/; it has one but no task was ever started in it (see the branch rule); you are in the new-session view and the composer could not be measured; another bundle claims the exact route /trellis-statusline/task/read (the Host logs [trellis-statusline] route unavailable at boot); or a dsh upgrade moved the seats. The plugin never shows a placeholder and never reports an error — an absent pill is the failure mode, by design.

It shows the wrong task. Check python ./.trellis/scripts/task.py current --source. If that disagrees with the pill, the plugin's scan and Trellis' pointer resolution have diverged — please open an issue with both.

It shows the workspace's newest task instead of the one you started. If dsh was launched from inside another Trellis session — a Claude Code or Codex window, say — Trellis 0.6.15 inherits that session's TRELLIS_CONTEXT_ID and can write the runtime pointer under the outer context key (the general case is tracked upstream, mindfold-ai/Trellis#549; Trellis 0.6.15 fixed it for dsh specifically). This plugin then finds no pointer for its own session and falls back to the workspace scan — which is precisely why that fallback exists. Unset TRELLIS_CONTEXT_ID before starting dsh, or run python ./.trellis/scripts/task.py start .trellis/tasks/<dir> in the dsh session itself.

It appears in one session but not another. That is the design: each session reports its own working directory, so parallel sessions in different workspaces show different tasks.

Development

No dependencies and no build step: the browser half is written directly in the form the shell consumes, the Host half imports nothing beyond node: builtins, and the suite asserts both.

node --check lib/index.js && node --check lib/client.js   # both halves parse
npm test                                                  # 197 assertions, four harnesses

The harnesses live in the repository, not in the published tarball — files ships only lib, the patch, the README, the design notes and the licence — so run npm test from a checkout.

HarnessCovers
test/host.test.mjsresolving the task against throwaway workspaces: pointer first, scan fallback, ranking, the branch rule, every tree case, and a before/after hash proof that a read never writes
test/client.test.mjsthe bundle contract: id, the react-only require, both seats (slot key vs cell id vs order), locale namespace, stylesheet lifecycle, cross-half constants
test/cell.test.mjsthe real cells under a minimal hook runtime: all three pill shapes, the dropdown and its dismissal routes, the Hero cell's blank-session gating and measured position, listener and interval cleanup
test/integration.test.mjsthe two halves against each other — the real Host half reads a real .trellis tree and that exact reply is fed to the real cell, so a wire-shape drift cannot pass unnoticed
FileRole
lib/index.jsHost half — session → cwd → task, and the /trellis-statusline/task/read route
lib/client.jsBrowser half — the module-loader bundle, the seat registrations, the cell
cordis.patch.ymlthe loader row; no other bundle's row is patched
docs/design-notes.mdwhy it works this way: the seats, the measurement, the derivation rules

License

MIT © 2026 HenTaiCJN

Trellis is a separate project by Mindfold LLC, licensed AGPL-3.0-only. This plugin is not affiliated with it, and neither bundles nor derives from its code: it reads the .trellis/ files Trellis writes.