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.

DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
U

dsh-upm

Upm

Native DeepSeek Harness plugin for ui-ux-pro-max: skills are bundled with the package, upstream search scripts are registered as native tools and commands, and data can be automatically repackaged as the upstream source updates

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

npx -y @deepseek-ai/dsh plugin --profile web add github:qizhuxu/dsh-upm#c449fc8fae10c503f9d343d49e55283fef0a9255
READMECompatibilityVersions

Compatibility and provenance

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

DSH compatibility
*
Runtime surfaces
any
Release source
github
Registry updated
11/3/2026

Versions

0.1.1stable
11/3/2026
0.1.0stable
10/30/2026

Related plugins

Loading related plugins…

Latest
0.1.1
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
any
License
MIT
Source
github
GitHub
★ 1
Weekly downloads
0
Last push
11/3/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

Related plugins

More verified plugins in search-research.

Free Searchdsh-free-searchFree web search for DeepSeek Harness: 27 engines (Bing/DuckDuckGo/AnySearch/SearXNG/Exa/Tavily/Keenable/Firecrawl/Parallel/You.com keyless; Zhihu global/site via MCP and Perplexity/SerpBase/DeepSeek (official + native tools/search)/Baidu/Kimi/Aliyun/DoubaAb Wechat Scrapedsh-ab-wechat-scrape--- description: "The out-of-tree wechat_scrape tool: retrieves WeChat official-account articles, filters promotional blocks, and saves each as a Markdown file, for maintainers of this machine's dsh profiles." kind: "package-reference" ---Ab Market Researchdsh-ab-market-researchAn out-of-tree DeepSeek Harness plugin: the trade_search tool (multi-round aspect-broadening query planning, publisher-tier ranking, source diversity, JSON snapshot) and its browser card in one package.Arisdsh-arisARIS research-workflow skills as a DeepSeek Harness bundle: 82 skills plus cross-model adversarial review through Codex.

README

dsh-upm

ui-ux-pro-max 的 DeepSeek Harness 原生插件。

上游是一套「设计智能」数据库 + Python 检索引擎:79 种可检索风格、192 套产品配色与推理档案、74 组字体搭配、119 条 UX 准则、105 个精选图标、17 个 GSAP 动效预设、25 类图表、22 个技术栈。用它的传统方式是把技能目录拷进宿主、再在终端里敲 python .../search.py。

本插件做了三件上游做不到的事:

  1. 把技能做成插件:进程内注册 upm-provider,技能与数据随包走,不再依赖你把仓库 clone 到某个固定路径。
  2. 把检索变成工具:上游的 search.py 包成 upm_search / upm_stack / upm_design_system,模型直接调用,不必手写命令行;另有 upm_domains 与 upm_status 两个不启动 Python 的自检入口。
  3. 随上游自动重新封装:GitHub Actions 定时比对上游 commit,有更新就重新打包并开 PR。

结构参考 dsh-taste(插件自带技能 + skill provider + 原生工具 + 原生命令),执行层用 DSH 官方 subprocess、argv 数组、无 shell。零运行时依赖——但需要一个 Python 解释器,见下。

先决条件:一个 Python 3.8+

上游的检索引擎是 Python(search.py + core.py + design_system.py),这是本插件与 dsh-taste 唯一的结构性差别:dsh-taste 能直接用宿主的 process.execPath 跑脚本,而这里必须先找到一个可用的 Python。插件不捆绑 Python(那样包会大得离谱,还要处理三平台的发行版)。

插件按这个顺序找一个能用的解释器:

  1. 配置里的 pythonPath;
  2. 环境变量 DSH_UPM_PYTHON;
  3. python → python3 → py -3。

配置了 pythonPath 就只用它,失败直接报错而不是静默换一个——否则你以为配置生效了,实际跑在另一个解释器上,是最难查的那类问题。探测结果会在插件实例内缓存,不会每次调用都付启动成本。

装 Python:

winget install Python.Python.3.12     # Windows
brew install python                   # macOS
sudo apt install python3              # Debian / Ubuntu

装好后重启 DSH。随时可以用 upm_status 确认插件到底找到了哪个解释器;upm_domains 不启动 Python,所以在没有 Python 的机器上它照样能列出有哪些域与栈。

安装

dsh plugin --profile <profile> add github:qizhuxu/dsh-upm

安装后重启 DSH(插件在宿主启动时加载,没有热重载)。装好后 upm_status 会告诉你打包版本、上游 commit 与 Python 解释器。

desktop profile 例外:它由 Electron 应用独占管理,CLI 会直接拒绝—— error: profile "desktop" is managed exclusively by the Electron application。 装在 desktop 上要走 GUI 的插件面板,或直接改它自己的依赖清单(GUI 写的也是同一个文件):

{
  "dependencies": { "dsh-upm": "github:qizhuxu/dsh-upm" },
  "dsh": { "profile": { "bundles": ["…", "dsh-upm"] } }
}

改完在该 profile 目录跑 pnpm install,然后重启 DSH。pnpm 会把解析到的 commit 写进 pnpm-lock.yaml(形如 codeload.github.com/qizhuxu/dsh-upm/tar.gz/<sha>), node_modules/dsh-upm 是一份实体副本,不是软链。

从 Git 仓库装的包少了什么

npm/pnpm 按 package.json 的 files 字段打包,所以从 GitHub 装下来的副本里 没有 scripts/vendor.mjs、test/、.github/、upstream.config.json。运行期一样不缺 (技能、数据、lib/ 都在),但想在本地重新 vendor 或跑测试,请 clone 源码仓库而不是在这个副本里操作。

从本地目录开发安装

改代码时不想每次重新打包,就用软链依赖:把 profile 的 package.json 里加上

{
  "dependencies": { "dsh-upm": "link:/path/to/dsh-upm" },
  "dsh": { "profile": { "bundles": ["…", "dsh-upm"] } }
}

再在该 profile 目录跑 pnpm install。link: 会让 node_modules/dsh-upm 直接指向源码目录, 改完源码重启 DSH 即可生效(仍然没有热重载)。

想把 link: 换回 GitHub 依赖,把那行改回 github:qizhuxu/dsh-upm 再 pnpm install 即可—— pnpm 会把软链换成实体副本,不必手动删目录。

更新(这一步很容易踩坑)

pnpm 会把 git 依赖钉在解析时的那个 commit 上,写进 profile 的 pnpm-lock.yaml。所以:

  • 新增一个插件版本不会自动来到你机器上。 上游更新、CI 自动开 PR 并合并之后,你的安装仍然停在旧 commit。

  • 在插件面板「重装/更新」也不一定会移动这个 pin——如果它按 lockfile 落地,那只是把旧版本重新铺一遍。

  • 想真正升上去,让 pnpm 重新解析:

    cd ~/.dsh/profiles/<profile>
    pnpm update dsh-upm --lockfile-only   # 重新解析,只改 lockfile
    pnpm install --frozen-lockfile        # 按新解析落地
    

    然后重启 DSH。

  • 不要手动往 node_modules/dsh-upm 里复制文件来「更新」:能立刻生效,但下一次插件重装会把整个目录按 lockfile 铺回去,改动全丢。

skills 面只有一条命令

上游只有一个技能,本插件把它注册成一条,而且名字改成与插件同名,所以 skills 面只留下一条:

/dsh-upm      ← 只有这一条,执行的是上游完整工作流(含 10 条优先级规则与检索契约)

上游原名是 ui-ux-pro-max。改成 dsh-upm 是为了让「一个插件 = 一条命令」一眼可见。 想换别的名字用配置里的 primaryName;想保留上游原名就设 primaryName: ui-ux-pro-max。

正文被补了「在 DSH 里怎么跑」

上游 SKILL.md 通篇假设你能在终端里敲 python "${CLAUDE_PLUGIN_ROOT}/.claude/skills/ui-ux-pro-max/scripts/search.py" ...。在 DSH 里这句话不成立——模型手上的工具是 upm_search / upm_stack / upm_design_system,不是 bash。

所以插件在加载技能时,在正文开头插入一段运行时说明,含一张「CLI 参数 → 工具参数」的对照表,并在末尾追加数据与参考文件的绝对路径:

上游正文里写的在 DSH 里改成
search.py "<q>" --domain <d>upm_search { query, domain }
search.py "<q>" --stack <s>upm_stack { query, stack }
search.py "<q>" --design-system -p "<n>"upm_design_system { query, projectName }
-n <max> / --json / --fullmaxResults / json / full
-f ascii|markdownformat
--persist --output-dir "<root>" --page <p> --forcepersist / outputDir / page / force
--variance/--motion/--density <1-10>variance / motion / density

上游文件本身一个字节都不改,vendor.mjs --check 因此仍然可用。

另外两条命令

工作流里反复要跑的入口,额外注册成原生命令——不经模型、不花 token,敲了直接出结果:

/upm-search <检索词> [--domain 域 | --stack 栈] [-n 条数] [--json] [--full]
/upm-ds     <产品类型 行业 关键词> [-p 项目名] [-f ascii|markdown] [--variance 1-10] [--motion 1-10] [--density 1-10] [--persist -o 项目根] [--page 页面] [--force] [--json]

例子:

/upm-search "keyboard focus modal" --domain ux -n 5
/upm-search "suspense streaming bundle" --stack nextjs
/upm-ds "beauty spa wellness service" -p "Serenity Spa"
/upm-ds "internal analytics dashboard" -p "Ops Console" --variance 8 --motion 7 --density 8 --persist -o "D:\work\ops-console"

--domain 与 --stack 只能给一个(两者是不同模式,混用会让另一项被静默忽略,所以直接报错)。路径含空格时用双引号包起来。

/upm-ds --persist 不写 -o 时会落到当前会话的工作目录——上游反复强调要显式指定输出目录,插件替你补了这个默认值,避免文件写进宿主的安装目录。

工具

工具作用
upm_status自检:打包版本、上游 commit、数据规模、数据目录、实际使用的 Python 解释器。排查问题先跑它
upm_domains列出 12 个搜索域与 22 个技术栈,附真实条目数与长文参考清单(纯 JS,不启动 Python)
upm_search按域检索:风格、配色、字体搭配、UX 准则、图表、落地页、图标、动效、React 性能、App 界面、Google 字体
upm_stack按技术栈检索实现准则(22 个栈)
upm_design_system生成完整设计系统:模式、风格、配色、字体、动效、要避开的反模式;可持久化成 design-system/<slug>/MASTER.md

12 个搜索域

域内容
style风格库:关键词、适用场景、配色与动效、实现清单、设计变量
color按产品类型的 192 套调色板,含语义色与前景/背景配对
chart25 类图表选型:何时用/何时不用、可访问性、库推荐
landing页面结构与分区顺序、CTA 位置、转化优化
product192 种产品类型的风格/落地页/仪表盘推荐
ux119 条 UX 准则:Do/Don't、好坏代码示例、严重度
typography74 组字体搭配:标题/正文字体、Google Fonts 导入、Tailwind 配置
icons105 个精选图标:库、导入代码、语义角色、使用语境
gsap17 个 GSAP 预设:强度档位、时长曲线、可运行片段
reactReact / Next.js 性能模式与反模式
webiOS / Android / React Native 原生界面准则
google-fonts1934 个可检索字体家族:分类、字重、子集、流行度

22 个技术栈

react · nextjs · vue · svelte · astro · swiftui · react-native · flutter · nuxtjs · nuxt-ui · html-tailwind · shadcn · jetpack-compose · threejs · angular · laravel · javafx · wpf · winui · avalonia · uno · uwp

设计拨盘(只对 upm_design_system 有效)

拨盘1–34–78–10
variance居中 / 极简均衡 / 现代大胆 / 非对称(Brutalism、Bento)
motion克制微交互标准滚动与错峰复杂编排(pin / Flip / SplitText),附 GSAP 片段
density疏朗(24–96px 间距)标准(16–64px)密集仪表盘(8–32px)

不设某个拨盘时,那部分输出与不传完全一致。

检索词要围绕一个主意图、2–5 个有意义的词("keyboard focus modal",而不是一整张检查清单)。0 结果时换更窄的词或显式指定 domain 重试一次;再不行就明说「没有命中数据库」,不要把通用建议伪装成命中结果——上游脚本自己也会这么提示。

配置

在 profile 的 cordis.patch.yml 里覆盖插件行:

- id: dsh-upm
  name: dsh-upm
  config:
    # pythonPath: C:\Python312\python.exe   # 默认自动探测 python → python3 → py -3
    # pythonPath: ["py", "-3"]             # 需要带固定参数时用数组
    # primaryName: dsh-upm                 # 主技能对外暴露的名字,即 /命令
    # rank: 380                            # 技能优先级,越小越优先
    # maxResults: 3                        # 不带 -n 时的默认条数(1–20)
    # timeoutMs: 300000                    # 单次脚本执行超时(10000–3600000)
    # graceMs: 10000                       # 终止宽限(1000–120000)

rank 为什么是 380

DSH 里 rank 越小越优先,用户级目录是 400,项目级是 100/200/300:

来源rank
项目 .dsh/skills100
项目 .agents/skills200
自定义目录300
本插件380
用户 ~/.dsh/skills400
用户 ~/.agents/skills500
DSH 内建600

所以插件版本会压过你 ~/.dsh/skills 里手装的那一份,但项目级副本仍然能覆盖插件。

关于技能面板的启用/停用开关

DSH 的技能面板(dsh-client-ui-skill-explorer)的开关是改写 SKILL.md 的 disable-model-invocation。 本插件在 list()/get() 时会实时读一次该字段并覆盖打包快照,所以面板上的开关是真生效的(打包清单只作为缺省值)。改完在面板里刷新即可,不必重装。

随上游自动更新

.github/workflows/upstream-sync.yml 每天跑一次:

  1. node scripts/vendor.mjs --check —— 比对上游 commit、重算本地打包内容的逐文件 hash。无漂移就安静结束。
  2. 检测到漂移 → 重新 vendoring → 递增 patch 版本 → 跑测试 → 提交到一个分支 → 开 PR。

本地随时可以自己跑:

node scripts/vendor.mjs                                  # 重新打包(联网,按 commit 浅克隆上游)
node scripts/vendor.mjs --check                          # 只比对,有漂移以退出码 1 结束
node scripts/vendor.mjs --from <上游仓库的本地副本>       # 离线打包

--from 用的本地副本必须是未被换行转换的 clone。Windows 上直接 git clone 会把 LF 变成 CRLF, 那样打出来的包 treeHash 与上游对不上,脚本会直接失败并提示。要离线用,请先 git -c core.autocrlf=false -c core.eol=lf clone <repo> <dir>。

打包为什么是可复现的

  • 按 commit 固定:先 git ls-remote 解析 ref 到具体 sha,再浅克隆该 sha。
  • 关掉换行转换:Windows 上 core.autocrlf 会把签出的 LF 变成 CRLF,导致与上游 git 的字节不一致;克隆显式 -c core.autocrlf=false -c core.eol=lf。.gitattributes 里 skills/** -text 保证签出也不会改写这些字节。
  • 哈希与遍历顺序无关:readdir 的返回顺序不保证(NTFS 与 ext4 不同),所以文件清单按名称排序、再按路径排序后才计算 treeHash。不这么做的话,同一份内容在 Windows 与 Linux 上会算出两个值,CI 会误报漂移。
  • 不让解释器写字节码:所有 Python 调用都带 -B,vendor 的遍历与复制后清理也会跳过 __pycache__ / *.pyc。否则任何人跑过一次检索,技能目录里就会多出几个 .pyc,--check 立刻报「有人改过打包内容」——那个报错会把人引到完全错误的方向(这是实测踩到的坑,不是假设)。

skills/ 由 scripts/vendor.mjs 生成,不要手改——改了 --check 会报 treeHash 不符。

首次发布后必须做的一步:允许 Actions 开 PR

GitHub 默认不允许 Actions 创建 PR。workflow 里的 pull-requests: write 只给了 token 权限, 真正的闸门是仓库级的另一个开关。不打开它,CI 照样能把分支推上去,但开 PR 那一步会失败:

pull request create failed: GraphQL: GitHub Actions is not permitted to create or approve pull requests

打开方式:仓库 Settings → Actions → General → Workflow permissions,勾选 「Allow GitHub Actions to create and approve pull requests」。或者用 API:

curl -X PUT -H "Authorization: token $GH_TOKEN" \
  https://api.github.com/repos/<owner>/<repo>/actions/permissions/workflow \
  -d '{"default_workflow_permissions":"write","can_approve_pull_request_reviews":true}'

这条是实测踩到的:在临时仓库里演练漂移时,前十步(重新封装、bump 版本、跑测试、自检) 全绿,只有第 11 步失败,而失败原因只出现在日志最后两行。

定时任务会被暂停

GitHub 会在仓库连续 60 天没有提交活动后自动停用 scheduled workflow。届时到 Actions 页面点「Enable workflow」即可恢复(或手动 workflow_dispatch)。 本项目在两次上游更新之间本来就没有提交,所以这条迟早会遇到——workflow 同时保留 push 与 workflow_dispatch 两个触发器,就是为了让恢复动作只需要点一下。

上游清单与排除项

upstream.config.json 声明上游仓库、技能目录、主技能与要排除的路径。被排除的只有「上游构建期用得到、运行期用不到」的东西(约 1.5 MB):

排除项为什么
scripts/tests上游自己的 Python 单测与 fixture
data/phosphor-icons-upstream.json图标上游快照,只给上游的刷新/校验脚本用
data/google-font-licenses.json字体许可清单,同上
data/data-provenance.json数据出处明细,只给 validate_data.py 用

搜索行为完全不受影响——core.py 与 design_system.py 都不读它们。清单里记了 excluded 字段说明每一项的去向。

上游新增数据文件会自动纳入,不需要改代码。上游新增 domain 或 stack 时,需要同步 lib/catalog.js 的内置表——漏改会被测试抓到(测试会拿 core.py 校验一致性)。

打包内容说明

  • skills/upm.manifest.json —— 运行期唯一的数据源。vendor 时就把 frontmatter 解析好(含 > / >- 折叠块),所以运行期不解析 YAML,插件没有 YAML 依赖,也不会因为上游换写法而在加载期失败。
  • upstream.lock.json —— 记录上游 commit 与每个文件的 hash,供 CI 判断漂移。
  • skills/UPSTREAM-LICENSE.txt —— 上游 MIT 许可全文。
  • NOTICE.md —— 第三方内容说明。

中文文档

文件内容
docs/zh/SKILL.zh.md上游主技能全文翻译:何时适用、10 条优先级规则、查询契约、工作流、拨盘、0 结果怎么办、交付前检查

译文由机器翻译整理,以英文原文为准;skills/ 目录是上游内容的逐字节副本,不受翻译影响,也不在 vendor.mjs 的同步范围内。长文参考(references/quick-reference.md 119 条准则、references/pro-rules.md 交付清单)保留英文原文,需要时按绝对路径直接读。

开发

node scripts/vendor.mjs             # 重新打包
node --test test/plugin.test.mjs    # 37 项插件级测试(假 ctx + 真实 subprocess 垫片,真的跑 Python)
node scripts/vendor.mjs --check     # 比对上游与本地打包内容

许可

MIT。skills/ 下的内容来自 nextlevelbuilder/ui-ux-pro-max-skill(MIT),版权归原作者所有。