dsh-plugin 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -55,12 +55,14 @@ Every DSH plugin links back to its GitHub source repository with stars, forks an
55
55
 
56
56
  ## Install DSH-Plugin Hub
57
57
 
58
- Local install:
58
+ Install from npm (recommended):
59
59
 
60
60
  ```bash
61
61
  dsh plugin --profile web add dsh-plugin
62
62
  ```
63
63
 
64
+ The plugin is published to the npm registry as `dsh-plugin` — one command installs and it just works, no build step required.
65
+
64
66
  Install from GitHub:
65
67
 
66
68
  ```bash
package/README.md CHANGED
@@ -55,12 +55,14 @@ DSH-Plugin 插件中心收录 **4,261** 个 DeepSeek Harness Plugin(DSH)插
55
55
 
56
56
  ## 安装 DSH-Plugin Hub
57
57
 
58
- 本地安装:
58
+ 从 npm 安装(推荐):
59
59
 
60
60
  ```bash
61
61
  dsh plugin --profile web add dsh-plugin
62
62
  ```
63
63
 
64
+ 插件已发布到 npm registry(包名 `dsh-plugin`),一条命令即可安装使用,无需任何构建。
65
+
64
66
  从 GitHub 安装:
65
67
 
66
68
  ```bash
package/client/client.js CHANGED
@@ -6,7 +6,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  let react = require("react");
8
8
  //#region \0dsh-css:src/client/Section.module.css.mjs
9
- const css = ".XlLbKa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;gap:8px;display:flex}.XlLbKa_header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:2px 2px 0;display:flex}.XlLbKa_brand{align-items:center;gap:10px;min-width:0;display:flex}.XlLbKa_brandText{flex-direction:column;gap:1px;min-width:0;display:flex}.XlLbKa_title{margin:0;font-size:14px;font-weight:600;line-height:20px}.XlLbKa_tagline{color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.XlLbKa_controls{flex-shrink:0;align-items:center;gap:8px;display:flex}.XlLbKa_adBanner{color:#fff;cursor:pointer;background:linear-gradient(90deg,#4f46e5 0%,#7c3aed 100%);border:1px solid #8b5cf68c;border-radius:8px;align-items:center;gap:8px;padding:7px 12px;text-decoration:none;transition:filter .15s,box-shadow .15s;display:flex;box-shadow:0 2px 10px #4f46e547}.XlLbKa_adBanner:hover{filter:brightness(1.1);box-shadow:0 4px 16px #7c3aed6b}.XlLbKa_adBadge{letter-spacing:.04em;color:#fff;white-space:nowrap;background:#ffffff29;border:1px solid #ffffff8c;border-radius:4px;flex-shrink:0;padding:3px 6px;font-size:10px;font-weight:700;line-height:1}.XlLbKa_adText{text-overflow:ellipsis;white-space:nowrap;color:#fff;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.XlLbKa_adArrow{color:#fff;flex-shrink:0;margin-left:auto;font-size:13px}.XlLbKa_search{width:190px;color:inherit;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:0 0;border-radius:6px;outline:none;padding:4px 9px;font-size:12px;line-height:18px;transition:border-color .12s}.XlLbKa_search::placeholder{color:var(--dsw-alias-label-tertiary,#8b93a1)}.XlLbKa_search:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_sort{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;background:0 0;border-radius:6px;outline:none;padding:4px 8px;font-size:12px;line-height:18px}.XlLbKa_sort:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_langBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;background:0 0;border-radius:6px;flex-shrink:0;padding:4px 9px;font-size:12px;line-height:18px;transition:color .12s,border-color .12s}.XlLbKa_langBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_openBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;align-items:center;gap:4px;padding:3px 9px;font-size:12px;font-weight:500;line-height:20px;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.XlLbKa_openBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_openArrow{font-size:12px;line-height:1}.XlLbKa_tabs{border-bottom:1px solid var(--dsw-alias-border-l1,#eceef1);flex-wrap:wrap;align-items:center;gap:6px;padding:2px 2px 8px;display:flex}.XlLbKa_tab,.XlLbKa_tabActive{cursor:pointer;border:1px solid #0000;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:3px 10px;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.XlLbKa_tab{color:var(--dsw-alias-label-secondary,#6b7280);border-color:var(--dsw-alias-border-l2,#e5e7eb);background:0 0}.XlLbKa_tab:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-border-l1,#eceef1)}.XlLbKa_tabActive{color:#fff;background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_tabCount,.XlLbKa_tabCountActive{text-align:center;border-radius:999px;min-width:16px;padding:0 5px;font-size:10px;line-height:14px}.XlLbKa_tabCount{color:var(--dsw-alias-label-tertiary,#8b93a1);background:var(--dsw-alias-bg-layer-2,#8080801a)}.XlLbKa_tabActive .XlLbKa_tabCountActive{color:#fff;background:#ffffff38}.XlLbKa_body{flex-direction:column;flex:1;min-height:0;display:flex}.XlLbKa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}.XlLbKa_card{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#8080800f);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}.XlLbKa_card:hover{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#8080801a)}.XlLbKa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}.XlLbKa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}.XlLbKa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.XlLbKa_categoryBadge,.XlLbKa_verified{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.XlLbKa_categoryBadge{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-button-ghost-active-border,#4f6ef740)}.XlLbKa_verified{color:var(--dsw-alias-state-success-primary,#1a7f37);border-color:var(--dsw-alias-state-success-secondary,#1a7f374d)}.XlLbKa_desc{color:var(--dsw-alias-label-secondary,#6b7280);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.XlLbKa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}.XlLbKa_topic{color:var(--dsw-alias-label-tertiary,#8b93a1);background:var(--dsw-alias-bg-layer-2,#8080801a);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.XlLbKa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}.XlLbKa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}.XlLbKa_star{color:var(--dsw-alias-state-warn-primary,#b8860b);white-space:nowrap;font-size:11px;line-height:16px}.XlLbKa_fork{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:16px}.XlLbKa_date{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:10px;line-height:14px}.XlLbKa_installBtn,.XlLbKa_installBtnCopied,.XlLbKa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}.XlLbKa_installBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:0 0}.XlLbKa_installBtn:hover{color:#4f6ef7;border-color:#4f6ef7}.XlLbKa_detailBtn{color:#4f6ef7;background:0 0;border:1px solid #4f6ef7;align-items:center;font-weight:500;text-decoration:none;display:inline-flex}.XlLbKa_detailBtn:hover{color:#fff;background:#4f6ef7}.XlLbKa_actions{align-items:center;gap:6px;display:flex}.XlLbKa_installBtnCopied{color:#fff;background:#4f6ef7;border:1px solid #4f6ef7}.XlLbKa_toast{z-index:1000;color:#f9fafb;pointer-events:none;white-space:nowrap;background:#111827;border:1px solid #ffffff1a;border-radius:8px;padding:10px 16px;font-size:12px;line-height:18px;animation:.22s ease-out XlLbKa_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000038}@keyframes XlLbKa_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.XlLbKa_state{text-align:center;min-height:160px;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}.XlLbKa_stateTitle{color:var(--dsw-alias-label-primary,#1f2328);font-size:13px;font-weight:600}.XlLbKa_stateDesc{max-width:420px}.XlLbKa_retryBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;background:0 0;border-radius:6px;margin-top:4px;padding:4px 12px;font-size:12px;line-height:18px}.XlLbKa_retryBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_footer{border-top:1px solid var(--dsw-alias-border-l1,#eceef1);flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;padding:6px 4px 0;display:flex}.XlLbKa_footText{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.XlLbKa_footLink{color:var(--dsw-alias-brand-primary,#4f6ef7);white-space:nowrap;font-size:11px;line-height:16px;text-decoration:none}.XlLbKa_footLink:hover{text-decoration:underline}";
9
+ const css = ".XlLbKa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;gap:8px;display:flex}.XlLbKa_header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:2px 2px 0;display:flex}.XlLbKa_brand{align-items:center;gap:10px;min-width:0;display:flex}.XlLbKa_brandText{flex-direction:column;gap:1px;min-width:0;display:flex}.XlLbKa_title{margin:0;font-size:14px;font-weight:600;line-height:20px}.XlLbKa_tagline{color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.XlLbKa_controls{flex-shrink:0;align-items:center;gap:8px;display:flex}.XlLbKa_adBanner{color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;background:linear-gradient(90deg,#4f46e5 0%,#7c3aed 100%);border:1px solid #8b5cf68c;border-radius:8px;align-items:center;gap:8px;padding:7px 12px;text-decoration:none;transition:filter .15s,box-shadow .15s;display:flex;box-shadow:0 2px 10px #4f46e547}.XlLbKa_adBanner:hover{filter:brightness(1.1);box-shadow:0 4px 16px #7c3aed6b}.XlLbKa_adBadge{letter-spacing:.04em;color:#fff;white-space:nowrap;background:#ffffff29;border:1px solid #ffffff8c;border-radius:4px;flex-shrink:0;padding:3px 6px;font-size:10px;font-weight:700;line-height:1}.XlLbKa_adText{text-overflow:ellipsis;white-space:nowrap;color:#fff;min-width:0;font-size:12px;line-height:18px;overflow:hidden}.XlLbKa_adArrow{color:#fff;flex-shrink:0;margin-left:auto;font-size:13px}.XlLbKa_search{width:190px;color:inherit;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:0 0;border-radius:6px;outline:none;padding:4px 9px;font-size:12px;line-height:18px;transition:border-color .12s}.XlLbKa_search::placeholder{color:var(--dsw-alias-label-tertiary,#8b93a1)}.XlLbKa_search:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.XlLbKa_sort{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;outline:none;padding:4px 8px;font-size:12px;line-height:18px}.XlLbKa_sort:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-button-ghost-active-border,#d0d4da)}.XlLbKa_langBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;flex-shrink:0;padding:4px 9px;font-size:12px;line-height:18px;transition:color .12s,border-color .12s}.XlLbKa_langBtn:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-button-ghost-active-border,#d0d4da)}.XlLbKa_openBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;flex-shrink:0;align-items:center;gap:4px;padding:3px 9px;font-size:12px;font-weight:500;line-height:20px;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.XlLbKa_openBtn:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-button-ghost-active-border,#d0d4da)}.XlLbKa_openArrow{font-size:12px;line-height:1}.XlLbKa_tabs{border-bottom:1px solid var(--dsw-alias-border-l1,#eceef1);flex-wrap:wrap;align-items:center;gap:6px;padding:2px 2px 8px;display:flex}.XlLbKa_tab,.XlLbKa_tabActive{cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;border-radius:999px;flex-shrink:0;align-items:center;gap:6px;padding:3px 10px;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.XlLbKa_tab{color:var(--dsw-alias-label-secondary,#6b7280);border-color:var(--dsw-alias-border-l2,#e5e7eb);background:0 0}.XlLbKa_tab:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-border-l1,#eceef1)}.XlLbKa_tabActive{color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-button-primary-fill,#1f2328);border-color:var(--dsw-alias-button-primary-fill,#1f2328)}.XlLbKa_tabCount,.XlLbKa_tabCountActive{text-align:center;border-radius:999px;min-width:16px;padding:0 5px;font-size:10px;line-height:14px}.XlLbKa_tabCount{color:var(--dsw-alias-label-tertiary,#8b93a1);background:var(--dsw-alias-bg-layer-2,#8080801a)}.XlLbKa_tabActive .XlLbKa_tabCountActive{color:var(--dsw-alias-label-primary-foreground,#fff);background:#80808038}.XlLbKa_body{flex-direction:column;flex:1;min-height:0;display:flex}.XlLbKa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}.XlLbKa_card{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#8080800f);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}.XlLbKa_card:hover{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#8080801a)}.XlLbKa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}.XlLbKa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}.XlLbKa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.XlLbKa_categoryBadge,.XlLbKa_verified{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.XlLbKa_categoryBadge{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-button-ghost-active-border,#4f6ef740)}.XlLbKa_verified{color:var(--dsw-alias-state-success-primary,#1a7f37);border-color:var(--dsw-alias-state-success-secondary,#1a7f374d)}.XlLbKa_desc{color:var(--dsw-alias-label-secondary,#6b7280);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.XlLbKa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}.XlLbKa_topic{color:var(--dsw-alias-label-tertiary,#8b93a1);background:var(--dsw-alias-bg-layer-2,#8080801a);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}.XlLbKa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}.XlLbKa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}.XlLbKa_star{color:var(--dsw-alias-state-warn-primary,#b8860b);white-space:nowrap;font-size:11px;line-height:16px}.XlLbKa_fork{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:16px}.XlLbKa_date{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:10px;line-height:14px}.XlLbKa_installBtn,.XlLbKa_installBtnCopied,.XlLbKa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}.XlLbKa_installBtn{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#8080800f);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);-webkit-user-select:none;user-select:none}.XlLbKa_installBtn:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#8080801f);border-color:var(--dsw-alias-button-ghost-active-border,#d0d4da)}.XlLbKa_detailBtn{color:var(--dsw-alias-label-primary-foreground,#fff);background:var(--dsw-alias-button-primary-fill,#1f2328);-webkit-user-select:none;user-select:none;border:1px solid #0000;align-items:center;font-weight:500;text-decoration:none;display:inline-flex}.XlLbKa_detailBtn:hover{background:var(--dsw-alias-button-primary-hover,#43454a)}.XlLbKa_actions{align-items:center;gap:6px;display:flex}.XlLbKa_installBtnCopied{color:var(--dsw-alias-state-success-primary,#1a7f37);border:1px solid var(--dsw-alias-state-success-secondary,#1a7f3766);-webkit-user-select:none;user-select:none;background:#22c55e24}.XlLbKa_toast{z-index:1000;background:var(--dsw-alias-button-primary-fill,#1f2328);color:var(--dsw-alias-label-primary-foreground,#fff);pointer-events:none;white-space:nowrap;border:1px solid #0000;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out XlLbKa_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes XlLbKa_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.XlLbKa_state{text-align:center;min-height:160px;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}.XlLbKa_stateTitle{color:var(--dsw-alias-label-primary,#1f2328);font-size:13px;font-weight:600}.XlLbKa_stateDesc{max-width:420px}.XlLbKa_retryBtn{color:var(--dsw-alias-label-secondary,#6b7280);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;margin-top:4px;padding:4px 12px;font-size:12px;line-height:18px}.XlLbKa_retryBtn:hover{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-interactive-bg-hover,#80808014);border-color:var(--dsw-alias-button-ghost-active-border,#d0d4da)}.XlLbKa_footer{border-top:1px solid var(--dsw-alias-border-l1,#eceef1);flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;padding:6px 4px 0;display:flex}.XlLbKa_footText{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.XlLbKa_footLink{color:var(--dsw-alias-brand-primary,#4f6ef7);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}.XlLbKa_footLink:hover{text-decoration:underline}";
10
10
  const tagId = "dsh-plugin/Section.module.css";
11
11
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
12
12
  const tag = document.createElement("style");
@@ -16,56 +16,56 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
16
16
  document.head.appendChild(tag);
17
17
  }
18
18
  var Section_module_css_default = {
19
- "date": "XlLbKa_date",
20
- "controls": "XlLbKa_controls",
21
- "sort": "XlLbKa_sort",
22
- "categoryBadge": "XlLbKa_categoryBadge",
19
+ "list": "XlLbKa_list",
20
+ "cardSide": "XlLbKa_cardSide",
21
+ "tabs": "XlLbKa_tabs",
22
+ "openBtn": "XlLbKa_openBtn",
23
+ "fork": "XlLbKa_fork",
24
+ "installBtnCopied": "XlLbKa_installBtnCopied",
23
25
  "detailBtn": "XlLbKa_detailBtn",
24
- "card": "XlLbKa_card",
25
- "desc": "XlLbKa_desc",
26
- "footLink": "XlLbKa_footLink",
27
- "adBadge": "XlLbKa_adBadge",
26
+ "adBanner": "XlLbKa_adBanner",
27
+ "root": "XlLbKa_root",
28
+ "header": "XlLbKa_header",
28
29
  "adText": "XlLbKa_adText",
29
- "topics": "XlLbKa_topics",
30
+ "tabActive": "XlLbKa_tabActive",
31
+ "desc": "XlLbKa_desc",
30
32
  "actions": "XlLbKa_actions",
31
- "root": "XlLbKa_root",
32
- "brandText": "XlLbKa_brandText",
33
- "list": "XlLbKa_list",
34
33
  "installBtn": "XlLbKa_installBtn",
35
- "retryBtn": "XlLbKa_retryBtn",
36
- "cardSide": "XlLbKa_cardSide",
37
- "state": "XlLbKa_state",
38
34
  "stateDesc": "XlLbKa_stateDesc",
39
- "brand": "XlLbKa_brand",
40
- "tabs": "XlLbKa_tabs",
41
- "header": "XlLbKa_header",
35
+ "footer": "XlLbKa_footer",
42
36
  "cardMain": "XlLbKa_cardMain",
43
- "body": "XlLbKa_body",
44
- "search": "XlLbKa_search",
45
- "tagline": "XlLbKa_tagline",
37
+ "tabCountActive": "XlLbKa_tabCountActive",
38
+ "cardTitle": "XlLbKa_cardTitle",
39
+ "stats": "XlLbKa_stats",
40
+ "retryBtn": "XlLbKa_retryBtn",
41
+ "footText": "XlLbKa_footText",
42
+ "card": "XlLbKa_card",
43
+ "footLink": "XlLbKa_footLink",
44
+ "brand": "XlLbKa_brand",
45
+ "toastIn": "XlLbKa_toastIn",
46
46
  "adArrow": "XlLbKa_adArrow",
47
+ "adBadge": "XlLbKa_adBadge",
48
+ "search": "XlLbKa_search",
49
+ "body": "XlLbKa_body",
50
+ "date": "XlLbKa_date",
51
+ "brandText": "XlLbKa_brandText",
52
+ "toast": "XlLbKa_toast",
53
+ "state": "XlLbKa_state",
54
+ "tab": "XlLbKa_tab",
55
+ "langBtn": "XlLbKa_langBtn",
47
56
  "cardHead": "XlLbKa_cardHead",
57
+ "topics": "XlLbKa_topics",
58
+ "stateTitle": "XlLbKa_stateTitle",
59
+ "sort": "XlLbKa_sort",
60
+ "controls": "XlLbKa_controls",
48
61
  "title": "XlLbKa_title",
49
- "openBtn": "XlLbKa_openBtn",
50
- "openArrow": "XlLbKa_openArrow",
51
- "verified": "XlLbKa_verified",
62
+ "tagline": "XlLbKa_tagline",
52
63
  "tabCount": "XlLbKa_tabCount",
64
+ "categoryBadge": "XlLbKa_categoryBadge",
53
65
  "topic": "XlLbKa_topic",
54
- "stateTitle": "XlLbKa_stateTitle",
55
- "footText": "XlLbKa_footText",
56
- "fork": "XlLbKa_fork",
57
- "langBtn": "XlLbKa_langBtn",
58
- "installBtnCopied": "XlLbKa_installBtnCopied",
59
- "toast": "XlLbKa_toast",
60
- "toastIn": "XlLbKa_toastIn",
61
- "adBanner": "XlLbKa_adBanner",
62
- "cardTitle": "XlLbKa_cardTitle",
63
- "stats": "XlLbKa_stats",
64
66
  "star": "XlLbKa_star",
65
- "footer": "XlLbKa_footer",
66
- "tab": "XlLbKa_tab",
67
- "tabCountActive": "XlLbKa_tabCountActive",
68
- "tabActive": "XlLbKa_tabActive"
67
+ "openArrow": "XlLbKa_openArrow",
68
+ "verified": "XlLbKa_verified"
69
69
  };
70
70
  //#endregion
71
71
  //#region src/client/locales.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A community plugin marketplace for DeepSeek Harness, built to the official plugin spec — browse, search and install 4000+ human-curated community plugins without leaving the app. · DeepSeek Harness 社区插件市场(遵循官方开发规范):4000+ 人工精选社区插件,每日更新。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -75,6 +75,7 @@
75
75
  color: #ffffff;
76
76
  text-decoration: none;
77
77
  cursor: pointer;
78
+ user-select: none;
78
79
  box-shadow: 0 2px 10px rgba(79, 70, 229, 0.28);
79
80
  transition: filter 0.15s ease, box-shadow 0.15s ease;
80
81
  }
@@ -146,11 +147,13 @@
146
147
  padding: 4px 8px;
147
148
  outline: none;
148
149
  cursor: pointer;
150
+ user-select: none;
149
151
  }
150
152
 
151
153
  .sort:hover {
152
- color: var(--dsw-alias-brand-primary, #4f6ef7);
153
- border-color: var(--dsw-alias-brand-primary, #4f6ef7);
154
+ color: var(--dsw-alias-label-primary, #1f2328);
155
+ background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08));
156
+ border-color: var(--dsw-alias-button-ghost-active-border, #d0d4da);
154
157
  }
155
158
 
156
159
  .langBtn {
@@ -163,12 +166,14 @@
163
166
  border-radius: 6px;
164
167
  padding: 4px 9px;
165
168
  cursor: pointer;
169
+ user-select: none;
166
170
  transition: color 120ms ease, border-color 120ms ease;
167
171
  }
168
172
 
169
173
  .langBtn:hover {
170
- color: var(--dsw-alias-brand-primary, #4f6ef7);
171
- border-color: var(--dsw-alias-brand-primary, #4f6ef7);
174
+ color: var(--dsw-alias-label-primary, #1f2328);
175
+ background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08));
176
+ border-color: var(--dsw-alias-button-ghost-active-border, #d0d4da);
172
177
  }
173
178
 
174
179
  .openBtn {
@@ -187,12 +192,14 @@
187
192
  background: transparent;
188
193
  cursor: pointer;
189
194
  white-space: nowrap;
195
+ user-select: none;
190
196
  transition: color 120ms ease, border-color 120ms ease;
191
197
  }
192
198
 
193
199
  .openBtn:hover {
194
- color: var(--dsw-alias-brand-primary, #4f6ef7);
195
- border-color: var(--dsw-alias-brand-primary, #4f6ef7);
200
+ color: var(--dsw-alias-label-primary, #1f2328);
201
+ background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08));
202
+ border-color: var(--dsw-alias-button-ghost-active-border, #d0d4da);
196
203
  }
197
204
 
198
205
  .openArrow {
@@ -223,6 +230,7 @@
223
230
  border-radius: 999px;
224
231
  padding: 3px 10px;
225
232
  cursor: pointer;
233
+ user-select: none;
226
234
  transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
227
235
  }
228
236
 
@@ -239,9 +247,9 @@
239
247
  }
240
248
 
241
249
  .tabActive {
242
- color: #fff;
243
- background: var(--dsw-alias-brand-primary, #4f6ef7);
244
- border-color: var(--dsw-alias-brand-primary, #4f6ef7);
250
+ color: var(--dsw-alias-label-primary-foreground, #fff);
251
+ background: var(--dsw-alias-button-primary-fill, #1f2328);
252
+ border-color: var(--dsw-alias-button-primary-fill, #1f2328);
245
253
  }
246
254
 
247
255
  .tabCount,
@@ -260,8 +268,8 @@
260
268
  }
261
269
 
262
270
  .tabActive .tabCountActive {
263
- color: #fff;
264
- background: rgba(255, 255, 255, 0.22);
271
+ color: var(--dsw-alias-label-primary-foreground, #fff);
272
+ background: rgba(128, 128, 128, 0.22);
265
273
  }
266
274
 
267
275
  /* —— body / list —— */
@@ -422,31 +430,34 @@
422
430
  }
423
431
 
424
432
  .installBtn {
425
- color: var(--dsw-alias-label-secondary, #6b7280);
426
- background: transparent;
433
+ color: var(--dsw-alias-label-primary, #1f2328);
434
+ background: var(--dsw-alias-bg-layer-2, rgba(128, 128, 128, 0.06));
427
435
  border: 1px solid var(--dsw-alias-border-l2, #e5e7eb);
436
+ user-select: none;
428
437
  }
429
438
 
430
439
  .installBtn:hover {
431
- color: #4f6ef7;
432
- border-color: #4f6ef7;
440
+ color: var(--dsw-alias-label-primary, #1f2328);
441
+ background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.12));
442
+ border-color: var(--dsw-alias-button-ghost-active-border, #d0d4da);
433
443
  }
434
444
 
435
445
  /* Primary action: opens the plugin detail page on dsh-plugin.org.
436
- Fixed colors (not host tokens) so it stays readable in dark themes. */
446
+ Uses the host primary-button tokens so it follows the active theme
447
+ (light: dark fill / dark: light fill). */
437
448
  .detailBtn {
438
- color: #4f6ef7;
439
- background: transparent;
440
- border: 1px solid #4f6ef7;
449
+ color: var(--dsw-alias-label-primary-foreground, #fff);
450
+ background: var(--dsw-alias-button-primary-fill, #1f2328);
451
+ border: 1px solid transparent;
441
452
  text-decoration: none;
442
453
  display: inline-flex;
443
454
  align-items: center;
444
455
  font-weight: 500;
456
+ user-select: none;
445
457
  }
446
458
 
447
459
  .detailBtn:hover {
448
- color: #ffffff;
449
- background: #4f6ef7;
460
+ background: var(--dsw-alias-button-primary-hover, #43454a);
450
461
  }
451
462
 
452
463
  .actions {
@@ -455,13 +466,18 @@
455
466
  gap: 6px;
456
467
  }
457
468
 
469
+ /* 复制成功态:成功绿描边 + 绿字 + 淡绿底,避免亮色下黑色实心块、暗色下白色实心块
470
+ 的强对比,两种主题下都清晰醒目,且明确表达"已复制"语义。 */
458
471
  .installBtnCopied {
459
- color: #ffffff;
460
- background: #4f6ef7;
461
- border: 1px solid #4f6ef7;
472
+ color: var(--dsw-alias-state-success-primary, #1a7f37);
473
+ background: rgba(34, 197, 94, 0.14);
474
+ border: 1px solid var(--dsw-alias-state-success-secondary, rgba(26, 127, 55, 0.4));
475
+ user-select: none;
462
476
  }
463
477
 
464
- /* 复制成功提示条:窗口正中央浮出,纯黑色文字条,无遮罩无图标。
478
+ /* 复制成功提示条:窗口正中央浮出,无遮罩无图标。采用反色浮层——亮色模式
479
+ 黑底白字、暗色模式白底深字(复用主按钮 token:primary-fill 与
480
+ label-primary-foreground 在两种主题下正好互换),与页面背景相反,始终醒目。
465
481
  base 上直接写死居中 transform,动画结束(fill-mode 默认 none)后
466
482
  transform 会回落到 base 值,保证动画前后位置一致、不跳动。 */
467
483
  .toast {
@@ -472,12 +488,13 @@
472
488
  z-index: 1000;
473
489
  padding: 10px 16px;
474
490
  border-radius: 8px;
475
- background: #111827;
476
- border: 1px solid rgba(255, 255, 255, 0.1);
477
- color: #f9fafb;
491
+ background: var(--dsw-alias-button-primary-fill, #1f2328);
492
+ border: 1px solid transparent;
493
+ color: var(--dsw-alias-label-primary-foreground, #fff);
478
494
  font-size: 12px;
495
+ font-weight: 500;
479
496
  line-height: 18px;
480
- box-shadow: 0 6px 24px rgba(0, 0, 0, 0.22);
497
+ box-shadow: 0 6px 24px rgba(0, 0, 0, 0.28);
481
498
  animation: toastIn 220ms ease-out;
482
499
  pointer-events: none;
483
500
  white-space: nowrap;
@@ -531,11 +548,13 @@
531
548
  padding: 4px 12px;
532
549
  background: transparent;
533
550
  cursor: pointer;
551
+ user-select: none;
534
552
  }
535
553
 
536
554
  .retryBtn:hover {
537
- color: var(--dsw-alias-brand-primary, #4f6ef7);
538
- border-color: var(--dsw-alias-brand-primary, #4f6ef7);
555
+ color: var(--dsw-alias-label-primary, #1f2328);
556
+ background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08));
557
+ border-color: var(--dsw-alias-button-ghost-active-border, #d0d4da);
539
558
  }
540
559
 
541
560
  /* —— footer —— */
@@ -562,6 +581,7 @@
562
581
  color: var(--dsw-alias-brand-primary, #4f6ef7);
563
582
  text-decoration: none;
564
583
  white-space: nowrap;
584
+ user-select: none;
565
585
  }
566
586
 
567
587
  .footLink:hover {