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

小程序页面助手 leo666-cloud/dsh-miniprogram-helper

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

生成并注册小程序页面,一键出预览二维码

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · platform
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/21·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 15 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量
查看扫描证据(共 26 处,展示前 25 条)
  • 删除本地文件
    lib/tools/page-remove.js:76
    await rm(path.join(project.srcRoot, rel), { force: true });
  • 删除本地文件递归
    lib/tools/page-remove.js:82
    await rm(dir, { recursive: true, force: true });
  • 读取本地文件
    lib/tools/project-init.js:80
    else if ((await readdir(root)).filter((entry) => entry !== '.DS_Store').length > 0) {
  • 读取本地文件
    lib/tools/project-init.js:172
    return readFile(file, 'utf8');
  • 读取密钥环境变量
    lib/tools/devtools.js:46
    const token = process.env.WECHAT_DEVTOOLS_CLI_TOKEN;
  • 写入本地文件
    lib/tools/devtools.js:96
    await mkdir(baseDir, { recursive: true });
  • 读取本地文件
    lib/lib/appjson.js:18
    const text = await readFile(file, 'utf8');
  • 读取本地文件
    lib/lib/appjson.js:24
    const raw = await readFile(file, 'utf8');
  • 写入本地文件
    lib/lib/appjson.js:288
    await mkdir(path.dirname(file), { recursive: true });
  • 写入本地文件
    lib/lib/appjson.js:290
    await writeFile(tmp, text, 'utf8');
  • 写入本地文件
    lib/lib/appjson.js:292
    await rename(tmp, file);
  • 删除本地文件
    lib/lib/appjson.js:295
    await unlink(tmp).catch(() => { });
  • 读取本地文件
    lib/lib/appjson.js:307
    const raw = await readFile(pageJsonFile, 'utf8');
  • 读取本地文件
    lib/lib/project.js:23
    return (await stat(p)).isFile();
  • 读取本地文件
    lib/lib/project.js:31
    return (await stat(p)).isDirectory();
  • 读取本地文件
    lib/lib/project.js:40
    const raw = await readFile(file, 'utf8');
  • 读取本地文件
    lib/lib/project.js:118
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    lib/lib/project.js:230
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    lib/lib/project.js:307
    entries = await readdir(current, { withFileTypes: true });
  • 读取本地文件
    lib/lib/validate.js:379
    entries = await readdir(dir, { withFileTypes: true });
  • 读取本地文件
    lib/lib/devtools.js:40
    await access(file, constants.X_OK);
  • 执行外部命令来自配置/变量
    lib/lib/devtools.js:69
    execFile(cli, args, { cwd: options.cwd, timeout: timeoutMs, maxBuffer: 8 * 1024 * 1024, env: { ...process.env } }, (error, stdout, stderr) => {
  • 写入本地文件
    lib/lib/devtools.js:133
    await mkdir(path.dirname(qrOutput), { recursive: true });
  • 读取本地文件
    lib/lib/devtools.js:184
    const raw = await readFile(file, 'utf8');
  • 删除本地文件
    lib/lib/devtools.js:193
    await rm(file, { force: true }).catch(() => { });
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 插件:搭建、注册并校验微信小程序页面,还集成了微信开发者工具命令行

README

由 DeepSeek 最新模型翻译生成
dsh-miniprogram-helper 一个 DSH(DeepSeek Harness)插件:让智能体能够扫描、生成、注册、校验微信小程序页面与配置,还能直接调微信开发者工具出预览二维码。 解决的核心痛点:AI 生成小程序时最容易犯的错是文件建好了但忘记写进 app.json 的 pages,页面在开发者工具里根本打不开。这个插件把「建文件 + 注册」做成一次原子操作,并且写完立刻自检。 11 个工具 | 工具 | 作用 | | mp_scan | 全面体检:页面清单、文件完整性、未注册的孤儿页、tabBar/分包/组件路径校验、包体积 | | mp_page_add | 新建页面(wxml/wxss/脚本/json)+ 自动写进 app.json + 写完立即自检 | | mp_page_remove | 注销页面(可连文件一起删),拦掉「删启动页 / 删 tab 页 / 删到最后一个」 | | mp_entry_set | 改启动页,同步 entryPagePath | | mp_register | 只补注册已存在的页面,不建文件 | | mp_fix | 一键修复:把所有「磁盘上有但未注册」的页面补进 app.json |
展开完整文档(README 剩余 1 节)
dsh-miniprogram-helper

一个 DSH(DeepSeek Harness)插件:让智能体能够扫描、生成、注册、校验微信小程序页面与配置,还能直接调微信开发者工具出预览二维码。

解决的核心痛点:AI 生成小程序时最容易犯的错是文件建好了但忘记写进 app.json 的 pages,页面在开发者工具里根本打不开。这个插件把「建文件 + 注册」做成一次原子操作,并且写完立刻自检。

11 个工具

| 工具 | 作用 |
| mp_scan | 全面体检:页面清单、文件完整性、未注册的孤儿页、tabBar/分包/组件路径校验、包体积 |
| mp_page_add | 新建页面(wxml/wxss/脚本/json)+ 自动写进 app.json + 写完立即自检 |
| mp_page_remove | 注销页面(可连文件一起删),拦掉「删启动页 / 删 tab 页 / 删到最后一个」 |
| mp_entry_set | 改启动页,同步 entryPagePath |
| mp_register | 只补注册已存在的页面,不建文件 |
| mp_fix | 一键修复:把所有「磁盘上有但未注册」的页面补进 app.json |
| mp_subpackage_add | 创建分包:校验 root + 写 subPackages + 搭首个页面(登记到分包,不是主包) |
| mp_component_add | 创建自定义组件 + 自动注入目标页面的 usingComponents |
| mp_tabbar | 一行配置底部 tab:页面:文字 列表,自动补注册页面、校验图标与 2–5 数量限制 |
| mp_project_init | 生成可直接导入开发者工具的工程骨架(含 miniprogramRoot 结构) |
| mp_devtools | 调微信开发者工具 CLI:detect / login / open / preview(出二维码 PNG)/ upload |

几个「懂小程序」的细节(这些决定它好不好用)

- 区分「项目根」与「代码根」。project.config.json 里的 miniprogramRoot(常见值是 miniprogram/)决定 app.json 在哪。插件的所有路径都相对代码根解析,也接受两种入参:项目根目录、或含 app.json 的代码根。搞混这两个概念,生成出来的页面就会落在开发者工具看不见的地方。
- 保格式改 JSON。app.json 允许写注释,但 JSON.parse 不认,而 JSON.stringify 会把用户的注释、缩进、键顺序、行尾注释全抹掉。插件内置 JSONC 解析器 + 区间替换编辑器:只改目标片段,注释和格式原样保留,连 "pages/a", // 首页 这种行尾注释都留在原行。
- 必需文件只有脚本 + .wxml,.wxss / .json 是可选的。很多校验器把四件套全当必需,对合法页面疯狂误报——这里分开报:必需缺失标 ❌,可选缺失只标 ℹ️。
- 组件不会被误当页面。判断依据是同名 .json 里 "component": true,外加跳过 components 目录(可配置多个)。否则 mp_fix 会把组件路径塞进 pages,直接把工程搞坏。
- 页面路径最后一段是文件名基名:pages/detail/index → pages/detail/index.wxml,不是 pages/detail/index/index.wxml。写错成目录时,扫描会主动提示「磁盘上实际存在 pages/detail/index,把路径改成它」。
- 分包页面绝不能被写进主包。mp_page_add 会先看路径是否落在某个已声明的分包 root 下,是的话登记到该分包的 pages(相对分包根),而不是主包 pages。这是原版最危险的 bug:分包页面被塞进主包会直接编译失败。
- 不覆盖用户代码。目标文件已存在时 mp_page_add / mp_component_add 默认跳过并明确告诉你「已保留」,要覆盖必须显式传 force / overwrite。
- 拒绝路径穿越。../ 会被拦下,不能把文件写到项目目录外面。
- tabBar 一次说清所有坑:数量 2–5、pagePath 必须在主包、图标文件必须真实存在、顶部 tab 不支持图标、缺的页面自动补注册。
- 开发者工具失败了能归因。CLI 只会回一句含糊的报错;插件把 EPERM/EACCES(权限)、IDE 初始化失败、未登录、服务端口没开、超时 分开识别,并给出各自的修复动作。所有 CLI 调用都带超时,不会把会话卡死。

快速开始

0. 前置环境

- Node.js ^22.19 或 >=24
- pnpm(dsh plugin add 内部转发给 pnpm)
- DSH 已装好,终端能跑 dsh --help

1. 构建

cd dsh-miniprogram-helper
pnpm install
pnpm run build # tsc -> lib/index.js
pnpm test # 21 个端到端测试,全部在临时目录里真跑

2. 装进配置档并验证

在【父目录】执行,相对路径会锚定到你运行命令的目录
dsh plugin --profile web add ./dsh-miniprogram-helper

先确认插件进了配置树(这一步不 boot,很快)
dsh --profile web --dump-config | grep -A2 miniprogram
预期看到: == dsh-miniprogram-helper
- id: miniprogram-helper
name: dsh-miniprogram-helper

然后重启 dsh web,并开一个新会话 —— 客户端模块注册表在进程生命周期内缓存元数据,不重启不生效。
Desktop 版(DeepSeek Harness.app)用的是 desktop 配置档,该配置档由 App 独占管理,命令行 dsh --profile desktop 会被拒绝。桌面版请在 App 的插件市场或插件页安装,或者把插件目录链接进 ~/.dsh/profiles/desktop/node_modules,并在 cordis.patch.yml 里加一行 - insert: [{ id: miniprogram-helper, name: dsh-miniprogram-helper }],再重启 App。

3. 在会话里用

用 mp_scan 扫一下 ~/project/miniprogram,看看有什么问题

帮我加一个"我的订单"页面 pages/order/index,导航标题叫"我的订单"

把扫描出来的孤儿页面都注册进 app.json

加一个底部导航:首页 / 订单 / 我的

生成预览二维码,我扫码看看效果

也可以在插件设置里配好 projectRoot,之后就不用每次传路径。可配置项:

| 配置 | 默认 | 说明 |
| projectRoot | 空 | 默认项目路径,留空则每次由模型传 |
| useTypeScript | false | 生成 .ts 而非 .js |
| componentDirs | components | 组件目录(逗号分隔多个),扫描页面时跳过 |
| appId | 空 | mp_project_init 写入的 AppID,留空用 touristappid 占位 |
| devtoolsCli | 空 | 开发者工具 CLI 路径,留空自动探测 |
| devtoolsPort | 空 | IDE 服务端口;IDE 已用其它端口启动时必须填同一个 |
| devtoolsTimeoutSec | 90 | CLI 超时秒数 |
| previewDir | 空 | 预览二维码落盘目录,留空用系统临时目录 |

微信开发者工具准备(只在用 mp_devtools 时需要):

1. 打开 IDE → 设置 → 安全设置 → 打开服务端口
2. 扫码登录(mp_devtools action=login 可查)
3. macOS 的 CLI 在 /Applications/wechatwebdevtools.app/Contents/MacOS/cli,插件会自动探测

推荐工作流

用 mp_scan 扫一遍项目,告诉我有什么问题 → 帮我加一个订单页 pages/order/index → 加个底部导航:首页 / 订单 / 我的 → 跑一次 mp_fix 确认没有漏注册的页面 → 再 mp_scan 复核 → 出预览二维码

本地调试(免编译,改完立刻生效)

不想每次改代码都 build + 重装,用 --patch 覆盖层直接挂 .ts 源码:

1. 在 DSH 源码检出根建 scratch-plugin/src/,把本项目的 src/ 拷过去
2. 写 scratch-plugin/cordis.yml,name 必须填绝对路径:

- insert:
- id: miniprogram-helper
name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/index.ts'

3. 启动:pnpm dsh web --patch ./scratch-plugin/cordis.yml

看到终端打印 [miniprogram-helper] 已注册 11 个工具… 就说明装上了。

插件的四个约定(写 DSH 插件必须先懂)

export const name = 'miniprogram-helper' // 插件唯一标识
export const inject = ['tools'] // 依赖声明,硬门槛
export const Config = Schema.object({...}) // 可选:可配置项
export function apply(ctx: Context, config: Config) { ... } // 唯一入口

- inject 不是可选的。Cordis 的 ctx 是 Proxy,没在 inject 里声明的服务,访问属性会直接抛异常(不是返回 undefined)。用了 ctx.tools 就必须写 export const inject = ['tools']。
- 注册即 effect。ctx.tools.register() 返回的清理函数会自动挂到插件生命周期,卸载时自动执行。定时器、网络连接这类手动资源必须自己用 ctx.effect() 包一层并返回清理函数。
- ctx 是唯一入口。不要 import 框架内部对象,也不需要写注册表。
- 函数式(上面的写法)覆盖 90% 场景;只有要「给别的插件提供服务」时才用类式(class X extends Service)。

打包成可安装的 bundle

三个关键文件:

package.json → 声明 dsh.bundle.patch cordis.patch.yml → 声明以什么 id 插进配置树 lib/index.js → 编译产物(main 指向它)

package.json 里必须有:

{
"type": "module",
"main": "./lib/index.js",
"files": ["lib", "cordis.patch.yml", "README.md"],
"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
}

没有 dsh.bundle 声明,装成功也只是一个普通 npm 依赖,不会进入 DSH 的组合层。

⚠️ 版本陷阱:dsh-tools 的 latest 是坏的

@deepseek-ai/dsh-tools 有两个 dist-tag:

- latest = 0.0.1-rc.1(stale,装了就是废的)
- next = 0.2.1-rc.2(真正的线)

直接 npm i @deepseek-ai/dsh-tools 会装到那条坏的线上。本项目已显式钉 0.2.1-rc.2。

代码结构

src/
index.ts 插件入口:name / inject / Config / apply,注册 11 个工具 config.ts Schemastery 配置定义 lib/ jsonc.ts JSONC 解析 + 保格式编辑(区间替换,保留注释) project.ts 工程模型:项目根 vs 代码根、miniprogramRoot、路径规整、扫描、探针 appjson.ts app.json 读写:注册页面 / 分包 / tabBar / 全局组件 validate.ts 静态校验:pages、tabBar、分包、组件路径、包体积 templates.ts 页面 / 组件 / 工程骨架模板 devtools.ts 微信开发者工具 CLI 封装:探测、超时、失败归因 toolkit.ts 工具公共件:项目解析、原子写、自检渲染 tools/ scan.ts mp_scan page-add.ts mp_page_add page-remove.ts mp_page_remove / mp_entry_set register.ts mp_register / mp_fix structure.ts mp_subpackage_add / mp_component_add tabbar.ts mp_tabbar project-init.ts mp_project_init devtools.ts mp_devtools test/ integration.test.ts 21 个端到端测试(真建目录、真跑工具、真解析结果)

测试

pnpm test

测试会真在临时目录里建工程、调工具、再把写出来的 app.json 解析回来断言,覆盖:

- 工具全部注册、参数 schema 能编译
- 建页面并注册、注释保留、幂等、不覆盖手写文件
- mp_fix 只补孤儿页、不把组件当页面
- 分包页面登记到分包而非主包、非法 root 被拦
- tabBar 数量限制、组件注入路径可解析
- 删启动页被拦、miniprogramRoot 工程里文件落在代码根
- 路径穿越被拒、错误信息可读
- CLI 失败归因优先级

常见报错速查

| 报错 | 原因 / 解决 |
| Cannot get property "tools" without inject | 忘了 export const inject = ['tools'] |
| 插件装了但 --dump-config 里没有 | package.json 缺 dsh.bundle 声明 |
| dsh plugin add 报 workspace 错误 | 命令后补 -w |
| 工具在会话里调不到 | 没重启 dsh web,或没开新会话 |
| 找不到 …/app.json | 传的是项目根但代码在 miniprogram/ 子目录;插件会读 miniprogramRoot,也可直接传代码根 |
| ❌ 预览失败:开发者工具 CLI 没有写权限 | 手动打开一次 IDE 让它完成初始化,或检查 ~/Library/Application Support/微信开发者工具 权限 |
| ❌ 预览失败:服务端口没开 | IDE → 设置 → 安全设置 → 打开服务端口 |
| 路径含空格导致安装失败 | dsh CLI 转发绝对路径不加引号。把仓库放到无空格路径 |

许可

MIT
预览分享卡片长什么样 ↓leo666-cloud/dsh-miniprogram-helper
分享 · DeepSeek Harness Hub
leo666-cloud/dsh-miniprogram-helper

生成并注册小程序页面,一键出预览二维码

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部