在侧边栏运行、调试并分析 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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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 工具链。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
nikitafedorov008/dsh-flutter-tools
在侧边栏运行、调试并分析 Flutter 应用
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目