dsh-hub-cli README

The project's README from github.com/pax-beehive/dsh-hub-cli. As one markdown file: README.md.

DSH Plugin Hub

DSH Hub CLI

English · 简体中文

Share your entire DeepSeek Harness setup as one versioned, reproducible Profile.

Capture the plugins, order, runtime, and config you have running locally. Publish it as an immutable Release. Anyone can apply it with a single command, review every change before it lands, and roll back if they don't like it.

🌐 dshpluginhub.ai  ·  Browse Plugins  ·  Explore Profiles  ·  Docs

npm version CI Node License: MIT

DSH Plugin Hub home page

This repository is the open-source client for the Hub. The website, API, and registry live at dshpluginhub.ai.

Quick start · Why Profiles · Commands · Support · Contributing · Governance · Security


npm install --global @dsh-plugin-hub/cli

# Apply a teammate's Profile to your local "web" harness
dsh-hub profile apply dsh-web-workspace --version 0.1.0 --profile web

That one command installs the exact plugin versions, in the exact order, with the exact patch the author published. Not "whatever is latest today." What they had.

Why shareable Profiles

A DeepSeek Harness (DSH) setup is more than a list of plugins. It is a specific runtime version, a set of plugins at specific versions, the order they load in, a cordis.patch.yml that wires them together, and a handful of environment variables that hold your keys.

Getting that onto a colleague's machine usually means a wiki page, a Slack thread, and an afternoon of "works on my machine."

DSH Hub turns that setup into a first-class, versioned artifact.

flowchart LR
    subgraph author["Author's machine"]
        A["~/.dsh/profiles/web<br/>plugins · order · patch · runtime"]
    end
    subgraph hub["DSH Plugin Hub"]
        R["Profile Release<br/><b>[email protected]</b><br/>sha256 content hash"]
    end
    subgraph team["Anyone else"]
        T1["Teammate"]
        T2["CI runner"]
        T3["AI agent"]
    end

    A -- "dsh-hub profile share" --> R
    R -- "dsh-hub profile apply" --> T1
    R -- "dsh-hub profile apply" --> T2
    R -- "dsh-hub profile apply" --> T3
Without DSH Hub With a shared Profile
"Install these six plugins" One slug and one version
Versions drift within days Every version, source, and integrity hash is locked
Load order lives in someone's head Order is part of the Release and validated on apply
Secrets get pasted into docs Only ${ENV_VAR} references are published; values stay local
Upgrades are a fresh install profile diff shows exactly what changes before you upgrade
Broke it? Start over profile rollback restores the previous complete revision
Profiles on dshpluginhub.ai

Browse community Profiles, or build one in the web builder, at dshpluginhub.ai/profiles.

What's inside a Profile Release

A Release is a small, content-addressed document. The CLI verifies its hash before doing anything with it.

flowchart TB
    R["<b>Profile Release</b><br/>dsh-web-workspace @ 0.1.0<br/><code>contentHash: sha256:…</code>"]
    RT["<b>Runtime</b><br/>@deepseek-ai/dsh 4.2.1"]
    P["<b>Patch</b><br/>cordis.patch.yml"]
    I["<b>Inputs</b><br/>OPENAI_API_KEY (secret)<br/>SEARCH_ENDPOINT"]
    subgraph B["Ordered bundles"]
        direction TB
        B1["1 · @deepseek-ai/dsh-base<br/><i>builtin</i>"]
        B2["2 · dsh-better-sidebar @ 0.15.2<br/>npm · sha512 integrity"]
        B3["3 · dsh-search @ 2.1.0<br/>npm · sha512 integrity"]
        B4["4 · acme/dsh-notes # 9f3c…a1<br/>github · pinned commit"]
        B1 --> B2 --> B3 --> B4
    end
    R --> RT
    R --> B
    R --> P
    R --> I

Quick start

Requires Node.js 22.13+ and pnpm on your PATH.

npm install --global @dsh-plugin-hub/cli
dsh-hub --help

Apply someone's Profile

# Find one
dsh-hub profile search workspace

# See exactly what would change on your machine
dsh-hub profile diff dsh-web-workspace --version 0.1.0 --profile web

# Apply it (staged, validated, then swapped in atomically)
dsh-hub profile apply dsh-web-workspace --version 0.1.0 --profile web

# Confirm everything is healthy
dsh-hub profile doctor --profile web

Share your own

# Preview what would be captured from ~/.dsh/profiles/web
dsh-hub profile share my-stack --version 1.0.0 --profile web --dry-run

# Sign in once, then publish an immutable Release
dsh-hub login
dsh-hub profile share my-stack --version 1.0.0 --profile web

Upgrade and roll back

dsh-hub profile upgrade --version 0.2.0 --profile web --dry-run   # review the diff
dsh-hub profile upgrade --version 0.2.0 --profile web             # apply it
dsh-hub profile history --profile web                             # see saved revisions
dsh-hub profile rollback --profile web                            # restore the previous one

Install a single plugin

dsh-hub search memory
dsh-hub info dsh-context --version 1.2.3
dsh-hub install dsh-context --version 1.2.3 --profile web

How it works

Every mutation is a reviewable plan

Nothing that changes your local harness runs immediately. The CLI first writes a plan: an exact, expiring description of what will happen, plus a fingerprint of the current state. You apply the plan by ID. If the local Profile changed in between, or 30 minutes passed, the plan is rejected and you make a fresh one.

sequenceDiagram
    autonumber
    participant U as You / Agent
    participant CLI as dsh-hub
    participant Hub as DSH Hub API
    participant FS as ~/.dsh

    U->>CLI: profile apply dsh-web-workspace --plan --json
    CLI->>Hub: fetch Release + resolve bundles
    Hub-->>CLI: Release (hash verified)
    CLI->>FS: write plan {id, expiresAt, precondition}
    CLI-->>U: plan JSON (exact versions, sources, inputs)
    Note over U: Review. Confirm.
    U->>CLI: operation apply <plan-id>
    CLI->>FS: check precondition hash + expiry
    CLI->>FS: stage → install → validate → atomic swap
    CLI-->>U: operation.completed {revision}

This is what makes the CLI safe to hand to an AI agent. The agent can plan freely, but a human confirms the exact plan ID before anything moves.

Apply is staged, validated, and atomic

flowchart LR
    S["Stage into<br/>.hub-web-xxxx/"] --> I["dsh plugin add<br/>each bundle in order"]
    I --> V["Structural check +<br/>dsh --dump-config"]
    V -->|pass| M["Move current web/<br/>to revisions/"]
    M --> W["Rename stage → web/"]
    W --> L["Write lockfile"]
    V -->|fail| X["Delete stage.<br/>Nothing touched."]

The previous Profile directory and its lockfile are kept as a complete revision. Rollback is a rename, not a reinstall.

Packages

flowchart LR
    S["<b>schemas</b><br/>zod contracts for<br/>manifests, Releases, API"] --> RG["<b>registry</b><br/>semver resolution,<br/>bundle ordering"]
    RG --> C["<b>cli</b><br/>dsh-hub command,<br/>plans, apply, rollback"]
    C --> P["<b>dsh-plugin</b><br/>agent tools that<br/>call the CLI"]
    C -.->|HTTPS| H["DSH Hub API"]
Package What it owns
@dsh-plugin-hub/schemas Runtime-validated Plugin, Profile, and Hub API contracts
@dsh-plugin-hub/registry Deterministic version resolution and Profile bundle ordering
@dsh-plugin-hub/cli The dsh-hub command: search, plans, apply, diff, doctor, share, rollback
@dsh-plugin-hub/dsh-plugin DSH agent tools backed by the same plan/apply pipeline

All four ship in lockstep under one version. See docs/architecture.md for trust boundaries.

Command reference

Command What it does
dsh-hub search <query> Search the Plugin catalog
dsh-hub info <package> [--version] Show a plugin's resolved version, source, compatibility, and security assessment
dsh-hub install <package> [--version] [--profile] Install one plugin into a local Profile
dsh-hub profile search <query> Search published Profiles
dsh-hub profile apply <slug> [--version] [--profile] Apply a Profile Release
dsh-hub profile upgrade [slug] [--version] [--profile] Upgrade the installed Profile to another Release
dsh-hub profile diff [slug] [--version] [--profile] Compare local state with a Release
dsh-hub profile doctor [slug] [--profile] Check directory, lockfile, order, installed versions, required inputs, and drift
dsh-hub profile share <slug> --version <v> [--profile] Publish the local Profile as an immutable Release
dsh-hub profile capture <slug> [--profile] Print the captured Profile draft without publishing
dsh-hub profile import <file.dshprofile> [--profile] Apply a Release from an exported archive
dsh-hub profile history [--profile] List recoverable local revisions
dsh-hub profile rollback [revision] [--profile] Restore a previous revision
dsh-hub operation apply <plan-id> Execute a previously created plan
dsh-hub init [dir] --repository <owner/repo> Scaffold a new plugin package
dsh-hub validate [dir] Validate a plugin or Profile package directory
dsh-hub login / logout Sign in to the Hub with a device code
dsh-hub telemetry state|on|off Manage anonymous usage reporting

Common flags: --profile <name> (default web), --version <exact|tag|range>, --dry-run, --plan, --json, --no-telemetry, --api <url>.

Use it from an agent

Install the adapter into a Profile and your DSH agent gets eleven tools that map one-to-one onto the CLI:

dsh plugin --profile web add @dsh-plugin-hub/dsh-plugin

Read-only tools (dsh_hub_search, dsh_hub_profile_diff, dsh_hub_profile_doctor, …) run freely. Mutating tools only ever create plans. A single dsh_hub_operation_apply tool executes a plan, and it requires confirmed: true, which the agent may only set after the user approves that exact plan.

The repository also ships a reviewable dsh-hub agent Skill that spells out the confirm-before-apply rules for any agent driving the CLI.

Security and privacy

The CLI installs packages, edits local DSH Profiles, and stores a Hub login session. It is built to make each of those inspectable and reversible:

Telemetry. After a first-run notice, lifecycle commands send anonymous, aggregate-only usage events (slug, version, outcome, error category, duration, platform, CLI version). No account, machine ID, path, config, or environment value is ever included. Disable it with dsh-hub telemetry off, --no-telemetry, DSH_HUB_TELEMETRY=0, or DO_NOT_TRACK=1. Full field list and retention policy: packages/cli/README.md.

To report a vulnerability, follow SECURITY.md.

Development

corepack enable
pnpm install --frozen-lockfile
pnpm check        # typecheck + tests + package-content audit
packages/
  schemas/       zod contracts
  registry/      resolver + bundle ordering
  cli/           the dsh-hub command
  dsh-plugin/    agent tool adapter
skills/dsh-hub/  agent Skill
docs/            architecture, releasing

Tests use Node's built-in runner. After pnpm build, run a single package's suite with:

node --test packages/cli/tests/*.test.ts

Release notes live in CHANGELOG.md and the release process in docs/releasing.md.

Contributing

Bug reports and pull requests are welcome. Start with CONTRIBUTING.md. By participating you agree to the Code of Conduct.

License

MIT

DSH Hub is an independent community project and is not affiliated with or endorsed by DeepSeek.

dsh-hub-cli (pax-beehive/dsh-hub-cli)

Searching Database…

这是什么?DSH Hub CLI 让你把整套 DeepSeek Harness(DSH)配置——插件、加载顺序、运行时版本和配置——捕获为带版本的 Profile,以不可变 Release 的形式发布,让他人用一条命令应用它、审查变更,并在需要时回滚。
这是一个 CLI 还是多个组件?它是一个包含四个同步发布包的 monorepo:@dsh-plugin-hub/schemas(契约)、@dsh-plugin-hub/registry(版本解析)、@dsh-plugin-hub/cli(dsh-hub 命令)和 @dsh-plugin-hub/dsh-plugin(智能体工具)。
怎么应用别人的 Profile?把 Node.js 22.13+ 和 pnpm 装到 PATH 上,然后运行 dsh-hub CLI 的 profile apply 命令并提供 Profile 的 slug 和版本;它会先生成一个计划,你需要按 ID 确认后磁盘上才会真正发生任何改动。
使用之前需要安装什么?PATH 上要有 Node.js 22.13+ 和 pnpm;应用公开 Profile 无需账户,但发布自己的 Profile 需要用 dsh-hub login 登录 Hub。
如果我确认变更太慢会怎样?修改类命令绝不会立即执行——它们先生成计划;如果在按 ID 应用该计划前已过 30 分钟、或你的本地 Profile 发生了变化,该计划会被拒绝,你需要重新生成一份。
它收集哪些遥测数据?在首次运行提示之后,它会发送匿名的聚合使用事件(slug、版本、结果、错误类别、时长、平台、CLI 版本);绝不包含账户 ID、机器 ID、路径、配置和环境变量值,并且可以用 dsh-hub telemetry off 或 DO_NOT_TRACK=1 关闭。
它如何防止密钥泄露到共享 Profile 中?CLI 拒绝发布包含疑似凭证值的 cordis.patch.yml,且 Release 只携带 ${ENVVAR} 引用,绝不会带真实的密钥值。
怎么让 AI 智能体有权使用它?安装 dsh-plugin 适配器会暴露十一个与 CLI 对应的工具;只读工具可以自由运行,但唯一的修改类工具需要 confirmed:true 标志,而只有经人类批准的计划 ID 才能设置它。
升级出错了怎么办?每次应用都会把之前的 Profile 目录和锁文件保存为完整修订版本,因此 dsh-hub profile rollback 只需一次简单重命名即可恢复,无需重新安装。
插件来源如何固定,才能避免被悄悄更改?来自 GitHub 的包必须引用完整的 40 字符提交哈希而不是分支,npm 包则带有完整性哈希,因此 Release 安装的始终是作者测试过的那份确切代码。
Size
0.5 MB
Stars
388
Age
1mo
Commits · 90 Days