🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

移动端界面测量台 LUgABeEEE/dsh-mobile-ui

DeepSeek Harness
LUgABeEEE3 天前有提交已提供中文文档扫描:含敏感能力

按真实手机比例测量界面并生成像素基线报告

30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add LUgABeEEE/dsh-mobile-ui
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · vision
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 33 处,展示前 31 条)
  • 读取本地文件
    lab/src/baseline.mjs:31
    return createHash('sha256').update(readFileSync(path)).digest('hex')
  • 读取本地文件
    lab/src/baseline.mjs:59
    const current = readFileSync(paths.current).toString('base64')
  • 读取本地文件
    lab/src/baseline.mjs:60
    const reference = readFileSync(paths.reference).toString('base64')
  • 写入本地文件
    lab/src/baseline.mjs:115
    mkdirSync(baselineDir, { recursive: true })
  • 读取本地文件
    lab/src/baseline.mjs:118
    if (entry.current === null || !existsSync(entry.current)) continue
  • 写入本地文件
    lab/src/baseline.mjs:120
    copyFileSync(entry.current, target)
  • 写入本地文件
    lab/src/baseline.mjs:129
    writeFileSync(join(baselineDir, 'baseline.json'), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8')
  • 读取本地文件
    lab/src/baseline.mjs:139
    if (!existsSync(path)) return null
  • 读取本地文件
    lab/src/baseline.mjs:141
    const parsed = JSON.parse(readFileSync(path, 'utf8'))
  • 读取本地文件
    lab/src/capture.mjs:74
    const reuseState = surface === 'mobile' && fresh !== true && existsSync(statePath)
  • 写入本地文件
    lab/src/capture.mjs:156
    mkdirSync(outDir, { recursive: true })
  • 读取本地文件
    lab/src/capture.mjs:164
    if (existsSync(paths.reference) === false) {
  • 读取本地文件
    lab/src/cli.mjs:18
    const pkg = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'))
  • 读取本地文件
    lab/src/inject.mjs:17
    if (!existsSync(target)) throw new UsageError(`--inject path does not exist: ${input}`)
  • 读取本地文件
    lab/src/inject.mjs:19
    const stat = statSync(target)
  • 读取本地文件
    lab/src/inject.mjs:22
    if (!existsSync(manifestPath)) {
  • 读取本地文件
    lab/src/inject.mjs:27
    manifest = JSON.parse(readFileSync(manifestPath, 'utf8'))
  • 读取本地文件
    lab/src/inject.mjs:31
    const cssPath = existsSync(join(target, 'mobile.css')) ? join(target, 'mobile.css') : null
  • 读取本地文件
    lab/src/inject.mjs:32
    const jsPath = existsSync(join(target, 'mobile.js')) ? join(target, 'mobile.js') : null
  • 发起网络请求
    lab/src/pairing.mjs:57
    response = await fetch(statusUrl, { signal: AbortSignal.timeout(timeoutMs) })
  • 发起网络请求
    lab/src/pairing.mjs:92
    response = await fetch(new URL('/api/mobile-access/pairing/open', adminUrl), {
  • 写入本地文件
    lab/src/pairing.mjs:130
    mkdirSync(dirname(statePath), { recursive: true })
  • 写入本地文件
    lab/src/pairing.mjs:133
    chmodSync(statePath, 0o600)
  • 读取本地文件
    lab/src/playwright.mjs:37
    if (existsSync(join(absolute, 'package.json'))) {
  • 读取本地文件
    lab/src/playwright.mjs:54
    if (!existsSync(anchor)) continue
  • 读取本地文件
    lab/src/profiles.mjs:113
    text = readFileSync(filePath, 'utf8')
  • 写入本地文件
    lab/src/report.mjs:187
    mkdirSync(outDir, { recursive: true })
  • 写入本地文件
    lab/src/report.mjs:191
    writeFileSync(htmlPath, renderReportHtml(summary), 'utf8')
  • 写入本地文件
    lab/src/report.mjs:192
    writeFileSync(jsonPath, `${JSON.stringify(summary, null, 2)}\n`, 'utf8')
  • 读取本地文件
    lab/src/token.mjs:28
    stats = statSync(filePath)
  • 读取本地文件
    lab/src/token.mjs:49
    token = readFileSync(filePath, 'utf8').trim()
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

测量并修复 DeepSeek Harness 的移动端界面:一套无头比例实验室(截图、指标、矩阵报告、像素基线),外加可选的适配包,用于通过 dsh-mobile 扩展目录加载的第三方插件面板。

README

由 DeepSeek 最新模型翻译生成
本仓库已拆分,由新仓库取代。 - 测量工具 → LUgABeEEE/dsh-ui-lab - 适配包 → LUgABeEEE/dsh-mobile-adapt 本仓库已归档,不再更新。 dsh-mobile-ui 先测量 DSH 移动端界面,再修掉测量发现的问题。 DeepSeek Harness 优先面向桌面端。到了手机上——无论是专用的 dsh-mobile 界面,还是手机宽度下的原生 Web UI——布局大体能用,但第三方插件面板往往在这里出问题:按钮拇指点不到,内容被浮动组件挡住,行与导航栏挤在一起。 本仓库负责这件事的两半: | | 是什么 | 给谁用 | | lab/ | dsh-ui-lab——无头 Chromium 测试台,按真实设备比例加载 DSH 界面,输出截图、测量数据和矩阵报告,并带像素基线门禁 | 想确认某次 UI 改动有没有在手机上挪动东西的人 | | packs/ | 可选适配包,由 dsh-mobile 的 extensions/ 目录加载——44px 触摸下限、导航栏留白、浮动组件留白 | 插件面板现在就得在手机上扛住的人 | 两者互相独立。lab 不需要 pack,pack 也不需要 lab。合起来才闭环:lab 指出哪里坏了,pack 修好它,lab 的基线判断修复是否守住。
展开完整文档(README 剩余 1 节)
本仓库已拆分,由新仓库取代。

- 测量工具 → LUgABeEEE/dsh-ui-lab
- 适配包 → LUgABeEEE/dsh-mobile-adapt

本仓库已归档,不再更新。

dsh-mobile-ui

先测量 DSH 移动端界面,再修掉测量发现的问题。

DeepSeek Harness 优先面向桌面端。到了手机上——无论是专用的 dsh-mobile 界面,还是手机宽度下的原生 Web UI——布局大体能用,但第三方插件面板往往在这里出问题:按钮拇指点不到,内容被浮动组件挡住,行与导航栏挤在一起。

本仓库负责这件事的两半:

| | 是什么 | 给谁用 |
| lab/ | dsh-ui-lab——无头 Chromium 测试台,按真实设备比例加载 DSH 界面,输出截图、测量数据和矩阵报告,并带像素基线门禁 | 想确认某次 UI 改动有没有在手机上挪动东西的人 |
| packs/ | 可选适配包,由 dsh-mobile 的 extensions/ 目录加载——44px 触摸下限、导航栏留白、浮动组件留白 | 插件面板现在就得在手机上扛住的人 |

两者互相独立。lab 不需要 pack,pack 也不需要 lab。合起来才闭环:lab 指出哪里坏了,pack 修好它,lab 的基线判断修复是否守住。

dsh-ui-lab ──measure──▶ DSH surface (390×844, coarse pointer)
▲
packs ──install────▶ $DSH_HOME/mobile-access/extensions/<id>/

快速开始——lab

需要 Node 20+,以及给 Playwright 用的 Chromium。

cd lab
npm ci
npx playwright install chromium

npx . list # 10 proportions: 6 phones, 4 tablets
npx . shot --surface mobile --profile phone-390x844 --open Todos
npx . matrix --surface mobile --class phone --open Todos --out .shots/phone

--surface mobile 驱动真实的 dsh-mobile 网关(它会配对一次设备并缓存状态)。--surface web 按同样比例打开原生 DSH Web。--open 先点侧边栏条目,这样截到的是面板,而不是欢迎页。

完全没有 DSH?仓库自带 fixture:

cd lab
npx . shot --surface web --profile phone-390x844 \
--url "file://$PWD/test/fixtures/desktop.html" --out .shots/fixture

基线把矩阵变成门禁:

npx . matrix --surface mobile --class phone --open Todos --out .shots/run --save-baseline ../.baselines/todos
npx . matrix --surface mobile --class phone --open Todos --out .shots/run --baseline ../.baselines/todos
exit 1 when the pixels moved past the tolerance

完整文档:lab/README.md(英文)· lab/README.zh.md(中文)。

快速开始——packs

这些包由 dsh-mobile 通过公开的 extensions/ 接口加载 —— 不用 fork,不用给已安装的文件打补丁,删掉目录后两秒内就会卸载。

node tools/check-pack.mjs # validate every pack (static + fixture + opt-out)
node tools/install.mjs pack core-panel --dry-run
node tools/install.mjs pack core-panel --yes

| 包 | 作用范围 | 做什么 |
| core-panel | 插件面板 | 面板内 44px 下限、回收宽度、为 56px 折叠侧栏留出空隙 |
| shell-chrome | 外壳本身 | 面板的「返回会话」栏,以及展开抽屉的各行 |
| floaters | 浮动组件 | 测量右下角固定组件并预留其高度,最后几行不再被压在下面 |

每个包都是 experimental,默认关闭;catalog.json 记录哪些已经验证、哪些还没有。每个包都支持退出开关(),发布前都会对照 fixture 检查。

完整文档:docs/收录标准.md · packs/core-panel/README.md · docs/phone-instance.md。

实际验证了什么

这里诚实比绿色对勾更重要,所以每个包的状态都写在 catalog.json 的 evidence 字段里:

| | 状态 |
| Fixture 测量(390×844 粗指针、1280×800 细指针零回归、退出开关) | ✅ 每个包,tools/check-pack.mjs |
| 在 dsh-mobile 0.7.1 上的真实运行时 | ✅ 每个包,在真实网关上测量 |
| 在 0.8.0 上的真实运行时 | ❌ 只对 lib/mobile-layout.js 做了文本级检查 |
| 真机 | ❌ 从未 —— 没有拇指、没有软键盘、没有真实的 env(safe-area-inset-*) |

所以这些包保持 experimental(不是 candidate)。如果你在真机上跑,lab 里的基线门禁是判断差异是否来自该包的最快方式。

这些包还依赖 dsh-mobile 不承诺保留的类名(.dshm-shell、.dshm-main、.dshm-drawer 等)。catalog.json 精确列出每个包触及的标记,出问题时可追溯,但 dsh-mobile 一次改版仍可能把它们弄坏。这是非官方兼容层,不是 dsh-mobile 维护者发布或支持的东西。

贡献

加一个比例,就是在 lab/profiles/profiles.json 里加一条。加一个包从 packs/_template/ 开始,并且必须通过 node tools/check-pack.mjs packs/<id>;规则见 docs/收录标准.md。测试与提交约定见 lab/CONTRIBUTING.md。

许可证

MIT —— 见 LICENSE。
预览分享卡片长什么样 ↓LUgABeEEE/dsh-mobile-ui
分享 · DeepSeek Harness Hub
LUgABeEEE/dsh-mobile-ui

按真实手机比例测量界面并生成像素基线报告

这是你的仓库?认领条目

回到顶部