b0cdf8bbminiprogram-v2/**(93 页 / 478 文件 / 127 TS)miniprogram-v2/** 域属主为小冈,pre-receive 锁定)查了三处,没有「小程序全面检测」的现成技能:
| 来源 | 结果 |
|---|---|
本地市场 ~/.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 用法),加载后确认不含检测清单。
⇒ 结论:技能只能提供判据依据,检测器必须自建。本轮按「微信小程序规范 + 本项目包体档位」自建两个脚本:
scripts/check_v2_miniprogram.py —— 包体 / 页面 / 组件 / 安全 / 反模式 / 权限 / 配置scripts/check_v2_api_contract.py —— 前端请求 ↔ 后端路由契约对账两个脚本均带 --selftest(反证:伪造工程必须报错,防假绿)。
app.json: pages=93, subPackages=0
微信小程序主包硬上限 2MB。实测主包源码 1894 KB,距上限仅剩 154 KB,且尚未计入编译产物与 minified=false 的影响。这是结构性问题,不是调优能解决的——必须按 tabBar 与低频页拆分包。
交叉印证:项目 memory 记载「主包代理 2884KB ⇒ 包体是唯一约束」「包体档位已拍 recommended 3072KB」。v2 零分包与此直接冲突。
契约对账结果:前端 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 处是「后端改了前缀前端没跟」还是「前端新页面尚未联调」,我不代判。但无论哪种,当前状态下这些调用不可用。
真密钥类(appSecret / 私钥 / sk- API Key / api_key)零命中。
判据修正说明:初版把 appid 当敏感信息,误报 7 处(.out/snowline/utils/brand.ts等)。appid 是公开标识不是密钥,已移出判据;同时.out/(白标构建产物)已排除出扫描范围。
urlCheck=falseproject.config.json 关闭了域名校验。本地能跑,但会掩盖 http 明文、未备案域名、未配服务器域名等提审阻断项。提审前必须开回 true 复验。
wx.getStorageSync/setStorageSync 阻塞主线程(utils/texts.ts:3683/3693、pages/demand-confirm、pages/fuyue-task-detail 等)。宜改异步。minified=false:仅影响包体,不影响正确性。按铁律,零命中必须反证判据,不能直接当"干净"。逐项验证结果:
| 项 | 反证方式 | 真值 |
|---|---|---|
| 注册页缺文件 | 93 页逐个查四件套 | 0 缺失 |
| 组件引用断链 | 全量 json 的 usingComponents 逐个解析落盘校验 | 0 断链 |
| console 日志残留 | 全目录正则计数 | 仅 1 处(app.ts,error 级,属合理) |
| Promise 无兜底 | 53 个含 .then 的文件逐个查 catch/fail/try | 0 无兜底 |
| 真密钥硬编码 | 6 类密钥模式全扫 | 0 处 |
| 本地图片资源 | 全目录图片计数 | 0 个(全走网络图,包体不受图片影响) |
这块的工程质量确实高——尤其 53 个异步链无一漏兜底,很少见。
不藏着,两次都是同类型:
app.include_router(auth.router),我取了 .router 当模块名(全都是 router),且前缀不在 include_router 而在各文件的 APIRouter(prefix=...) ⇒ 前缀全空。修完变 32 通过 / 7 断链。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