@microi.net/cli 6.2.4 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +6 -6
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +98 -98
  10. package/scripts/microi-cli.js +44 -44
  11. package/scripts/microi-codex-broker.js +2 -0
  12. package/scripts/microi-skills.meta.json +275 -257
  13. package/skills/.microi-skills-version.json +2 -2
  14. package/skills/.progressive-disclosure-manifest.json +89 -86
  15. package/skills/app-store/SKILL.md +555 -553
  16. package/skills/app-store/references/platform-row-format.md +7 -0
  17. package/skills/dos-orm/SKILL.md +2 -0
  18. package/skills/dos-orm/references/oceanbase-mysql.md +8 -0
  19. package/skills/message-notification/SKILL.md +2 -0
  20. package/skills/microi-ai-application/SKILL.md +1 -0
  21. package/skills/microi-client-frontend/SKILL.md +12 -48
  22. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +18 -1
  23. package/skills/microi-client-frontend/references/progressive-04-/345/211/215/347/253/257/346/216/245/345/217/243/344/270/216/347/274/223/345/255/230/346/201/242/345/244/215.md +45 -0
  24. package/skills/microi-codex/SKILL.md +2 -0
  25. package/skills/microi-deployment/SKILL.md +7 -0
  26. package/skills/microi-docs-coverage/references/capability-map.md +1 -1
  27. package/skills/microi-microservice/SKILL.md +14 -0
  28. package/skills/microi-mobile-app-quality/SKILL.md +2 -0
  29. package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
  30. package/skills/microi-system-delivery/SKILL.md +8 -1
  31. package/skills/microi-system-delivery/references/delivery-pitfalls.md +19 -0
  32. package/skills/microi-ui/SKILL.md +7 -4
  33. package/skills/microi-uniapp-frontend/SKILL.md +10 -1
  34. package/skills/microi.v8.js +17 -3
  35. package/skills/module-engine/SKILL.md +5 -0
  36. package/skills/playwright-e2e/SKILL.md +11 -3
  37. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +4 -4
  38. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +2 -2
  39. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +2 -2
  40. package/skills/ui-design/SKILL.md +19 -5
  41. package/skills/ui-design/assets/pattern-showcase/app.js +57 -0
  42. package/skills/ui-design/assets/pattern-showcase/index.html +35 -4
  43. package/skills/ui-design/assets/pattern-showcase/scenario-state.js +34 -0
  44. package/skills/ui-design/assets/pattern-showcase/styles.css +115 -0
  45. package/skills/ui-design/references/data-workspace-density.md +8 -0
  46. package/skills/ui-design/references/design-pattern-library.md +50 -1
  47. package/skills/ui-design/references/mobile-product-language.md +93 -0
  48. package/skills/uniapp-mall-assets/SKILL.md +1 -0
  49. package/skills/v8-crud-api/SKILL.md +2 -1
  50. package/skills/v8-file-upload/SKILL.md +2 -2
  51. package/skills/v8-frontend-events/SKILL.md +2 -1
  52. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +21 -1
  53. package/skills/v8-table-event/SKILL.md +2 -1
  54. package/skills/vision-engine/SKILL.md +284 -280
  55. package/skills/vision-engine/references/architecture-and-acceptance.md +14 -0
  56. package/skills/vision-engine/references/realtime-cpu-profiles.md +73 -0
  57. package/skills/vision-engine/references/video-timeline.md +176 -0
  58. package/skills/workspace-conventions/SKILL.md +3 -0
@@ -0,0 +1,7 @@
1
+ # 历史平台表行格式与覆盖安装
2
+
3
+ `Managed` 资源按授权应用包覆盖,`CreateIfMissing`、业务数据和租户扩展按原合同保留;“强制覆盖”不等于删除客户数据或绕过平台兼容版本、权限、哈希与资源所有权校验。
4
+
5
+ MySQL 的 `COMPACT`/`REDUNDANT` 会把 TEXT 前缀内联,旧备份即使恢复到新 MySQL 仍可在菜单 INSERT 时触发 1118 / 8126 字节行限制。后端启动与独立导入器在添加列、写菜单之前检查固定平台表的实际 ENGINE/ROW_FORMAT,仅对真实 InnoDB 旧格式执行 `ALTER TABLE ... ROW_FORMAT=DYNAMIC`。不得重写客户列、删索引、关闭严格模式或吞掉 ALTER 错误。
6
+
7
+ 后台按表复用前置检查点并强回读,现代格式不写 DDL,ValidateOnly 保持只读;新动态表显式使用 DYNAMIC。回归须在已授权现有 MySQL 上重现旧行格式的实际 INSERT 失败,再证明原数据、索引、默认值、中文/Emoji 和重复覆盖均保持正确;不能用字符串断言或当前空库安装一次代替旧库回归。
@@ -15,6 +15,8 @@ Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
15
15
 
16
16
  完整 API、跨库行为与示例见 `references/api-reference.md`。
17
17
 
18
+ OceanBase MySQL 兼容模式接入、会话超时及真实空库验收见 [OceanBase 接入](references/oceanbase-mysql.md)。
19
+
18
20
  ## 默认选择
19
21
 
20
22
  | 需求 | 首选 |
@@ -0,0 +1,8 @@
1
+ # OceanBase MySQL 兼容接入
2
+
3
+ - 使用 `OceanBase`、`OceanBase-MySql` 或 `OceanBaseMySql` 配置别名;Dos.ORM 复用参数化 MySQL 方言和 MySql.Data 驱动,平台运行时名称归一为 `MySql`。不支持用这些入口连接 Oracle 兼容模式。
4
+ - SQL 用户通常为 `user@tenant`,SQL 默认端口 `2881`,外部端口以实际编排为准。测试优先绑定回环地址并用已有授权的 SSH 隧道,不为连接测试公开数据库端口。
5
+ - `MySql.Data.ServerVersion` 可能去掉 OceanBase 后缀;真实身份由 `SELECT VERSION()` 读取并按端点短时缓存。每次打开及池复用时恢复驱动一致的 client/connection 字符集(默认 utf8mb4,显式配置优先),防止连接池重认证将会话重置为 latin1 后中文参数乱码;保留连接重置,不修改全局参数。会话 `ob_query_timeout` 继承连接串命令超时,导入器另同步事务预算。
6
+ - 使用原生 `DatabaseSeedImporter.ImportMySql57` 还原同一 SHA 的官网 SaaS 空库。逐表核对列、索引、完整行数和数据摘要,再验证真实 DDL、NULL/Unicode/日期/小数、参数化、事务、BulkInsert、Upsert、分页及平台 API;只有登录或 SELECT 1 不算全量兼容验收。
7
+ - 流式 SQL 分句必须保留字符串内部的 CRLF、CR、LF,不能用 `ReadLine()` 后统一补 LF;V8/JSON/文件正文与哈希都属于还原验收。仅行数一致不能证明内容完整。
8
+ - 复用现有服务。用户明确要求远端 OceanBase 安装时才建立对应编排及独立验收库;默认平台发布不追加此专项、不创建本地测试容器、不触及客户数据库。
@@ -92,6 +92,8 @@ return V8.ApiEngine.Run('msg_event', {
92
92
 
93
93
  ### 4. 前端通知中心
94
94
 
95
+ 框架通知中心的数量统一放在五个页签,不再增加重复统计卡片。“安装/更新全部平台应用”作为公共工具栏主操作跨页签可见,继续核验管理员权限、排除官方发布租户并防重复提交;不增加“去应用商城”按钮。弹层、徽标、错误详情和滚动区使用宿主主题变量,核对明暗色、非默认主题色及窄屏。
96
+
95
97
  前端 V8 使用 `V8.Notification.List` 获取当前登录用户的权威快照,使用 `MarkRead` 标记本人通知。SignalR 固定事件 `ReceivePlatformNotification` 只用于低延迟刷新:客户端按 `Id/EventId` 去重,收到后仍以列表接口回读为准。
96
98
 
97
99
  ```js
@@ -58,6 +58,7 @@ UniApp 使用 Vue 3 + TypeScript 的官方 Vite 工具链,并同时遵守 `mic
58
58
  - SFC 模板承担真实 DOM 结构;事件使用 Vue 绑定,状态使用 `ref/reactive/computed`,副作用在组合函数的生命周期内注册并清理。
59
59
  - 组件以业务语义命名,如 `RoomLobby`、`GameTable`、`AudioMixer`、`SettlementDialog`,不要按颜色或位置命名。
60
60
  - 长连接、轮询、音频上下文、动画帧、观察器和全局事件必须在卸载时释放;页面隐藏时暂停非必要工作。
61
+ - 首次数据读取失败后,后续有效轮询必须能启动尚未创建的场景或播放器,不能只对可空实例调用更新。初始化使用单个在途Promise与存活/实例保护,卸载后的迟到成功不得复活页面;同时覆盖首次失败后恢复、并发启动只创建一个实例及卸载时回填的行为回归。加载失败保持明确错误与原数据,不通过延长全局超时或隐藏失败取得通过。
61
62
  - 响应式布局至少覆盖 1440px 桌面和 390px 移动视口;使用安全区、44px 触控目标、键盘焦点和 `prefers-reduced-motion`。
62
63
  - 音频应用必须区分背景音乐、人声和效果音,分别调节、静音和持久化;浏览器首次用户手势前不得强制播放。
63
64
  - 不使用原生 `alert/confirm/prompt`;使用宿主反馈或可访问的 MCI 弹层。
@@ -62,7 +62,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
62
62
  | 通用 V8/低代码工具 | `src/utils/diy.common.js`、`src/utils/v8-*.js` |
63
63
 
64
64
  <!-- /microi-progressive:chunk -->
65
- <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=5d3b01eb376defa4bcbf754a617bcfab2e0cfa56e492c6f28c081488a049ba2b -->
65
+ <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=b87a61e03738e2f510e4036fb2d13750b2af873b37aa307def6f44894fa48213 -->
66
66
  ## 2. 表单引擎三层结构
67
67
 
68
68
  ### 模块级跨端视图
@@ -144,7 +144,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
144
144
 
145
145
  ### 前端 V8 上下文不是固定 DTO
146
146
 
147
- 原生 `FormSet` 的异步上下文绑定、加载代次与回归要求见 [运行时规则](references/progressive-02-8-运行时高频坑复盘.md#原生-formset-的异步上下文绑定)。
147
+ 原生 `FormSet` 的异步上下文绑定、加载代次与回归要求见 [运行时规则](references/progressive-02-8-运行时高频坑复盘.md#原生-formset-的异步上下文绑定)。Select 在子表行或 V8 `FormSet` 后只显示保存 Id 时,先查 [已选值显示补查](references/progressive-02-8-运行时高频坑复盘.md#select-动态赋值与子表回显),不能把 Id 改存 Label。替换原生详情使用模块 `sys_menu.DetailPageV8`;`InFormV8` 是已打开表单的初始化,不是详情打开前拦截点。
148
148
 
149
149
  `DiyCommon.SetV8DefaultValue()` 只创建基础能力,`diy-table.vue`、`diy-form.vue`、`diy-form-full.vue` 和各 mixin 会按事件再挂载动态属性。新增 API 或修正文档时必须同时核对这些入口,不能只看一个 `V8` 对象字面量。
150
150
 
@@ -175,9 +175,16 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
175
175
 
176
176
  ### 用户级界面偏好(强制)
177
177
 
178
+ - 启动屏 `#microi_loading` 是独立不透明遮挡层,使用 `--mci-startup-surface`,不能继承玻璃画布的透明 `--mci-bg-base`。进度未到100%、到100%但业务仍等待、明确失败时都不能透出登录或壁纸;只有真实租户、首路由与当前场景壁纸选择/预载完成后发送 `microi:app-ready`,先显示完整100%帧再退出。保留等待文案、失败原因和重试,不把这条启动边界扩散为业务骨架不透明。
179
+ - 壁纸统一复用 `utils/wallpaper-runtime.js`。登录的 `sys_config.LoginBgImgRandom` 开启时,历史 `LoginWallpaper` 不能锁死刷新随机;桌面按个人 `RandomDesktopBg` 明确0/1优先,`null/undefined/空字符串` 才继承 `sys_config.DesktopBgImgRandom`,固定图片字段与随机开关分别解析。同一document、API/租户/场景/账号/策略共用目录请求、一次随机选择及预载Promise,玻璃与WebOS不能各自重抽;刷新重新选择,手选可覆盖本document,不把临时随机结果写回个人偏好。账号/租户变化后的迟到结果失效,图片/目录失败有界回退。
180
+ - `login-branding.js` 只将无凭据、特殊端口、query及hash的 `https://static.itdos.com` 公开图片映射至同路径 `https://file.microi.net`;文件对象和JSON先解包再解析。不能全局替换任意客户HTTP地址、签名URL或相似域名,也不能把目录读取成功当作图片已可加载。
181
+ - `ImgUpload` 的主上传卡片就是原生文件选择入口,不再复制一个独立“选择图片”按钮;点击、Enter、Space保留原生filechooser,多选仍按字段配置。移动布局主卡片同样可选图库,拍照保留单独入口与后置摄像头capture;裁剪开关不得冒泡触发选图。隐藏/查看模式不残留可操作文件input,数量、公私桶、权限、裁剪和上传前后事件不变。
182
+ - WebOS 新窗口的初始高度为已扣除工具栏/Dock后的可用桌面高度88%,再走原边界限制;不是持续强制高度,也不能重置已打开窗口的拖动、缩放或最大化。Toolbar图标、时间、搜索/主题和账号共用配对的 `--webos-toolbar-text`,浅色玻璃深字、深色玻璃浅字;去除影响辨识的文字阴影和hover降透明,经典界面与非玻璃样式保持独立。
183
+ - 回归检查真实启动CSS/脚本与背景组件、随机/固定/继承/预载/迟到响应,运行 `startup-wallpaper.browser.mjs`、`wallpaper-runtime.spec.mjs` 和既有主题/登录兼容测试;上传用真实SFC与ElUpload的鼠标/键盘filechooser,WebOS覆盖两种桌面风格、亮暗玻璃及初始/还原/最大化。窄屏相机模拟不是原生硬件验收,源码测试、实际页面与渠道发布分别报告。
184
+
178
185
  - 界面材质是独立维度:`ThemeMaterial=Solid/Glass/Frosted/Liquid` 分别为实色、普通玻璃、磨砂玻璃、液态玻璃,不增加第三种 `ThemeMode` 或把玻璃写成 `ThemeColor`。全局保存 `sys_config.ThemeMaterial`,个人保存同名 `sys_user` 字段;个人 `System`/空值/null 继承,系统缺省/未知为 Solid。主题设置和个人中心共用 `platform-user-update-preferences` 当前用户白名单及保存队列;登录前纯外观缓存可含材质但不含身份/权限/凭据,匿名选择只预览。恢复默认写 System,不能固化当前全局材质。
179
186
  - 玻璃运行标识为根 `data-mci-material=solid/glass/frosted/liquid`,`theme-material.js` 统一解析,`theme-material.scss` 消费语义表面和前景;模糊限于壳层、导航、面板及弹层,不能每个表格单元格独立滤镜或持续液体变形。背景复用当前租户已校验壁纸目录,个人只保存目录Id;API/租户切换使旧目录响应失效。无 backdrop-filter、`prefers-reduced-transparency` 或 forced-colors 时降级实色;关闭渐变/阴影仍有效,菜单文字、表格内容、输入及焦点保持可读。iframe 通过既有主题快照接收材质,不读取父DOM或自行重建个人偏好。
180
- - 全框架玻璃沿统一材质色板和语义令牌覆盖表格、表单、控件、弹层及精确AppKey微应用;壁纸全局只调理一次明度,大容器只铺一层低alpha表面,内层画布透明。`theme-material-components.scss` 承接表单、Banner、折叠/Tab、Element控件与官方平台应用投影。静态边使用细暗 `--mci-material-border`,不泛白/发光;hover可加强底边,键盘 `focus-visible` 使用独立清晰焦点环;小范围主操作使用成对的primary-bg/hover/text令牌保留主次。文字不使用容器opacity,Canvas/业务图片及显式图片背景保留像素;固定列裁剪滚入固定区的普通单元格绘制防透字,退出材质后恢复,不能重新铺实色挡板。真实跨文档iframe不继承CSS,当前micro-app沙箱可见DOM投影到lightDOM时也只能在所属AppKey范围适配,不能用裸micro-app-body规则污染其他应用。
187
+ - 修改全框架玻璃、浮层或加载态前,必须读取 [玻璃材质采样与清晰度](references/progressive-02-8-运行时高频坑复盘.md#玻璃材质采样与清晰度):沿用统一采样所有者、轻内层控件与清晰前景,保留固定列、iframe 隔离、加载草稿及迟到响应边界,并完成真实背景与嵌套浮层验收。
181
188
  - AI 配置材质先 `microi_get_field_list` 回读 sys_config/sys_user 实际枚举;个人使用 `microi_run_engine` 调用 `platform-user-update-preferences`,`params:{ThemeMaterial:'Frosted'}`、`confirmExecution:'platform-user-update-preferences'`,不能传目标账号/租户、CSS、透明度或URL。字段/PC版本缺失时更新责任官方应用与PC;MCP通用读字段/执行引擎已覆盖,不新增专用写设置通道。
182
189
  - 菜单前景独立于按钮前景与页面显示模式。主题设置在自定义颜色旁提供 `MenuTextColor=Auto/Light/Dark`(跟随主题/浅色/深色),默认按实际菜单背景选择。普通、选中、悬停、顶部与侧边弹出菜单必须使用同一前景契约;模式切换和主题重应用保留显式选择。沿当前账号偏好队列保存到 `sys_user.MenuTextColor`,个人中心同步回显;空值继承 `sys_config.MenuTextColor`,全局缺省 Auto。重置清空个人值。旧租户仅使用身份隔离的设备回退,禁止新增全局 localStorage 偏好。密度仅保留现有“小/标准/大”滑杆,不再增加同步的预设按钮组。修改时执行 `menu-text-color.spec.mjs`、偏好接口白名单与真实浏览器刷新恢复回归。
183
190
 
@@ -195,7 +202,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
195
202
  - 登录页与登录后共用主题设置组件;登录页使用居中弹层且禁止调用个人保存队列。壁纸使用当前租户目录缩略图,登录后仅保存 `sys_user.LoginWallpaper` 中的目录 Id,不能持久化任意外部 URL;空值恢复默认行为,字段由系统账号及 SaaS 基础包交付。
196
203
  - 登录前可展示当前设备最后一次成功登录用户的纯外观缓存,按规范化 API 地址与租户隔离,并按“缓存中的显式外观项 → 当前全局配置 → 平台默认”逐项合并;只在真实登录成功或当前用户偏好确认后更新。缓存白名单不得包含 Token、账号资料、角色和权限;损坏、未知项及跨租户缓存忽略,不新增匿名按账号查询个人设置的接口。登录页预览不改这份已确认缓存;登录成功后以当前用户服务器偏好为准,不能把旧缓存写入另一账号。
197
204
  - 主题面板的主题色、亮暗模式、边角、导航、菜单展开、密度、三个装饰开关及登录风格均有同名系统全局默认,不新建重复字段。`framework-appearance.js` 统一应用运行状态;渲染继承值不能写成个人选择。`UiDensityScale` 安全范围为 90~110、步长 5,覆盖表单标签/普通控件、系统设置表单、侧栏、表格、Tab 与 Teleport 弹层;富文本、代码、地图和子表保持内容高度,触屏最小目标仍为 44px。
198
- - 密度覆盖不能只改字号和单元格 padding:父菜单底圈、图标、菜单行间距、普通表格 `.cell` 的历史38/40px行高、模块/表单 Banner、表单顶部工具栏与折叠分组标头都必须采用同一密度 token,同步缩放字号、图标、padding和最小高度。多行内容保持自然高度,不能设置固定行高裁切。直角样式需按真实选择器优先级覆盖 `.el-message-box.mci-unified-message-box` 等双class的 important 壳,并验退出确认 Teleport 首帧。表格列宽拖动热区与可见分隔线分开,不能叠加两条边框造成2px视觉;验证拖拽保存仍可用。
205
+ - 密度覆盖不能只改字号和单元格 padding:父菜单底圈、图标、菜单行间距、普通表格 `.cell` 的历史38/40px行高、模块/表单 Banner、表单顶部工具栏与折叠分组标头都必须采用同一密度 token,同步缩放字号、图标、padding和最小高度。90/95小档桌面顶栏及侧栏/固定头/主内容偏移共用 `--mci-ui-topbar-height:44px`,标准/大档保持50px;表单标题与Banner压缩重复留白,保留保存/更多/搜索并按内容容器自然换行,移动触控目标仍至少44px。多行内容保持自然高度,不能设置固定行高裁切。直角样式需按真实选择器优先级覆盖 `.el-message-box.mci-unified-message-box` 等双class的 important 壳,并验退出确认 Teleport 首帧。表格列宽拖动热区与可见分隔线分开,不能叠加两条边框造成2px视觉;验证拖拽保存仍可用。
199
206
  - 【恢复默认】沿原保存队列把 `ThemeMode/ThemeColor/LoginWallpaper` 清空、`ThemeMaterial/CornerStyle/NavigationLayout/MenuChildExpandMode/LoginStyle` 写 `System`、`UiDensityScale/DisableGradient/DisableShadow/DisableButtonIcon` 写 `null`,只作用当前用户。同时清旧设备回退与本身份缓存;不能修改 `sys_config` 或把平台默认值写成个人覆盖。开关 `0` 与 `null` 语义不同:`0` 可覆盖全局 `1`,`null` 继承全局。
200
207
  - `DisableGradient/DisableShadow/DisableButtonIcon` 同时支持个人与租户默认,根标识分别为 `data-mci-disable-gradient/shadow/button-icon`。去装饰仍保留按钮/输入边界、键盘焦点、加载指示与纯图标操作;登录方式图标、说明文字与按钮前景按所在真实表面配对,不能被全局渐变关闭规则改为白底白字。登录样式 `LoginStyle=Original/Minimal/Split/Console` 复用一套业务 mixin 与表单,不复制验证码、SSO、强认证、协议及回跳逻辑;匿名阶段只使用已确认的纯外观缓存、当前租户默认或当前匿名预览,不发起个人设置读取/写入。
201
208
  - `sys_config.HideFrameworkFunctions` 只控制顶栏入口,固定 Key 为 `Chat/BackgroundTasks/Search/Language/Theme/AI/Bluetooth/SystemStyle/FullScreen`,账号头像姓名始终保留。它与控制移动端等范围的原 AI 禁用开关独立,也不能代替功能权限。所有入口提供 `data-framework-function` 便于验收,未知 Key 忽略。
@@ -229,51 +236,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
229
236
  ---
230
237
 
231
238
  <!-- /microi-progressive:chunk -->
232
- <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=7cf7bca3618237a68089a9891292028c6293c17eee973cb3af40afaef3740383 -->
233
- ## 7. 验证建议
234
-
235
- ### 本地 ApiBase 与 OsClient 解析(强制)
236
-
237
- WebOS 直链容器不能只等旧版 `CallbackSysMenuModel` / `CallbackCurrentDiyTableModel`:标准页面可能不再发送这些事件,标题与图标必须回退当前权限路由的 `meta.title/icon`。路由切换时清空旧模型,回调绑定来源路由并拒绝迟到事件;嵌入窗通知、桌面和手机标题共用同一响应式结果。修改时运行 `tests/webos-page-title.spec.mjs`,并验收直链、刷新、前进后退、桌面窗口和经典界面。
238
-
239
- - 域名发现先于租户确定,固定 `platform-os-client-by-domain` 请求不能自动注入默认或缓存租户,也不能携带旧 Token;显式调用租户仍保持。没有 URL/index.html 租户时,每次冷启动重新发现域名,成功后更新缓存,失败立即停止,不写入 `iTdos` 继续请求配置。配置业务失败不是连接故障,健康检查成功不能触发循环重载;只有确认连接故障后的恢复才重载失败启动页。回归覆盖无缓存、错误缓存、显式租户及失败不重载,使用 `domain-tenant-bootstrap.spec.mjs`。
240
- - 登录回跳使用 Vue Router 解析完整深链接后合并 query/hash;对象式 `push({path, query})` 的 query 会覆盖 path 中原有参数,不能直接传空对象导致记录 Id 丢失。使用 `login-deep-link-query.spec.mjs` 验证编号、编码参数、重复参数和锚点。
241
-
242
- - `app.use(router)` 会立即触发首个路由守卫。守卫中的 SSO、认证、菜单请求必须等待 `initApp()` 完成真实租户和系统配置初始化;初始化失败时取消导航并保留启动错误界面。释放初始化等待必须早于 `router.isReady()`,避免彼此等待;禁止将缓存尚未建立时的 `GetOsClient()` 默认值 `iTdos` 发给客户服务器。
243
-
244
- - 身份和菜单只读初始化的短暂失败最多读取三次,间隔 300/1000ms;认证失效立即回登录页并保留原深链接,HTTP 403 和已耗尽的菜单依赖重试不得继续重试。重试期间退出登录应停止后续读取,不得用清空 Token、伪造角色或放行保护路由掩盖错误。持续失败用 `next(error)` 保留身份/菜单阶段和原始原因,禁止用 `next(false)` 把它替换为 `Navigation aborted`;启动界面不能据此断言后端断网。当前用户请求的传输失败必须 reject,不能留下永久 pending 的 Promise。修改这条链路时运行 `route-bootstrap-recovery.spec.mjs`,并用真实路由验证健康登录、短暂失败恢复、持续失败提示和过期会话跳转。
245
-
246
- - `ApiServiceUnavailable` 确认连接故障后,每轮探测结束 5 秒后继续请求固定匿名健康接口;单次请求超时 5 秒,自动与手动检测共用在途请求。后端返回有效健康正文后停止轮询,启动失败的页面只重载一次原 URL,已经就绪的业务页面原地撤掉异常层并保留输入,禁止重放失败的业务写入。旧版健康接口也必须返回有效的 Healthy 正文,不能把反向代理 HTML/404 当作恢复。安全拦截继续按后端解除时间检查,不用连接故障轮询缩短封禁。定向回归使用 `api-service-recovery.spec.mjs` 与 `api-service-status.spec.mjs`,浏览器必须验证断连到自动恢复全过程。
247
239
 
248
- - `src/config.json.ApiBaseDev` 是本地默认 API;URL 中 `#` 之前的 `ApiBase`、`OsClient` 必须同时
249
- 高于 `index.html`、config、Pinia 与 localStorage。解析统一走
250
- `src/utils/runtime-endpoint-query.js`,禁止在新入口另写正则形成不同优先级。
251
- - URL 只允许有效的 HTTP(S) ApiBase 和安全 OsClient。页面初始化后通过不含 Token 的
252
- `window.__MICROI_RUNTIME_ENDPOINT__` 暴露实际值,便于 AI/自动化确认没有误连配置文件中的服务器。
253
- - 页面已解析的租户必须进入真实 HTTP 请求。`DiyCommon.UseAxios/UseAxiosAll` 与共享 axios 请求层统一通过 `request-tenant-context.js` 补当前 API 的 `osclient` 请求头;保留调用者显式的路径、Query、参数或 Header 租户,不给其它服务器或相邻 API 子路径自动添加页面租户。JSON 正文在动态路由阶段可能尚未读取,不能只依赖正文或旧 Token 选择租户。验收必须增加同源旧 Token 指向其它/不存在租户的真实后端场景:`platform-current-user` 应走页面租户并返回登录失效,保留原深链接进入登录页,不得显示“无法确认接口配置”或让 SSO 发现返回错误租户的 404;定向回归为 `request-tenant-context.spec.mjs`。
254
- - 首次身份读取的业务/传输失败交给路由守卫处理,`getInfo` 不调用带全局通知副作用的 `DiyCommon.Result`,同时抑制请求层通知和抢先登录跳转;`App.PageInit` 等待首次导航成功后再启动续签/用户刷新,导航失败时结束。既要验证干净会话,也要验证旧登录缓存和失败后重复刷新,不能以隔离浏览器成功代替用户当前会话验收。
255
- - 同源浏览器窗口仍共享 Token、CurrentUser 等持久化状态。不同 `ApiBase + OsClient` 并行测试必须
256
- 使用独立 browser context/profile;URL 最高优先级不等于登录态隔离。
257
- - 修改该链路时运行 `node --test tests/runtime-endpoint-query.spec.mjs`,再使用两个独立
258
- `browser.newContext()` 验证两组运行目标互不串号。
259
-
260
- ### 菜单微服务缓存与恢复(强制)
261
-
262
- - 首次挂载分开检查资源下载与渲染:下载最多 60 秒,`beforemount` 资源齐备后才开始原有 12 秒渲染期限;不得在资源正常下载时提前销毁沙箱。成功仍要求真实可见 DOM,保留一次自愈与旧实例保护。回归覆盖超过 12 秒的真实下载、下载停滞、渲染停滞和陈旧实例事件。
263
- - 动态菜单宿主的 Vue 路由保持 `keepAlive:false`,由 `<micro-app keep-alive>` 独占运行时状态;契约固定为 `runtime-keep-alive`,禁止 Vue `KeepAlive` 和 micro-app 双层缓存。
264
- - 每个顶部 Tab 按完整路由生成稳定实例身份,最多保留 5 个隐藏实例并按 LRU 淘汰。关闭 Tab、退出登录、Token/角色变化以及版本或入口变化时必须精确销毁对应运行时。
265
- - 恢复时强制同步宿主上下文并检查真实可见 DOM;子应用监听 `appstate-change`,在 `afterhidden` 幂等暂停轮询、WebSocket 和观察器,在 `aftershow` 幂等恢复并重新测量布局,同时保留用户输入、筛选、滚动和内部路由。
266
- - 微服务 `openForm` 省略 `sysMenuId` 时,宿主从自身冻结的 `ownedRouteMeta.Id` 补回菜单上下文,不能在异步打开后借用另一页的全局 `$route`。显式跨表菜单仍透传并由 FormEngine 验证,不设置 `_IsAdmin`、绕过行范围或增加用户权限;没有合法菜单/表权限时保留拒绝。修改运行 `micro-app-open-form-context.spec.mjs` 并在实际商城点击发布新应用;涉及保存链路时用获授权的本轮私有 fixture 完成保存、独立回读、重开及精确清理,不上传或公开发布测试包。
267
- - 修改宿主、TagsView 或权限路由时,必须同时读取 [Vue3 前端微服务宿主规则](references/progressive-03-vue3-前端微服务宿主规则.md) 并运行微服务缓存契约测试。
268
- - 修改 Vue/JS 后先跑 VS Code Problems 或 `get_errors`。
269
- - 宿主按钮重置只作用于 `button:not(:focus-visible)`,不能用全局 `outline:none !important` 覆盖组件或微应用的键盘焦点。微应用保留自己的边框形状,焦点色使用已适配明暗表面的 `--mci-text-link`(缺省回退正文语义色),不能直接用浅品牌色。真实 Tab/Shift+Tab 回归须核对 `:focus-visible`、实际 `outline-style`、宽度、颜色与至少 3:1 对比度;`outline-style:none` 即使宽度非零也不可见。使用阴影焦点时另验实际 `box-shadow`,不能只看焦点状态。平台样式组件回归归 Full,应用自身按钮继续在真实业务页面验收。
270
- - 影响核心前端时跑 `Microi.Client` 的 `npm run build`。
271
- - 如果改了工作流、表单保存、按钮 V8,建议用实际 `sys_menu` 配置测试:
272
- - `FormBtns` 是否出现在表单右上角/FAB。
273
-
274
- ---
275
-
276
- <!-- /microi-progressive:chunk -->
277
240
  ## 详细参考路由(渐进披露)
278
241
 
279
242
  仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
@@ -281,4 +244,5 @@ WebOS 直链容器不能只等旧版 `CallbackSysMenuModel` / `CallbackCurrentDi
281
244
  - [references/progressive-01-3-动态按钮系统.md](references/progressive-01-3-动态按钮系统.md):3. 动态按钮系统;5. 路由与打开方式;6. 修改前必查清单
282
245
  - [references/progressive-02-8-运行时高频坑复盘.md](references/progressive-02-8-运行时高频坑复盘.md):8. 运行时高频坑复盘;7.1 登录验证码与 Sys_Config;Microi 前端 SDK 约束
283
246
  - [references/progressive-03-vue3-前端微服务宿主规则.md](references/progressive-03-vue3-前端微服务宿主规则.md):Vue3 前端微服务宿主规则;在线 AI 应用与微服务页面协作;浏览器访问密钥路由
247
+ - [references/progressive-04-前端接口与缓存恢复.md](references/progressive-04-前端接口与缓存恢复.md):运行目标、菜单微服务缓存与恢复
284
248
  <!-- microi-progressive:end -->
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-008 sha256=a435b99b6bfad7ab62d95ef78f0614205e5da51cfc0d4f2b7d3a1f7c6eb9c2ea -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-008 sha256=d0192d6d272dafa342f51af6b30e6e6d2b5d916898b94116fc62d1bcd5a03f87 -->
6
6
  ## 8. 运行时高频坑复盘
7
7
 
8
8
  ### 原生 FormSet 的异步上下文绑定
@@ -13,6 +13,15 @@
13
13
  `form-v8-context.spec.mjs`,验证切记录、同记录重载、卸载和正常事件链;直接写 `V8.Form`
14
14
  及其它异步副作用仍需自己的当前性检查。
15
15
 
16
+ ### Select 动态赋值与子表回显
17
+
18
+ - `diy-select.vue` 在挂载、`modelValue/ModelProps` 变化后的 `nextTick`、远程候选完成或 `field.Data` 整体替换后,复用 `DiyCommon.ResolveFieldsSelectedData` 补齐缺失标签。候选分页与已选值补查独立,不能扫描全部页或把第一页当作全部选项。
19
+ - 单/多选、Id/Label、Text/Json 及数组按既有保存配置解释;`0/false` 是有效键,清空保持清空。普通 Data/KeyValue 和直接存 Label 继续本地处理。SQL 使用服务端受控解析;Api/ApiEngine/DataSource 只有 `Config.SelectedValueLookup===true` 且返回 `DataAppend.SelectedValuesResolved===true` 才接受补查结果,否则保留原 Id。
20
+ - 每个控件独立构建字段补查投影,不能让多行共用字段对象的请求彼此作废;真实 Label 可替换同键的临时 Id 占位并刷新 Element 显示缓存。此路径只更新显示选项,不 emit `ModelChange`、不触发字段 V8、不写 `V8.Form` 或改变提交格式,更不是其它业务字段的关联回填。
21
+ - 请求携带当前表单、菜单和子表授权上下文;API、租户、会话、表单引用、记录、选择代次、配置变化或组件卸载后,丢弃迟到结果。无权限、已删除、契约未确认或失败时保留原保存值,不扩大候选范围。
22
+ - 实例短缓存命中仍应用已选 Label,只是不重复 HTTP;比较选项列表以避免 watch 反馈循环,不把独立投影存进共享字段的长期缓存。授权/菜单就绪后重建上下文使旧负缓存失效;补查失败捕获后释放实例缓存,允许后续重试。
23
+ - 修改须验证单/多选×Text/Json×本地/远程搜索×Sql/Api/ApiEngine/DataSource,补充多行共享元数据、清空、数值键、Label/Data/KeyValue、迟到及无业务回写断言。真实子表和 V8 动态赋值应另做页面验收。
24
+
16
25
  ### 前端 V8.Http 与后端同构契约
17
26
 
18
27
  `Microi.Client` 的前端 V8 运行时在 `src/utils/diy.common.js` 挂载 `V8.Http`,实现位于 `src/utils/v8-http.js`。修改 HTTP 能力时必须保持:
@@ -154,6 +163,14 @@ DiyCommon.FormEngine.AddFormData("table_name", { Field: "value" }, function (res
154
163
  - 保存/提交/登录验证等动作保留按钮 Loading,可信百分比保留真实进度;其余 spinner、转圈图标和“加载中”文案不得充当内容加载态。
155
164
  - 修改后运行静态门禁,确认源码不存在内容型 `v-loading`、`ElLoading.service`、硬编码黑色 Loading mask 或加载期空态;再用真实浏览器验证菜单、首页、表格、表单详情在亮色、暗色、自定义主题和移动端下的骨架几何、对比度、`aria-busy`、reduced-motion 及请求失败收口。
156
165
 
166
+ ### 玻璃材质采样与清晰度
167
+
168
+ - 全框架玻璃沿统一材质色板和语义令牌覆盖表格、表单、控件、弹层及精确 AppKey 微应用。背景保留壁纸原有色彩与明暗结构,不使用全局去色滤镜或厚重白/黑 veil;一个独立外壳只采样一次背景,内层画布透明,按钮与控件用轻填充,不对每个字段、Tag 或表格单元格叠独立滤镜。`theme-material-components.scss` 承接表单、Banner、折叠/Tab、Element 控件与官方平台应用投影;WebOS 窗口、工具栏、Dock、右键菜单与加载态也复用材质语义令牌,不另存偏好。`diy-code-editor` 为明确例外:自身、版本预览/对比及 AI 内部控件使用固定原生 `vs-dark` 暗色域和独立语义变量,不能把 Monaco 画布改透明或跟随品牌/明暗/材质;保留共享 loader 与原生 token,模型 Teleport 下拉仅用自有 class 隔离,不污染其它编辑器。
169
+ - 经典桌面显示 TagsView 时,由完整 `.tags-view-container-microi` 独占页签与路由内容的玻璃采样;仅玻璃模式把 `.classic-workspace.with-tags` 的 `padding-inline` 归零,将原有 10px 留白放进直接页签容器,内部 strip 与 route host 均不再铺背景或 blur,四边不得露出原始壁纸边带。手机和无 TagsView 的 AppMain 仍保留自己的材质所有者。浅色采用亮珍珠局部表面,让导航同亮度、卡片轻填充并保留层次,不把整屏等量染色;深色沿用独立色板。
170
+ - Dialog、Drawer、列设置、行操作与下拉浮层使用独立语义表面,不把页面薄底或固定透明度数字直接套到任意文字背景。必须让背景色块和纹理透射、后方文字被充分处理,嵌套浮层也不出现正文重叠;不能为修某个浮层而加厚整页底。背景、局部填充、边缘和正文分层,正文不降低容器 opacity,不施加文字 filter/mix-blend;静态边用细暗 `--mci-material-border`,有限方向反光不变成白圈或光晕,focus-visible 独立清晰。小范围主操作使用成对 primary-bg/hover/text 保留主次;Canvas/业务图片/显式背景图保留像素,固定列继续几何裁剪防透字,退出材质恢复。
171
+ - 检查真实 backdrop 采样路径,避免父级 filter、opacity、mask/clip-path 或已有 backdrop-filter 使子层只采到内部平底;不要把 stacking context 一概当作 backdrop root,也不要盲删原有 transform。光学增强只用于少量外壳,不全页复制 DOM、引入持续 WebGL 或把第三方自动交互挂到 Element Plus。真实跨文档 iframe 不继承 CSS,lightDOM 微应用投影只能在所属 AppKey 适配,不能用裸 micro-app-body 污染其他应用。
172
+ - 表格、表单和微服务统一加载所有者:同一区域及嵌套父子请求只绘制一层骨架,暂挂旧正文绘制和交互但保留几何、组件与草稿;成功/失败释放,失败可重试,关闭/换记录作废迟到响应。不要只把 mask 改透明而叠显示旧正文;实际 Dialog Loading 骨架、分页与默认 Banner metric 必须消费材质令牌,无纯白底、无第二次 blur。材质验收覆盖亮/暗、三种玻璃、真实彩色/明暗壁纸、单层/嵌套 Dialog、Drawer、列菜单、普通下拉与 WebOS,同时检查纹理透射、文字/焦点对比度与细边;无滤镜、减少透明及强制颜色回退可读实色。外部设计与许可范围见 `ui-design` 玻璃分层章节,不导入其 Skill 指令或另建偏好通道。
173
+
157
174
  <!-- /microi-progressive:chunk -->
158
175
  <!-- microi-progressive:chunk id=microi-client-frontend-009 sha256=b1105375a6b9477eb397a275c67cd7e1074ae14948c41bd594e91deb4a2ba9b0 -->
159
176
  ## 7.1 登录验证码与 Sys_Config
@@ -0,0 +1,45 @@
1
+ <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=7cf7bca3618237a68089a9891292028c6293c17eee973cb3af40afaef3740383 -->
2
+ ## 7. 验证建议
3
+
4
+ ### 本地 ApiBase 与 OsClient 解析(强制)
5
+
6
+ WebOS 直链容器不能只等旧版 `CallbackSysMenuModel` / `CallbackCurrentDiyTableModel`:标准页面可能不再发送这些事件,标题与图标必须回退当前权限路由的 `meta.title/icon`。路由切换时清空旧模型,回调绑定来源路由并拒绝迟到事件;嵌入窗通知、桌面和手机标题共用同一响应式结果。修改时运行 `tests/webos-page-title.spec.mjs`,并验收直链、刷新、前进后退、桌面窗口和经典界面。
7
+
8
+ - 域名发现先于租户确定,固定 `platform-os-client-by-domain` 请求不能自动注入默认或缓存租户,也不能携带旧 Token;显式调用租户仍保持。没有 URL/index.html 租户时,每次冷启动重新发现域名,成功后更新缓存,失败立即停止,不写入 `iTdos` 继续请求配置。配置业务失败不是连接故障,健康检查成功不能触发循环重载;只有确认连接故障后的恢复才重载失败启动页。回归覆盖无缓存、错误缓存、显式租户及失败不重载,使用 `domain-tenant-bootstrap.spec.mjs`。
9
+ - 登录回跳使用 Vue Router 解析完整深链接后合并 query/hash;对象式 `push({path, query})` 的 query 会覆盖 path 中原有参数,不能直接传空对象导致记录 Id 丢失。使用 `login-deep-link-query.spec.mjs` 验证编号、编码参数、重复参数和锚点。
10
+
11
+ - `app.use(router)` 会立即触发首个路由守卫。守卫中的 SSO、认证、菜单请求必须等待 `initApp()` 完成真实租户和系统配置初始化;初始化失败时取消导航并保留启动错误界面。释放初始化等待必须早于 `router.isReady()`,避免彼此等待;禁止将缓存尚未建立时的 `GetOsClient()` 默认值 `iTdos` 发给客户服务器。
12
+
13
+ - 身份和菜单只读初始化的短暂失败最多读取三次,间隔 300/1000ms;认证失效立即回登录页并保留原深链接,HTTP 403 和已耗尽的菜单依赖重试不得继续重试。重试期间退出登录应停止后续读取,不得用清空 Token、伪造角色或放行保护路由掩盖错误。持续失败用 `next(error)` 保留身份/菜单阶段和原始原因,禁止用 `next(false)` 把它替换为 `Navigation aborted`;启动界面不能据此断言后端断网。当前用户请求的传输失败必须 reject,不能留下永久 pending 的 Promise。修改这条链路时运行 `route-bootstrap-recovery.spec.mjs`,并用真实路由验证健康登录、短暂失败恢复、持续失败提示和过期会话跳转。
14
+
15
+ - `ApiServiceUnavailable` 确认连接故障后,每轮探测结束 5 秒后继续请求固定匿名健康接口;单次请求超时 5 秒,自动与手动检测共用在途请求。后端返回有效健康正文后停止轮询,启动失败的页面只重载一次原 URL,已经就绪的业务页面原地撤掉异常层并保留输入,禁止重放失败的业务写入。旧版健康接口也必须返回有效的 Healthy 正文,不能把反向代理 HTML/404 当作恢复。安全拦截继续按后端解除时间检查,不用连接故障轮询缩短封禁。定向回归使用 `api-service-recovery.spec.mjs` 与 `api-service-status.spec.mjs`,浏览器必须验证断连到自动恢复全过程。
16
+
17
+ - `src/config.json.ApiBaseDev` 是本地默认 API;URL 中 `#` 之前的 `ApiBase`、`OsClient` 必须同时
18
+ 高于 `index.html`、config、Pinia 与 localStorage。解析统一走
19
+ `src/utils/runtime-endpoint-query.js`,禁止在新入口另写正则形成不同优先级。
20
+ - URL 只允许有效的 HTTP(S) ApiBase 和安全 OsClient。页面初始化后通过不含 Token 的
21
+ `window.__MICROI_RUNTIME_ENDPOINT__` 暴露实际值,便于 AI/自动化确认没有误连配置文件中的服务器。
22
+ - 页面已解析的租户必须进入真实 HTTP 请求。`DiyCommon.UseAxios/UseAxiosAll` 与共享 axios 请求层统一通过 `request-tenant-context.js` 补当前 API 的 `osclient` 请求头;保留调用者显式的路径、Query、参数或 Header 租户,不给其它服务器或相邻 API 子路径自动添加页面租户。JSON 正文在动态路由阶段可能尚未读取,不能只依赖正文或旧 Token 选择租户。验收必须增加同源旧 Token 指向其它/不存在租户的真实后端场景:`platform-current-user` 应走页面租户并返回登录失效,保留原深链接进入登录页,不得显示“无法确认接口配置”或让 SSO 发现返回错误租户的 404;定向回归为 `request-tenant-context.spec.mjs`。
23
+ - 首次身份读取的业务/传输失败交给路由守卫处理,`getInfo` 不调用带全局通知副作用的 `DiyCommon.Result`,同时抑制请求层通知和抢先登录跳转;`App.PageInit` 等待首次导航成功后再启动续签/用户刷新,导航失败时结束。既要验证干净会话,也要验证旧登录缓存和失败后重复刷新,不能以隔离浏览器成功代替用户当前会话验收。
24
+ - 同源浏览器窗口仍共享 Token、CurrentUser 等持久化状态。不同 `ApiBase + OsClient` 并行测试必须
25
+ 使用独立 browser context/profile;URL 最高优先级不等于登录态隔离。
26
+ - 修改该链路时运行 `node --test tests/runtime-endpoint-query.spec.mjs`,再使用两个独立
27
+ `browser.newContext()` 验证两组运行目标互不串号。
28
+
29
+ ### 菜单微服务缓存与恢复(强制)
30
+
31
+ - 首次挂载分开检查资源下载与渲染:下载最多 60 秒,`beforemount` 资源齐备后才开始原有 12 秒渲染期限;不得在资源正常下载时提前销毁沙箱。成功仍要求真实可见 DOM,保留一次自愈与旧实例保护。回归覆盖超过 12 秒的真实下载、下载停滞、渲染停滞和陈旧实例事件。
32
+ - 动态菜单宿主的 Vue 路由保持 `keepAlive:false`,由 `<micro-app keep-alive>` 独占运行时状态;契约固定为 `runtime-keep-alive`,禁止 Vue `KeepAlive` 和 micro-app 双层缓存。
33
+ - 每个顶部 Tab 按完整路由生成稳定实例身份,最多保留 5 个隐藏实例并按 LRU 淘汰。关闭 Tab、退出登录、Token/角色变化以及版本或入口变化时必须精确销毁对应运行时。
34
+ - 恢复时强制同步宿主上下文并检查真实可见 DOM;子应用监听 `appstate-change`,在 `afterhidden` 幂等暂停轮询、WebSocket 和观察器,在 `aftershow` 幂等恢复并重新测量布局,同时保留用户输入、筛选、滚动和内部路由。
35
+ - 微服务 `openForm` 省略 `sysMenuId` 时,宿主从自身冻结的 `ownedRouteMeta.Id` 补回菜单上下文,不能在异步打开后借用另一页的全局 `$route`。显式跨表菜单仍透传并由 FormEngine 验证,不设置 `_IsAdmin`、绕过行范围或增加用户权限;没有合法菜单/表权限时保留拒绝。修改运行 `micro-app-open-form-context.spec.mjs` 并在实际商城点击发布新应用;涉及保存链路时用获授权的本轮私有 fixture 完成保存、独立回读、重开及精确清理,不上传或公开发布测试包。
36
+ - 修改宿主、TagsView 或权限路由时,必须同时读取 [Vue3 前端微服务宿主规则](references/progressive-03-vue3-前端微服务宿主规则.md) 并运行微服务缓存契约测试。
37
+ - 修改 Vue/JS 后先跑 VS Code Problems 或 `get_errors`。
38
+ - 宿主按钮重置只作用于 `button:not(:focus-visible)`,不能用全局 `outline:none !important` 覆盖组件或微应用的键盘焦点。微应用保留自己的边框形状,焦点色使用已适配明暗表面的 `--mci-text-link`(缺省回退正文语义色),不能直接用浅品牌色。真实 Tab/Shift+Tab 回归须核对 `:focus-visible`、实际 `outline-style`、宽度、颜色与至少 3:1 对比度;`outline-style:none` 即使宽度非零也不可见。使用阴影焦点时另验实际 `box-shadow`,不能只看焦点状态。平台样式组件回归归 Full,应用自身按钮继续在真实业务页面验收。
39
+ - 影响核心前端时跑 `Microi.Client` 的 `npm run build`。
40
+ - 如果改了工作流、表单保存、按钮 V8,建议用实际 `sys_menu` 配置测试:
41
+ - `FormBtns` 是否出现在表单右上角/FAB。
42
+
43
+ ---
44
+
45
+ <!-- /microi-progressive:chunk -->
@@ -38,6 +38,8 @@ description: 在 Microi Agent、Codex 或 DeepSeek Harness 中完成 Microi吾
38
38
  - 对话输入框上下键回填成功提交的提示词,向下可恢复未发送草稿。菜单、输入法候选、选区和多行正常光标移动优先;不要在用户编辑文本时强行覆盖草稿。
39
39
  - 消息编辑/撤回通过真实会话分叉到该消息之前的已完成轮次;原会话和已经执行的文件修改保留。撤回将消息恢复为草稿,编辑则重新发送;这不是撤销文件系统。图片随草稿恢复,无法安全恢复的文件附件明确拒绝,不能静默删除附件或只改屏幕文字而保留旧模型上下文。
40
40
  - AI 员工按项目群协作,十个岗位加技术总监共十一个岗位,可分别选择桌面已配置模型;原任务、成果审阅、目标和预算仍从「任务与验收」进入。群与任务共用用户明确选择并已登录的吾码 MCP,不能默认切到官方账号或首个客户。数据、运行与验收记录归所选租户;未安装员工中心或权限不足必须明确提示,不能擅自向所有客户安装。Harness 的会话/技能/定时能力不能证明完整 OpenClaw 已内置。相关执行边界读取 `ai-engine/references/ai-employees.md`。
41
+ - `GroupWorkflowList` 将本人未结束工作置首,其余按创建时间和 Id 从新到旧排列并去重、最多二十条;全部结束后群头应打开最新工作会话。验收多条工作时独立核对实际选中的 SessionId,不能仅凭窗口打开判定成功;群消息和交接仍按原时间正序展示。
42
+ - 员工中心 v1.2.7 的嵌入导航保留用户当前页:同入口 resize/theme/resume 不是导航,只有真实宿主路由或身份/入口变化才切换;验收每页需等待骨架消失与绘制稳定,并独立核对截图中的标题、选中态和实际内容。
41
43
  - 员工群消息先持久提交 SQL 消息、运行与 outbox,再返回短确认;后台用稳定 Mongo `_id` 同步并按授权游标分页读取,失败明确显示 SQL 兜底,不能把未确认发送或模型排队当完成。旧历史只在当前群管理者显式操作后分批迁移。SignalR 使用通用 `/api-engine-realtime` 和群授权,只传版本提示;断线重连后重新授权并按游标回读,不将推送当持久记录。Token 留在桌面 Worker,切换 MCP/用户/群时清理旧订阅及迟到响应。最终安装包须实测详情、模型选择保存、短确认、Mongo 回读及断线恢复。
42
44
  - Mongo 附件投影保存规范四字段数组的 JSON 字符串,读回仍核对完整消息摘要,不能只比较顶层 ContentHash。冲突先用同源、当前群管理权限限定的只读审计;旧嵌套字段已丢失时不可猜测解码或跳过摘要。派生投影修复仅限 SQL 正文摘要与 outbox 一致、原 outbox 独占租约仍有效、Mongo 同 Message/Group/Owner、时间/序号及其余非附件字段匹配、已知缺陷形态明确的记录;只更新派生附件字段并完整回读核对,不把固定 Id 更新宣称为 Mongo 原子 CAS。未知冲突保留 SQL 兜底,不改业务消息或模型运行、不扫描所有租户。
43
45
  - 同一桌面实例的多个 Worker 必须共享本机模型容量预准入,在领取云端任务前取得名额;RPC 超时不等于模型终态,结果未知时停止自动重放并保留核对入口。
@@ -52,6 +52,12 @@ MySQL 就绪和后续 SQL 使用最终 TCP 服务,不能把镜像初始化时
52
52
  指纹到同一会话历史,再以原版本、渠道和累计起点重新冻结并执行完整门禁。
53
53
  此开关不能复用失败测试,也不能重写已有成功阶段;默认续发仍严格拒绝源码漂移。
54
54
 
55
+ 仅当用户明确改定唯一最终发行版本,且原会话没有任何成功阶段或上传时,使用原入口
56
+ `--resume=<原会话绝对路径> --retarget-unaccepted-version=x.y.z` 顺延一次。原生门禁核验
57
+ 原计划、全部旧候选证据及不变的配置、渠道和测试范围,保留原始起点、版本变更记录与
58
+ 失败 TRX/TAP;新版本重新冻结并执行完整门禁。不得与重冻、凭据或控制恢复叠加,
59
+ 也不能用于已有成功发布结果的会话;普通续发仍保留原版本。
60
+
55
61
  收到“发布吾码”“完整正式发布”“一键发布”时,默认执行根目录 `Microi一键编译发布.sh --platform-release`(默认完整选项):新版本号按原规则 +1 一次,NuGet、API Docker、PC Docker、官方网站文档及其 Docker 全部发布。官网不再是可选追加项;只有用户明确要求“仅前端/仅后端/仅官网”等局部发布时才缩小范围。完整入口使用 `PlatformRelease` 执行常规 Microi.Tests(平台单元/组件,不自动追加 Full 专项)、吾码前端通用 Node 测试、真实接口检查与最终加密产物启动/运行冒烟;扩展浏览器验收仅在显式传入 `--platform-frontend-tests` 时追加。真实付费 AI、鸿地/JUNCHI、XJY 等指定客户数据专项和 SQL Server 等独立提供商专项默认不纳入,不再逐次询问;只有用户另行明确要求专项时才执行,回执逐项列为“不适用/未执行”,不能冒充通过。独立商城应用、OpenClaw 等应用源码专项由各自入口执行,不作为平台发布前置;平台 SDK、商城协议、安装器、SaaS 与工作流通用回归继续保留。Microi Code/Agent 是独立产品,不混入吾码平台测试与发行。
56
62
 
57
63
  1. 默认确认 NuGet、API/PC 和官网完整渠道及版本;记录开始时间,每次新完整发布从当前版本 +1 一次。中断后使用脚本输出的 `--resume=<会话JSON>` 恢复同一完整发布,沿用原版本、渠道、候选和累计起点;`--release-version=x.y.z` 只用于显式选择版本,本身不代表复用测试或产物。不能仅凭版本文件未提交推断为续发。
@@ -107,6 +113,7 @@ MySQL 就绪和后续 SQL 使用最终 TCP 服务,不能把镜像初始化时
107
113
 
108
114
  - 项目由 `Microi.Ops` 更名为 `Microi.Panel`;独立 .NET + Vue + Microi.UI 宿主使用自己的管理员账号、SQLite 和 Docker 权限,业务 API/Web 停止时仍可操作。只安装面板时使用 `install-microi-panel.sh`,不要求先安装吾码业务平台、宝塔或 1Panel。具体命令与能力边界见中文官网 `server-panel/overview.md`。
109
115
  - 先确认主机内存、Docker Engine 身份、活动任务、已有 Ops/Panel 控制器、端口、编排和数据目录。每台 Docker 主机只运行一个吾码控制器。与宝塔/1Panel 共存时使用独立安装目录、容器名、卷、网络和端口;80/443 等监听端口不能被两个入口同时占用,不得重置 Docker 或自动接管第三方面板资源。
116
+ - 安装器选端口同时回读 Docker PortBindings 与主机监听状态,包含未运行容器已声明的 TCP 绑定和本次规划的自定义 Ops 端口;探测失败不能当作空闲。WebSocket `/diy-websocket` 共用 API 端口,TCP/MQTT 使用各自显式映射。Ops 运行时禁止命令行竞争更新是控制器互斥,不能通过抢占或挪走 WebSocket 端口绕过。
110
117
  - 宝塔原厂进程检查可能识别 Docker 内的 Nginx,后装时即使端口独立也会提示已有 Web 环境。按已授权范围处理原厂确认:隔离机验收保存确认记录与安装前基线,客户机不自动确认未授权的覆盖或迁移。非交互执行要显式处理已识别的提示并设置超时,不能把挂起、安装器退出或仅出现目录当作安装成功;完成后回读原 Docker 身份、面板凭据/证书哈希及真实网站内容。
111
118
  - 1Panel 版本检查使用原厂支持的 `1pctl version` 或 `1panel-core version`,再核对 core/agent 的真实 systemd ExecStart 和官方包 ELF 哈希。不要猜测执行 `1panel-agent version`:已验收的 v2.4.1 会启动另一个 agent 并争用 Unix socket。宝塔新版本不一定保留旧 `data/version.pl`,应使用当前安装版本支持的读取方法,并独立验证真实服务、浏览器页面和网站。
112
119
  - 插件市场只安装目录内明确版本与 SHA-256 的镜像;检查架构、许可、健康检查、持久卷和真实业务读写。Oracle 等原厂许可渠道不擅自镜像;MinIO 社区归档后的源码构建必须保留对应源码、许可与摘要。跨数据库大版本升级仍需专用迁移方案。
@@ -69,7 +69,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
69
69
  | `system-engine/vision-engine.md` | vision-engine, ai-engine, microi-microservice, app-store, v8-security | ONNX 视觉特征、样本匹配、视频脸框与有界跟随、授权图库与私有示例、异步候选复核、微服务与商城交付 |
70
70
  | `system-engine/translate-engine.md` | translate-engine | 多语言与翻译供应商 |
71
71
  | `system-engine/unity-integration.md` | unity-integration, v8-api-config, microi-client-frontend | Unity UPM、WebGL/Windows、多人租约、公屏、DiyToken 与 V8 通讯边界 |
72
- | `system-engine/visualization-engine.md` | page-engine, microi-ui, microi-microservice | 3D、LIS 型材库、CAD、goView 与数据大屏能力边界及微服务交付 |
72
+ | `system-engine/visualization-engine.md` | page-engine, microi-ui, microi-microservice | 3D、LIS 型材库、CAD、goView 与数据大屏能力边界;空间合批、透明/AO、完整手势、安全镜头、纯读取诊断和同DPR连续交互验收;世界坐标玻璃牌、实际相机裁剪与异步场景原子提交;真实ModelKey实例与CAD细部绑定、静态AO的T·R·S/独立UV1/非色彩/合批核验、限定族有界并集与来源保全;明确暂停的完整AO结果复用与真实输入/资源失效验证 |
73
73
  | `system-engine/wf-engine.md` | v8-workflow | 工作流设计和事件 |
74
74
  | `v8-engine/ai-apiengine.md` | ai-engine, v8-api-config, microi-system-delivery | AI 编程与短提示词;完整开发默认清单覆盖原推荐提示词 1–8 |
75
75
  | `v8-engine/api-engine.md` | v8-api-config, v8-utilities | 接口上下文、配置、分布式锁续租和调用 |
@@ -15,6 +15,8 @@ description: Microi 前端微服务 MicroService 开发与交付指南。用于
15
15
 
16
16
  完整数据模型、文件/路由协议和宿主通信见 `references/runtime-delivery.md`。
17
17
 
18
+ 设计、创建或修改吾码前端微服务页面、菜单应用或定制弹窗时,默认执行[前端界面任务默认路由](../microi-system-delivery/SKILL.md#前端界面任务默认路由)。用户直接提出页面需求时,同样先读取并应用 [吾码 UI 设计](../ui-design/SKILL.md) 和 [Microi.UI](../microi-ui/SKILL.md)。
19
+
18
20
  ## 何时使用
19
21
 
20
22
  ### 看板与复杂页面的三种实现方式
@@ -287,8 +289,20 @@ AI 生成菜单微服务时,应优先封装一个 `callMicroiHost(action, data
287
289
  - 品牌车辆和真实建筑只能在拥有明确资产/商标使用依据时描述为精确复刻。程序化或原创近似模型使用“风格化/演示模型”措辞,不得把车型标签当作厂商认证。视觉签收与功能、运行发布、商城包、目标租户安装是不同证据层。
288
290
  - 运动物体优先使用可复用几何/材质、LOD、实例化和离屏回绕;相机近景仍要检查曲面法线、透明车窗、轮胎方向、脚底接地、穿模和阴影。页面隐藏时暂停动画,恢复时避免累积大时间差导致物体瞬移。
289
291
  - 三维数据标牌可以使用透明 PBR 厚度几何、纹理文字与空间连线,但必须保留对齐的 DOM 点击/键盘目标、读屏文本和焦点环。小屏避碰要测试真实矩形交集,不能仅检查页面无横向滚动;把冲突标牌一律向上推会在工具条边界堆叠。玻璃 transmission 会额外渲染场景,密集人群应先量测绘制次数,再选择透明近似或折射质量档。
292
+ - 先明确标牌属于实体世界还是屏幕 HUD。用户要求嵌入场景的玻璃牌时,位置、米制尺寸和朝向由世界坐标/业务锚点决定,随相机产生透视缩小并参与深度遮挡;不能为保持字号和避碰,每帧把它反投影到固定屏幕槽、复制相机四元数或关闭 depthTest。无操作的只读牌不能用透明 DOM 矩形拦截旋转/缩放;可访问文本与键盘入口另保留。验收固定同一业务锚点,仅改变相机,断言世界矩阵不变、画面投影变化、遮挡正确、背面文字不镜像。
293
+ - 镜头切换的裁剪参数依据相机实际位置与沿途净空,不能只因选中了室内目标就提前使用室内近裁平面,否则相机仍在远景时会丢失深度精度。异步几何/着色器准备期间保留旧场景完整可见,在准备成功且导航世代仍有效后一次提交目标层、剖切、灯光和镜头;不得跨 await 隐藏正在显示的对象,也不能用周期性全屏暗遮罩掩盖准备闪烁。验收应录制总览到室内、跨楼层、连续快览及快速重复切换的实际运动帧,静态像素检查不代替动态验收。
294
+ - 模型库中有精细原型不等于真实业务已使用它。先从当前租户真实 Bootstrap 或资产表取得实际 ModelKey(以真实响应字段为准)及逐键实例数,区分生产设备、布局单元和 IoT;再将细部几何绑定到实际 CAD/业务根,逐条串联业务 Id、模型键、库节点、嵌套实例与运行截图。顶层同名键实例为零时也须检查原型是否已嵌入 CAD 子树,不能由库中存在或某一个计数直接宣称全量可见、全部未展示或逐机一致。
295
+ - 静态 AO 烘焙必须使用当前实际实例的 T·R·S 与对应建筑/设备几何,保留原 UV0,另建独立 UV1;标量 occlusionTexture 使用匹配的 texCoord/aoMap.channel 与 NoColorSpace,不能当 sRGB 彩色贴图。用真实加载器和实际合批后的几何检查 UV1 数量、有限性、范围、通道与字节保全,并分别验证贴图解码、GPU采样和同机位画面;CPU图像mock不计视觉通过。运动构件须排除或明确记录当次零命中;静态布局/姿态改变后显式重烘焙,有限范围环境遮蔽不得冒称完整 GI、实测光度或实时动态阴影。
296
+ - 只有运行者明确 paused、无活动镜头/转场且属于已审计支持范围的真实 AO 输入逐值完全相同时,才可复用最近成功生成的完整 16 AO+16 降噪结果;颜色、透明玻璃与 Output 仍每帧实时绘制。相机/投影/裁剪、几何/实例/祖先变换、材质/可见性/排序、噪声/采样参数、尺寸、上下文及 GPU 资源等相关输入改变时必须失效;未知可编程变形、外部 GPU 可变输入与未覆盖回调拒绝缓存。首帧、失效、恢复帧完整重算,异常不能保留旧 valid 结果;非暂停实时状态不复用。保持原像素门槛,分别测静态 PNG、真实失效与真实 RAF 帧时;部分样本通过不等于所有视角/实体手机无频闪,不能无证据把残差归因于 AO。
297
+ - CAD近共面柱或构件只在有来源句柄、明确外包络与限定同族范围内做有界并集,保留全部来源身份/元数据、非目标位置/法线/UV/材质和可回滚原件;列出允许变拓扑的具体批次并独立解码核验。不能按全园坐标近似或统一阈值全局“清重复”,以免删掉真实相邻件、通道或实际重叠装配;目标样本零重复三角只证明所查范围,不能承诺全园零共面或所有运动帧零频闪。
290
298
  - 人群实例化须按可复用几何及材质属性分组,保留各人物肘膝关节矩阵,颜色用实例属性;实例化之后仍验证抬脚/落脚和长时间回绕。车辆座椅按座舱净高缩放,不能所有车型使用同一绝对头枕高度。静态源码断言之外,应实例化真实几何做边界/有限矩阵单测,并提供街景近景入口供实拍验收。
291
299
  - 建筑照片立面、实体墙和屋顶若几乎共面,旋转相机时会触发深度缓冲 z-fighting:外露侧墙的纹理面沿法向留明确间距,屋顶纹理面高于实体面,必要时用 `polygonOffset`;被相邻楼翼/门廊遮住的内部端面不要重复画照片面。验收须从东、西两端短侧墙和斜俯视分别实拍,暂停动态物体后比较同角度连续帧的大幅像素跳变;只看主立面截图不能证明无闪烁。
300
+ - 大车间或楼层按材质合成一个巨型 Mesh 会丢失局部视锥剔除。静态不透明几何应按实际米制空间块与材质分组,保留全部顶点、法线、UV、业务拾取身份和阴影;动态机构及楼层/剖切语义保持独立。用总览、近景和侧向机位比较可见三角形、绘制次数与帧时,不能只因 drawcall 减少就判定更快,也不能把分块当成减面或降低贴图质量。
301
+ - 透明/透射构件保留每个实体的排序边界与真实包围球,不跨整层按玻璃材质合并;缺少资产身份时逐构件保留。沿用原 PBR、深度写入、双面和透明度语义,不用统一 `renderOrder`、改不透明或单面掩盖排序问题;相交透明表面仍须单独检查。AO 法线/深度通道只采真实可遮挡实体,排除投影牌、透明玻璃及装饰背景;临时过滤用 `finally` 精确恢复原可见性、材质和 override,不能留下隐藏楼层或改变颜色通道的实际显示。
302
+ - 拖动拾取按完整 pointer 手势判断:记录按下、全过程最大位移、按键、pointer 身份及多指状态,只有同一次未拖动的正常抬起才执行点击。不能只比较按下与抬起位置,否则绕一圈回到起点会误选设备并触发镜头跳转;取消、失焦、页面隐藏和卸载时清除待定手势,并覆盖触摸与非主键路径。
303
+ - 室内手动镜头碰撞检查前后位置之间的完整扫掠与真实净空,不能只看终点或关闭碰撞换取平滑。碰撞时停在接触前的安全位置,并结算 OrbitControls 的残余阻尼,防止持续推进后弹回;静止镜头不重复全场景扫描。程序镜头和手动控制必须有唯一当前所有者,切换后旧阻尼或迟到回调不能再次改变新机位。
304
+ - 诊断 getter、统计与截图采样必须纯读取,不能通过读取修正面牌可见性、相机或业务状态。投影与避碰在每个实际渲染帧统一更新,不能依赖低频统计定时器;同一相机/时钟下,连续读取诊断、切换采样顺序或暂不读取诊断,实际画面与可见对象集合应一致。
305
+ - 流畅度验收使用真实连续旋转、滚轮/触摸缩放与镜头切换,固定设备/GPU、视口、DPR、画质、数据和模型候选,分别记录冷加载/预热、帧间隔分位、长帧、可见三角形和绘制次数。静止 FPS、CPU 合成剔除或电脑模拟手机视口不能代替实体手机 GPU 结论;移动中的 AO、MSAA、阴影与材质保持约定质量,不在输入期间暗中关闭。颜色 MSAA 与后处理轮廓/着色器高光的抗锯齿范围分别验证,不凭配置名承诺无频闪。
292
306
 
293
307
  ### 菜单页签缓存与子应用生命周期(强制)
294
308
 
@@ -13,6 +13,8 @@ description: Microi 移动端首版交付质量门禁。用于 UniApp/H5/App/小
13
13
 
14
14
  开发前读取[首版交付与外部服务验收](references/mobile-first-delivery.md),按本次实际业务列出适用门禁。首版就验真实手机号流程、会话恢复、手机与桌面布局、持续动效及发布入口;只有首页截图、编译成功或 SDK 对象存在不能宣布产品交付。第三方商户账号尚未开通时完成安全模板与失败路径,并准确区分接入完成和真实业务验收。
15
15
 
16
+ 涉及新产品设计、整站重设计或用户反馈“平庸/同质/缺少设计感”时,同时读取 [移动产品设计语言](../ui-design/references/mobile-product-language.md) 与 [项目设计签名](../ui-design/references/design-pattern-library.md#项目设计签名与场景配方)。功能、几何和设计表达分开验收:真实可用、图标对齐、无报错是基础,不能据此关闭构图同质的问题;应以同视口、同内容的页面族截图说明具体改善和仍存在的视觉缺陷。不要机械为每页增加动效、照片或大标题。
17
+
16
18
  <!-- microi-progressive:begin -->
17
19
  <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=de98f218788f72f407d39ef9bdee2c1155574ce7a831021f63971d1eaf08943b -->
18
20
  ## 1. 导航和快捷入口必须使用真实图标
@@ -4,7 +4,7 @@
4
4
  快捷登录和会话协议以 `microi-uniapp-frontend`、`microi-frontend-sdk` 为准;本参考负责
5
5
  把源码、外部服务、后台与正式入口组成一条可回读的交付链,避免只有静态页面。
6
6
 
7
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-022 sha256=33bf185e007fab2c8316f090b1f608143deca2e3ff4b010e7577c7f88d751008 -->
7
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-022 sha256=2654c16ea78aaccf6a6e742c84ac7e4faac86b7bad6ad51341aa6cda09a61b88 -->
8
8
  ## 开发前固定事实源和首版范围
9
9
 
10
10
  - 使用指定 MCP 的实际 Profile,先回读 `ApiBase + OsClient`,不能因为官网发布归主租户就让试用端请求主租户。不同租户用独立浏览器 context,不能只新开标签。
@@ -27,6 +27,7 @@
27
27
  - 地图、短信、支付与电子开票敏感项进入当前租户系统设置的安全配置;公开启动配置只返回明确白名单的能力开关、供应商和当前端必要运行值。不得返回整个 `V8.SysConfig`、`V8.OsClientModel` 或私有设置字典。
28
28
  - 获授权从另一租户迁移配置时,先核对供应商产品、运营主体、域名和可复用范围;仅复制所需键的最小允许列表,由可信后端在目标租户重新加密。禁止整行复制 `sys_osclients`、盲拷租户密文、复用基础设施连接串或把秘密写进源码/Manifest。
29
29
  - 使用已存在且审阅过的安全配置工具;若没有安全迁移能力,先补可信通用能力或让管理员在后台填写,不能通过 FormEngine、SQL 别名、临时维护引擎或普通 Reveal 绕过权限。具体实现以 `v8-security` 为准。
30
+ - 主租户向同API分区子租户复用阿里云短信凭据,可使用 `microi_copy_main_sms_credentials`:先 Inspect,核对主租户真实管理员、源成对配置、目标及Revision,再精确确认Copy。目标已有秘密不覆盖,只有可信服务端读取并重新加密;回执只含状态。旧后端没有能力时先升级可信控制面,不能改走明文读取。新会员默认角色配置在后端私有 `Auth.Sms.DefaultRoleId`,不得从匿名请求选择角色或使用旧兼容值 `Allow` 绕过验证码。
30
31
  - MCP `microi_run_engine` 的原始 `params` 可能被持久化审计;Token、短信码、完整手机号和密钥不得当普通引擎参数用于调试或迁移。认证验收通过标准 SDK/受保护传输在内存使用凭据,日志、报告和错误响应只保留脱敏阶段/追踪号;专用安全写入工具仍按其脱敏契约执行。
31
32
 
32
33
  ### 地图必须按产品与终端验证
@@ -9,6 +9,8 @@ description: 已初始化吾码工作区的默认 AI 开发总控入口,用户
9
9
 
10
10
  # Microi 全系统交付复盘与总控规范
11
11
 
12
+ 浏览器交互验收先执行 `workspace-conventions/SKILL.md` 首部的浏览器选择规则:用户未指定时默认使用当前 Codex/WorkBuddy/DSH 宿主的内置浏览器,包括新开发 PC 后台、UniApp/H5 与本地预览;仅在没有内置浏览器、必要能力不支持或有界诊断确认不可用时降级到本地浏览器。具体测试、独立 CI 与会话隔离按 `playwright-e2e` 执行。
13
+
12
14
  所有范围的收尾都必须执行 [测试临时文件随任务清理](../workspace-conventions/SKILL.md#测试临时文件必须随任务清理强制):每轮测试结束清理本任务 `.tmp`、宿主临时目录、隔离源码/运行副本和已结束工作树,交付必需证据先最小归档,失败/中断也要回收;独立回读删除结果,并逐项说明确需暂留的文件、体积、原因与清理时机。脚本需有实际 teardown,不能把文字规范当作自动清理功能。
13
15
 
14
16
  本 Skill 来自一次完整业务系统交付复盘。目标是让下一套 OA、ERP、MES、CRM、商城、预约、互联网项目等 Microi 系统少走返工路:先固定事实源,再用 MCP 正确建模,最后用可视化和业务闭环测试证明可交付。
@@ -26,6 +28,10 @@ description: 已初始化吾码工作区的默认 AI 开发总控入口,用户
26
28
 
27
29
  完整系统及用户反馈后的交付复测,还须读取 [交付易错项与证据门禁](references/delivery-pitfalls.md),逐项记录适用、通过、失败或不适用及理由。此表适用于所有模型与宿主;连接成功、模型自述“已完成”或引用规则不能替代实际回执。涉及报表/模拟数据时必须执行 `report-engine` 的默认周期覆盖检查。
28
30
 
31
+ ## 前端界面任务默认路由
32
+
33
+ 根据吾码工作区、当前应用和用户要操作的界面识别任务。设计、创建或修改前端微服务页面或移动端界面时,即使用户只说“给订单加个详情页”或“调整手机端首页”,也要在设计和实现前完整读取并应用 [吾码 UI 设计](../ui-design/SKILL.md) 和 [Microi.UI](../microi-ui/SKILL.md)。再按下表读取端侧专项规范,沿用既有设计契约和用户指定的设计体系。纯后端改动、只读盘点等按实际范围读取专项。
34
+
29
35
  按本次实际能力读取相关 Skill,不能只读总控入口后凭记忆实现:
30
36
 
31
37
  | 工作内容 | 相关 Skill |
@@ -36,7 +42,8 @@ description: 已初始化吾码工作区的默认 AI 开发总控入口,用户
36
42
  | 菜单骨架、AI 开发中占位、逐菜单切换、PageTabs、模块展示 | `module-engine`、`v8-menu-buttons` |
37
43
  | 选项 Key/Label、数据源、状态模板 | `microi-datasource-mapping`、`datasource-engine`、`v8-template-engine` |
38
44
  | 业务接口、表单事件 | `v8-crud-api`、`v8-table-event` |
39
- | 微服务、个人中心、菜单应用、定制组件或复杂弹窗 | `microi-microservice`、`microi-client-frontend`、`ui-design`;必须先读主题色、明暗、密度和样式隔离契约,不能只读模板后实现 |
45
+ | 前端微服务、个人中心、菜单应用、定制组件或复杂弹窗 | [微服务](../microi-microservice/SKILL.md)、[宿主前端](../microi-client-frontend/SKILL.md),结合上方两份 UI Skill 核对宿主主题色、明暗、密度和样式隔离 |
46
+ | 移动端页面(UniApp、移动 H5、App、微信小程序) | [UniApp 前端](../microi-uniapp-frontend/SKILL.md)、[移动端质量](../microi-mobile-app-quality/SKILL.md),结合上方两份 UI Skill 核对导航、触控、动效和目标端验收 |
40
47
  | MCP 连接入口、角色 AI 开发授权 | `microi-codex`、`v8-security`;服务端逐请求复核范围与操作开关,普通表单路由不能作为绕过通道 |
41
48
  | 业务统计、老板经营、领导管理看板及明细报表 | `page-engine`、`report-engine`、`datasource-engine` |
42
49
  | 真实业务、截图、账号和跨端验收 | `playwright-e2e`;有独立前端时再读相应前端 Skill |
@@ -47,6 +47,25 @@
47
47
  | 24 | 为同步干净覆盖他人修改、清理误伤共享目录 | 保存本任务文件/进程清单,冲突先三方合并;只收尾可证归属的临时路径,不删共享依赖或其它任务变更。分别列出本任务差异与外部差异,不为零计数覆盖远端 | `workspace-conventions`、`context-quality.md` |
48
48
  | 25 | 本地更新 Skills 就称所有用户已获得 | 规范正文单源维护,同步已注册内嵌知识和插件/CLI资源,验证宿主默认路由及包内文件/哈希;源码、构建包、发布渠道和新工作区实际初始化分别记回执。未实际跑过的模型不称已实测 | `microi-docs-coverage`、`microi-codex-installer` |
49
49
 
50
+ ## 跨端与长任务中容易遗漏的边界
51
+
52
+ | 现象 | 下一次执行方法 | 所属规范 |
53
+ |---|---|---|
54
+ | 独立 H5 是手机预览,嵌入原菜单却拉满桌面 | 将呈现目的与 embedded 分开;移动预览保持内屏尺寸,工作台才满宽。比较真实 CSS viewport、宿主可用区域、底栏与滚动所有者 | `ui-design/references/mobile-product-language.md` |
55
+ | 功能和构建通过,整体视觉仍粗糙 | 先明确移动产品表达强度,再统一 token、图标、Tab、表单与动效;逐页面模式截图批判。图标间距/中心线和触控尺寸做实际几何断言 | `microi-ui`、`microi-mobile-app-quality` |
56
+ | 角色通过率看似很高,仍漏了大量管理动作 | 开工建立角色×资源×动作×范围分母,单列原生菜单、H5工作台、报表、附件和混合角色;每格记录真实身份、写后回读与失败分支 | `playwright-e2e`、`v8-security` |
57
+ | 网络丢响应后重复聊天、出入库或资产命令 | 幂等键、初始 ExpectedVersion 与业务意图绑定;重试先回读相同业务键,保持首次参数。不能重新生成意图或用最新版本重放旧意图 | `v8-crud-api` |
58
+ | 私有附件路径签名正确但归属仍不安全 | 同时核对实际业务记录、上传者/关联对象、当前角色范围和存储路径;公共商品图与私有工单图分别处理,签名不能代替授权 | `uniapp-mall-assets`、`v8-security` |
59
+ | 普通业务 DTO 被宿主传输字段污染 | 白名单剥离已确认的宿主元数据,业务字段继续严格拒绝未知项;不要整体关闭参数校验 | `microi-microservice`、`v8-security` |
60
+ | 接口源码能运行,但拉取与本地生成永久有差异 | 逐引擎保存发布头和 schema 快照依赖;对未使用新字段的旧引擎声明快照例外,按实际全文回读验证,不伪造零差异 | `v8-crud-api`、`context-quality.md` |
61
+ | 大目录同步调用超时,被误判失败或直接重写 | 为目录操作配置有界长超时与进度续时;未知结果先比候选 manifest,并逐文件回读原始字节。候选已原子提交时不重复上传或取得新基线补票 | `microi-microservice`、`v8-file-upload` |
62
+ | 对比度检查忽略渐变/透明叠层而误报或漏报 | 同时检查实际合成背景与渐变最不利位置,保留实色降级背景;不能通过降低阈值或只测白底消除失败 | `ui-design`、`playwright-e2e` |
63
+ | 主租户短信可用,被假定子租户也有凭据 | 只读核对成对凭据、签名/模板、可信新用户最低角色和会话链;使用受审阅的安全迁移工具,缺能力明确缺口,不取明文、不盲拷密文、不伪造发送成功 | `microi-mobile-app-quality/references/mobile-first-delivery.md` |
64
+
65
+ ### 失败记录要区分归因
66
+
67
+ 命令路径猜错、`rg` 无匹配、缺少本机包管理器、测试程序读取协议字段错误,与平台真实缺陷分别记录。搜索先使用 `rg --files`,读取按语义范围和输出预算进行;依赖、凭据、源码基线与验收分母在首次业务开发前验证。不要给每个项目复制庞大一次性测试脚本,优先维护可复用的小工具与明确的失败恢复点。
68
+
50
69
  ## 失败时的交付规则
51
70
 
52
71
  - 修复清单必须保留用户原编号及默认交付 1–10 的映射,不用“优化完成”代替位置、证据与未完成项。
@@ -14,12 +14,12 @@ Microi.UI 是 Microi 产品共享前端设计系统。Vue 3 网站、响应式
14
14
  这是自动规则。不要等用户明确说“遵循 `microi.skills/microi-ui/SKILL.md`”。只要仓库、需求、文件路径或项目上下文属于 Microi 生态,且工作涉及前端界面、网站界面、H5、uni-app、小程序、客户/员工/会员页面、报告、仪表盘或视觉打磨,就默认读取并应用本 skill。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=microi-ui-000 sha256=a400da7a05d4e24e763880a997f27c1fcd859bcbe01693765695f02214bdb550 -->
17
+ <!-- microi-progressive:chunk id=microi-ui-000 sha256=1229187f57bb1623782c22a9086a8e93dc03362397e7a137c7c9a6d68df3ddc3 -->
18
18
  ## 核心承诺
19
19
 
20
20
  Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
21
21
 
22
- - 默认紧凑适度,不鼓励大标题、大圆角、大间距;只有用户明确选择表现性方向或真实可读/触控需要才扩大相应尺度。减少重复标题、说明、统计卡和无业务意义装饰,用清楚层级、稳定对齐与真实内容建立品质。
22
+ - 标准后台表单和高频数据区默认紧凑适度;定制微服务、移动产品、门户和内容页先确定自己的构图与视觉性格,不能把后台 token 的示例值当全产品上限。用户明确要求个性化时,主动形成有业务依据的排版、媒体、形状和空间关系;避免重复标题、同权统计卡与无意义装饰,也避免全站只有换色白卡。
23
23
  - 清爽不等于大面积空白或固定白底;页面必须在信息密度与可扫读性之间取得平衡,核心任务和主要操作应在首屏内清楚可见。管理/分析/监控页先读取 [数据工作台密度规范](../ui-design/references/data-workspace-density.md),按宿主可用内容区满宽、容器断点和实际字号/几何验收,不把移动 premium 或营销 Hero 作为后台默认。
24
24
  - 每个组件和页面都必须消费语义 token,适配任意租户主题色,并同时支持亮色、暗色模式;禁止把某一种主色、白色表面或深色背景写成唯一正确外观。
25
25
  - 新增视觉验收至少覆盖一个浅色主题、一个暗色主题和一个非默认租户主题色,并检查文字、边界、状态色及焦点态的可读性。
@@ -30,7 +30,7 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
30
30
  - 每个移动端页面都必须处理安全区、加载状态、按下反馈和底部操作。
31
31
 
32
32
  <!-- /microi-progressive:chunk -->
33
- <!-- microi-progressive:chunk id=microi-ui-001 sha256=33d0fbc900090983a0e5959e10f611a3ebb3b9b2c0dc1d13ce7569cfc4701211 -->
33
+ <!-- microi-progressive:chunk id=microi-ui-001 sha256=cda04dc6f6e7b164ca2de2a7f7aeec711d629bf82a546849dc56b09bdb3aa64a -->
34
34
  ## 内置设计模式
35
35
 
36
36
  当需求只说“主流、高级、好看”时,先为页面确定一种主模式,再开始选组件和写样式:
@@ -45,6 +45,7 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
45
45
  | 数据工作台 | 优先异常、趋势、明细和筛选回显 | `MciMetricCard + MciFilterBar + MciDataState` |
46
46
 
47
47
  - 一页只能有一个主模式,辅助能力最多两项;禁止把六种风格堆成拼盘。
48
+ - 整站或显著重设计先读取 [项目设计签名与场景配方](../ui-design/references/design-pattern-library.md#项目设计签名与场景配方)。主模式只决定任务优先级,不要求所有页面套同一骨架;首页、资产、目录、表单与 PC 工作台共享语义 token,同时各自组织主要对象和动作。
48
49
  - 先完成默认、加载、空、错误、禁用、权限、成功状态,再增加装饰和动效。
49
50
  - 涉及完整产品设计时,读取 [设计模式库](../ui-design/references/design-pattern-library.md);涉及登录、订阅、支付、权限、搜索和设置时读取 [产品流程配方](../ui-design/references/product-flow-recipes.md);涉及动效、Canvas/WebGL、图片或视频时读取 [动效与媒体规范](../ui-design/references/motion-and-media.md)。
50
51
  - 整站或长期维护项目必须在项目根目录维护 `MCI-DESIGN.md`,按 [设计契约规范](../ui-design/references/mci-design-contract.md) 描述 token、组件状态、动效、响应式和降级策略;可复制 [契约模板](../ui-design/assets/templates/MCI-DESIGN.md)。
@@ -121,11 +122,13 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
121
122
  - 可点击整卡必须有 hover/focus/pressed、键盘 Enter/Space、可见焦点与内部控件事件隔离;骨架屏和最终卡片结构等高。
122
123
 
123
124
  <!-- /microi-progressive:chunk -->
124
- <!-- microi-progressive:chunk id=microi-ui-005 sha256=f46f6672b60d4faad4a0fc501036bcb7b9d04545952ad8acb716668aac699454 -->
125
+ <!-- microi-progressive:chunk id=microi-ui-005 sha256=3d000f626ee1b0a3560577033f95b948845236fb117d47f4adfa1a93c076cfd3 -->
125
126
  ## 高品质移动端视觉标准
126
127
 
127
128
  移动端应用必须像经过打磨的产品,而不是把后台表单硬塞进手机视口。
128
129
 
130
+ 整站设计、重设计及用户反馈复测前,必读 [移动产品设计语言与可执行视觉门禁](../ui-design/references/mobile-product-language.md)。先把参考中的排版、主体比例、色块用途和任务顺序转译为当前产品的原创设计签名,再确定共享组件和动效;“默认紧凑”不能否定用户明确要求的表现性方向。Tab、图标与排序控件须量测真实中心线、间距和触控框,桌面独立与原菜单的手机预览必须同视口对比;无报错或几何正确不代表视觉已经出众。原创可交互场景见 [模式实验室](../ui-design/assets/pattern-showcase/index.html#expressive)。
131
+
129
132
  写页面局部 CSS 前,优先使用这些基础能力:
130
133
 
131
134
  - `.mci-page--mobile-premium`
@@ -9,6 +9,8 @@ description: Microi 吾码 UniApp/H5/App/小程序前端规范。用于创建或
9
9
 
10
10
  本 Skill 适用于任何 Microi 吾码 UniApp/H5 项目,包括商城、OA、ERP、MES、CRM、互联网项目、预约项目等。不要把规则写成某一个业务应用专属规范。
11
11
 
12
+ 设计、创建或修改 UniApp、移动 H5、App、微信小程序页面时,默认执行[前端界面任务默认路由](../microi-system-delivery/SKILL.md#前端界面任务默认路由)。用户直接提出页面需求时,同样先读取并应用 [吾码 UI 设计](../ui-design/SKILL.md) 和 [Microi.UI](../microi-ui/SKILL.md),并执行下方移动端质量门禁。
13
+
12
14
  ## 视频选择与开发者工具兼容
13
15
 
14
16
  视频上传必须区分微信开发者工具与真机:只在微信运行时明确返回 `platform='devtools'`
@@ -38,7 +40,7 @@ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` /
38
40
  创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`,并读取其[首版交付与外部服务验收](../microi-mobile-app-quality/references/mobile-first-delivery.md)。手机号快捷登录、会话续签、导航几何、真实地图、页面动效和公开发布回读从首版纳入需求与测试,不能先交静态占位版,再等待用户逐页指出问题。涉及后台与第三方服务时按实际业务范围执行,既有授权和租户策略优先。
39
41
 
40
42
  <!-- /microi-progressive:chunk -->
41
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=de245aa65643e8bbb5d9cfd5256066295b4857bfa2fc8ef2689161eee9b2bc25 -->
43
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=0e8369c5c302af076eede55b45b251bbb96861602432a612c172bd9521a9f4c9 -->
42
44
  ## 标准产品、视图协议与租户扩展
43
45
 
44
46
  地图提供行政区与附近距离两类筛选时,应复用省市区字典,并允许省、市、区逐级选“全部”;省级“全部”须显式启用,不能改变普通地址录入的默认值。行政区域查询不依赖手机定位、不叠加附近半径,空地区仍可保留既有附近模式。范围筛选必须在原有菜单/租户/行权限内执行,分批读取并丢弃迟到响应;来源列表存在同表不同菜单时,地图入口与查询应保留准确的来源菜单和固定业务条件。验收覆盖全国、全省、全市、区县、直辖市、定位拒绝、旧接口兼容和快速切换。
@@ -49,6 +51,8 @@ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` /
49
51
 
50
52
  Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile + 租户插件”架构,不能把某个交付项目直接写死成平台产品:
51
53
 
54
+ 组合字段替代原生字段渲染时,必须保留原字段的租户动作、授权上下文与只读行为。标签旁动作通过通用插槽接入(如 `mci-visit-target-fields` 的 `target-label-actions`),动作仍由原字段 `getFieldActions/runFieldAction` 声明和执行;不要因为成员字段被组合控件隐藏就丢失详情入口。关联跳转使用真实关联 Id 和目标菜单权限,不能按显示名称猜测记录;已有业务列表详情时优先复用同一详情路由及参数,不用通用表单代替而丢失统计、关联和操作。验收覆盖新增、编辑、查看、未关联和撤权,比较列表与快捷入口的实际导航目标,并检查完整详情、按钮尺寸及标签间距。
55
+
52
56
  JSON 历史字段的只读展示使用 `Config.ReadonlyView.Type=Timeline`,通过 `TitleField/TimeField/Fields[{Name,Label}]/ToneMap/EmptyText` 声明;复用 `mci-record-timeline` 与 `record-timeline.mjs`。只展示映射的标量字段,不泄露内部 ID,不执行 HTML 或 V8;模块详情整行布局,最近三条和逐批展开,空值及损坏数据均有可读提示。通用组件不得按客户表名或字段名硬编码。更新后验证旧记录、排序、长说明及两套小程序构建。
53
57
 
54
58
  - `src/platform/`、通用 `mci-*` 组件、动态模块页和动态表单页只实现平台能力,不得出现租户表名、字段名、品牌文案、素材或客户路由。
@@ -63,6 +67,7 @@ JSON 历史字段的只读展示使用 `Config.ReadonlyView.Type=Timeline`,通
63
67
  - 表单元数据必须通过 `V8.FormEngine.GetDiyTableModel/GetDiyFieldList` 访问当前 FormEngine 缓存入口,并携带真实菜单授权上下文;页面和控件不得用普通 `GetFormData/GetTableData` 直查受保护的 `diy_table/diy_field`,也不得散落裸元数据接口 URL。
64
68
  - ViewSchema 未配置、配置不完整或网络暂时失败时,必须回退到菜单移动字段和完整 `diy_field` 定义;定制详情还必须把未显式编排的新字段追加到折叠分组,不能静默丢字段。
65
69
  - 列表、详情、编辑和保存请求应携带真实授权 `_SysMenuId`;客户端不能自行声明角色、数据范围或表权限,服务端仍是最终权限边界。
70
+ - 普通模块查询的 `ModuleEngineKey` 优先使用显式模块配置或真实授权菜单 Id;本地路由/业务 `key` 不得覆盖已解析的菜单 Id。关联下拉报“sys_menu 不存在”时,先核对请求是否误传本地代号,再只读验证真实菜单和数据,不凭报错补建菜单或重建业务数据。回归覆盖静态入口、动态菜单、显式模块 Key、无权限和子表委托。
66
71
  - 动态列表和子表必须读取授权菜单的 `SelectApi`,单条详情读取表级 `ApiReplace.Select`;接口缺失时沿用普通查询,接口失败时保留错误,不能回退到空物理表伪装暂无数据。子表继续传完整 `_TableChildAuth`、父子外键条件和分页参数;虚拟记录 Id 原样传递,分区月份由后端解析。接口地址只允许当前 API 同源,并委托已配置 SDK 处理租户与续签。只读日志的月份字段和支持的筛选能力由租户插件声明,普通表编辑权限保持原契约;验收覆盖预览、分页、详情、历史月份、跨设备拒绝及普通子表。
67
72
  - 原生详情进入编辑后,取消丢弃未保存字段并返回同一详情/Tab,保存成功后回读服务端结果并通知来源列表刷新;直接新增/编辑仍返回来源列表。验收覆盖系统返回、保存/子表失败、迟到响应和权限撤销,不能用重复压入详情页替代原实例恢复。
68
73
  - IoT/关联快照的“记录不存在”应展示业务空状态并隐藏表名/SQL,权限与网络失败仍保留真实错误;未知遥测使用占位值,零值和离线不能被当作缺失。依赖租户 V8 的契约测试从授权同步目录按唯一 ApiEngineKey 定位,测试前核验源码完整性与哈希,不靠旧分类文件夹名定位或跳过缺失依赖。
@@ -223,6 +228,10 @@ row.OwnerAvatarUrl = await resolveAvatarUrl(rawAvatar);
223
228
  ```
224
229
 
225
230
  <!-- /microi-progressive:chunk -->
231
+ ## 跨平台构建插件与无浏览器依赖
232
+
233
+ Vite/Rollup 插件匹配依赖时,须统一模块 ID 与 `require.resolve()` 路径的斜杠;Windows 的反斜杠不能直接与 Vite 正斜杠 ID 比较。兼容加载仅处理真实依赖入口,不能扩大到虚拟模块或 CommonJS 代理模块。第三方依赖读取 `navigator.appName` 或 `window` 导致启动失败时,在模块局部兼容,不向 App/小程序全局伪造浏览器对象。回归同时覆盖两种路径、真实 Vite 打包产物在无浏览器环境中初始化、既有加密协议与浏览器随机数接口;只直调插件原始文件路径不足以证明真实构建有效。编译配置更新后重新运行原开发入口,再确认页面注册,不能把启动异常后的页面未注册当作独立路由缺失处理。
234
+
226
235
  ## 详细参考路由(渐进披露)
227
236
 
228
237
  仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。