dsh-plugin 1.1.1 → 1.2.0
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 +5 -5
- package/README.md +5 -5
- package/client/client.js +4772 -1659
- package/client/client.js.map +1 -1
- package/lib/http/routes.js +451 -28
- package/lib/index.js +5 -1
- package/lib/services/{install-types.js → install/install-types.js} +8 -2
- package/lib/services/install/install.js +4 -0
- package/lib/services/install/npm-check.js +55 -0
- package/lib/services/{npm-resolve.js → install/npm-resolve.js} +11 -5
- package/lib/services/{preflight.js → install/preflight.js} +23 -7
- package/lib/services/{task-queue.js → install/task-queue.js} +166 -71
- package/lib/services/loader.js +60 -1
- package/lib/services/log.js +138 -0
- package/lib/services/probe.js +157 -0
- package/lib/services/{installed-versions.js → profile/installed-versions.js} +5 -1
- package/lib/services/{pending-restart.js → profile/pending-restart.js} +1 -1
- package/lib/services/{profile.js → profile/profile.js} +59 -4
- package/lib/services/{progress.js → profile/progress.js} +4 -0
- package/lib/services/settings.js +60 -0
- package/lib/types/http/routes.d.ts +1 -1
- package/lib/types/index.d.ts +5 -1
- package/lib/types/services/{install-types.d.ts → install/install-types.d.ts} +13 -4
- package/lib/types/services/{install.d.ts → install/install.d.ts} +9 -5
- package/lib/types/services/install/npm-check.d.ts +12 -0
- package/lib/types/services/{npm-resolve.d.ts → install/npm-resolve.d.ts} +2 -1
- package/lib/types/services/{task-queue.d.ts → install/task-queue.d.ts} +5 -1
- package/lib/types/services/loader.d.ts +14 -4
- package/lib/types/services/log.d.ts +49 -0
- package/lib/types/services/probe.d.ts +30 -0
- package/lib/types/services/{pending-restart.d.ts → profile/pending-restart.d.ts} +9 -3
- package/lib/types/services/{profile.d.ts → profile/profile.d.ts} +6 -2
- package/lib/types/services/{progress.d.ts → profile/progress.d.ts} +4 -0
- package/lib/types/services/settings.d.ts +24 -0
- package/package.json +1 -1
- package/src/client/components/PluginHubSection.tsx +346 -121
- package/src/client/components/{CatalogList.tsx → catalog/CatalogList.tsx} +15 -7
- package/src/client/components/{PluginCard.tsx → catalog/PluginCard.tsx} +10 -5
- package/src/client/components/layout/CatalogControls.tsx +80 -0
- package/src/client/components/{CatalogHeader.tsx → layout/CatalogHeader.tsx} +8 -4
- package/src/client/components/{CategoryTabs.tsx → layout/CategoryTabs.tsx} +7 -3
- package/src/client/components/layout/SectionTabs.tsx +60 -0
- package/src/client/components/{AboutModal.tsx → modals/AboutModal.tsx} +11 -7
- package/src/client/components/{HubUpdateModal.tsx → modals/HubUpdateModal.tsx} +9 -5
- package/src/client/components/modals/InstalledDetailModal.tsx +193 -0
- package/src/client/components/modals/LogsModal.tsx +301 -0
- package/src/client/components/modals/LogsPathModal.tsx +161 -0
- package/src/client/components/{NotificationsModal.tsx → modals/NotificationsModal.tsx} +51 -20
- package/src/client/components/{ProgressView.tsx → modals/ProgressView.tsx} +6 -2
- package/src/client/components/{modals.tsx → modals/modals.tsx} +121 -40
- package/src/client/components/{Dropdown.tsx → ui/Dropdown.tsx} +18 -6
- package/src/client/components/ui/Toggle.tsx +28 -0
- package/src/client/components/ui/icons.tsx +343 -0
- package/src/client/components/views/CustomInstallView.tsx +250 -0
- package/src/client/components/views/DiagnosticsView.tsx +172 -0
- package/src/client/components/views/InstalledView.tsx +328 -0
- package/src/client/components/views/LogsView.tsx +150 -0
- package/src/client/components/views/MarketView.tsx +66 -0
- package/src/client/components/views/SettingsView.tsx +273 -0
- package/src/client/data/catalog.ts +38 -0
- package/src/client/data/host.ts +107 -0
- package/src/client/data/hub.ts +41 -0
- package/src/client/hooks/useCatalog.ts +77 -117
- package/src/client/hooks/useIncrementalList.ts +46 -0
- package/src/client/hooks/useLanguage.ts +40 -0
- package/src/client/hooks/useSettings.ts +90 -0
- package/src/client/hooks/useTaskQueue.ts +168 -47
- package/src/client/index.tsx +4 -0
- package/src/client/locales.ts +365 -39
- package/src/client/logic/constants.ts +87 -0
- package/src/client/{lib → logic}/failures.ts +99 -74
- package/src/client/{lib → logic}/format.ts +4 -0
- package/src/client/logic/install-command.ts +56 -0
- package/src/client/logic/installed.ts +207 -0
- package/src/client/logic/normalize.ts +52 -0
- package/src/client/{lib → logic}/renderMarkdown.ts +4 -0
- package/src/client/logic/urls.ts +125 -0
- package/src/client/styles/CustomInstallView.module.css +191 -0
- package/src/client/styles/DiagnosticsView.module.css +231 -0
- package/src/client/styles/Dropdown.module.css +46 -41
- package/src/client/styles/Header.module.css +105 -133
- package/src/client/styles/InstalledView.module.css +447 -0
- package/src/client/styles/List.module.css +11 -1
- package/src/client/styles/LogsView.module.css +503 -0
- package/src/client/styles/Modal.module.css +357 -71
- package/src/client/styles/SectionTabs.module.css +142 -0
- package/src/client/styles/SettingsView.module.css +232 -0
- package/src/client/styles/Toggle.module.css +60 -0
- package/src/client/styles/tokens.module.css +6 -1
- package/src/client/types.ts +28 -4
- package/src/server/http/routes.ts +426 -28
- package/src/server/index.ts +5 -1
- package/src/server/services/{install-types.ts → install/install-types.ts} +13 -5
- package/src/server/services/{install.ts → install/install.ts} +9 -5
- package/src/server/services/install/npm-check.ts +53 -0
- package/src/server/services/{npm-resolve.ts → install/npm-resolve.ts} +11 -5
- package/src/server/services/{preflight.ts → install/preflight.ts} +24 -7
- package/src/server/services/{task-queue.ts → install/task-queue.ts} +168 -68
- package/src/server/services/loader.ts +59 -1
- package/src/server/services/log.ts +167 -0
- package/src/server/services/probe.ts +157 -0
- package/src/server/services/{installed-versions.ts → profile/installed-versions.ts} +5 -1
- package/src/server/services/{pending-restart.ts → profile/pending-restart.ts} +9 -3
- package/src/server/services/{profile.ts → profile/profile.ts} +58 -4
- package/src/server/services/{progress.ts → profile/progress.ts} +4 -0
- package/src/server/services/settings.ts +79 -0
- package/lib/services/install.js +0 -4
- package/src/client/components/CatalogControls.tsx +0 -104
- package/src/client/components/icons.tsx +0 -125
- package/src/client/lib/catalog.ts +0 -272
- package/src/client/lib/env.ts +0 -16
- /package/lib/types/services/{preflight.d.ts → install/preflight.d.ts} +0 -0
- /package/lib/types/services/{installed-versions.d.ts → profile/installed-versions.d.ts} +0 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/* Plugin Hub
|
|
1
|
+
/* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
2
|
+
* Website: https://dsh-plugin.org
|
|
3
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
4
|
+
*
|
|
5
|
+
* Plugin Hub section header: brand row, tagline, ad banner, search input,
|
|
2
6
|
* filter toolbar (installed / not installed, failures entry) and category
|
|
3
7
|
* tabs. Colors resolve through the --hub-* design tokens. */
|
|
4
8
|
|
|
@@ -219,16 +223,28 @@
|
|
|
219
223
|
text-overflow: ellipsis;
|
|
220
224
|
}
|
|
221
225
|
|
|
226
|
+
/* 工具栏第二行:左侧筛选结果数 + 右侧排序按钮组(排序组靠 auto 顶到行尾);
|
|
227
|
+
分隔线收在行底,与插件列表之间一条横线 */
|
|
222
228
|
.controls {
|
|
223
229
|
display: flex;
|
|
224
230
|
align-items: center;
|
|
225
|
-
gap:
|
|
231
|
+
gap: 8px;
|
|
226
232
|
flex-shrink: 0;
|
|
227
|
-
|
|
233
|
+
padding: 0 2px 8px;
|
|
234
|
+
border-bottom: 1px solid var(--hub-border-1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* 结果数里的数字:等宽数字 + 固定 5 位宽度;数字在预留位中始终居中,两侧位置都固定不跳动 */
|
|
238
|
+
.resultCount {
|
|
239
|
+
font-variant-numeric: tabular-nums;
|
|
240
|
+
min-width: 5ch;
|
|
241
|
+
text-align: center;
|
|
228
242
|
}
|
|
229
243
|
|
|
230
|
-
/*
|
|
231
|
-
|
|
244
|
+
/* —— result count —— */
|
|
245
|
+
|
|
246
|
+
/* 筛选结果数:弱化灰字信息「结果 N 条插件」,位于工具栏行最左侧 */
|
|
247
|
+
.resultSeg {
|
|
232
248
|
flex-shrink: 0;
|
|
233
249
|
display: inline-flex;
|
|
234
250
|
align-items: baseline;
|
|
@@ -236,13 +252,76 @@
|
|
|
236
252
|
line-height: 18px;
|
|
237
253
|
color: var(--hub-text-tertiary);
|
|
238
254
|
white-space: nowrap;
|
|
255
|
+
user-select: none;
|
|
239
256
|
}
|
|
240
257
|
|
|
241
|
-
/*
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
258
|
+
/* —— 排序按钮组(与已安装视图同款 segmented control)——
|
|
259
|
+
组前小标签 + 按钮组,靠 margin-left:auto 顶到结果数右侧行尾 */
|
|
260
|
+
|
|
261
|
+
/* 排序组容器:整体右对齐,独立一行内容不换行 */
|
|
262
|
+
.sortGroup {
|
|
263
|
+
margin-left: auto;
|
|
264
|
+
flex-shrink: 0;
|
|
265
|
+
display: inline-flex;
|
|
266
|
+
align-items: center;
|
|
267
|
+
gap: 8px;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* 组前小标签:灰字,标注这组按钮的作用 */
|
|
271
|
+
.segLabel {
|
|
272
|
+
flex-shrink: 0;
|
|
273
|
+
font-size: 11px;
|
|
274
|
+
line-height: 16px;
|
|
275
|
+
color: var(--hub-text-tertiary);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.segGroup {
|
|
279
|
+
display: inline-flex;
|
|
280
|
+
align-items: center;
|
|
281
|
+
flex-shrink: 0;
|
|
282
|
+
border: 1px solid var(--hub-border-2);
|
|
283
|
+
border-radius: 6px;
|
|
284
|
+
overflow: hidden;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.segBtn {
|
|
288
|
+
font-family: inherit;
|
|
289
|
+
font-size: 12px;
|
|
290
|
+
line-height: 24px;
|
|
291
|
+
height: 24px;
|
|
292
|
+
padding: 0 10px;
|
|
293
|
+
display: inline-flex;
|
|
294
|
+
align-items: center;
|
|
295
|
+
justify-content: center;
|
|
296
|
+
gap: 4px;
|
|
297
|
+
color: var(--hub-text-secondary);
|
|
298
|
+
background: transparent;
|
|
299
|
+
border: none;
|
|
300
|
+
cursor: pointer;
|
|
301
|
+
user-select: none;
|
|
302
|
+
white-space: nowrap;
|
|
303
|
+
transition: color 120ms ease, background 120ms ease;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/* 激活排序按钮上的方向箭头:随文字色着色、不可被压缩 */
|
|
307
|
+
.segBtn svg {
|
|
308
|
+
flex-shrink: 0;
|
|
309
|
+
display: block;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.segBtn + .segBtn {
|
|
313
|
+
border-left: 1px solid var(--hub-border-2);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.segBtn:hover {
|
|
317
|
+
color: var(--hub-text-primary);
|
|
318
|
+
background: var(--hub-bg-hover);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.segBtnActive,
|
|
322
|
+
.segBtnActive:hover {
|
|
323
|
+
color: #fff;
|
|
324
|
+
background: var(--hub-brand);
|
|
246
325
|
}
|
|
247
326
|
|
|
248
327
|
/* —— ad banner —— */
|
|
@@ -303,19 +382,23 @@
|
|
|
303
382
|
|
|
304
383
|
.searchRow {
|
|
305
384
|
display: flex;
|
|
385
|
+
align-items: center;
|
|
386
|
+
gap: 6px;
|
|
306
387
|
padding: 0 2px;
|
|
307
388
|
}
|
|
308
389
|
|
|
309
|
-
/*
|
|
390
|
+
/* 搜索框:整行占满(排序已移出到结果数下方的按钮组行,搜索框独占整行) */
|
|
310
391
|
.search {
|
|
311
|
-
|
|
392
|
+
flex: 1 1 auto;
|
|
393
|
+
min-width: 0;
|
|
394
|
+
height: 28px;
|
|
395
|
+
padding: 0 9px;
|
|
312
396
|
font-size: 12px;
|
|
313
|
-
line-height:
|
|
397
|
+
line-height: 26px;
|
|
314
398
|
color: inherit;
|
|
315
399
|
background: transparent;
|
|
316
400
|
border: 1px solid var(--hub-border-2);
|
|
317
401
|
border-radius: 6px;
|
|
318
|
-
padding: 4px 9px;
|
|
319
402
|
outline: none;
|
|
320
403
|
transition: border-color 120ms ease;
|
|
321
404
|
}
|
|
@@ -328,79 +411,6 @@
|
|
|
328
411
|
border-color: var(--hub-brand);
|
|
329
412
|
}
|
|
330
413
|
|
|
331
|
-
/* —— install-state filter —— */
|
|
332
|
-
|
|
333
|
-
/* 已安装 / 未安装:两个独立按钮,外观尺寸与「安装失败记录」按钮一致(高 24px);
|
|
334
|
-
各自点击筛选对应安装状态,再点一次恢复全部。公共规则统一无边框,
|
|
335
|
-
避免激活态回落到浏览器默认 2px 边框导致点击时按钮变粗跳动。 */
|
|
336
|
-
.installedBtn,
|
|
337
|
-
.installedBtnActive,
|
|
338
|
-
.installedBtnDisabled {
|
|
339
|
-
flex-shrink: 0;
|
|
340
|
-
display: inline-flex;
|
|
341
|
-
align-items: center;
|
|
342
|
-
gap: 5px;
|
|
343
|
-
height: 24px;
|
|
344
|
-
padding: 0 8px;
|
|
345
|
-
border: none;
|
|
346
|
-
border-radius: 6px;
|
|
347
|
-
font-size: 12px;
|
|
348
|
-
line-height: 22px;
|
|
349
|
-
cursor: pointer;
|
|
350
|
-
user-select: none;
|
|
351
|
-
transition: color 120ms ease, background 120ms ease;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
.installedBtn {
|
|
355
|
-
color: var(--hub-text-primary);
|
|
356
|
-
background: transparent;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/* 悬浮:明显加重底色,保证「看得见、点得准」。 */
|
|
360
|
-
.installedBtn:hover {
|
|
361
|
-
color: var(--hub-text-primary);
|
|
362
|
-
background: var(--hub-bg-hover);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/* 置灰:当前分类下无对应安装状态的插件时不可点;尺寸保持 24px 不塌陷,
|
|
366
|
-
文字弱化,配合 disabled 属性天然屏蔽 hover/点击。 */
|
|
367
|
-
.installedBtnDisabled,
|
|
368
|
-
.installedBtnDisabled:hover {
|
|
369
|
-
color: var(--hub-text-disabled);
|
|
370
|
-
background: transparent;
|
|
371
|
-
cursor: not-allowed;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
.installedBtnDisabled .segCount {
|
|
375
|
-
color: var(--hub-text-disabled);
|
|
376
|
-
background: rgba(128, 128, 128, 0.06);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
.installedBtnActive {
|
|
380
|
-
color: var(--hub-text-on-fill);
|
|
381
|
-
background: var(--hub-btn-fill);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
.segCount,
|
|
385
|
-
.segCountActive {
|
|
386
|
-
font-size: 10px;
|
|
387
|
-
line-height: 14px;
|
|
388
|
-
border-radius: 999px;
|
|
389
|
-
padding: 0 4px;
|
|
390
|
-
min-width: 14px;
|
|
391
|
-
text-align: center;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
.segCount {
|
|
395
|
-
color: var(--hub-text-tertiary);
|
|
396
|
-
background: var(--hub-bg-btn);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
.installedBtnActive .segCountActive {
|
|
400
|
-
color: var(--hub-text-on-fill);
|
|
401
|
-
background: var(--hub-bg-on-fill);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
414
|
/* —— category chips —— */
|
|
405
415
|
|
|
406
416
|
.tabs {
|
|
@@ -460,53 +470,15 @@
|
|
|
460
470
|
background: var(--hub-bg-on-fill);
|
|
461
471
|
}
|
|
462
472
|
|
|
463
|
-
/*
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
box-sizing: border-box 让 1px 边框包含在 24px 高度内,与「已安装/未安装」无边框按钮外尺寸一致;
|
|
467
|
-
有通知时右上角悬浮的红圈白字徽标成为提醒焦点 */
|
|
468
|
-
.failBtn {
|
|
469
|
-
position: relative;
|
|
470
|
-
flex-shrink: 0;
|
|
471
|
-
/* 与左侧操作按钮分开:自动吃掉剩余空间,把按钮顶到控件行最右 */
|
|
472
|
-
margin-left: auto;
|
|
473
|
-
display: inline-flex;
|
|
473
|
+
/* 一级导航行:tab 占满左侧 */
|
|
474
|
+
.tabsRow {
|
|
475
|
+
display: flex;
|
|
474
476
|
align-items: center;
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
padding: 0 10px;
|
|
478
|
-
border: 1px solid var(--hub-border-2);
|
|
479
|
-
border-radius: 6px;
|
|
480
|
-
font-size: 12px;
|
|
481
|
-
line-height: 22px;
|
|
482
|
-
color: var(--hub-text-primary);
|
|
483
|
-
background: var(--hub-bg-hover);
|
|
484
|
-
cursor: pointer;
|
|
485
|
-
user-select: none;
|
|
486
|
-
transition: color 120ms ease, background 120ms ease;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
.failBtn:hover {
|
|
490
|
-
color: var(--hub-text-primary);
|
|
491
|
-
background: rgba(128, 128, 128, 0.28);
|
|
477
|
+
gap: 10px;
|
|
478
|
+
flex-shrink: 0;
|
|
492
479
|
}
|
|
493
480
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
position: absolute;
|
|
498
|
-
top: -16px;
|
|
499
|
-
right: -7px;
|
|
500
|
-
z-index: 1;
|
|
501
|
-
min-width: 16px;
|
|
502
|
-
height: 16px;
|
|
503
|
-
padding: 0 5px;
|
|
504
|
-
border-radius: 999px;
|
|
505
|
-
font-size: 10px;
|
|
506
|
-
font-weight: 600;
|
|
507
|
-
line-height: 16px;
|
|
508
|
-
text-align: center;
|
|
509
|
-
color: #ffffff;
|
|
510
|
-
background: var(--hub-danger);
|
|
511
|
-
box-shadow: 0 1px 4px rgba(209, 36, 47, 0.4);
|
|
481
|
+
.tabsRow > :first-child {
|
|
482
|
+
flex: 1 1 auto;
|
|
483
|
+
min-width: 0;
|
|
512
484
|
}
|