@microi.net/cli 5.0.5 → 5.0.7

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.
@@ -119,35 +119,44 @@
119
119
  ---
120
120
 
121
121
  <!-- /microi-progressive:chunk -->
122
- <!-- microi-progressive:chunk id=ui-design-011 sha256=1d31f1333c8853380d4e624d3798fddecf7bc26c861afc2dce9df82c566ffa25 -->
122
+ <!-- microi-progressive:chunk id=ui-design-011 sha256=fba089e9a092efca57bfad2a34a4b9bada857c1072b09488e29b3cf28eefaba1 -->
123
123
  ## 骨架屏 Loading 设计规范
124
124
 
125
- 所有依赖接口、数据库、远程资源或异步计算的数据区域,首屏加载态必须使用骨架屏(Skeleton Screen),不能只显示 spinner、进度圈、空图标或“数据加载中...”文案。骨架屏属于基础体验规范,适用于 PC、移动端 H5、uni-app、小程序和 WebView。
126
-
127
- - 骨架屏形态必须接近最终内容版式:列表用行骨架,表格用表头+行骨架,卡片/商品用网格骨架,详情页用大图区+标题/段落骨架,仪表盘用指标卡骨架。
128
- - 加载期间不能提前显示“暂无数据/暂无明细/空空如也”;空态只能在请求完成且确认无数据后出现。
129
- - 骨架颜色使用主题变量或中性色阶,不要使用高饱和主色大面积闪烁;亮色主题推荐 `rgba(255,255,255,.72)` 与 `rgba(232,221,205,.9)`,暗色主题推荐低对比深灰阶。
130
- - 动画只允许使用 `background-position`、`opacity` `transform`,节奏控制在 1.0s 到 1.4s;必须支持 `prefers-reduced-motion` 关闭或弱化动画。
131
- - 分页加载下一页时,只在列表底部追加紧凑骨架,不覆盖已有内容;切换筛选/分类重载第一页时才显示首屏骨架。
132
- - 骨架块必须有稳定尺寸、圆角和间距,加载前后不能造成明显布局跳动。
125
+ 所有依赖接口、数据库、远程资源或异步计算的数据区域,首屏加载态必须使用骨架屏(Skeleton Screen),不能只显示 spinner、进度圈、空图标或“数据加载中...”文案。骨架屏属于基础体验规范,适用于 PC、移动端 H5、uni-app、小程序和 WebView。
126
+
127
+ - 覆盖范围包括菜单/路由切换、首页工作台、表格、卡片、表单与详情首开、右侧面板、弹窗、树、文件/文档/3D 等远程内容容器;不能只改某一个 `diy-table` 页面。
128
+ - 骨架屏形态必须接近最终内容版式:列表用行骨架,表格用表头+行骨架,卡片/商品用网格骨架,详情页用大图区+标题/段落骨架,仪表盘用指标卡骨架。
129
+ - 加载期间不能提前显示“暂无数据/暂无明细/空空如也”;空态只能在请求完成且确认无数据后出现。
130
+ - 骨架表面必须不透明,禁止复用 `.el-loading-mask` 的半透明黑/灰遮罩。颜色只引用语义令牌:`--mci-skeleton-surface/card/header/base/highlight/accent/border`;运行时从当前 `--mci-*` 表面与主题色低饱和派生,必须同时兼容 `data-theme="light|dark"`、`html.dark`、租户自定义主题色和系统主题切换。
131
+ - 主色只允许作为低占比边缘/高光染色,不能把高饱和主题色铺满骨架;切换亮色、暗色或任意自定义主题后,骨架层级要可辨认且不闪白、不变黑幕。
132
+ - 动画只允许使用 `background-position`、`opacity` 或 `transform`,节奏控制在 1.0s 到 1.4s;必须支持 `prefers-reduced-motion` 关闭或弱化动画。
133
+ - 分页加载下一页时,只在列表底部追加紧凑骨架,不覆盖已有内容;切换筛选/分类重载第一页时才显示首屏骨架。
134
+ - 骨架块必须有稳定尺寸、圆角和间距,加载前后不能造成明显布局跳动。
135
+ - 内容加载与操作反馈必须区分:查询/渲染内容使用骨架;保存、提交、删除、登录验证等短操作继续使用按钮内 `loading`;文件上传、后台任务、Unity/WebGL 等已有可信百分比时继续显示真实进度。禁止用骨架伪装可量化进度,也禁止用按钮 spinner 代替内容骨架。
136
+ - Microi.Client 内容区优先使用全局 `v-mci-loading:<table|cards|form|detail|page|stats|list|tree|compact>`;全屏内容切换使用 `openMciLoading()`。不得新增内容型 `v-loading` / `ElLoading.service`。第三方遗留 Loading 必须由主题骨架兜底,不能恢复暗色遮罩。
137
+ - 头像、验证码、私有图片/文件缩略图等局部远程资源使用消费同一主题令牌的圆形或媒体骨架;历史 `./static/img/loading.gif` 只能作为内部兼容哨兵,必须在渲染层拦截,禁止传给 `<img>`、`<el-image>` 或 CSS `url()` 发起真实请求。
138
+ - 自动验收至少扫描 `v-loading`、`ElLoading.service`、硬编码 `.el-loading-mask rgba(...)` 和加载期空态文案;浏览器截图覆盖 1440/1920 桌面、390 移动、亮色、暗色、至少一种非默认自定义主题,以及菜单切换、表格、表单详情、首页。检查控制台、404/5xx、`aria-busy` 和 reduced-motion。
133
139
 
134
140
  参考样式:
135
141
 
136
142
  ```scss
137
- .mci-skeleton {
138
- position: relative;
139
- overflow: hidden;
140
- background: linear-gradient(90deg, rgba(255,255,255,.72), rgba(232,221,205,.9), rgba(255,255,255,.72));
141
- background-size: 240% 100%;
142
- animation: mciSkeleton 1.15s ease-in-out infinite;
143
- }
143
+ .mci-skeleton {
144
+ position: relative;
145
+ overflow: hidden;
146
+ background: var(--mci-skeleton-surface);
147
+ }
148
+ .mci-skeleton__block {
149
+ background: linear-gradient(90deg, var(--mci-skeleton-base), var(--mci-skeleton-highlight), var(--mci-skeleton-base));
150
+ background-size: 240% 100%;
151
+ animation: mciSkeleton 1.15s ease-in-out infinite;
152
+ }
144
153
  @keyframes mciSkeleton {
145
154
  0% { background-position: 120% 0; }
146
155
  100% { background-position: -120% 0; }
147
156
  }
148
- @media (prefers-reduced-motion: reduce) {
149
- .mci-skeleton { animation: none; }
150
- }
157
+ @media (prefers-reduced-motion: reduce) {
158
+ .mci-skeleton__block { animation: none; }
159
+ }
151
160
  ```
152
161
 
153
162
  ---
@@ -84,7 +84,7 @@ did: {DeviceId}
84
84
  - 匿名多人由服务端签发 `SessionId + SessionSecret`;数据库只保存秘密哈希,公开快照不得返回秘密、UserId、设备指纹或内部权限字段。
85
85
  - 在线角色、房间版本和掉线到期时间进入共享数据库/Redis;客户端心跳、接口重试和节点切换都不能依赖进程内字典。
86
86
  - 位置心跳由服务端限制地图边界、最大速度和递增序列;过期查询以服务端时间为准,正常离场与租约超时都必须幂等。
87
- - 公屏文字限制长度、频率、表情白名单与稳定请求 IDDOM 输入框阻止键盘事件冒泡,避免聊天时角色继续移动。
87
+ - 公屏文字限制长度、频率、表情白名单与稳定请求 ID。WebGL 使用 DOM 输入时必须在 Player 端将 `WebGLInput.captureAllKeyboardInput` 设为 `false`,并阻止输入区的键盘、`beforeinput`、组合输入与指针事件继续驱动角色;只拦截冒泡阶段不足以保证数字、标点和 Shift 符号可输入。若 Unity 6 的 Player 编译响应文件未引用 `UnityEngine.WebGLModule`,使用受 `link.xml` 显式保留的反射设置并以真实键盘 E2E 验收,不得跳过该行为。
88
88
  - 接口引擎 `Code=1` 自动提交,失败返回其它 Code 自动回滚,不手动 Commit/Rollback。
89
89
  - 表、索引、菜单、接口与权限通过应用 Manifest 安装,不为游戏资源新增 `Microi.Upgrade` 定制迁移。
90
90
  - 所有接口必须声明 `ResourcePolicies.ApiEngines`:官方核心 `Managed`;租户扩展 `CreateIfMissing`,后续升级不覆盖。
@@ -94,7 +94,8 @@ did: {DeviceId}
94
94
  - `ApplicationType` 使用 `Web`;Vue 3 + Vite + TypeScript 作为页面外壳,Unity Canvas/WebGL 与普通 DOM 分层。
95
95
  - 官方租户的 `AI应用/<appKey>` 是私有源码、构建脚本、V8、Manifest 与商城合约的唯一编辑根。
96
96
  - 页面必须 poster-first:未启动时不下载大体积 WASM/Data;提供加载、错误、重试、全屏、退出和低性能提示。
97
- - 多人界面要显示本地及远端昵称;同模型远端角色使用快照插值,失效租约及时销毁;公屏固定在不遮挡核心操作区的位置并支持键盘与表情选择。
97
+ - 多人界面要显示本地及远端昵称;同模型远端角色使用快照插值,失效租约及时销毁;公屏固定在不遮挡核心操作区的位置并支持键盘与表情选择。真实键盘验收至少覆盖中文、大小写字母、数字、ASCII/中文标点、Shift 符号与输入法组合文本,禁止用直接设置 input value 的方式替代。
98
+ - 开场语音或剧情对白需要字幕时,字幕事件以 `AudioSource.time` 或同等播放器时间轴为准,中文与英文分行显示在底部安全区;不得用页面加载后的固定定时器冒充音画同步。WebGL 可用可访问 DOM 字幕,Windows/原生端使用同一份 cue 数据。
98
99
  - 构建门禁必须拒绝缺失 Unity 产物的“空壳发布”,并校验 WASM、Data、体积、哈希、本机地址、source map 与疑似硬编码 Token。
99
100
  - Unity `Data`、WASM 或 Windows 安装包大于 128 MiB 时,MCP/CLI 必须使用协议 v3 原始字节断点续传;禁止拆分文件、转 Base64 或通过提高普通表单上限发布。失败后读取同一不可变会话只续传缺片,并在“系统引擎 → 超大文件上传记录”回读进度、心跳、错误与恢复建议。
100
101
  - 先同步私有源码,再发布不可变 Web 产物,最后生成/发布商城包;三个动作分别回读。
@@ -136,6 +137,7 @@ did: {DeviceId}
136
137
  | Microi 租户 | 当前用户隔离、Token 轮换、保存重放、无权失败 |
137
138
  | 多人在线 | 至少两个独立会话互见唯一昵称、移动与动作;异常断线超过租约后双方快照均不再返回该角色 |
138
139
  | 实时公屏 | 两个独立会话互相收发文字与表情;非法表情、超长、超频和请求重放均被正确处理 |
140
+ | 字幕与语音 | 开场或剧情语音逐句驱动中英字幕;暂停/恢复不漂移,字幕位于底部安全区且对比度可读 |
139
141
  | 多节点 | 重复投递、节点切换、失败恢复时副作用仅一次 |
140
142
  | 大型资产 | 断点后只补缺片、HDFS 整文件哈希一致、后台审计进度与终态可见 |
141
143
  | AI 应用 | 私有源码回读、运行版本哈希、列表/详情公开可见 |
@@ -34,14 +34,15 @@ tests/
34
34
  - 匿名模式可以承载公开多人玩法,但必须使用服务端签发、只存哈希、可过期的会话秘密;个人持久化接口仍要求 DiyToken。
35
35
  - `ApplicationType=Web`,独立入口为 `index.html`。
36
36
  - 构建状态明确区分 `available` 与 `publishable`;无真实 Unity WASM/Data 时禁止正式发布。
37
- - WebGL 公屏优先使用可访问的 DOM 输入控件并拦截键盘传播;Windows 可使用原生 UI/UIToolkit。不要在外壳和 Unity 中重复绘制同一组操作提示。
37
+ - WebGL 公屏优先使用可访问的 DOM 输入控件,并在 Unity Player 将 `WebGLInput.captureAllKeyboardInput` 设为 `false`;输入区同时隔离键盘、`beforeinput`、组合输入与指针事件。Unity 6 若未向 Player 编译响应文件引用 `UnityEngine.WebGLModule`,可用 `link.xml` 保留类型后反射设置,并必须以真实键盘输入回归。Windows 可使用原生 UI/UIToolkit。不要在外壳和 Unity 中重复绘制同一组操作提示。
38
+ - 语音字幕由真实播放器时间轴逐 cue 驱动,中英文分行放在底部安全区;WebGL DOM 与 Windows 原生 UI 复用同一份字幕数据。固定 `setTimeout` 只能做无音轨占位,不算同步验收。
38
39
 
39
40
  ## 多人租约与公屏交付
40
41
 
41
42
  - 在线角色的事实源使用按 `OsClient` 隔离的共享数据库/Redis,不能使用 API 节点静态字典;客户端心跳周期必须短于租约超时。
42
43
  - 加入响应只向本人返回会话秘密;数据库保存 SHA-256,位置快照只公开昵称、受限坐标、朝向、动作与房间版本。
43
44
  - 正常卸载/离开主动调用 leave;浏览器崩溃、断网或 `kill -9` 依靠服务端租约自然失效,并通过两个真实客户端测量消失时间。
44
- - 公屏接口校验在线会话、内容长度、表情白名单、速率窗口和请求幂等;公开读取只返回有限时间窗和有限条数。
45
+ - 公屏接口校验在线会话、内容长度、表情白名单、速率窗口和请求幂等;公开读取只返回有限时间窗和有限条数。浏览器验收用真实按键输入中文、字母、数字、标点、Shift 符号和输入法组合文本,并由第二个独立会话核对原文;直接调用 `fill()`/赋值只能验证服务端,不能证明键盘链路。
45
46
  - 轮询是兼容基线;接入 WebSocket/SignalR 时仍保留共享租约为事实源,并用 V8 授权接口签发短期频道权限。
46
47
 
47
48
  ## WebGL 与 Windows 双端交付
@@ -199,7 +199,7 @@ AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果
199
199
  7. Microi.VSCode 生成 MCP 配置时应清理旧的中文/横杠 Microi MCP key,只保留 `microi_<osClient>` 或 `microi_<osClient>_<host>` 形式,避免不同 AI 客户端因 namespace 不稳定而无法注入工具。
200
200
 
201
201
  <!-- /microi-progressive:chunk -->
202
- <!-- microi-progressive:chunk id=workspace-conventions-037 sha256=d0c37c1f0c5ec999b10ed6f0ccbb4f1f32aa8b0fc998a433d020d6552cc6fb5c -->
202
+ <!-- microi-progressive:chunk id=workspace-conventions-037 sha256=e8ddd5ad53787087f8e50a13618ee5626686cc72b0b21c1b12b0dc60ea515713 -->
203
203
  ## Windows MCP 控制台闪窗复盘
204
204
 
205
205
  当用户反馈“打开 Microi.VSCode、添加服务器或初始化 MCP 后连续弹出并立即关闭多个 cmd 窗口”时,应按进程风暴排查,不能只给已有 `spawn` 补 `windowsHide`:
@@ -209,6 +209,8 @@ AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果
209
209
  3. VS Code 已配置 `chat.mcp.autostart` 时,插件后台监测只能检查配置和状态,禁止在侧栏显示、定时轮询、登录、添加连接或初始化流程里再次执行 `workbench.mcp.startServer('*')`。
210
210
  4. 握手诊断会真实启动每个 stdio MCP,只能由用户显式点击“诊断 MCP 可调用性”触发;常规配置成功提示不得暗中运行整组诊断。
211
211
  5. Windows 的 VS Code/Cursor 配置优先复用 GUI Electron 宿主 `process.execPath` 并设置 `ELECTRON_RUN_AS_NODE=1`,避免把控制台子系统的外部 `node.exe` 持久化为每个 MCP 的启动命令。Trae 若因空格路径兼容必须经过 `cmd.exe`,仍需使用固定 launcher 并隐藏窗口。
212
- 6. 回归测试至少静态断言:Codex CLI 批量注册函数不存在、后台 monitor 不包含 `startServer`、自动配置不包含诊断、Codex 配置内容不变时不改写、Windows GUI 宿主检查早于外部 Node 探测。再在扩展开发宿主中覆盖打开侧栏、添加连接、初始化 MCP,观察无连续控制台闪窗。
212
+ 6. CLI 或初始化器运行在 VS Code/Cursor Electron 宿主内时,必须通过 `process.versions.electron` 或等价事实识别宿主,并把 `ELECTRON_RUN_AS_NODE=1` 同步写入 `.vscode/mcp.json`、`.cursor/mcp.json`、根 `.mcp.json` 以及 `.codex/config.toml` 的对应 stdio 配置。禁止只把 `Code.exe`/`Cursor.exe` 写成 `command` 却遗漏 Node 模式;否则 Windows 会把 `mcp-codex-stdio-adapter.js` 当普通文件交给编辑器打开,每次启动或切换 AI 对话都可能新增一棵 GUI 进程树。
213
+ 7. Codex 仍只能生成一个 `microi_codex` 路由块,禁止按 Profile 注册多个 Codex MCP。验收必须同时回读配置和进程:凡 `Code.exe`/`Cursor.exe` 命令都带 Node 模式,且不得存在以 `mcp-codex-stdio-adapter.js`、`microi-codex-router.js` 为普通文件参数的可见编辑器根进程;多个对话的 Router 应复用共享 Broker,而不是各自再拉起全部真实 Profile MCP。
214
+ 8. 回归测试至少静态断言:Codex CLI 批量注册函数不存在、后台 monitor 不包含 `startServer`、自动配置不包含诊断、Codex 配置内容不变时不改写、Windows GUI 宿主检查早于外部 Node 探测、CLI 与 Codex 路由配置都保留 `ELECTRON_RUN_AS_NODE=1`。再在扩展开发宿主中覆盖打开侧栏、添加连接、初始化 MCP,观察无连续控制台闪窗或脚本文件被自动打开。
213
215
 
214
216
  <!-- /microi-progressive:chunk -->