@noob-stupid/dsh-plugin-console 0.3.13 → 0.3.15

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.md CHANGED
@@ -20,8 +20,17 @@ enable/disable of installed plugins, a **multi-source plugin marketplace**
20
20
  static plugin & skill index** refreshed by CI every 6 hours, skill install/disable,
21
21
  suite one-click assembly, and **one-click framework upgrade** (online install with
22
22
  auto-rollback).
23
- (GitHub / Gitee / custom sources) with one-click install — and an **auto-collected
24
- static plugin & skill index** refreshed by CI every 6 hours.
23
+
24
+ > ## 🎯 One-click framework upgrade (v0.3.13 highlight)
25
+ >
26
+ > Open the "Plugin Console" panel → **Plugin Marketplace** → the
27
+ > `deepseek-ai/deepseek-harness` card → click **"Framework Upgrade → vX"**:
28
+ > **backup config & framework (rollback point) → online install (service stays up) →
29
+ > version verification → auto-rollback on failure → auto-restart**.
30
+ >
31
+ > After upgrade, framework packages are **auto-relinked** (fixes pnpm top-level link
32
+ > staleness that caused mixed versions, e.g. an old model plugin missing vision models).
33
+ > Tested: 0.1.0-rc.8 → **0.1.1-rc.2** end-to-end automatic, rollback-safe.
25
34
 
26
35
  <!-- TOC -->
27
36
  - [Highlights](#highlights)
package/README.zh.md CHANGED
@@ -18,6 +18,15 @@
18
18
  在**多个搜索源**上浏览 dsh-plugin 插件项目(GitHub / Gitee / 自定义源),一键添加并启用——
19
19
  并带一份 **CI 每 6 小时自动收录的静态插件/技能索引**。
20
20
 
21
+ > ## 🎯 框架一键升级(v0.3.13 亮点)
22
+ >
23
+ > 打开「插件管理」面板 → **插件市场** → `deepseek-ai/deepseek-harness` 卡片 →
24
+ > 点 **「框架升级 → vX」**,一步完成:
25
+ > **备份配置与框架本体(回滚点)→ 在线安装(服务不中断)→ 版本校验 → 失败自动回滚 → 自动重启生效**。
26
+ >
27
+ > 升级后**自动重链框架配套包**(避免 pnpm 顶层链接滞后导致的混版本问题,如模型插件旧版缺失 vision 模型)。
28
+ > 已实测:0.1.0-rc.8 → **0.1.1-rc.2** 全程自动、失败可回滚、升级后可正常使用。
29
+
21
30
  <!-- TOC -->
22
31
  - [核心优势](#核心优势)
23
32
  - [一键部署](#一键部署)
package/lib/client.js CHANGED
@@ -1,5 +1,5 @@
1
1
  window.__ModuleLoader__.load({
2
- id: "@deepseek-ai/dsh-plugin-console",
2
+ id: "@noob-stupid/dsh-plugin-console",
3
3
  factory: (require) => {
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
@@ -7,10 +7,10 @@ window.__ModuleLoader__.load({
7
7
  let react = require("react");
8
8
  //#region styles
9
9
  const css = ".pc_section{width:100%;max-width:760px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:14px;display:flex}.pc_section h3{margin:0;font-size:13px;font-weight:600;line-height:20px}.pc_message{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px;margin:0}.pc_messageRow{display:flex;align-items:center;gap:10px}.pc_spinner{width:14px;height:14px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-state-business-primary);border-radius:50%;animation:pcspin 1s linear infinite;flex:none}@keyframes pcspin{to{transform:rotate(360deg)}}.pc_message[data-error=true]{color:var(--dsw-alias-state-error-primary)}.pc_list{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;padding:0;list-style:none;display:grid}.pc_row{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_rowTop{align-items:center;gap:8px;display:flex}.pc_name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.pc_tag{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 8px;font-size:11px;line-height:16px;flex:none}.pc_tag[data-enabled=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-user=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_tag[data-skill=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_tag[data-system=true]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.pc_tag[data-disabled=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tag[data-suite=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-error=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tabGroup{display:inline-flex;gap:4px;align-items:center}.pc_meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;gap:6px;display:flex;align-items:center}.pc_phase[data-phase=failed]{color:var(--dsw-alias-state-error-primary)}.pc_phase[data-phase=active]{color:var(--dsw-alias-state-success-primary)}.pc_toggle{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 12px;align-self:flex-start}.pc_toggle:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_toggle:disabled{opacity:.5;cursor:default}.pc_search{gap:8px;display:flex}.pc_search input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);height:34px;flex:1;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;outline:none;padding:0 12px;font-size:13px}.pc_search input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}.pc_search button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:0 14px;font-size:13px}.pc_search button:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_market{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.pc_item{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_itemTop{align-items:center;gap:8px;display:flex}.pc_itemTop a{color:var(--dsw-alias-state-business-primary);font-size:13px;font-weight:600;text-decoration:none;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pc_stars{color:var(--dsw-alias-label-tertiary);font-size:11px;flex:none}.pc_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_item button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;align-self:flex-start;font-size:12px}.pc_item button:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_item button:disabled{opacity:.5;cursor:default}.pc_detail{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_status{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_note{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;margin:0}.pc_marketHead{display:flex;align-items:center;justify-content:space-between;gap:10px}.pc_descWrap{flex-direction:column;display:flex}.pc_installedHead{display:flex;align-items:center;gap:10px}.pc_backTopWrap{position:fixed;top:56px;right:20px;z-index:100;display:flex;flex-direction:column;gap:8px}.pc_backTop{width:34px;height:34px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:rgba(22,27,34,.72);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);cursor:pointer;backdrop-filter:blur(4px);opacity:.7}.pc_backTop:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_descTopbar{display:flex;justify-content:flex-end;margin:2px 0}.pc_ghpill{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 10px;font-size:11px;line-height:18px}.pc_ghpill[data-on=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_extraBtn{opacity:.75;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 10px;font-size:12px;line-height:16px;flex:none;transition:opacity .15s ease,border-color 1.5s ease,color 1.5s ease}.pc_extraBtn:hover{opacity:1}.pc_extraBtn[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_extraBtn[data-flash=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_view{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:2px 10px;font-size:12px;line-height:18px;flex:none}.pc_floatPanel{position:fixed;left:20px;top:50%;transform:translateY(-50%);width:340px;max-height:75vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:12px;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:50;flex-direction:column;gap:8px;display:flex}.pc_refresh{position:sticky;bottom:14px;align-self:flex-end;margin-top:8px;z-index:60;opacity:.45;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_refresh:hover{opacity:.9}.pc_date{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;flex:none}.pc_searchInner{position:relative;flex:1;display:flex;align-items:center;min-width:0}.pc_searchInner input{padding-right:32px;width:100%}.pc_starBtn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:13px;line-height:1;padding:4px 8px;border-radius:6px;opacity:.75;transition:opacity .15s ease;flex:none}.pc_starBtn:hover{opacity:1}.pc_starBtn[data-active=true]{opacity:1;color:var(--dsw-alias-state-business-primary)}.pc_restartBtn{position:fixed;right:20px;top:50%;transform:translateY(-50%);z-index:60;opacity:.45;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_restartBtn:hover{opacity:.9}.pc_relaunchFloat{position:fixed;left:20px;top:50%;transform:translateY(-50%);z-index:70;opacity:.85;border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_relaunchFloat:hover{opacity:1}.pc_aiToggle{position:fixed;right:20px;top:20px;z-index:70;opacity:.45;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_aiToggle:hover{opacity:.9}.pc_aiToggle[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_sourcesFloat{position:fixed;right:20px;top:76px;z-index:70;opacity:.85;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_sourcesFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat{position:fixed;right:20px;top:176px;z-index:70;opacity:.85;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_modeFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat[data-mode=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_trashBtn{border:0;background:0 0;color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:12px;line-height:16px;padding:2px 6px;flex:none;display:flex;align-items:center;border-radius:6px;transition:color .15s ease}.pc_trashBtn:hover{color:var(--dsw-alias-state-error-primary)}.pc_consentRemember{display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-secondary);cursor:pointer}.pc_modalBackdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:flex;align-items:center;justify-content:center}.pc_modalCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:16px 18px;max-width:420px;width:calc(100% - 48px);flex-direction:column;gap:10px;display:flex;box-shadow:0 12px 32px rgba(0,0,0,.25)}.pc_ghpill{background:0 0;cursor:pointer}.pc_ghwrap{position:relative;display:inline-flex}.pc_sourceMenu{position:absolute;right:0;top:calc(100% + 6px);z-index:90;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:8px;padding:4px;flex-direction:column;display:flex;min-width:120px;box-shadow:0 8px 24px rgba(0,0,0,.18)}.pc_sourceOpt{border:0;background:0 0;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:6px 10px;text-align:left;font-size:12px;line-height:16px}.pc_sourceOpt[data-active=true]{color:var(--dsw-alias-state-business-primary);font-weight:600}.pc_sourceOpt:hover{background:var(--dsw-alias-bg-layer-3)}";
10
- const tagId = "@deepseek-ai/dsh-plugin-console/PluginConsoleTab.css";
10
+ const tagId = "@noob-stupid/dsh-plugin-console/PluginConsoleTab.css";
11
11
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
12
12
  const tag = document.createElement("style");
13
- tag.dataset.plugin = "@deepseek-ai/dsh-plugin-console";
13
+ tag.dataset.plugin = "@noob-stupid/dsh-plugin-console";
14
14
  tag.dataset.pluginCss = tagId;
15
15
  tag.textContent = css;
16
16
  document.head.appendChild(tag);
package/lib/index.js CHANGED
@@ -25,7 +25,7 @@ import { request as httpsRequest } from 'node:https'
25
25
  const execFileAsync = promisify(execFile)
26
26
 
27
27
  /** Cordis 插件元信息。 */
28
- export const name = '@deepseek-ai/dsh-plugin-console'
28
+ export const name = '@noob-stupid/dsh-plugin-console'
29
29
  export const inject = ['webServer', 'loader']
30
30
 
31
31
  const ROUTE_PREFIX = '/plugin-console'
@@ -3298,6 +3298,12 @@ async function handle(ctx, req, res) {
3298
3298
  // 升级完成重启后,框架适配逻辑自动:备份新版本快照 + 重打框架补丁 + 版本提示。
3299
3299
  let current = null
3300
3300
  let dshDir = null
3301
+ // 面板自报名(自报名一致性校验用):从插件自身 package.json 读,与部署目录比对
3302
+ let selfName = null
3303
+ try {
3304
+ const selfPkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), 'package.json'), 'utf8'))
3305
+ selfName = typeof selfPkg.name === 'string' ? selfPkg.name : null
3306
+ } catch {}
3301
3307
  try {
3302
3308
  const require = createRequire(ctx.baseUrl ?? 'file:///')
3303
3309
  const dshPkgPath = require.resolve('@deepseek-ai/dsh/package.json')
@@ -3551,6 +3557,71 @@ async function handle(ctx, req, res) {
3551
3557
  `}`,
3552
3558
  `Relink-FrameworkPackages '${target}'`,
3553
3559
  `Log ('重链框架配套包完成(' + $script:relinked + ' 个)')`,
3560
+ // 依赖树完整性验证(事故教训:升级只装框架主包,pnpm 不重装依赖树——dsh-client-* 等
3561
+ // 39 个客户端组件仍停旧版(如 0.1.0-rc.7),新旧混版本导致输入框传图卡死等异常。
3562
+ // 修复:扫描 web-app 声明的 @deepseek-ai 依赖,与顶层实际版本比对,
3563
+ // 不一致则按声明版本从 npm registry 精确下载 tarball 修复(绕过 pnpm dist-tags 远古版陷阱)。
3564
+ `$treeFixed = 0`,
3565
+ `function Verify-DependencyTree($refVersion) {`,
3566
+ ` # dshDir = .../node_modules/@deepseek-ai/dsh → nodeModules = .../node_modules`,
3567
+ ` $nodeModules = ${ps(dirname(dirname(dshDir)))}`,
3568
+ ` $webApp = Join-Path $nodeModules '@deepseek-ai\\dsh-web-app\\package.json'`,
3569
+ ` if (-not (Test-Path $webApp)) { Log ('依赖树验证跳过:dsh-web-app 未找到'); return }`,
3570
+ ` try { $deps = (Get-Content $webApp -Raw | ConvertFrom-Json).dependencies } catch { Log ('依赖树验证跳过:读取失败'); return }`,
3571
+ ` foreach ($dep in $deps.PSObject.Properties) {`,
3572
+ ` $name = $dep.Name`,
3573
+ ` if (-not ($name -match '^@deepseek-ai/')) { continue }`,
3574
+ ` $short = $name.Substring(13)`,
3575
+ ` $topDir = Join-Path $nodeModules (@('@deepseek-ai', $short) -join '\')`,
3576
+ ` $topPkgJson = Join-Path $topDir 'package.json'`,
3577
+ ` if (-not (Test-Path $topPkgJson)) { continue }`,
3578
+ ` try { $curVer = (Get-Content $topPkgJson -Raw | ConvertFrom-Json).version } catch { continue }`,
3579
+ ` if ($curVer -eq $refVersion) { continue }`,
3580
+ ` try {`,
3581
+ ` # 按声明版本精确下载 npm tarball(registry 的 dist-tags.latest 是远古版不可信,必须显式版本)`,
3582
+ ` $tmpDir = Join-Path $env:TEMP ('dsh-depfix-' + [guid]::NewGuid().ToString('N'))`,
3583
+ ` New-Item -ItemType Directory -Path $tmpDir -Force | Out-Null`,
3584
+ ` $tgz = Join-Path $tmpDir 'pkg.tgz'`,
3585
+ ` $encName = $name.Replace('/','%2f')`,
3586
+ ` $url = 'https://registry.npmjs.org/' + $encName + '/-/' + $short + '-' + $refVersion + '.tgz'`,
3587
+ ` curl.exe -s -L -m 60 -o $tgz $url`,
3588
+ ` if (-not (Test-Path $tgz) -or (Get-Item $tgz).Length -lt 1000) { Remove-Item $tmpDir -Recurse -Force -ErrorAction SilentlyContinue; continue }`,
3589
+ ` tar -xzf $tgz -C $tmpDir`,
3590
+ ` $ver = (Get-Content (Join-Path $tmpDir 'package\\package.json') -Raw | ConvertFrom-Json).version`,
3591
+ ` if ($ver -eq $refVersion) {`,
3592
+ ` $bak = $topDir + '.bak-' + $curVer`,
3593
+ ` if (Test-Path $bak) { Remove-Item $bak -Recurse -Force -ErrorAction SilentlyContinue }`,
3594
+ ` Rename-Item -LiteralPath $topDir -NewName ($short + '.bak-' + $curVer) -Force`,
3595
+ ` Copy-Item (Join-Path $tmpDir 'package') $topDir -Recurse -Force`,
3596
+ ` $script:treeFixed++`,
3597
+ ` Log ('依赖修复 ' + $short + ': ' + $curVer + ' -> ' + $ver)`,
3598
+ ` }`,
3599
+ ` Remove-Item $tmpDir -Recurse -Force -ErrorAction SilentlyContinue`,
3600
+ ` } catch { Log ('依赖修复异常:' + $short + ' ' + $_.Exception.Message) }`,
3601
+ ` }`,
3602
+ `}`,
3603
+ `Verify-DependencyTree '${target}'`,
3604
+ `Log ('依赖树完整性修复完成(' + $script:treeFixed + ' 个)')`,
3605
+ // 自报名一致性校验(事故教训:面板自身部署名与代码自报名不一致崩溃)——
3606
+ // 曾把 @noob-stupid/dsh-plugin-console 的代码装进 @deepseek-ai/dsh-plugin-console 目录,
3607
+ // 浏览器端报 loaded without registering "@deepseek-ai/dsh-plugin-console"(加载器期望
3608
+ // 目录名 = 包名 = 登记 ID,三者必须一致)。校验面板自身:export const name / client.js
3609
+ // 注册 id 必须与部署目录名一致,不一致则日志告警(升级脚本不自动改名——避免破坏运行时)。
3610
+ `function Verify-SelfNameConsistency($expectedName) {`,
3611
+ ` $selfDir = ${ps(dirname(dirname(fileURLToPath(import.meta.url))))}`,
3612
+ ` $indexJs = Join-Path $selfDir 'lib\\index.js'`,
3613
+ ` $clientJs = Join-Path $selfDir 'lib\\client.js'`,
3614
+ ` if (-not (Test-Path $indexJs)) { Log ('自报名校验跳过:index.js 未找到'); return }`,
3615
+ ` $idx = Get-Content $indexJs -Raw`,
3616
+ ` $nameOk = $idx.Contains("export const name = '" + $expectedName + "'")`,
3617
+ ` $clientOk = $true`,
3618
+ ` if (Test-Path $clientJs) {`,
3619
+ ` $cli = Get-Content $clientJs -Raw`,
3620
+ ` $clientOk = $cli.Contains('id: "' + $expectedName + '"')`,
3621
+ ` }`,
3622
+ ` if ($nameOk -and $clientOk) { Log ('自报名一致性 OK:' + $expectedName) } else { Log ('⚠️ 自报名一致性异常:部署目录=' + (Split-Path $selfDir -Leaf) + ',期望 ' + $expectedName + '(index=' + $nameOk + ' client=' + $clientOk + ')——请检查部署目录与包名是否匹配') }`,
3623
+ `}`,
3624
+ `Verify-SelfNameConsistency '${selfName ?? '@noob-stupid/dsh-plugin-console'}'`,
3554
3625
  pkgArgs.length > 0 ? `SetState 'pkg' '更新官方配套包…'\n Log '更新官方配套包…'\n Set-Location -Path ${ps(profileDir2)}\n if (Test-Path ${ps(corepackJs)}) {\n $pp = Start-Process -FilePath ${ps(nodePath)} -ArgumentList @(${ps(corepackJs)}, 'pnpm', 'update', ${pkgArgs.join(', ')}, '--no-optional', '--registry', 'https://registry.npmmirror.com') -PassThru -WindowStyle Hidden\n if (-not $pp.WaitForExit(300000)) { Stop-Process -Id $pp.Id -Force -ErrorAction SilentlyContinue; Log '官方配套包更新超时(5 分钟),已跳过' } else { try { Log ('官方配套包更新结束(exit=' + $pp.ExitCode + ')') } catch { Log '官方配套包更新结束(退出码读取失败)' } }\n }` : '',
3555
3626
  "SetState 'relaunching' '升级完成,重启 DSH 服务生效…'",
3556
3627
  "Log '重启 DSH 服务生效…'",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noob-stupid/dsh-plugin-console",
3
- "version": "0.3.13",
3
+ "version": "0.3.15",
4
4
  "description": "DSH plugin management panel \u0026 marketplace: one-click enable/disable, multi-source market (GitHub/Gitee/custom), static-index market (500+ plugins / 300 skills), skills, suites, and one-click framework upgrade.",
5
5
  "repository": {
6
6
  "type": "git",