v2 版小程序全面检测报告(第一轮 · 静态)


零、先回答「有没有专用技能」

查了三处,没有「小程序全面检测」的现成技能:

来源结果
本地市场 ~/.workbuddy/skills-marketplace/skills空
已装用户级 skills仅 doc-code-archaeology
SkillHub 远程(中文 + 三轮英文语义搜索)只有开发类(wechat-miniprogram-toolkit 0.076 / wechat-miniprogram-skill 0.071 / wechat-miniprogram-ui-ux 0.068),无检测/审计类

项目内已内置的 wechat-miniprogram 是框架知识(生命周期、WXML 语法、API 用法),加载后确认不含检测清单。

⇒ 结论:技能只能提供判据依据,检测器必须自建。本轮按「微信小程序规范 + 本项目包体档位」自建两个脚本:

两个脚本均带 --selftest(反证:伪造工程必须报错,防假绿)。


一、🔴 P0 阻断项(3 条)

P0-1 零分包 + 93 页全在主包

app.json: pages=93, subPackages=0

微信小程序主包硬上限 2MB。实测主包源码 1894 KB,距上限仅剩 154 KB,且尚未计入编译产物与 minified=false 的影响。这是结构性问题,不是调优能解决的——必须按 tabBar 与低频页拆分包。

交叉印证:项目 memory 记载「主包代理 2884KB ⇒ 包体是唯一约束」「包体档位已拍 recommended 3072KB」。v2 零分包与此直接冲突。

P0-2 接口断链 7 处(前端调用后端不存在的端点)

契约对账结果:前端 39 个 API 路径字面量,32 个对上、7 个断链——且断链成因高度一致,全部是路径段缺失:

前端调用位置前端路径后端真实路径
services/api/keyTasks.ts:70/api/miniapp/key-tasks/api/miniapp/workbench/key-tasks
services/api/keyTasks.ts:75/api/miniapp/key-tasks/同上
services/api/keyTasks.ts:85/api/miniapp/key-tasks/claims//api/miniapp/workbench/key-tasks/claims/{claim_id}/complete
services/api/keyTasks.ts:90/api/miniapp/key-tasks/balance/api/miniapp/workbench/key-tasks/balance
services/dsl-sources.ts:21/api/miniapp/key-tasks/ledger/api/miniapp/workbench/key-tasks/ledger
pages/task-review/task-review.ts:17/api/miniapp/key-tasks/mine/api/miniapp/workbench/key-tasks/mine
pages/membership/membership.ts:17/api/miniapp/footprints/api/miniapp/user/footprints

request.ts 的 request(path) 是 BASE_URL + path 直拼,无路径重写层 ⇒ 这 7 处运行时必然 404。

⚠️ 需人工确认一层:这 7 处是「后端改了前缀前端没跟」还是「前端新页面尚未联调」,我不代判。但无论哪种,当前状态下这些调用不可用。

P0-3(暂缓)敏感信息:0 处

真密钥类(appSecret / 私钥 / sk- API Key / api_key)零命中。

判据修正说明:初版把 appid 当敏感信息,误报 7 处(.out/snowline/utils/brand.ts 等)。appid 是公开标识不是密钥,已移出判据;同时 .out/(白标构建产物)已排除出扫描范围。

二、🟡 P1 缺陷(1 条)

P1-1 urlCheck=false

project.config.json 关闭了域名校验。本地能跑,但会掩盖 http 明文、未备案域名、未配服务器域名等提审阻断项。提审前必须开回 true 复验。


三、🟢 P2 提示(3 条)


四、✅ 干净项(经反证,不是"没扫到")

按铁律,零命中必须反证判据,不能直接当"干净"。逐项验证结果:

项反证方式真值
注册页缺文件93 页逐个查四件套0 缺失
组件引用断链全量 json 的 usingComponents 逐个解析落盘校验0 断链
console 日志残留全目录正则计数仅 1 处(app.ts,error 级,属合理)
Promise 无兜底53 个含 .then 的文件逐个查 catch/fail/try0 无兜底
真密钥硬编码6 类密钥模式全扫0 处
本地图片资源全目录图片计数0 个(全走网络图,包体不受图片影响)

这块的工程质量确实高——尤其 53 个异步链无一漏兜底,很少见。


五、🔧 自曝:我的判据自己错了两次

不藏着,两次都是同类型:

  1. 首版契约对账报「39/39 全断链」——不可能,一个能跑的小程序不会全 404。根因:挂载写法是 app.include_router(auth.router),我取了 .router 当模块名(全都是 router),且前缀不在 include_router 而在各文件的 APIRouter(prefix=...) ⇒ 前缀全空。修完变 32 通过 / 7 断链。
  2. APIRouter 形态漏判:只认 ast.Name,漏了 fastapi.APIRouter(ast.Attribute)。同期发现脚本里 except: continue 会静默跳过 AST 解析失败的文件 ⇒ 会导致整文件路由漏检造成假断链,已改为显式报出 PARSE_FAIL。

两次都是「判据报红,先分类是脚本 bug 还是真缺陷」——和我在 335 演练里反复用的同一条铁律,这次在自己身上又应验了一遍。


六、第二轮待办(本轮未做,需派单或确认)

项说明阻塞度
TS 语法编译127 个 TS 用 esbuild 逐个过(node --check 对 .ts 无效,已踩过)中
页面跳转完整性navigateTo/switchTab 的 url 是否在 app.json 注册中
运行时检测用开发者工具 CLI(cli agent get-dom / get-card-image)读真实 DOM 与渲染结果高(能看到静态看不到的)
后端反向覆盖后端 427 条路由中,C 端应覆盖但前端未调用的(死接口/漏接)低
WXSS 规范是否用 TDesign、样式变量一致性低

运行时检测是唯一能验证「页面真的能跑起来」的手段,静态做不到。开发者工具已装(36.6.0,服务端口 56302 已开),CLI 与 agent 通道就绪 —— 需要你点头我再开跑(会打开项目、触发编译,属交互式操作)。


七、复现命令

# 静态全扫(P0 数即退出码)
python3 scripts/check_v2_miniprogram.py
python3 scripts/check_v2_miniprogram.py --selftest      # 反证判据

# 契约对账
python3 scripts/check_v2_api_contract.py