Official website for the dsh-plugins organization — open-source plugins for DeepSeek Harness.
🌐 https://dsh-plug.in (GitHub Pages + custom domain)
- Vite 7 · Vue 3.5 · TypeScript 5.9
- No UI framework — hand-rolled design system (CSS custom properties)
- Hand-rolled i18n (zh-CN primary / en), persisted in
localStorage
pnpm install # pnpm 11+; builds approved via pnpm-workspace.yaml
pnpm dev # http://localhost:5173
pnpm build # vue-tsc type-check + vite build → dist/
pnpm preview # serve the production build
?preview=1renders every scroll-reveal section immediately (used for screenshots / design reviews).
├── public/ # copied verbatim into dist/
│ ├── CNAME # dsh-plug.in (custom domain)
│ ├── .nojekyll # skip GitHub Pages Jekyll processing
│ ├── favicon-32.png # favicon 32px (org avatar)
│ ├── favicon-180.png # favicon / apple-touch-icon 180px
│ ├── logo-avatar.png # navbar brand mark (org avatar)
│ ├── org-avatar.png # org avatar source (460×460)
│ ├── logo.svg # brand mark (full)
│ └── og.png # Open Graph banner (1200×630)
├── scripts/og/ # OG banner sources + regeneration
│ ├── og.html # composed banner (art + type)
│ ├── og-bg.jpg # cropped/compressed art (1200×630)
│ └── art-source.png # original AI art (1792×1024)
├── src/
│ ├── styles/ # tokens.css (design system) + base.css
│ ├── i18n/ # zh.ts / en.ts / index.ts (reactive lang)
│ ├── data/plugins.ts # plugin metadata (sourced from the GitHub org)
│ └── components/ # sections + ui/ primitives
└── index.html # meta + Open Graph/Twitter tags
The site is served by GitHub Pages from the main branch root:
pnpm buildand commitdist/contents to the repo root (or use a Pages workflow withvite build→ deploydist/).- The
CNAMEfile (dsh-plug.in) is committed at the root so Pages publishes the custom domain. - Point
dsh-plug.inat the Pages host per GitHub's custom-domain docs, then enable Enforce HTTPS.
Content is generated from the live GitHub org (repos, versions, licenses) —
update src/data/plugins.ts and the i18n dictionaries as plugins evolve.
Two workflows keep the static API snapshots fresh. Both write with
GITHUB_TOKEN, which does not cascade into deploy.yml, so each workflow
performs its own Pages deploy.
| Feed | URL | Source | Trigger |
|---|---|---|---|
| Plugin market | /api/plugins.json, /api/dsh-plugins.json |
dsh-plugin-market repo + npm/GitHub versions |
every three hours, repository_dispatch, manual |
| DSH news | /api/news.md |
deepseek-harness releases | hourly cron (news.yml) |
Both feed workflows check out the latest main and commit their generated
snapshots back to main after a successful deployment. News deployments also
refresh and commit both market catalogs so publishing news keeps the market
current. Unchanged snapshots do not create an extra commit.
The news feed is built from two inputs by scripts/generate-news.mjs:
scripts/news/manual.mdis the hand-written baseline. Its header, curated wording, highlight taglines (>!…!<) and older entries are copied verbatim into the output. Edit this file to fix or rewrite an entry — the generator never touches it.- The deepseek-harness releases supply entries only for versions the baseline does not cover yet, so a new release appears on the feed without anyone editing the page. Only the Chinese half of a release body is kept; section headings are normalized onto 新增功能 / 体验优化 / 问题修复 / 其他变更 / SDK, contributor handles move to the end of each bullet, and announcements, blockquotes and the English half are dropped.
Both inputs are deterministic, so when no release changed the script reports
changed=false and the workflow skips the commit, build and deploy entirely.
pnpm news # rebuild public/api/news.md from manual.md + releases# 1. update scripts/og/og.html with new copy
# 2. re-render with headless Edge:
msedge --headless=new --disable-gpu --force-device-scale-factor=1 `
--window-size=1200,630 --virtual-time-budget=6000 `
--user-data-dir="$env:TEMP\edge-og" `
--screenshot="public/og.png" "file:///…/scripts/og/og.html"Site content © 2026 dsh-plugins organization. The plugins themselves are
licensed separately (see src/data/plugins.ts): LGPL-3.0, BSD-3-Clause,
MIT and GPL-3.0.
public/api/plugins.json 保留市场描述符,public/api/dsh-plugins.json 提供官方 format: 1 索引。
两个文件由 pnpm sync:market 一起生成,工作流每三小时执行,并在网站部署前同步。
plugins.json 的 name 可以是字符串或语言对象;生成器复用官方索引的 npm locale meta.title,按 {zh, en, en-US, zh-CN} 输出(中文族取 zh/zh-cn,英文族取 en/en-us,缺一族时只输出该族两键),没有本地化标题的条目保留描述符字符串。
生成器读取 npm 的 latest/next 标签和 GitHub 的最新稳定版、预发布版标签;同版本优先 npm。
描述采用市场描述符,语言键统一小写;缺少 en 时优先复制 en-us,否则使用首个语言文本;缺少 zh 时复制 zh-cn,显式提供的 zh 优先。
显示名称与图标优先读取 npm next 对应的精确版本;没有 next 时读取 latest。生成器通过 jsDelivr 文件列表发现 exports 声明的 ./locale/*.json 或具体 locale 路径,从各语言 JSON 的 meta.title 生成多语言 title 与 plugins.json 的 name 对象,并按相同规则补充默认语言键。语言键归一化后,精确导出优先于通配导出。
图标优先使用包的顶层 icon,其次使用 exports["./icon"];生成的 icon 为固定精确版本的 https://cdn.jsdelivr.net/npm/<包名>@<版本>/<资源路径>,支持 SVG、PNG、JPEG 和 WebP。资源声明使用包内相对路径字符串;locale 最大 1 MiB,图标最大 256 KiB。
未声明资源或没有 locale 标题时保留描述符名称,未声明图标时省略 icon。已声明文件缺失、路径非法、标题非法或 CDN 请求失败会终止生成,避免将不完整的目录发布上线。
任何网络或校验错误会终止部署。使用 pnpm sync:market --input ../dsh-plugin-market/plugins.json 可以从本地聚合文件生成。
版本区间以分号分隔并取并集,预发布版本参与比较;官方索引中的范围转换为标准 SemVer 表达式。
运行 pnpm test:market 验证范围与索引生成,运行 pnpm build 验证网站产物。