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

Flutter 工具面板 nikitafedorov008/dsh-flutter-tools

DeepSeek Harness
nikitafedorov00831 天前有提交已提供中文文档扫描:高危

在侧边栏运行、调试并分析 Flutter 应用

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · browser
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 20 处,展示前 17 条)
  • 读取本地文件
    index.js:86
    if (candidate.includes('/') && !existsSync(candidate)) continue
  • 执行外部命令固定命令
    index.js:111
    output = execFileSync('ps', ['-Ao', 'pid=,ppid=,command='], { encoding: 'utf8' })
  • 读取本地文件
    index.js:185
    return await readFile(join(cwd, rel), 'utf8')
  • 读取本地文件
    index.js:204
    entries = await readdir(join(cwd, `${platform}/Runner.xcodeproj/xcshareddata/xcschemes`))
  • 读取本地文件
    index.js:223
    const parsed = JSON.parse(await readFile(join(cwd, file), 'utf8'))
  • 发起网络请求
    index.js:351
    const vm = await this.request('getVM')
  • 发起网络请求
    index.js:362
    const isolate = await this.request('getIsolate', { isolateId })
  • 发起网络请求
    index.js:368
    return this.request('getMemoryUsage', { isolateId: await this.isolateId() })
  • 发起网络请求
    index.js:373
    await this.request('getAllocationProfile', { isolateId: await this.isolateId(), gc: true })
  • 发起网络请求
    index.js:380
    return this.request(name, { isolateId, ...(params ?? {}) })
  • 执行外部命令来自配置/变量
    index.js:445
    const child = spawn(flutter, args, {
  • 读取本地文件
    index.js:446
    cwd: cwd !== '' && existsSync(cwd) ? cwd : undefined,
  • 执行外部命令表达式求值
    index.js:604
    this.#starting = this.#spawn().finally(() => { this.#starting = null })
  • 执行外部命令表达式求值
    index.js:608
    #spawn() {
  • 执行外部命令来自配置/变量
    index.js:612
    const child = spawn(this.#flutter, ['daemon'], {
  • 读取本地文件
    index.js:613
    cwd: this.#cwd !== '' && existsSync(this.#cwd) ? this.#cwd : undefined,
  • 执行外部命令来自配置/变量
    index.js:772
    const child = spawn(NPX, ['-y', MCP_PACKAGE], { stdio: ['pipe', 'pipe', 'pipe'], env: childEnv(), detached: true })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 侧边栏运行调试
  • 设备与启动控制
  • 内嵌DevTools分析

Flutter 面板,用于 DeepSeek Harness 侧边栏:设备、启动、VM Service 控制、调试开关、内嵌 DevTools、内存与性能分析

README

由 DeepSeek 最新模型翻译生成
dsh-flutter-tools 给 DeepSeek Harness 侧边栏用的 Flutter 面板:不用离开对话,就能运行、检查、分析 Flutter 应用。 设备与启动 设备来自常驻的 flutter daemon,启动走 flutter run --machine,VM Service URI 会自动接上,其余功能都通过运行中应用自己的 VM Service 和 flutter-devtools-mcp 完成。 已连接的应用 功能 - 设备 —— 常驻的 flutter daemon(推事件,不轮询):手机一插上就自己出现。这一栏显示当前选中的设备,带 OS 图标(Apple、Android、Windows、Linux,Web 目标则是浏览器)和一个小类型图标;点一下展开列表切换,选择按项目记住。模拟器也来自同一个 daemon。 - 启动 —— 设备、模式(debug / profile / release)、flavor 和 --dart-define 键值对,然后一个按钮,按状态决定运行还是停止。面板读取 app.debugPort 并自己连上;应用日志落在面板里。
展开完整文档(README 剩余 1 节)
dsh-flutter-tools

给 DeepSeek Harness 侧边栏用的 Flutter 面板:不用离开对话,就能运行、检查、分析 Flutter 应用。

设备与启动

设备来自常驻的 flutter daemon,启动走 flutter run --machine,VM Service URI 会自动接上,其余功能都通过运行中应用自己的 VM Service 和 flutter-devtools-mcp 完成。

已连接的应用

功能

- 设备 —— 常驻的 flutter daemon(推事件,不轮询):手机一插上就自己出现。这一栏显示当前选中的设备,带 OS 图标(Apple、Android、Windows、Linux,Web 目标则是浏览器)和一个小类型图标;点一下展开列表切换,选择按项目记住。模拟器也来自同一个 daemon。
- 启动 —— 设备、模式(debug / profile / release)、flavor 和 --dart-define 键值对,然后一个按钮,按状态决定运行还是停止。面板读取 app.debugPort 并自己连上;应用日志落在面板里。
- Flavor 与 defines —— flavor 从项目里推断(Android 的 productFlavors、非默认的 Xcode scheme);defines 是键值编辑器。两者都按项目记住,进命令行之前先校验。
- 控制 —— 热重载、热重启、截图(内联)、widget 树、debug paint。
- 调试开关 —— 应用实际注册的服务扩展:debugPaint、showPerformanceOverlay、repaintRainbow、debugPaintBaselinesEnabled、timeDilation、inspector.show。
- 面板内嵌 DevTools —— daemon 托管 DevTools 服务器,面板把它嵌进来(inspector、performance、cpu-profiler、memory、network、logging),还有一个按钮把同一页面挪到侧边栏浏览器标签页。
- 应用信息与内存 —— VM 版本、平台、pid 和 isolate 组成键值块;实时堆读数、GC 按钮、已保存的内存快照,以及最近两次快照的对比。
- 抓取与分析 —— 重建跟踪和 HTTP 抓取各一个开关,profiling 会话,collect_performance_session 自动填好工作区根目录。
- 项目命令 —— pub get、pub outdated、flutter doctor,输出带渲染:pub outdated 变成表格,可升级的行高亮;flutter doctor 变成清单。
- 分离与 Web —— 让应用继续跑,面板不再跟踪它;或者把 Web 构建打开到侧边栏浏览器标签页。
- SDK —— 工作区自己的锁定版本(先 .fvm/flutter_sdk,再 .fvmrc)优先于 PATH 上的任何版本。

安装

DeepSeek Harness → Settings → Add plugin,然后粘贴本仓库地址。这个字段接受插件包名、GitHub 仓库地址或本地目录。命令行接受同样的写法(dsh plugin add …);注意,桌面应用管理的配置档会拒绝命令行改动,所以插件管理器才是常规途径。

要求:

- Flutter SDK(优先用工作区锁定的版本,PATH 里的作为兜底);
- PATH 里有 npx —— flutter-devtools-mcp 首次使用时拉取;
- 侧边栏标签页需要 dsh-better-sidebar;
- Flutter 应用跑在 debug(重建跟踪)或 profile(指标)模式下。

组成结构

| 文件 | 所属半边 | 作用 |
| index.js | 宿主(Cordis) | 注册 /flutter 路由,持有 flutter daemon、flutter run 子进程和 flutter-devtools-mcp 子进程,提供 panel.html |
| panel.html | 被提供的页面 | 整个 UI,纯 HTML/CSS/JS —— 无需构建步骤 |
| client.js | 客户端 bundle | 注册侧边栏标签页,其主体是指向 /flutter 的 iframe |
| icon.svg | 清单资源 | 插件管理器显示的图标,在 package.json 里声明为 icon |
| cordis.patch.yml | bundle 补丁 | 挂载行;其 name 必须等于包名,这样客户端 bundle 才会在 /plugins/dsh-flutter-tools/client.js 提供 |
| dev-server.mjs | 开发 | 在 DSH 之外跑同样的路由,方便迭代 UI |
| docs/ | 开发 | 上面的截图 |

端点

全部位于 /flutter 下,仅限回环 Host。

| 路由 | 用途 |
| GET /flutter | 面板页面(?cwd=&sessionId=) |
| GET /flutter/config | 工作区 cwd、fvm 锁定版本、解析出的 Flutter、开关标签 |
| GET /flutter/devices | 实时设备列表(daemon) |
| GET /flutter/emulators | 来自 daemon 的模拟器 |
| GET /flutter/flavors | 项目里找到的 flavor(Android blocks + Xcode schemes) |
| GET /flutter/run | 启动状态:running、appId、mode、flavor、defines、VM Service URI、日志尾部 |
| POST /flutter/run | 在设备上启动:{ deviceId, mode, flavor, defines } |
| POST /flutter/run/stop | 停止已启动的应用 |
| POST /flutter/run/detach | 让应用继续运行,停止跟踪它 |
| POST /flutter/emulator/launch | 启动模拟器:{ emulatorId } |
| GET /flutter/devtools | DevTools 页面 URL:?page=…&uri= |
| GET /flutter/extensions | 已注册的调试扩展及其当前状态 |
| POST /flutter/extension | 切换某个扩展:{ name, value }(仅限允许列表) |
| GET /flutter/heap | 主 isolate 的堆用量(?uri=) |
| POST /flutter/gc | 回收垃圾,然后报告堆用量 |
| POST /flutter/command | 一次性命令行:pub_get \| pub_outdated \| doctor |
| POST /flutter/call | flutter-devtools-mcp 工具调用:{ tool, arguments }(仅限允许列表) |

构建时的笔记

这些地方花过时间,记下来免得别人再付一遍。

- flutter daemon --machine 不是合法参数:它会以退出码 2 退出,且没有任何输出。不带它时,daemon 说的是同一套协议。
- flutter emulators --machine 也不存在。
- 故意不传 --show-web-server-device:实测下来,它只改变一件事——列表里多出那个合成的 web-server 设备——而这里没有任何东西依赖它。
- flutter run、flutter daemon 和 npx 都是包装器:真正的进程是孙进程(dartvm),所以直接 child.kill() 杀不掉它。子进程以 detached 方式启动,再按进程组杀掉——但 app.detach 之后例外,此时按进程组杀会把已分离的应用一起带走,所以改成按 pid 杀工具进程。
- 实测:app.detach 之后工具不会自行退出(20 s 后仍然活着),而它启动的应用能独立存活。
- VM Service 的 getMemoryUsage 需要 isolateId,而且没有 collectAllGarbage RPC——那正是 getAllocationProfile(gc: true) 的用途。
- ext.flutter.brightnessOverride 不做成开关:它上报的是平台的实际亮度,所以在深色系统上「关」依然读作深色,开关会说谎。
- --dart-define 是编译期的:改过的 define 在下次启动时生效,热重启不生效。
- 命令输出从头截断:pub outdated 的列标题留在顶部,而从尾部截断会让面板剩下一些解析不了的行。
- 插件图标是 data URL,由 harness 根据 package.json 顶层的 icon 生成;它没有 HTTP 路由,路径必须留在 manifest 目录内。

License

MIT — see LICENSE.

Development

node dev-server.mjs 9100 /path/to/flutter/project # the panel, outside DSH

docs/ 里的截图取自那个 dev server,Chrome 深色模式,device scale 2。

Attribution

标签页图标和插件图标都是 Flutter 的标志,取自 simple-icons(CC0)。Flutter 是 Google 的商标;这里用这个标志只是为了标注 Flutter 工具链。
预览分享卡片长什么样 ↓nikitafedorov008/dsh-flutter-tools
分享 · DeepSeek Harness Hub
nikitafedorov008/dsh-flutter-tools

在侧边栏运行、调试并分析 Flutter 应用

这是你的仓库?认领条目

回到顶部