@microi.net/cli 6.2.4 → 6.3.2

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 (87) 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 +118 -118
  10. package/scripts/microi-cli.js +64 -59
  11. package/scripts/microi-codex-broker.js +2 -0
  12. package/scripts/microi-skills.meta.json +318 -279
  13. package/skills/.microi-skills-version.json +2 -2
  14. package/skills/.progressive-disclosure-manifest.json +109 -106
  15. package/skills/ai-engine/SKILL.md +32 -2
  16. package/skills/ai-engine/references/cpu-timeline-export.md +31 -0
  17. package/skills/ai-engine/references/local-speech-s2v.md +35 -0
  18. package/skills/app-store/SKILL.md +567 -553
  19. package/skills/app-store/references/platform-row-format.md +7 -0
  20. package/skills/dos-orm/SKILL.md +5 -0
  21. package/skills/dos-orm/references/oceanbase-mysql.md +8 -0
  22. package/skills/job-engine/SKILL.md +12 -0
  23. package/skills/message-notification/SKILL.md +2 -0
  24. package/skills/microi-ai-application/SKILL.md +1 -0
  25. package/skills/microi-client-frontend/SKILL.md +13 -49
  26. 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
  27. 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
  28. package/skills/microi-codex/SKILL.md +5 -0
  29. package/skills/microi-codex-installer/SKILL.md +18 -2
  30. package/skills/microi-deployment/SKILL.md +376 -366
  31. package/skills/microi-deployment/references/deployment-matrix.md +167 -145
  32. package/skills/microi-deployment/references/offline-installer.md +66 -64
  33. package/skills/microi-docs-coverage/SKILL.md +1 -1
  34. package/skills/microi-docs-coverage/references/capability-map.md +11 -5
  35. package/skills/microi-form-engine/references/form-generation-quality.md +12 -0
  36. package/skills/microi-frontend-sdk/SKILL.md +12 -1
  37. package/skills/microi-left-right-layout/SKILL.md +176 -163
  38. package/skills/microi-microservice/SKILL.md +19 -0
  39. package/skills/microi-microservice/references/runtime-delivery.md +6 -0
  40. package/skills/microi-microservice/references/v3-committed-status-read.md +13 -0
  41. package/skills/microi-mobile-app-quality/SKILL.md +2 -0
  42. package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
  43. package/skills/microi-system-delivery/SKILL.md +8 -1
  44. package/skills/microi-system-delivery/references/delivery-pitfalls.md +19 -0
  45. package/skills/microi-ui/SKILL.md +19 -4
  46. package/skills/microi-uniapp-frontend/SKILL.md +10 -1
  47. package/skills/microi.v8.js +17 -3
  48. package/skills/module-engine/SKILL.md +32 -2
  49. package/skills/ocr-engine/SKILL.md +30 -0
  50. package/skills/playwright-e2e/SKILL.md +11 -3
  51. 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
  52. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +2 -2
  53. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +2 -2
  54. package/skills/system-observability/SKILL.md +24 -0
  55. package/skills/system-observability/references/framework-status-widgets.md +51 -0
  56. package/skills/system-observability/references/memory-incident-triage.md +14 -0
  57. package/skills/ui-design/SKILL.md +32 -5
  58. package/skills/ui-design/assets/pattern-showcase/app.js +57 -0
  59. package/skills/ui-design/assets/pattern-showcase/index.html +35 -4
  60. package/skills/ui-design/assets/pattern-showcase/scenario-state.js +34 -0
  61. package/skills/ui-design/assets/pattern-showcase/styles.css +115 -0
  62. package/skills/ui-design/references/controls-and-motion-research.md +49 -0
  63. package/skills/ui-design/references/data-workspace-density.md +8 -0
  64. package/skills/ui-design/references/design-pattern-library.md +50 -1
  65. package/skills/ui-design/references/media-geometry-and-pointer.md +42 -0
  66. package/skills/ui-design/references/mobile-product-language.md +95 -0
  67. package/skills/ui-design/references/motion-and-media.md +4 -2
  68. package/skills/ui-design/references/product-flow-recipes.md +3 -0
  69. package/skills/uniapp-mall-assets/SKILL.md +3 -0
  70. package/skills/v8-api-config/SKILL.md +2 -2
  71. package/skills/v8-crud-api/SKILL.md +2 -1
  72. package/skills/v8-file-upload/SKILL.md +2 -2
  73. package/skills/v8-frontend-events/SKILL.md +2 -1
  74. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +21 -1
  75. package/skills/v8-security/SKILL.md +22 -5
  76. package/skills/v8-security/references/payment-gateway.md +25 -0
  77. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +20 -0
  78. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +19 -1
  79. package/skills/v8-sql-query/SKILL.md +2 -0
  80. package/skills/v8-table-event/SKILL.md +15 -2
  81. package/skills/v8-workflow/SKILL.md +8 -0
  82. package/skills/vision-engine/SKILL.md +284 -280
  83. package/skills/vision-engine/references/architecture-and-acceptance.md +14 -0
  84. package/skills/vision-engine/references/realtime-cpu-profiles.md +80 -0
  85. package/skills/vision-engine/references/video-timeline.md +189 -0
  86. package/skills/workspace-conventions/SKILL.md +3 -0
  87. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +9 -9
@@ -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
  | 需求 | 首选 |
@@ -47,6 +49,7 @@ Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
47
49
  - AI 在线恢复使用 `microi_manage_system_observability(action=ResetDatabasePools)` 的预览、确认和回读协议,详细决策见 [系统日志/监控](../system-observability/SKILL.md)。需要升级含 `database-pools/v1` 的后端和 MCP;事故恢复本身不要求重启数据库/API。
48
50
 
49
51
  - 数据值全程参数化;`FromSql` 的动态值用 `AddInParameter`。
52
+ - C#中密文、支付入口或秘密值改用`SqlSection.AddSensitiveInParameter(name,value)`;普通与慢SQL的参数和可执行SQL投影均按`Section.IsSensitiveParameter`脱敏。已加密也不能把完整密文写日志;不能用日志过滤替代参数化。
50
53
  - 表名、字段名、排序名不能来自未经白名单验证的用户输入。
51
54
  - 保留 `{0}Name{1}` 标识符延迟绑定机制,不能改成字符串替换。
52
55
  - `OrderByClip` 的校验不是授权;可排序字段仍需业务白名单。
@@ -90,6 +93,8 @@ Dispose 幂等,未 Commit 时自动回滚。事务内异步操作串行执行
90
93
 
91
94
  ## 验收
92
95
 
96
+ - 强类型读取器在首行迭代前准备映射,零行结果也必须能创建反序列化器。继承非公开属性的解析须使用与首次枚举一致的实例/公开/非公开标志,并保留基类 private setter 的重绑定、Field 别名和只读属性语义;不能把内部保护标记改为 public 来消除空引用。覆盖实际 WFWork/WFFlow 的空/单行 Reader 读取及两种 JSON 绑定器拒绝外部设置原生保护标记。ORM 映射能力不改变 FormEngine 鉴权或外部 JSON 绑定权限。
97
+
93
98
  - Oracle 原生 `TO_CHAR(value, format[, nlsparam])` 必须保留参数顺序;Provider 不得用
94
99
  字符串扫描交换参数。单参数、嵌套函数、格式串中的逗号、注释与字面量也要原样保留。
95
100
  - `ToArray/ToList` 是查询执行与读取边界,堆栈停在这里不能证明对象转换出错。
@@ -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 安装时才建立对应编排及独立验收库;默认平台发布不追加此专项、不创建本地测试容器、不触及客户数据库。
@@ -102,6 +102,11 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
102
102
  - 先证明任务真的在执行:读 `Scheduler.IsStarted`、`Scheduler.NumberOfJobsExecuted` 和 `Acquisition.LastAcquisitionError`,参考 `microi.doc/docs/doc/system-engine/job.md` 的“任务不执行”。`diy_schedule_job.Status=正常`、`diy_schedule_job.NextTime` 和“插件启动成功”都不能证明触发成功;列表/详情页的 `LastTime/NextTime` 来自运行时,直接查表看到的是库内快照。
103
103
  - 领取错误含 `Key 'IDX_microi_job_T_NFT_ST' doesn't exist` 时,是 Quartz 3.19 MySQL 方言依赖 `USE INDEX (IDX_{tablePrefix}T_NFT_ST)` 与 `IDX_{tablePrefix}T_NFT_ST_MISFIRE`,而触发器表缺少这两个索引(常见于历史租户库仍是旧 `QRTZ_` 前缀索引名)。平台调度器初始化会按前缀幂等补齐;人工抢修可直接执行文档中的两条 `CREATE INDEX`,索引名大小写不敏感,补完后无需重建任务或 Cron。
104
104
  - 失败记录错误分类、重试次数和 `NextRetryTime`,采用有上限退避;永久错误进入人工处理。
105
+ - 后端9.0.2把`Code=0`业务回包的有界脱敏详情与重试/最终失败状态一起按原owner/fence保存;
106
+ 不再只留`Msg`而丢掉失败资源。通知中心`Detail`仍仅任务所属用户读取,摘要/Redis不带详情。
107
+ `ResultTruncated=true`表示节点数/深度/字符预算截断,不能宣称拿到了完整原回包;密码、密钥、
108
+ 签名和临时访问地址隐藏。成功的后续checkpoint清除旧失败详情,成功终态保存实际最终结果。
109
+ 已有旧失败记录不会凭空补回详情;先修复根因,再用正式入口明确发起新任务,保留旧审计。
105
110
  - 大应用包安装返回 Id 后长期 `Pending/AttemptCount=0`,先回读原任务和 `WorkerClaimFailed` 持久栈。旧版完整 `ParamJson` 共用 2 秒候选扫描时限,数据库慢读可能触发驱动超时处理中的空引用;不得凭异常文案归因业务脚本或重复提交。新版候选仅含领取必需字段,完整参数在已领取的执行槽中以任务 Id、租户、owner/fence 和有效租约约束读取,独立上限 30 秒,读后再验租约;读取失败不执行正文,仅释放本次仍拥有的租约。验收覆盖大参数慢读、读失败、读取期间租约变化和原任务成功终态;需要更新后端,MCP/CLI 升级不能代替。
106
111
  - 已领取的后台任务执行失败时,先按原任务 Id 回读真实状态,再查系统日志 `Source=BackgroundTask`、`Action=ExecutionFailed`。脱敏诊断用 `Stage` 区分接口引擎执行(`ApiEngineExecution`,也包括执行前的权威引擎读取)、分片进度写入(`ContinuationProgress`)、分片重新入队(`ContinuationPersist`)和终态写入(`TerminalPersist`);后者表示 `Complete` 本身失败,不能据此认定业务脚本失败。结合 `OwnerOsClient/ExecutionOsClient`、运行环境、`TaskId/Fence` 关联原任务;安全异常链最多 4 个节点,保留类型、`HResult`、可读取的提供商 `Number/SqlState/SocketErrorCode` 及每节点最多 4 个 CLR 方法名,不包含源码路径、行号或实参。
107
112
  - 此诊断不记录异常消息正文、SQL、参数或连接串。`MessageSha256` 仅用于关联相同消息前缀:最多取前 65,536 个 UTF-16 字符后编码为 UTF-8 计算摘要,并同时记录 `MessageLength/MessageHashChars/MessageHashTruncated`;不能把截断摘要当作完整消息或根因证据。诊断走既有 `QueueSystemLog`,接受入队不等于已经持久化,必须实际查询到日志才算取得诊断证据;日志拒绝或异常不改变原任务的重试、事务、租约和失败结果,也不能触发重复提交。
@@ -112,6 +117,13 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
112
117
 
113
118
  ## 后台按钮
114
119
 
120
+ ### 创作任务与长期素材引用
121
+
122
+ - 后端9.0.3起,原生本机媒体 `__microi_native_ai_local_media__` 和 CPU 时间线/私有音频检查 `__microi_native_ai_timeline_export__` 的任务身份与结果作为长期素材引用保留。通知中心 `ClearCompleted` 只清除可归档的普通成功任务;固定两类任务不计入清除数,`Remove` 返回明确拒绝。服务端固定 Worker 身份决定策略,客户端不能传保留/删除开关。
123
+ - 保留条件直接放在数据库清理/软删除的同一条原子 UPDATE 内,仍限定原租户、本人、运行环境和终态;不能只先查再拒绝,以免完成和清理并发时隐藏刚生成的素材。普通任务清理、其它原生 Worker 和取消协议保持原有语义。
124
+ - 状态/结果查询、素材强引用和后续剪辑仍按本人、租户、原生任务/收据及对象完整性校验,不因保留而开放其它用户的数据。创作页面不得提供通用清空/移除这些任务的入口;需要资源生命周期管理时应另做显式授权、引用检查和审计流程。
125
+ - 本变更不恢复历史已删除任务,不补造丢失结果,也不保证底层对象永久可用。回归需实际执行 ORM 清理 SQL,覆盖普通清理、两固定 Worker、租户/用户/运行环境隔离及完成与清理并发;本地数据库引擎回归不能代替客户数据库和长期素材复用验收。
126
+
115
127
  满足任一条件即按后台任务设计:预计超过 2 分钟、500 条以上、1000 个以上扇出子操作、100 次以上外部调用、总量未知且可能持续运行,或安装/初始化/批量导入/批量生成/全量同步/迁移/备份。预计超过 10 分钟时,仅设置 `RunBackground=true` 仍不够,必须按 checkpoint 分片,每片独立事务。
116
128
 
117
129
  菜单按钮设置 `RunBackground/BackgroundTask/IsBackgroundTask=true` 和 `ApiEngineKey`,并配置 `BackgroundTaskOptions`:
@@ -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=6127b9fd2b04839ea362158a0e51eed44415b6f956ea7109739227bf43f3d693 -->
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,16 +175,23 @@ 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
 
184
191
  右上角主题设置的边角风格默认圆角;已安装 `sys_user.CornerStyle` 时从账号偏好恢复,旧租户才使用浏览器本地兼容值。根元素 `data-mci-corner-style` 控制全局角半径,覆盖动态挂载的 Element Plus 弹层。顶栏入口统一使用 40px 触控区域和 20px 图标,AI 入口使用图标组件,不使用图片。模块 `HideTableBanner`、`HideFormBanner` 只在值明确为 `1/true` 时隐藏对应 Banner,并跳过其专属统计请求;未安装开关字段的旧菜单继续显示。
185
192
 
186
193
  - 边角风格先读取当前用户 `CornerStyle`:`round/square` 显式覆盖;空值或 `System` 继承租户 `sys_config.CornerStyle`,租户空值默认为圆角。不得把空个人值提前归一为 `round`,否则会阻断租户直角设置。
187
- - 桌面经典布局使用 `NavigationLayout=Side/Top/TopSide`,个人空值或 `System` 继承租户,租户空值为 TopSide;`MenuChildExpandMode` 全局空值为 Right。`TopSide` 将一级放顶部,当前一级的二级及更深菜单复用原侧栏;单个子菜单仍留在侧栏,无可见子菜单时隐藏侧栏并释放内容宽度。侧栏仍支持收起及 `MenuChildExpandMode=System/Down/Right`,收起后的叶菜单使用既有向右弹出面板显示真实名称,保留多级分支、键盘焦点与Escape,不重复叠加Tooltip。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。当前路由与一级归属由 `hybrid-navigation.js` 统一投影,禁止修改共享权限树。
194
+ - 桌面经典布局使用 `NavigationLayout=Side/Top/TopSide`,个人空值或 `System` 继承租户,租户空值为 TopSide;`MenuChildExpandMode` 全局空值为 Right。`TopSide` 将一级放顶部,当前一级的二级及更深菜单复用原侧栏;仅此模式按已授权路由递归过滤隐藏项,可访问叶子为0或1时整块隐藏侧栏并释放内容宽度,切换到多于1项时恢复;单目录有多个可达叶子仍保留侧栏,自动显隐不改个人折叠偏好。侧栏仍支持收起及 `MenuChildExpandMode=System/Down/Right`,收起后的叶菜单使用既有向右弹出面板显示真实名称,保留多级分支、键盘焦点与Escape,不重复叠加Tooltip。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。当前路由与一级归属由 `hybrid-navigation.js` 统一投影,禁止修改共享权限树。
188
195
  - 侧栏与角色管理组织树共用 `MciResizablePane`:右边缘拖拽、可访问分隔条、方向键/Shift/Home/End 和收起按钮必须同样可用。`sys_user.SidebarWidth/RoleTreeWidth` 为 nullable 整数像素(160–600),`SidebarCollapsed/RoleTreeCollapsed` 为 nullable 0/1;使用当前账号的 Managed 偏好白名单保存。拖拽中仅预览,松开提交,取消或卸载释放指针。视口夹紧保留主内容宽度,不能把夹紧值覆盖长期偏好;窄屏禁拖,旧租户仅用账号/租户/API 隔离的设备回退。侧栏空宽度沿用 `sys_config.MenuWidth` 后回退240px,角色树默认240px。
189
196
  - 顶部主导航与工作区 Tabs 是不同层级:`Top/TopSide` 的当前一级使用独立短底线,hover/focus 前景显式跟随可读主题,禁止继承 Element 的低对比品牌色。长弹出菜单使用独立主题表面、无异色顶边和内部滚动,嵌套层仍 Teleport;顶部菜单标题与品牌不显示 title/alt/Tooltip 类提示浮层,保留完整 aria-label 无障碍名称;顶栏整条背景色带须贴合视口或所属壳层左右边界,不能把内部 padding 当成全宽验收,内容区留白独立处理。窄视口“更多”菜单也遵守同一契约。
190
197
  - 顶部导航整行(含功能图标和账号姓名)使用主题运行时的 `--sidebar-*` 可读表面与前景;主题面板和业务弹层保留自身语义表面。主题入口为齿轮,界面密度在同一主题面板调整,已安装 `sys_user.UiDensityScale` 时保存当前账号、个人空值继承 `sys_config.UiDensityScale`,旧租户才使用按租户/账号隔离的设备回退;AI 入口使用圆圈内 AI 字母 SVG,不能回退魔法棒或图片。
@@ -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 -->
@@ -33,11 +33,14 @@ description: 在 Microi Agent、Codex 或 DeepSeek Harness 中完成 Microi吾
33
33
 
34
34
  ## Microi Agent 桌面宿主
35
35
 
36
+ - macOS 单架构发行必须隔离更新频道:正式运行时按自身 `process.arch`,打包元数据按目标架构选择 `/microi-code/updates/latest/x64/` 或 `/arm64/`;Windows 继续原频道。旧共用 Mac 清单可能服务 Universal 用户,不能用仅 x64 的新版覆盖它,也不能依靠浏览器 UA 推断 Apple Silicon。官网下载应明确列出架构;缺少对应架构清单时显示不可用,不跨架构降级。签名、公证、最终包原生验收和 CDN 字节回读分别记录,另一架构通过不能替代本机结果。
36
37
  - 完整版在所有平台用物理 `node_modules/node/bin/node[.exe]` 启动 Harness、Worker 和插件命令,不能换成 Electron Helper/utilityProcess;后者会在特定 Electron 指纹下被原生加载器拒绝。每次发布最终安装包先运行 `test:packaged-desktop`,设置真实产物与独立证据目录,验收生产 main 两次正常启动、Worker IPC、员工引导及 Harness 重启,并核对日志 `electron=none`。直接启动 Harness、签名公证成功或跳过完整应用用例均不足以证明用户能正常启动;不同系统和架构覆盖分别记录。同步上游必须保留该选择器、门禁脚本与回归用例。
37
38
  - 桌面包内置技能目录;干净工作区输入 `/microi` 可发现吾码入口,再读取基础规范与专项技能。查不到时先核对当前桌面版本及内置技能资源,不要求用户复制开发机目录,也不要把 MCP 工具名当成斜杠技能名。
38
39
  - 对话输入框上下键回填成功提交的提示词,向下可恢复未发送草稿。菜单、输入法候选、选区和多行正常光标移动优先;不要在用户编辑文本时强行覆盖草稿。
39
40
  - 消息编辑/撤回通过真实会话分叉到该消息之前的已完成轮次;原会话和已经执行的文件修改保留。撤回将消息恢复为草稿,编辑则重新发送;这不是撤销文件系统。图片随草稿恢复,无法安全恢复的文件附件明确拒绝,不能静默删除附件或只改屏幕文字而保留旧模型上下文。
40
41
  - AI 员工按项目群协作,十个岗位加技术总监共十一个岗位,可分别选择桌面已配置模型;原任务、成果审阅、目标和预算仍从「任务与验收」进入。群与任务共用用户明确选择并已登录的吾码 MCP,不能默认切到官方账号或首个客户。数据、运行与验收记录归所选租户;未安装员工中心或权限不足必须明确提示,不能擅自向所有客户安装。Harness 的会话/技能/定时能力不能证明完整 OpenClaw 已内置。相关执行边界读取 `ai-engine/references/ai-employees.md`。
42
+ - `GroupWorkflowList` 将本人未结束工作置首,其余按创建时间和 Id 从新到旧排列并去重、最多二十条;全部结束后群头应打开最新工作会话。验收多条工作时独立核对实际选中的 SessionId,不能仅凭窗口打开判定成功;群消息和交接仍按原时间正序展示。
43
+ - 员工中心 v1.2.7 的嵌入导航保留用户当前页:同入口 resize/theme/resume 不是导航,只有真实宿主路由或身份/入口变化才切换;验收每页需等待骨架消失与绘制稳定,并独立核对截图中的标题、选中态和实际内容。
41
44
  - 员工群消息先持久提交 SQL 消息、运行与 outbox,再返回短确认;后台用稳定 Mongo `_id` 同步并按授权游标分页读取,失败明确显示 SQL 兜底,不能把未确认发送或模型排队当完成。旧历史只在当前群管理者显式操作后分批迁移。SignalR 使用通用 `/api-engine-realtime` 和群授权,只传版本提示;断线重连后重新授权并按游标回读,不将推送当持久记录。Token 留在桌面 Worker,切换 MCP/用户/群时清理旧订阅及迟到响应。最终安装包须实测详情、模型选择保存、短确认、Mongo 回读及断线恢复。
42
45
  - Mongo 附件投影保存规范四字段数组的 JSON 字符串,读回仍核对完整消息摘要,不能只比较顶层 ContentHash。冲突先用同源、当前群管理权限限定的只读审计;旧嵌套字段已丢失时不可猜测解码或跳过摘要。派生投影修复仅限 SQL 正文摘要与 outbox 一致、原 outbox 独占租约仍有效、Mongo 同 Message/Group/Owner、时间/序号及其余非附件字段匹配、已知缺陷形态明确的记录;只更新派生附件字段并完整回读核对,不把固定 Id 更新宣称为 Mongo 原子 CAS。未知冲突保留 SQL 兜底,不改业务消息或模型运行、不扫描所有租户。
43
46
  - 同一桌面实例的多个 Worker 必须共享本机模型容量预准入,在领取云端任务前取得名额;RPC 超时不等于模型终态,结果未知时停止自动重放并保留核对入口。
@@ -96,6 +99,8 @@ Codex Router 启动后会异步调用 bundled CLI 的 `microi update --backgroun
96
99
 
97
100
  ## 先确认工作区连接
98
101
 
102
+ 原始 `microi_*` 未展开时先查找 `microi_codex` 单入口。当前对话确实未注册入口时,按 [安装与诊断的官方 CLI 通道](../microi-codex-installer/SKILL.md#当前对话没有吾码工具时继续工作) 使用 `microi mcp tools` / `microi mcp call <microi_tool> --params-stdin`,不手写 stdio 桥接或先要求新开对话;CLI 调用成功与宿主原生工具注册分别验收。
103
+
99
104
  1. 调用 `microi_codex`,传 `{ "action": "profiles" }`。
100
105
  2. 只有一个已登录连接时,后续可以省略 `profile`;存在多个连接时,始终传 `profiles` 返回的稳定 `name`。
101
106
  3. 尚未初始化时,插件根目录是本文件向上两级;使用其中的 `scripts/microi-cli.js`:
@@ -181,9 +181,25 @@ microi init --workspace <工作区> --pull
181
181
 
182
182
  安装/升级后若 `microi doctor` 返回“Token 签名验证失败”,先区分验签密钥变化与 20 天到期。新版 MCP 会从 Windows 工作区 DPAPI 保险库、macOS Keychain 或 Linux Secret Service 重载精确 Profile 的帐号密码并自动续登、更新 Token/MCP;不得删除全部 Profile、清空 Token 文件或要求用户反复手工输入。同一 `OsClient` 的多条 SaaS 运行记录必须由后端在 JWT 初始化前收敛到同一个 `AuthSecret`,否则更新后仍会反复失效。
183
183
 
184
+ ### 当前对话没有吾码工具时继续工作
185
+
186
+ “配置已写入”“MCP 能握手”“当前对话已注册工具”是三个独立状态。先使用宿主真实的工具发现/刷新能力,同时查找原始 `microi_*` 和 `microi_codex` 单入口;发现单入口后通过 `profiles`、`list_tools`、`describe_tool` 调用,不能因没有展开全部原始工具就判断吾码不可用。工具数量以本次发现结果为准。
187
+
188
+ 原生入口仍未出现且宿主允许执行终端时,使用官方 CLI **6.3.2 起**提供的同源 MCP 通道继续当前任务;旧版缺少命令时先按上方官方更新流程升级:
189
+
190
+ ```powershell
191
+ microi profile list --workspace "<工作区绝对路径>" --json
192
+ microi mcp tools --profile <mcpName> --workspace "<工作区绝对路径>" --json
193
+ '{}' | microi mcp call microi_get_status --params-stdin --profile <mcpName> --workspace "<工作区绝对路径>" --json
194
+ ```
195
+
196
+ `mcp tools` 读取真实工具目录和参数 Schema;`mcp call <microi_tool> --params-stdin` 从标准输入读取严格 JSON 对象,无参数也传 `{}`。按返回的当前租户状态完成只读基线后,再调用业务工具;写入仍传原工具要求的 `confirmExecution`、版本/哈希及其它参数,保留授权、审计、回读与结果未知先核对规则。这个入口复用包内同源标准 stdio MCP,不要求 AI 手写桥接、复制 Token、直连 HTTP 或 SQL,也不改变连接四段身份。
197
+
198
+ CLI 成功只证明官方调用通道可用,不能报告当前宿主已注册工具。明确禁用 MCP、权限/策略拒绝或终端不可用时,不用 CLI 绕过;仅报告实际失败层级及最小恢复动作。不能根据一句“没有工具”就断言 WorkBuddy 不支持热加载,更不能把 WorkBuddy 与千问工作助理混称;核对实际宿主、版本、配置和状态。只有宿主明确要求的信任/启用操作,或官方通道确实无法完成的步骤,才需要用户处理,不能把新开对话作为默认前置条件。
199
+
184
200
  原生配置对应关系:
185
201
 
186
- - WorkBuddy:`.workbuddy/mcp.json`;保存并重载后可直接用自然语言调用 MCP。
202
+ - WorkBuddy:项目级 `.workbuddy/mcp.json`,用户级 `~/.workbuddy/mcp.json`;在宿主 MCP 页面核对真实连接状态,再发现工具。
187
203
  - CodeBuddy:`.codebuddy/skills/microi/SKILL.md`、`.codebuddy/rules/microi.md` 与根 `.mcp.json`。
188
204
  - Qoder:`.qoder/skills/microi/SKILL.md`、`AGENTS.md` 与根 `.mcp.json`。
189
205
  - 百度 Comate:`.agents/skills/microi/SKILL.md`、`.comate/skills/microi/SKILL.md` 与 `.comate/mcp.json`。
@@ -197,7 +213,7 @@ microi init --workspace <工作区> --pull
197
213
  microi doctor --workspace <工作区> --json
198
214
  ```
199
215
 
200
- 当前宿主不会热加载新 Skills/MCP 时,不要求用户立即重载;当前工作继续,用户自然新建任务、重载 Skills/MCP 或重启宿主后再验收新版能力。
216
+ 当前宿主尚未加载新 Skills/MCP 时,按上面的官方 CLI 通道继续已授权工作;用户自然新建任务、刷新 Skills/MCP 或重启宿主后,再独立验收原生工具是否可用。
201
217
 
202
218
  ## 按服务器连接拉取全部 V8
203
219