@microi.net/cli 5.6.5 → 5.6.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.
Files changed (70) 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 +4 -4
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +45 -44
  10. package/scripts/microi-skills.meta.json +250 -250
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +221 -221
  13. package/skills/ai-engine/SKILL.md +3 -2
  14. package/skills/ai-platform-governance/SKILL.md +8 -8
  15. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +9 -9
  16. package/skills/app-store/SKILL.md +3 -1
  17. package/skills/datasource-engine/SKILL.md +3 -1
  18. package/skills/job-engine/SKILL.md +12 -2
  19. package/skills/microi-client-frontend/SKILL.md +19 -5
  20. package/skills/microi-codex/SKILL.md +8 -3
  21. package/skills/microi-deployment/SKILL.md +11 -0
  22. package/skills/microi-form-engine/SKILL.md +3 -0
  23. package/skills/microi-form-engine/references/component-catalog.md +1 -1
  24. package/skills/microi-form-layout/SKILL.md +1 -1
  25. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +3 -3
  26. package/skills/microi-frontend-sdk/SKILL.md +2 -2
  27. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +8 -7
  28. package/skills/microi-mobile-app-quality/SKILL.md +8 -8
  29. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +10 -10
  30. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +4 -4
  31. package/skills/microi-sso/SKILL.md +1 -0
  32. package/skills/microi-uniapp-frontend/SKILL.md +10 -10
  33. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +7 -7
  34. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +10 -10
  35. package/skills/microi.v8.js +14 -3
  36. package/skills/module-engine/SKILL.md +8 -2
  37. package/skills/page-engine/SKILL.md +4 -4
  38. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +3 -3
  39. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +4 -4
  40. package/skills/system-observability/SKILL.md +2 -1
  41. package/skills/uniapp-mall-assets/SKILL.md +6 -0
  42. package/skills/v8-crud-api/SKILL.md +3 -3
  43. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +4 -4
  44. package/skills/v8-export-import/SKILL.md +9 -5
  45. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +3 -3
  46. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +3 -3
  47. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +1 -1
  48. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +2 -0
  49. package/skills/v8-frontend-events/SKILL.md +4 -3
  50. package/skills/v8-frontend-events/references/bluetooth-print.md +13 -2
  51. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +2 -2
  52. package/skills/v8-http-integration/SKILL.md +4 -4
  53. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +2 -2
  54. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +1 -1
  55. package/skills/v8-menu-buttons/SKILL.md +4 -4
  56. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +4 -4
  57. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +5 -5
  58. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +3 -3
  59. package/skills/v8-mongodb/SKILL.md +8 -1
  60. package/skills/v8-mq-mqtt/SKILL.md +2 -2
  61. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +1 -1
  62. package/skills/v8-saas-multi-tenant/SKILL.md +5 -2
  63. package/skills/v8-security/SKILL.md +2 -2
  64. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +5 -4
  65. package/skills/v8-table-event/SKILL.md +1 -1
  66. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +1 -1
  67. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +2 -2
  68. package/skills/v8-utilities/SKILL.md +6 -2
  69. package/skills/v8-workflow/SKILL.md +2 -2
  70. package/skills/vision-engine/SKILL.md +1 -1
@@ -7,7 +7,7 @@ description: Microi AI 引擎、MiniMax 图片/音乐/视频生成与预览、
7
7
 
8
8
  # Microi AI Engine
9
9
 
10
- 平台媒体生成的受控 HTTP 入口包括 `/api/Ai/GenerateMiniMaxImage`、`/api/Ai/GenerateMiniMaxMusic`、`/api/Ai/CreateMiniMaxVideo`、`/api/Ai/GetMiniMaxVideoTask`、`/api/Ai/GetMiniMaxVideoFile`、`/api/Ai/PersistMiniMaxVideoFile`;AI 工作流统一调用 Managed 接口引擎 `/apiengine/platform-ai-workflow`,通过 `Action` 选择概览、节点详情、生成、列表、读取、保存或删除。调用方只提交业务参数和模型选择,供应商密钥、租户配额、任务归属和文件读取权限由服务端判定。生成结果必须先进入当前租户 HDFS 或受控临时句柄,浏览器不接触供应商密钥、图片 Base64、音频十六进制或原始视频任务 Id。`PersistMiniMaxVideoFile` 只能转存当前登录用户所属且已完成的任务,禁止作为任意 URL 搬运器。
10
+ 平台媒体生成的受控 HTTP 入口包括 `/api/Ai/`、`/api/Ai/GenerateMiniMaxImage`、`/api/Ai/GenerateMiniMaxMusic`、`/api/Ai/CreateMiniMaxVideo`、`/api/Ai/GetMiniMaxVideoTask`、`/api/Ai/GetMiniMaxVideoFile`、`/api/Ai/PersistMiniMaxVideoFile` 和恢复原任务的 `/api/Ai/RecoverMiniMaxImageTask`;AI 工作流统一调用 Managed 接口引擎 `/apiengine/platform-ai-workflow`,通过 `Action` 选择概览、节点详情、生成、列表、读取、保存或删除。调用方只提交业务参数和模型选择,供应商密钥、租户配额、任务归属和文件读取权限由服务端判定。生成结果必须先进入当前租户 HDFS 或受控临时句柄,浏览器不接触供应商密钥、图片 Base64、音频十六进制或原始视频任务 Id。`PersistMiniMaxVideoFile` 只能转存当前登录用户所属且已完成的任务,禁止作为任意 URL 搬运器。
11
11
 
12
12
  ## 能力
13
13
 
@@ -75,7 +75,8 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
75
75
  - 模型 Provider、Endpoint、ApiKey、AuthPrefix 和上游模型 Id 只保存在服务端受保护配置。
76
76
  - 普通用户使用平台签发的受限 API Key/订阅身份,不能枚举或读取上游密钥。
77
77
  - MiniMax 对话媒体必须区分意图模型与生成工具:`MiniMax-M3` 是对话与工具编排模型;图片入口兼容名仍为 `GenerateMiniMaxImage`,实际模型由 `mic_ai.MediaProtocol / MediaModels` 与当前媒体选择决定,不能固定为 `image-01`。MiniMax Code 的 `generate_image + input_urls` 使用 `minimax-connector-image` 协议和逻辑路由 `minimax-code-image`;供应商未公开底层图像模型名,不得把界面选择的 M3 当成图片生成底模。纯音乐优先使用所配置且可用的 `music-3.0`,兼容 `music-2.6`;托管音乐只有明确返回 410 退役终态时才允许切到官方开源 `MiniMax-Music3`,不得把超时、5xx、额度不足当作回退条件。目标账号能力必须实时校准,不得用文本说明冒充生成产物。
78
- - `GenerateMiniMaxImage` 使用稳定 `RequestId` 持久入队,返回 `Code=2 + Data.TaskId` 后只通过 `GET /api/Ai/GetMiniMaxImageTask?taskId=...` 查询。只有 `Code=1 + Images` 才表示原图已写入 HDFS;浏览器超时、刷新或停止等待不能取消后台生成,也不能换请求号自动重发。图片任务复用 `mci_background_task` 的租户/用户隔离、数据库唯一键、分布式租约和 fencing,原生 Worker Key 为 `__microi_native_ai_image__`,不可由租户 V8 覆盖。请求参数只保存在服务端私有任务列,状态接口不返回提示词或参考图。
78
+ - `GenerateMiniMaxImage` 使用稳定 `RequestId` 持久入队,返回 `Code=2 + Data.TaskId` 后只通过 `GET /api/Ai/GetMiniMaxImageTask?taskId=...` 查询。只有 `Code=1 + Images` 才表示原图已写入 HDFS;浏览器超时、刷新或停止等待不能取消后台生成,也不能换请求号自动重发。图片任务复用 `mci_background_task` 的租户/用户隔离、数据库唯一键、分布式租约和 fencing,原生 Worker Key 为 `__microi_native_ai_image__`,不可由租户 V8 覆盖。请求参数只保存在服务端私有任务列,状态接口不返回提示词或参考图。
79
+ - MCP 对应工具为 `microi_generate_minimax_image`、`microi_get_minimax_image_task`、`microi_recover_minimax_image_task`。生成工具未提供 `confirmExecution=requestId` 时只返回 dry-run;确认后接受 `Code=2` 排队结果。状态工具只读同一 TaskId;恢复工具仅在 `CanRecoverResult=true` 时重新落盘既有结果,禁止重新生成。工具不接收供应商密钥、Endpoint、Authorization 或租户覆盖,宽高必须成对出现,平台发布前仍须回读当前租户 HDFS 地址和文件摘要。
79
80
  - `GenerateMiniMaxImage` 可接收最多 4 张 JPEG/PNG/WebP 参考图;先写当前租户私有 HDFS,由可信适配器上传原图或提供短时签名 URL,浏览器与响应均不得得到供应商上传票据和签名地址。`image-01` 的 `subject_reference` 是人物参考重绘,不能据此声称所有 MiniMax 工具都不支持消除。消除、换背景等操作须选择目录中声明对应编辑能力的协议:MiniMax Code 使用 `input_urls`,OpenAI Images 兼容模型使用 edits;实际效果必须逐张检查,生成式身份保持、发丝边缘与像素不变不能仅凭接口成功判为通过。黑白、纯色背景抠除、缩放、裁剪、旋转、翻转、格式转换和拼图使用 `platform-ai-runtime/ProcessImage + V8.Image` 精确处理。
80
81
  - MiniMax Code 媒体连接使用管理员独立 OAuth 授权,不读取或复用桌面客户端凭据。令牌在可信后端按租户及引擎记录绑定加密保存,刷新使用共享锁与旧值比较;明确 401 可刷新后重试一次,不确定生成请求不得重发。生成结果节点须先保存到共享存储;下载或 HDFS 失败且存在节点时,通过同一 TaskId 的 `RecoverMiniMaxImageTask` 或 `/v1/microi/image_tasks/{taskId}/recover` 恢复已有图片,不再次生成。目录只公开能力元数据。`MediaModels` 可扩展同协议模型;新的供应商协议仍需适配器、商城字段及真实中转验收,不能只填名称就宣称已接通。
81
82
  - 吾码节点之间的图片中转使用 `POST /v1/microi/image_tasks` 与 `GET /v1/microi/image_tasks/{taskId}`,服务端平台 API Key 鉴权,提交必须有稳定 `Idempotency-Key`。查询不占用生成额度;接收节点只能使用已启用且公布的供应商媒体模型,禁止自调用中转环路。MiniMax 官方适配器调用同步 `/v1/image_generation`,其它供应商由对应协议适配器处理。消费者、官方中转节点和前端必须更新到同一持久任务协议;应用包更新不能代替平台二进制与前端更新。
@@ -8,7 +8,7 @@ description: Microi吾码 AI 平台治理中心设计、调用、扩展、应用
8
8
  # Microi吾码 AI 平台治理中心
9
9
 
10
10
  <!-- microi-progressive:begin -->
11
- <!-- microi-progressive:chunk id=ai-platform-governance-000 sha256=48b82af9f11388d6872cf90aa2c74a1d35c1db948483f30615ce054989ef0d77 -->
11
+ <!-- microi-progressive:chunk id=ai-platform-governance-000 sha256=db3f5112eb1f1fbf530fc846f27b062df2a0aca481a4488b3cd31ad2562a3571 -->
12
12
  ## 何时使用
13
13
 
14
14
  以下任一需求都应使用本 Skill:
@@ -24,7 +24,7 @@ description: Microi吾码 AI 平台治理中心设计、调用、扩展、应用
24
24
  - 发布或安装官方应用 `ai-platform-studio`。
25
25
 
26
26
  <!-- /microi-progressive:chunk -->
27
- <!-- microi-progressive:chunk id=ai-platform-governance-001 sha256=47197af80919be7e08ef051884e70900714bdf53f551fad16e119a86d6efb63c -->
27
+ <!-- microi-progressive:chunk id=ai-platform-governance-001 sha256=854b349825066903060e0012a61c2e496e5241829ccb2ae743c17bc5ad716411 -->
28
28
  ## 不可破坏的边界
29
29
 
30
30
  - DiyToken 是唯一会话入口;继续复用现有用户、角色、部门、菜单、表权限和数据范围,禁止建立第二套 Token/RBAC。
@@ -36,7 +36,7 @@ description: Microi吾码 AI 平台治理中心设计、调用、扩展、应用
36
36
  - Secret 只保存引用;列表、Diff、错误、日志、截图、导出和运行台账不得出现密码、Token、私钥或连接串原文。
37
37
 
38
38
  <!-- /microi-progressive:chunk -->
39
- <!-- microi-progressive:chunk id=ai-platform-governance-002 sha256=527f1cda978f88d0d1507d90aac71089f7585699f0ad7d5266dc7e40ba026b7c -->
39
+ <!-- microi-progressive:chunk id=ai-platform-governance-002 sha256=f67f0ed08ec5b5d42a1bb2cc8b73db373c297d2ad78b646bd16a9ed08fe2d158 -->
40
40
  ## 官方应用事实
41
41
 
42
42
  应用 Key:`ai-platform-studio`,当前资源合同版本:`v2.0.9`。
@@ -63,7 +63,7 @@ mci-release-execute-extension
63
63
  Hook 首次创建后归租户维护,升级永不覆盖,也不得把同 Key 改回 `Managed`。
64
64
 
65
65
  <!-- /microi-progressive:chunk -->
66
- <!-- microi-progressive:chunk id=ai-platform-governance-003 sha256=3d43295846e19e8b5cb526442ff8aff8f0317db88f5be803b5798e63118546e2 -->
66
+ <!-- microi-progressive:chunk id=ai-platform-governance-003 sha256=620f19f67eae2f6c6b0888240423594df96c3c0fa96b9df0fe60327438b9209a -->
67
67
  ## 菜单层级与语义
68
68
 
69
69
  应用安装或升级后只保留一个可见入口,禁止把历史工作台或 40 个数据菜单继续暴露到导航:
@@ -90,7 +90,7 @@ Hook 首次创建后归租户维护,升级永不覆盖,也不得把同 Key
90
90
  向用户解释时必须区分页面类型:`配置` 是日常维护入口,`审批/处置` 在有待办或异常时使用,`运行` 用于观察和恢复任务,`台账` 主要供审计与排错。不得把台账页描述成需要人工逐项维护的业务模块。
91
91
 
92
92
  <!-- /microi-progressive:chunk -->
93
- <!-- microi-progressive:chunk id=ai-platform-governance-004 sha256=f4fbda7d2522d95e4aaa6f010637b6dfe652a7871614177ce489df7830b9c911 -->
93
+ <!-- microi-progressive:chunk id=ai-platform-governance-004 sha256=b112a5de375c999e536f5c216132db83d11d024a766b9a4deab71963a5a017f6 -->
94
94
  ## 通用调用规则
95
95
 
96
96
  1. 通过 MCP 回读当前表结构、菜单、接口、应用和微服务事实。
@@ -103,7 +103,7 @@ Hook 首次创建后归租户维护,升级永不覆盖,也不得把同 Key
103
103
  旧 Hash、旧 RowVersion、旧 fencing token、未知状态、未知步骤或未知字段一律失败关闭。
104
104
 
105
105
  <!-- /microi-progressive:chunk -->
106
- <!-- microi-progressive:chunk id=ai-platform-governance-005 sha256=6298a32cb0b0c2f226485697bba306936265dab62248bb48a1709e36f73241e9 -->
106
+ <!-- microi-progressive:chunk id=ai-platform-governance-005 sha256=0c1db1cd39cbe0878388da8871c4094d3853179815d0ede9ce99cbfa5fa849d0 -->
107
107
  ## 门户与资源版本
108
108
 
109
109
  调用顺序:
@@ -121,7 +121,7 @@ mci-portal-publish-plan
121
121
  - `mci-resource-rollback` 校验 `ExpectedCurrentHash` 并创建新回滚版本,不能删除历史。
122
122
 
123
123
  <!-- /microi-progressive:chunk -->
124
- <!-- microi-progressive:chunk id=ai-platform-governance-006 sha256=ec5c949ac0615c9917ce1910a397f5ab1e7878fb56a35cb761cd5ebbdf96c714 -->
124
+ <!-- microi-progressive:chunk id=ai-platform-governance-006 sha256=32b79f58d3ef41a3d7c550c50db8ce6bb4d00717282e9aa3fbaa35ea9ac9a33e -->
125
125
  ## 身份与访问治理
126
126
 
127
127
  ### 身份同步
@@ -148,7 +148,7 @@ mci-identity-sync-plan → 人工处置冲突 → mci-identity-sync-apply
148
148
  `mci-permission-explain` 必须调用 `V8.Method.ExplainAuthorizationDecision` 复用真实 FormEngine 授权逻辑;禁止从菜单/角色表重新拼近似结论。
149
149
 
150
150
  <!-- /microi-progressive:chunk -->
151
- <!-- microi-progressive:chunk id=ai-platform-governance-007 sha256=64f2699d58860ed29782136673b51bdb1488b87cd17b24b761e9d22479902ae5 -->
151
+ <!-- microi-progressive:chunk id=ai-platform-governance-007 sha256=ad22d6e14c7ccdc2f6de6cf9285b9c94a949425f30be39e52949fedc60fd7d6a -->
152
152
  ## 配置模板与漂移
153
153
 
154
154
  `mci-configuration-publish` 输入要点:
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=ai-platform-governance-008 sha256=e3927151358f0c9e801c1027edb877332c8e148f245d58eade2eaae53ddb7948 -->
5
+ <!-- microi-progressive:chunk id=ai-platform-governance-008 sha256=9e2dfb6ca71a12bc39c54aca498a6f0eafdb700716db2a9bd0f9dc6f14194e85 -->
6
6
  ## 功能开关
7
7
 
8
8
  发布调用 `mci-feature-flag-publish`,求值调用 `mci-feature-flag-evaluate`。
@@ -14,7 +14,7 @@
14
14
  - 功能开关不能代替任何权限、状态机、幂等或审计。
15
15
 
16
16
  <!-- /microi-progressive:chunk -->
17
- <!-- microi-progressive:chunk id=ai-platform-governance-009 sha256=ca73d439788b802c1b999c0a7973e735caf8b4149d4be116511e470ca93d728e -->
17
+ <!-- microi-progressive:chunk id=ai-platform-governance-009 sha256=0ef9057b5d6a346f09931a7aac5007f6f0760096990b142931814b16043423c4 -->
18
18
  ## 发布状态机
19
19
 
20
20
  ### 固定计划
@@ -73,7 +73,7 @@ Submit / Approve / Reject / Cancel / Reopen
73
73
  - 变更子步骤使用独立事务;成功后台账中断时用 `StepIdempotencyKey` 重试。
74
74
 
75
75
  <!-- /microi-progressive:chunk -->
76
- <!-- microi-progressive:chunk id=ai-platform-governance-010 sha256=cb8f46acd05462f4fb99d52517b34f9f9a7ae785f44d6ea0c0f1e79f050068d0 -->
76
+ <!-- microi-progressive:chunk id=ai-platform-governance-010 sha256=09cf92ff56f8dfd4bb95872741da05e462d06b8027e934a3282b265c48203a40 -->
77
77
  ## 服务治理
78
78
 
79
79
  ### 实例协议
@@ -93,7 +93,7 @@ Submit / Approve / Reject / Cancel / Reopen
93
93
  V8 业务只能使用租户隔离的 `SetIfNotExists/Expire/HashIncrement` 原子能力,不能获得原始 Redis 客户端或自定义 Key 前缀逃逸租户边界。
94
94
 
95
95
  <!-- /microi-progressive:chunk -->
96
- <!-- microi-progressive:chunk id=ai-platform-governance-011 sha256=db964d7f412ce56112c7a8173a10a6a1f33c762761747b6db780463a0e07f79d -->
96
+ <!-- microi-progressive:chunk id=ai-platform-governance-011 sha256=9f62550921dccdb4f550a093183c44b0523822a2e75e9de3bfc3255406cecfe2 -->
97
97
  ## Trace、告警与日志
98
98
 
99
99
  ### 可信原子能力
@@ -122,7 +122,7 @@ V8 业务只能使用租户隔离的 `SetIfNotExists/Expire/HashIncrement` 原
122
122
  - `Extension` 模式由 `mci-log-archive-extension` 处理;法律保留不能删除。
123
123
 
124
124
  <!-- /microi-progressive:chunk -->
125
- <!-- microi-progressive:chunk id=ai-platform-governance-012 sha256=82e059f90494a679d4073693b83904826841a7c87e0ed1e5ab0e28575eedffac -->
125
+ <!-- microi-progressive:chunk id=ai-platform-governance-012 sha256=05f16e1c9370170a8bf20152439b3ebde4e85aa1bf360a6375c7c344380d2ace -->
126
126
  ## 资产、协作和变更集
127
127
 
128
128
  - `mci-asset-publish` 使用 `microi.asset.v1`,声明 Component、Props、Setters、DataAdapters、Platforms、DependencyPackages。
@@ -133,7 +133,7 @@ V8 业务只能使用租户隔离的 `SetIfNotExists/Expire/HashIncrement` 原
133
133
  - Page JSON ↔ Vue SFC 只处理平台生成的受控标记,不执行任意 Vue/JavaScript,也不承诺任意源码无损反编译。
134
134
 
135
135
  <!-- /microi-progressive:chunk -->
136
- <!-- microi-progressive:chunk id=ai-platform-governance-013 sha256=b286f47071ac64e9e7d75929134123e8a3ef65a05ddb86007554ae05099e1445 -->
136
+ <!-- microi-progressive:chunk id=ai-platform-governance-013 sha256=17cce66f24e666271abc143a77319c9ecb43c476d4d9523f2da1dc3df2649d87 -->
137
137
  ## 可恢复导入
138
138
 
139
139
  - `mci-import-plan`:JSON/CSV/Excel 解析、字段元数据校验、文件/计划/行 Hash、公式注入与敏感字段拒绝。
@@ -145,7 +145,7 @@ V8 业务只能使用租户隔离的 `SetIfNotExists/Expire/HashIncrement` 原
145
145
  单批最多 2,000 行。更大数据应拆批或使用专用迁移作业,不提高内存上限硬顶。
146
146
 
147
147
  <!-- /microi-progressive:chunk -->
148
- <!-- microi-progressive:chunk id=ai-platform-governance-014 sha256=9c5387dccbc2ff092470edc70b9600416700ac734f15df2c2e775bae0adf00c4 -->
148
+ <!-- microi-progressive:chunk id=ai-platform-governance-014 sha256=1f931b62b510316d8e2b9e034b1348c7dc63e307166bee107e9e3430b1be5a2c -->
149
149
  ## 页面与蓝图版本
150
150
 
151
151
  页面工具:
@@ -161,7 +161,7 @@ microi_rollback_page_design
161
161
  蓝图提供对应的历史、读取、比较、导出和回滚工具。修改前读取 CurrentHash,保存传 ExpectedHash,写后回读新 Hash 与不可变历史。回滚创建新版本,不删除旧历史。
162
162
 
163
163
  <!-- /microi-progressive:chunk -->
164
- <!-- microi-progressive:chunk id=ai-platform-governance-015 sha256=6fafd84efd63a1607c4c98c4a173d755b2ba22fb7a251a21ed4d4699556656a7 -->
164
+ <!-- microi-progressive:chunk id=ai-platform-governance-015 sha256=763421b1b0bbf719255cfeee093fdd33517d4ead38ddd1c0043a5ba5ec3fe86a -->
165
165
  ## 应用商城发布
166
166
 
167
167
  - 官方发布使用绑定 `https://api.itdos.com`、`OsClient=iTdos` 的 `microi_itdos`。
@@ -175,7 +175,7 @@ microi_rollback_page_design
175
175
  - 商城发布不等于生产 API/Web 容器部署。
176
176
 
177
177
  <!-- /microi-progressive:chunk -->
178
- <!-- microi-progressive:chunk id=ai-platform-governance-016 sha256=76dab40556ce9a5a732c398d2f534c16478a1a88d4c1efdcdeaa6ba76d4339df -->
178
+ <!-- microi-progressive:chunk id=ai-platform-governance-016 sha256=195d1af8151cf8c8c846799418e822f3c9f17310fac91a0442af8944f3c39899 -->
179
179
  ## 双节点与浏览器验收
180
180
 
181
181
  至少覆盖:
@@ -245,7 +245,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
245
245
 
246
246
  - 触发场景:商城应用包把既有字段从可空升级为 `NOT NULL DEFAULT ...`,老租户的物理列已经存在,但历史记录仍为 `NULL`;导入器直接执行 `ALTER TABLE ... MODIFY COLUMN ... NOT NULL` 时,MySQL 报 `Invalid use of NULL value`,整个安装分片失败。
247
247
  - 根因:物理列同步只比较类型、可空性、默认值和注释,没有在收紧可空性前迁移存量数据。列默认值只影响后续写入,不会自动修复既有 `NULL`。
248
- - 通用规则:除主键 `Id` 外,平台普通物理列一律允许 `NULL`。导入器必须将历史 `PhysicalColumns.IS_NULLABLE=NO` 归一为允许为空,不收紧已有列,不为迁就非空约束而回填零/空串/租户值;业务必填由表单与后端事件校验。默认值独立保留。启动前必需的核心表必须在共享租约内完成可空兼容,再插入运行时接口;不能等商城运行后才修复商城自身的启动前置结构。
248
+ - 通用规则:除所有主键(不限于 `Id`,包括复合主键的每一列)及自增/identity 列外,平台普通物理列一律允许 `NULL`。导入器必须将历史 `PhysicalColumns.IS_NULLABLE=NO` 归一为允许为空,不收紧已有列,不为迁就非空约束而回填零/空串/租户值;业务必填由表单与后端事件校验。默认值独立保留。启动前必需的核心表必须在共享租约内完成可空兼容,再插入运行时接口;不能等商城运行后才修复商城自身的启动前置结构。
249
249
  - 自动化检查:构造 `V8Limit NOT NULL` 无默认值的旧表、含 `NULL` 的历史记录及带默认值/注释/排序规则/索引的列;同时覆盖普通列已允许 NULL 但被 DROP DEFAULT 的情况,使用 `SELECT DEFAULT(列) FROM 表 LIMIT 0` 识别元数据无法区分的缺失默认标志。断言 Id 仍为主键、旧数据和列属性保留,随后省略可选字段的 INSERT 成功;同版本重启和二次安装不重复 DDL 或回填业务值。
250
250
 
251
251
  - 历史数据库的可选菜单关联字段可能仍为整数类型。引用该表的应用包只能按实际物理类型把空字符串归一为 `NULL`,不能将无关联猜成 `0`,也不能越过表所有权修改既有类型;非空值及文本列保持原样。验收同时覆盖旧整数列、新文本列、重复安装和无效非空值继续报错。
@@ -351,3 +351,5 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
351
351
  - 强制规则:启动前接口闭包必须由全部内置官方平台应用包动态计算,并递归解析接口调用;当前官方基线为 9 个包、106 个接口(98 个 `Managed`、8 个 `CreateIfMissing`),数量只是发布快照,运行逻辑不得硬编码。门禁逐项校验 Key、地址、启用状态、匿名/HTTP 状态和源码策略;缺失时从受信内置包按原所有权补齐,所有项严格回读成功后才对外提供流量。`CreateIfMissing` 首次创建后永不覆盖客户代码。
352
352
  - 控制面自举:官方资源发布必须先保证 `get-microi-upgrade-resource` 自身达到当前协议,再发布其它包;若控制面旧版本不能校验新包,先只发布并回读这一项,刷新动态路由缓存后再发布剩余资源。发布响应超时或 Redis 广播失败时先按资源 SHA 回读判断提交/回滚,禁止盲目重放。
353
353
  - 兼容与验收:历史 Controller 回退不能再转调可能缺失的同一个接口引擎;保留旧路由时必须使用可信 Core 原子或明确返回可诊断兼容结果。自动化测试应扫描 PC、UniApp、内置应用包和接口源码的全部 `/apiengine/` 与 `V8.ApiEngine.Run` 引用,证明每个依赖由官方包声明;真实启动必须对每个启用租户输出开始、缺项、修复、逐项成功及最终汇总日志,并同时验证匿名、登录态、商城批量计划和重复启动幂等。
354
+
355
+ 跨租户安装验收必须检查 `sys_microiservice.MsUrl`:受托管文件运行时的入口必须使用目标租户与目标 AppKey;数据库运行时保留 `db`,显式外部运行时保留外部地址。源码摘要与编译资源摘要仍需独立回读。
@@ -11,7 +11,9 @@ description: Microi 数据源引擎设计、调用与安全规范。用于配置
11
11
 
12
12
  数据源引擎适合复用“只读或计算型数据获取”,支持 `SQL`、`V8`、`JSON`。需要跨表事务、状态推进、扣减库存或外部副作用时应创建接口引擎,不要把数据源当业务命令。
13
13
 
14
- 数据源定义保存在 `sys_datasource`,属于平台控制面:创建、修改、删除、匿名开关和角色配置只允许 `Level >= 9999` 的可信管理链路。普通角色只能调用已经授权的数据源。
14
+ 数据源定义保存在 `sys_datasource`,属于平台控制面:创建、修改、删除、匿名开关和角色配置只允许 `Level >= 9999` 的可信管理链路。普通角色只能调用已经授权的数据源。
15
+
16
+ 兼容 HTTP 入口为 `POST /api/DataSourceEngine/GetData` 与 `POST /api/DataSourceEngine/Run`;新代码优先使用前后端类型化的 `V8.DataSourceEngine.Run/RunAsync`,兼容路由仍必须执行当前租户、角色和数据源权限校验。
15
17
 
16
18
  ## 标准调用
17
19
 
@@ -18,12 +18,20 @@ description: Microi 定时任务与可靠后台任务规范。用于配置 Micro
18
18
 
19
19
  ## 平台对象
20
20
 
21
- Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任务。任务配置、接口引擎代码和执行日志属于控制面,只允许 `Level >= 9999` 维护;业务用户只能触发明确授权的后台动作。
21
+ Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任务。V8 中的 `V8.Method.ManageScheduleJob` 用于能力发现、任务查询和受控管理,必须绑定当前租户的管理员身份。任务配置、接口引擎代码和执行日志属于控制面,只允许 `Level >= 9999` 维护;业务用户只能触发明确授权的后台动作。
22
22
 
23
23
  任务通常调用稳定的 `ApiEngineKey`。接口引擎返回 `Code=1` 只表示本次执行成功,不代表调度系统可忽略重试与幂等。
24
24
 
25
25
  ## 多节点设计
26
26
 
27
+ ### 执行日志与只读诊断
28
+
29
+ - 新执行/失败/跳过记录使用 `ScheduleExecutionLog` 进入系统日志队列,落入 `sys_log_<tenant>/log_yyyyMM`;固定 `TargetType=ScheduledJob`、`TargetId=JobName`,`EventId` 幂等重放。日志队列失败不得改变业务结果,不再回写关系库日志表。
30
+ - 表单使用字段级 Tabs,分别放置“运行日志”和“历史日志”只读表格;仅显示的页签发起查询。历史 `diy_schedule_job_log` 保留,不自动删除、搬迁或清空。
31
+ - `platform-schedule-job` 的 `logs/historylogs` 要求任务名、月份,每页最多 100 条,按时间+Id 游标多取一条判断 `HasMore`,不计算多年数据总数。Mongo 索引为 `(TargetType,TargetId,CreateTime,EventId)`;历史表索引 `(JobName,CreateTime,Id)` 通过声明式应用包交付并现场回读。
32
+ - 用 `microi_query_job_runtime` 或 `microi_run_engine` 的 `Action=diagnostics` 核验启动、待机、实际执行数、领取进展、设置读取失败、触发器与心跳。一个租户的设置读取超时只能关闭该租户,不能拖住其它租户;每租户最多一个在途读,不能按轮询叠加请求。
33
+ - MongoDB 连接或协议不兼容必须显示查询失败,不能伪装为空日志;先验证目标 Mongo 与驱动兼容。镜像更新不等于 Mongo 升级,队列接受不等于日志已持久化,spool 应在持久卷并验收恢复重放。
34
+
27
35
  ### 运行时间刷新与配置版本分离
28
36
 
29
37
  - Quartz 周期同步 `LastTime/NextTime` 是运行状态投影,不能调用通用 `UptFormData` 生成配置版本或数据日志;用户保存名称、Cron、代码等配置仍走原表单事件和版本链路。
@@ -37,7 +45,7 @@ Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任
37
45
  - 开启时在 Quartz 领取触发器、处理 Misfire 之前按租户过滤;领取后、真正触发前重新读取系统设置缓存。禁止仅在 `IJob.Execute`、Listener veto 或业务 V8 入口 return:共享 Quartz 可能已经推进 NextFireTime,造成旧版漏执行。
38
46
  - 集群故障恢复也不得清理停用租户的在途记录或创建其补偿触发器。Quartz 以故障节点为单位清理记录,所以同一故障节点混有被停用租户时,新版推迟该故障节点整组恢复,交给旧节点或关闭开关后处理;其它健康节点仍正常领取。
39
47
  - 正常保存系统设置在事务提交后失效缓存,下一次调度检查生效,不用重启;不是强制中断,已经开始的任务允许完成。缓存/配置读取失败拒绝该租户的新领取,不影响其它健康租户;Redis/失效通知异常时不能承诺硬实时。
40
- - 停用期间只读观察周期计划,不推进共享触发器;每个“租户 + Job + Trigger + 计划时间”写一条 `diy_schedule_job_log`,包含 `Status=Skipped`、`Executed=false`、`Reason=SystemTaskSchedulingDisabled` 和中文说明。Redis 原子预留与数据库确定性主键共同防止多新版节点重复记录;日志说明仅代表新版未执行,旧版仍可能正常执行。不补跑业务、不补写进程停机历史;新增/修改计划的日志目录最多约 10 秒更新。
48
+ - 停用期间只读观察周期计划,不推进共享触发器;每个“租户 + Job + Trigger + 计划时间”向 Mongo 日志队列提交确定性事件,包含 `Status=Skipped`、`Executed=false`、`Reason=SystemTaskSchedulingDisabled` 和中文说明。Redis 原子预留与 Mongo 确定性主键共同防止多新版节点重复记录;日志说明仅代表新版未执行,旧版仍可能正常执行。不补跑业务、不补写进程停机历史;新增/修改计划的日志目录最多约 10 秒更新。
41
49
  - 普通接口调用、MQ 消费、升级/应用安装等持久后台任务不属于此开关的范围。手动触发 Quartz 任务仍经过门禁。
42
50
  - 交付顺序:先安装字段并打开开关,再让新版节点参与调度;确认旧版所有调度进程已停止且在途任务完成后,关闭开关交接。不同业务库分别设置,不能用一个租户的值控制全部租户。
43
51
  - 验收至少覆盖:默认兼容、开关实时读取、租户隔离、共享库旧节点继续领取、领取后开关变化不推进触发器、Misfire 不误推进、多节点日志去重;不得在真实生产任务上制造副作用做测试。
@@ -74,6 +82,8 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
74
82
 
75
83
  ## 失败、重试与停机
76
84
 
85
+ - 先证明任务真的在执行:读 `Scheduler.IsStarted`、`Scheduler.NumberOfJobsExecuted` 和 `Acquisition.LastAcquisitionError`,参考 `microi.doc/docs/doc/system-engine/job.md` 的“任务不执行”。`diy_schedule_job.Status=正常`、`diy_schedule_job.NextTime` 和“插件启动成功”都不能证明触发成功;列表/详情页的 `LastTime/NextTime` 来自运行时,直接查表看到的是库内快照。
86
+ - 领取错误含 `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。
77
87
  - 失败记录错误分类、重试次数和 `NextRetryTime`,采用有上限退避;永久错误进入人工处理。
78
88
  - 外部调用设置超时;无法确认对方是否成功时用业务幂等号查询,不盲目重发。
79
89
  - 服务停机先停止接单,再在有限宽限期排空或持久化;重启扫描未完成任务。
@@ -5,7 +5,13 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
5
5
 
6
6
  > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
7
 
8
- # Microi.Client 前台源码架构说明
8
+ # Microi.Client 前台源码架构说明
9
+
10
+ 表单设计保存请求必须使用 `DiyCommon.GetOsClient()`,不能将导入表定义残留的 `OsClient`
11
+ 作为传输租户;元数据来源与当前会话租户是不同概念。回归应覆盖从另一租户迁入的表定义,
12
+ 验证表和字段保存成功且会话保持有效,不通过放宽后端租户鉴权修复。
13
+ 右上角授权类型优先读取公开启动配置 `SysConfig.PlatformEdition`,兼容旧版会话查询;
14
+ `SysConfig.HideSystemLicenseVersion` 缺省关闭,标签可点击跳转 `/license`,不能因一次请求失败永久消失。
9
15
 
10
16
  <!-- microi-progressive:begin -->
11
17
  <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=9b949c68b0867fc1ecf2e6cb1fd1bec45d22c01ad3be63485e0376d0183d1795 -->
@@ -21,10 +27,18 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
21
27
  ---
22
28
 
23
29
  <!-- /microi-progressive:chunk -->
24
- <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=c17e7292fa264d10c6d21a2d634b60f40e12bb7168e69a46a85f351f5ed48f2f -->
25
- ## 1. 技术栈和源码入口
26
-
27
- - Vue 3 + Options API + mixins,构建工具是 Vite。
30
+ <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=e9667a3a534e09b964c4a11796c003b48edc4093c66ed0c8777aefd4188a4ba8 -->
31
+ ## 1. 技术栈和源码入口
32
+
33
+ ### 详情评论与代码版本的按需读取
34
+
35
+ - 评论用 `/api/FormEngine/AddFormComment`,只传 `ParentFormEngineKey/ParentTableRowId/_SysMenuId/Content/ParentCommentId/RequestId`。服务端固定作者、父表及回复上下文;同一提交重试必须复用 RequestId,兼容 GUID 与平台 `DiyCommon.NewGuid()` 实际生成的 ULID。
36
+ - 评论归属为 `diy_comment.ParentTableId + TableRowId`,新表字段与复合索引通过表单引擎应用交付,主库回读保证写后可见。已有 TableId 绑定兼容,空归属历史评论禁止仅按记录 Id 自动猜测或后台回填。
37
+ - `/api/FormEngine/GetFormRelatedData` 的版本列表只含元信息;`HistoryContentMode=OnDemand` 时,点击动作再传 `VersionId` 读取一条,并要求返回 `Authorized`。不要把 Data 缓存到列表,不要并发预取全部正文。
38
+ - 代码历史只向当前有效的平台管理员开放代码字段白名单;当前行可读不等于历史秘密可读。局部版本比较/加载只涉及快照中的字段,保存继续走正常表单鉴权和事件。
39
+ - 不得为了修复右栏恢复调度器通用 FormEngine 状态写回、启动历史回填或无变化版本写入。必须同时运行评论归属/去重、按需读取以及 ScheduleRuntimeTimeWriter、V8CodeVersionService 的性能回归。
40
+
41
+ - Vue 3 + Options API + mixins,构建工具是 Vite。
28
42
  - UI 主要使用 Element Plus、FontAwesome、项目内 `dynamic-icon`。
29
43
  - 状态入口:`src/pinia`,常用 `useDiyStore()` 读取 `GetCurrentUser`、`OsClient`、终端类型等。
30
44
  - 低代码主入口集中在 `src/views/form-engine/`,不要只看一个 `.vue` 文件就下结论。
@@ -13,12 +13,17 @@ description: 在 Microi Code、Codex 或 DeepSeek Harness 中完成 Microi吾码
13
13
 
14
14
  ## Microi Code 桌面宿主
15
15
 
16
- - Microi Code 是同仓独立桌面发行物,内置固定版本的 DeepSeek Harness SDK、Node.js、MCP / CLI / Skills;不是需要额外 Agent Token 的 CLI 别名。
16
+ - Microi Code 是内部仓库中的独立桌面发行物,直接基于 DataElement/dsh-desktop 与 DeepSeek Harness 二次开发,内置固定版本的 Harness SDK、Node.js、MCP / CLI / Skills;不是需要额外 Agent Token 的 CLI 别名。
17
17
  - 官方 AI 登录只走桌面账号窗口,固定 `https://api.itdos.com`、`OsClient=iTdos`,使用当前用户的中转 Key 和额度。不要让用户把密码或 AI Key 写入对话、命令行、MCP 参数或模型配置。
18
- - 业务连接在「服务器连接」中单独添加、登录;官方 AI 账号不授予业务租户权限。项目初始化和资源同步优先使用桌面「项目资源」;其余业务继续调用同源 MCP 的原工具。
18
+ - 业务连接在「服务器连接(MCP)」中单独添加、登录;官方 AI 账号不授予业务租户权限。项目初始化和资源同步优先使用桌面「项目资源」;其余业务继续调用同源 MCP 的原工具。
19
19
  - macOS 登录凭据通过桌面 Keychain/受限 IPC 管理;不要在 macOS 改跑当前只支持 Windows 凭据恢复的 `microi auth login`。不要手改 Token 文件。
20
20
  - 桌面安装包中的 Harness、Node 和同源资产随桌面版本升级;不运行 npm 自更新去改写正在使用或已签名的安装目录。外部 Codex / WorkBuddy / CLI 的后台更新规则保持不变。
21
- - 首次为浅色玻璃水纹,支持深色和自选主题色。停止或退出后的任务保留历史,当前 SDK 的跨进程历史仅供查看,需新建任务引用继续。
21
+ - 桌面 UI 沿用 dsh-desktop 的设计系统;首页不重复放置吾码 AI、服务器连接或“预览版”,相关能力集中在左侧功能区。「Microi吾码」可打开完整 `/#/mic-ai-engine` 工作台。AI 数据分析明确使用 `microi_run_engine` 调用 `mci_ai_data_assistant`,不能改成绕过 MCP 的直接数据库访问。
22
+ - Microi Code 左侧「功能区」动态读取 dsh 的 `settings.section` 注册表,并在主界面 `main` 面板中渲染原设置组件;第一项「Microi吾码」合并官方账号和吾码 AI,第二项为「服务器连接(MCP)」,之后是 dsh 原生设置。功能区与工作区可拖动调高,默认无滚动条;首页/聊天页不显示虚假选中态。底部入口显示「关于 v版本号」及 `LicenseType` 版本标签,连接手机入口保持同一行。品牌显示 `Microi Code` 与 `HARNESS` 标签,新安装默认深色,用户仍可切换浅色/深色。
23
+ - 桌面安装包版本从 `1.0.0` 开始,使用吾码三段十进制进位规则。Windows/macOS 的公开打包命令必须先执行仓库 `version:bump`,不能复用同版本覆盖已有产物;测试、类型检查和普通 Web 构建不升版。
24
+ - 官方账号页和关于标签通过 `platform-current-user` 接口引擎读取当前 `sys_user.LicenseType`。桌面相关平台业务逻辑优先通过 `microi_itdos` 接口引擎实现;只有接口引擎缺少必需底层原子能力时才能改后端源码,并说明原因。
25
+ - 正式 Windows/macOS 安装包必须内置固定版本且经过 SHA-256 校验的 cloudflared,运行时优先使用安装包 `resources/bin`,避免首次联网临时下载。检查更新从 `https://api.itdos.com/microi-code/updates/` 的匿名接口引擎读取 YAML/JSON,安装包二进制仍通过 HDFS 流式发布。
26
+ - dsh-desktop 升级必须遵循 `Microi.Code/同步dsh-desktop上游.md` 的三方同步流程和补丁意图清单;`microi/`、`packages/microi-code-*` 与桥接代码是永久保护区,普通上游文件使用三方比较,补丁必须经 `npm ci` 重放。关于页、NOTICE、MIT License、DataElement 版权与两个上游仓库链接不得删除。停止或退出后的任务保留历史,当前 SDK 的跨进程历史仅供查看,需新建任务引用继续。
22
27
 
23
28
  ## 非阻塞自动更新(强制)
24
29
 
@@ -188,6 +188,17 @@ Microi API 安装时,`AppSettings` 与同名容器环境变量只允许以下
188
188
  - 通用规则:任何在 FormEngine 可用前直接写核心物理表的可信自愈,都必须先规范化已知历史别名,再应用固定实体字段白名单,并与目标租户实时回读的物理列取交集;SQL 只使用经过双重筛选的固定标识符和参数值。官方包本身必须携带完整审计字段;无登录上下文的启动门禁还必须为历史必填审计列提供稳定的系统身份兜底,并为 `IsDeleted/IsEnable/Lock` 等开关及 `ApiRole/Files` 等集合字段补齐语义明确的插入默认值,这些默认值不得参与授权。必需业务列缺失时给出明确物理升级错误,写入后按稳定 Key 强回读,禁止把包级元数据直接转换成列名。
189
189
  - 自动化检查:使用包含旧 `Name`、未来包级字段、新版本可选列及缺失 `UserId/UserName/Lock` 的官方包样例,分别对完整结构与精简旧结构断言 `Name -> ApiName`、未知字段被丢弃、必需字段保留、审计字段和传统必填列获得稳定非空值;同时扫描全部启动闭包包,保证 `SysApiEngines` 只输出 `ApiName` 且审计字段及传统必填开关完整,并锁定新增接口生成器输出的集合字段,最后执行真实启动日志门禁回归。
190
190
 
191
+ ## 空数据库 SQL 导入回归
192
+
193
+ - PostgreSQL 导出中的 V8、默认值和注释使用显式 `E'…'` 字符串,同时转义反斜杠、引号、
194
+ 物理换行及控制字符。分别在 `standard_conforming_strings=on/off` 中完整导入,回读代码
195
+ 哈希、长度、空字符串与 NULL;不能把关闭标准字符串模式当作通用修复,也不能删改 V8 代码。
196
+ - MySQL 5.7/8 分别在隔离 Docker 数据库执行完整原始脚本。SaaS 宽表的非索引配置文本
197
+ 优先使用 `mediumtext`,保留主键、租户标识和索引列;字段元数据、物理列与应用包 DDL
198
+ 必须一致。不通过关闭严格模式掩盖行宽错误,不将字符转义问题一概归为字段长度不足。
199
+ - 通过官方 MCP 修复母版后发布归属应用,后端导出修复进入镜像后再运行既有空库制作后台任务。
200
+ 等待成功终态,完整下载各 ZIP 并校验 SHA-256,再做导入与数据完整性验收。
201
+
191
202
  ## 禁止事项
192
203
 
193
204
  - 启动字段门禁必须检查核心普通列的可空约束,不能仅以“字段存在”判定就绪。旧库非空列在程序共享租约内放宽为 `NULL`,保留 Id/数据库主键、列类型、默认值、注释和索引;同版本热修复也需回读真实结构。修复必须在插入启动接口之前执行,禁止通过逐次补默认值掩盖结构问题。
@@ -71,6 +71,9 @@ MySQL 的 `ALTER COLUMN DROP DEFAULT` 会让可空列也在省略字段时报 13
71
71
  - 每个文件的 `VisibleRoleIds` 是真实角色 Id 数组;空数组跟随表单权限。标签名称及 `_FileAccess`
72
72
  由后端投影,不能作为客户端授权事实。默认真实持有角色的 Level 严格更高即可继承,
73
73
  同级不同角色不继承;多选任一角色命中即可,仍须有菜单/表单/记录访问与编辑权限。
74
+ - `Config.FileUpload.ConfigurableRoleIds` 是“可配置角色列表”,使用真实角色 Id 数组,默认 `[]` 表示全部。
75
+ 非空时,角色目录和后端新增附件授权都只允许该范围;缩小范围保留旧附件已有角色,可移除但不可再添加。
76
+ 此范围只限制可选授权角色,不改变 Level 继承规则。先用 `microi_list_roles` 读取当前租户角色,禁止复制其它租户的 Id。
74
77
  - 无权限附件默认只显示锁定占位、不显示名称;开启隐藏只改变展示,保存时服务端保留原附件,
75
78
  篡改无权元数据、复制他人路径及删除含无权附件的整条记录均应失败。条件批量写附件/删除应改为逐条。
76
79
  - 新附件必须通过当前记录/字段的私有上传取得短期 `_UploadProof`,保存后由服务端移除。
@@ -36,7 +36,7 @@
36
36
  | `StaticText` | 静态文本 | 不承载业务状态 |
37
37
  | `Html` | 可信 HTML 展示 | 必须净化,不拼接不可信内容 |
38
38
  | `RichText` | 富文本 | `mediumtext`;输出需净化 |
39
- | `CodeEditor` | 代码/JSON/SQL 编辑 | `mediumtext`;通常 `FormWidth=24`;长配置表单使用 `Config.CodeEditor.DisplayMode=Dialog`,默认只渲染“编辑代码(N字)”按钮;代码工作台可用 `Inline` |
39
+ | `CodeEditor` | 代码/JSON/SQL 编辑 | `mediumtext`;通常 `FormWidth=24`;未配置 `DisplayMode` 默认 `Inline`,长配置表单显式用 `Dialog`。`CodeEditor.ButtonText` 默认 `编辑代码({{charCount}}字)`,支持 `{{charCount}}` 字符数、`{{lineCount}}` 行数 |
40
40
  | `JsonTable` | JSON 表格 | `mediumtext`;定义结构与大小上限 |
41
41
 
42
42
  ## 文件与高级输入
@@ -137,7 +137,7 @@ Q1: 核心可见字段数、子表和强任务域?
137
137
  V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.ClickFormTab('tabId')` 动态控制 Tab 显隐和默认选中。
138
138
 
139
139
  <!-- /microi-progressive:chunk -->
140
- <!-- microi-progressive:chunk id=microi-form-layout-003 sha256=02934831afff7bd9065406b074f5780cb5686ccdb63fcb350b8c409dad315c74 -->
140
+ <!-- microi-progressive:chunk id=microi-form-layout-003 sha256=64c443ebb86b5bdc72003016065bd02f358ab62fcd9f35b945c4ddc60ee5de56 -->
141
141
  ## 5. 必填与禁止
142
142
 
143
143
  ### 5.1 必填
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-form-layout-006 sha256=a78b000a9fee46d8394b0b6cb186702e520ab513f7eff098f2226f1158e46970 -->
5
+ <!-- microi-progressive:chunk id=microi-form-layout-006 sha256=483f58dcfce758809aed7ba010c3d3e402ae9c2701b1cadb5d49b5d1f80a3880 -->
6
6
  ## 3. 三种分组的存储与配置
7
7
 
8
8
  ### 3.1 diy_table.Tabs(表级 Tab)
@@ -114,7 +114,7 @@
114
114
  | 适合"互斥分组" | ✅ | ❌ |
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=microi-form-layout-007 sha256=5944a965b1ac9a5c87a0e066af7f6489d2b5cd09e55fff7dc4e43d8d3a029fd6 -->
117
+ <!-- microi-progressive:chunk id=microi-form-layout-007 sha256=a54b3e56d39abb37261adc1d2f0ad92ecde35b70c4594f94fd2e830b8b4fa6e1 -->
118
118
  ## 7. 反例参考(必须避免)
119
119
 
120
120
  ### 反例 1:MRP 运算 3 字段单独建 Tab
@@ -172,7 +172,7 @@ diy_table.Tabs = [
172
172
  ```
173
173
 
174
174
  <!-- /microi-progressive:chunk -->
175
- <!-- microi-progressive:chunk id=microi-form-layout-008 sha256=1d93c83d865ef941f62c4e8e0dd6238489645bf53367b61e6e397543447dcdbd -->
175
+ <!-- microi-progressive:chunk id=microi-form-layout-008 sha256=72af1ae1c77f1acef09e4741141d2aa97beaa7124b4ac824f24535c7f1ca2468 -->
176
176
  ## 8. 快速参考代码片段
177
177
 
178
178
  ### 8.1 MCP 创建表级 Tab
@@ -71,7 +71,7 @@ export function createApp() {
71
71
  `Microi.Client` 主后台运行时已内置前后端同构的 `V8.Http.Get/Post/Patch` 及对应 Response 方法;表单事件、按钮 V8 等宿主前端新代码必须优先使用 `V8.Http`,旧 `V8.Post/Get` 仅作兼容保留,其参数和兼容规则以 `v8-http-integration/SKILL.md` 为准。独立项目使用本 SDK、且不在主后台 V8 宿主中时,才使用 SDK 自身的小写 `V8.get/post`、`ApiEngine`、`FormEngine`;不要把它们与宿主旧版大写 `V8.Post/Get` 混为一谈,也不要假设浏览器可以绕过第三方接口的 CORS。
72
72
 
73
73
  <!-- /microi-progressive:chunk -->
74
- <!-- microi-progressive:chunk id=microi-frontend-sdk-002 sha256=b71205548e4701f8bf53e2bed3da914da4ca0f49e0cce952a1c938fc77218ed8 -->
74
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-002 sha256=c514dbf966c96102ea04cdf6f967814f2babe74fceaaee6c1f771d351bfdb8eb -->
75
75
  ## 登录与验证码封装
76
76
 
77
77
  SDK 或项目请求模块必须提供登录所需的系统配置和验证码薄封装,不要让页面散落手写。
@@ -132,7 +132,7 @@ SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业
132
132
  - 验收时检查真实网络请求:不得出现 `osclient: demo, demo`、`Authorization: Bearer xxx, Bearer xxx` 这类逗号合并值。
133
133
 
134
134
  <!-- /microi-progressive:chunk -->
135
- <!-- microi-progressive:chunk id=microi-frontend-sdk-004 sha256=1ecb73f5b1246c7157d782b62cba59850389858baeefdc5351a255d4d04b11b6 -->
135
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-004 sha256=bdb3bd646b06d4fb03c4fb62c8e76a22850e79b4ad230fe19b3feabc6f0578a0 -->
136
136
  ## 上传规则
137
137
 
138
138
  `V8.uploadFile` 是 Microi 前端唯一允许的上传入口。SDK 实现必须:
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-frontend-sdk-006 sha256=a834ee9855361ec5ed3f466de8d8fef53de89e40a6882b563694471d060a0dfe -->
5
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-006 sha256=85694df371b7b889b5bf4aea5bc98d604232eb5c7b88b8a0eae8a26d70877009 -->
6
6
  ## Token、当前登录用户与当前终端登录协议
7
7
 
8
8
  Microi 后端不是只保存一个全局 Token。每个租户、每个 `sys_user` 在 Redis 中维护一份 `CurrentToken`,其中 `CurrentUser` 表示平台当前登录用户,`Tokens` 表示该用户的多个当前终端登录。每个终端项至少包含 `Token`、`ClientType`、`Did`、`IP`、`CreateTime`、`UpdateTime`;退出、管理员清除登录信息、同终端重新登录或 Token 轮换都会影响该列表。
@@ -57,6 +57,7 @@ const result = await V8.refreshToken();
57
57
  - UniApp/App/小程序在 `App.onShow` 调用 `resumeAuthSession(false)`。
58
58
  - VS Code 在扩展激活后维护 Token,并在 `vscode.window.onDidChangeWindowState` 恢复焦点时立即检查。
59
59
  - 多请求、多 Tab 续签必须 single-flight。PC 后台可使用 Web Locks;收到响应时,如果本地 Token 已被其它 Tab 更新,旧请求不得把旧 Token 覆盖回来或清掉新登录态。
60
+ - 续签请求即使以 `auth:false` 调用,也必须绑定发起时的会话(SDK 内部使用 `sessionBound:true`);退出或重新登录后的旧续签响应不得恢复旧会话。UniApp 登录缓存写入后须回读确认 Token 与用户都已保存,失败时清理半登录态并留在登录页,禁止继续欢迎提示和导航。
60
61
  - 调用 `/api/SysUser/RefreshToken` 时同时传旧 `authorization`、当前 `OsClient`、原终端 `_ClientType`,请求头继续传稳定 `did`。不要频繁无条件换新。
61
62
 
62
63
  ### 失效提示与租户边界
@@ -83,13 +84,13 @@ const result = await V8.refreshToken();
83
84
  - 管理员调用 `ClearUserLoginInfo` 后,旧 Token 返回 `SessionMissing` 或等价明确原因,前端不再循环续签。
84
85
 
85
86
  <!-- /microi-progressive:chunk -->
86
- <!-- microi-progressive:chunk id=microi-frontend-sdk-007 sha256=32ff522b3d30d94eb6cc1747b1f1238e35c1c3d43091f3ce308067e320ecb2a4 -->
87
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-007 sha256=936e2f5619bb4aecfea4e42f46e297a78b816782d648b19d4b9a60ced710c974 -->
87
88
  ## 仅支持 Vue 3
88
89
 
89
90
  新的 Microi 前端工作只支持 Vue 3。不要把 Vue2、Vuex、`Vue.prototype` 或 Vue2/uni-app 条件编译加入 `microi.v8.js`。状态管理属于项目本身,通常使用 Pinia 或本地组合函数;SDK 只负责平台访问、请求、鉴权、上传、资源 URL 和小工具。
90
91
 
91
92
  <!-- /microi-progressive:chunk -->
92
- <!-- microi-progressive:chunk id=microi-frontend-sdk-008 sha256=0c59d00b2e54dd61d194d6246dd787a456ab8f12d4abe6dc330b002f41d7ee26 -->
93
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-008 sha256=70275fb9b5183647c002b5a14841a0dced68e211ccd43d95c2df53bc72938aa6 -->
93
94
  ## Key-Value 枚举的跨端约定(强制)
94
95
 
95
96
  - PC、UniApp、小程序和 Web 页面遇到简单枚举时,应从字段元数据或业务接口返回的公开 `{Key,Value}` 选项获取数据源;`Value` 只负责展示,`Key` 才能进入表单值、URL、缓存键和接口筛选参数。
@@ -98,7 +99,7 @@ const result = await V8.refreshToken();
98
99
  - 兼容历史数据时,客户端可以短期识别旧 Value,但提交和新 URL 必须立即归一为 Key;长期迁移由服务端完成并回读验证。
99
100
 
100
101
  <!-- /microi-progressive:chunk -->
101
- <!-- microi-progressive:chunk id=microi-frontend-sdk-009 sha256=2e428f404342ad21af261e5f5876e34e2b9fc9455791bf0ad73ff4ad5b3e2ed0 -->
102
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-009 sha256=c1737089a40664006a83fea85d08aca1362ab447ad614c46202df9e165fea62f -->
102
103
  ## 界面层独立
103
104
 
104
105
  SDK 不得导入 Element Plus、uni-ui、uView、TDesign、FirstUI、Pinia、Vue Router 或 axios。界面反馈通过可配置适配器提供:
@@ -111,7 +112,7 @@ SDK 不得导入 Element Plus、uni-ui、uView、TDesign、FirstUI、Pinia、Vue
111
112
  这样同一个 SDK 才能同时用于 uni-app、PC 网站、后台扩展页面和文档演示。
112
113
 
113
114
  <!-- /microi-progressive:chunk -->
114
- <!-- microi-progressive:chunk id=microi-frontend-sdk-010 sha256=ee237c45899f7204d3da1a2d589a89268c2db2a9b765f68fc7097eadf8da7104 -->
115
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-010 sha256=e70dbff2f66a986a699fc5ac778b61cc5fb0a49e1a376d955956a87bb0c4d39c -->
115
116
  ## 验证
116
117
 
117
118
  将项目改为使用 SDK 后:
@@ -130,7 +131,7 @@ SDK 不得导入 Element Plus、uni-ui、uView、TDesign、FirstUI、Pinia、Vue
130
131
  - 自动化检查:生产构建后扫描 JS 产物不得包含本地 ApiBase,并在正式域名上下文断言接口请求 origin 等于配置的生产 API;本地 `npm run dev` 仍应命中开发 API。
131
132
 
132
133
  <!-- /microi-progressive:chunk -->
133
- <!-- microi-progressive:chunk id=microi-frontend-sdk-011 sha256=81ac75e383ea5a32ae45aeff1276fc2b8f56141961e70cc3956ae818aaf2fa1d -->
134
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-011 sha256=49b3d764342f0d9c70c93b1462ce65d29f910770c0e0f10c8a8e79f0dc94453e -->
134
135
  ## 搭配 MCI-UI
135
136
 
136
137
  SDK 负责平台能力,MCI-UI 负责产品界面。新的 Microi Vue3 项目应同时使用:
@@ -143,7 +144,7 @@ SDK 负责平台能力,MCI-UI 负责产品界面。新的 Microi Vue3 项目
143
144
  不要在 SDK 内解决界面状态、骨架屏、富文本间距或安全区布局。这一层应使用 MCI-UI 组件处理。
144
145
 
145
146
  <!-- /microi-progressive:chunk -->
146
- <!-- microi-progressive:chunk id=microi-frontend-sdk-012 sha256=d869adb0abd87d9ba03b58faa84944a61895773a6c3642f5c20c8a03e315a2ce -->
147
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-012 sha256=bfbc732893154d636aeea6d9a28ade3ecb0ab5e717ca19b0dff9bbd45ccc17d9 -->
147
148
  ## MicroApp 宿主 Token 同步
148
149
 
149
150
  Vue3 前端微服务通过 `window.microApp.getData()` 接收主平台上下文时,不能只把 `token` 放进普通配置对象后假设请求会自动携带。标准 `microi.v8.js` 必须支持 `config.token`,且 `getToken()` 要优先读取运行时 token,再回退到 `storage[tokenKey]`。微服务必须复用同一个 V8 客户端实例,不能在每次按钮点击时重新 `createMicroiV8()`。
@@ -12,7 +12,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
12
12
  自动触发:只要任务涉及 Microi 移动端应用、H5、微信小程序、App 构建、uni-app 项目、登录页、tabbar、首页、我的页、工作台、报告页、视觉重设计或移动端验收,即使用户没有明确点名,也要应用本 skill。
13
13
 
14
14
  <!-- microi-progressive:begin -->
15
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=9f83607349ba6e305c3d2993de8eeceab70c344557e5dfa2a5be964492ef4685 -->
15
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=a900075c32d4cecb8ac00de762363b7eb4db5bb693795e7207cc8d133b4a962b -->
16
16
  ## 1. 导航和快捷入口必须使用真实图标
17
17
 
18
18
  底部导航、首页快捷入口、会员中心快捷项、九宫格操作和悬浮操作,必须在文字上方或旁边显示可识别的图标。
@@ -40,7 +40,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
40
40
  - UniApp H5 桌面预览可以显示手机壳;真机和浏览器移动设备仿真必须自动去壳并铺满视口。自动化测试要分别断言桌面手机壳存在、移动端手机壳标题隐藏,同时检查所有底部菜单包含真实图标节点。
41
41
 
42
42
  <!-- /microi-progressive:chunk -->
43
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=4e1b247852aa9f235a26f756d415ebb9fb922f2fea0569bda1bdc8e0b91c4d1c -->
43
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=a5e92f4e6114635b73be59d2a550294bb79dd8c60a3cc2133be16c934e05da8e -->
44
44
  ## 1.1 包体资源必须按用途分层
45
45
 
46
46
  - 构建前扫描图片、音频、视频、字体和第三方资源;公开的大资源优先上传到当前租户 HDFS 公有桶并通过 `sys_config.FileServer`/CDN 引用,敏感资源使用私有桶。
@@ -51,7 +51,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
51
51
  - 迁移到 HDFS/CDN 后必须从构建产物确认原大文件已经消失,并从业务记录/配置回读相对 `Path`;页面要先加载当前租户 `SysConfig.FileServer`,不得以源码硬编码 CDN 域名替代运行期配置。远程资源加载失败时只能回退到轻量本地占位,不得把原大图重新塞回主包。
52
52
 
53
53
  <!-- /microi-progressive:chunk -->
54
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=99bbb22068bb61d61a3fd20b1a21f421804857ce8da85a92390f64641e3f43fc -->
54
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=24c611992557e53b7bce165d5c555486c8b171c71e130359b2d9bc9228728791 -->
55
55
  ## 2. 不要猜测 Microi 前端 SDK 登录接口
56
56
 
57
57
  编写登录代码前,先检查本地项目 SDK 封装,例如 `src/utils/microi.v8.js`、`src/utils/api.js`,或标准 `microi.uniapp` 登录实现。
@@ -78,7 +78,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
78
78
  - 使用真实系统账号登录后,必须验证“我的”页显示已登录角色,首页/工单/报告不再出现未登录提示,刷新页面或切换底部导航后仍保持一致。
79
79
 
80
80
  <!-- /microi-progressive:chunk -->
81
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=a35f20404acbf61814f9475610f881f7c60effc0ce3bb8797cee300cd3349ba7 -->
81
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=fec4c841ed7a897643a4c16337dce79a9be22931866af8aa7f888cbae5e72a20 -->
82
82
  ## 2.1 登录验证码必须跟随 Sys_Config.EnableCaptcha
83
83
 
84
84
  PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)`,都必须先读取 `Sys_Config` 的 `EnableCaptcha` 配置,并按配置决定是否展示和提交图形验证码。
@@ -104,7 +104,7 @@ PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/Sy
104
104
  - 参考标准实现:`microi.uniapp/src/pages/login/index.vue`。
105
105
 
106
106
  <!-- /microi-progressive:chunk -->
107
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=22bdaf38588f251016e115f1ad15a433e827fb2191041d55ecad42cda94253d1 -->
107
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=84a0f768af152f584f87643e1037a0ae57261df8947cc59710e1f021b99c287f -->
108
108
  ## 3. OsClient 请求头不得重复
109
109
 
110
110
  Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览器、代理或服务端运行时可能把 `OsClient` 和 `osclient` 这类大小写重复键合并成 `demo, demo`,导致租户识别失败。
@@ -126,7 +126,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
126
126
  - 微信/支付宝/飞书/抖音等小程序授权登录接口也必须检查,例如 `/apiengine/miniprogram-login`,不得出现 `osclient: demo, demo` 这类合并值。
127
127
 
128
128
  <!-- /microi-progressive:chunk -->
129
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=1394c7fb8e59b25553e2f9b71ab7f8cf03290b6930c8d8436123bc6048ad2435 -->
129
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=aefc3f7242a62ac411fa234fe322dd7726a8ed7db4f0d35e01cc364a36e8a335 -->
130
130
  ## 3.1 小程序授权登录必须可追踪、可读错误
131
131
 
132
132
  微信开发者工具的模拟授权与体验版真机调用不是同一条真实链路。手机号授权登录接口必须按阶段诊断,不能只返回“手机号登录失败”。
@@ -145,7 +145,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
145
145
  - 体验版真机复测授权登录;不能只以开发者工具模拟成功作为上线依据。
146
146
 
147
147
  <!-- /microi-progressive:chunk -->
148
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=feb9ba3267bdf1f6394c425b45dd71e19ac4382ae05549d6e1b6b664c6517a19 -->
148
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=e2446ca4c0fca61d3c748c2f91c585d9da0df9ee9a0170f70d823b0c0745a88e -->
149
149
  ## 3.1.1 手机号快速验证前置页不得混淆腾讯官方
150
150
 
151
151
  - 调用手机号快速验证组件前展示的登录页、弹窗、按钮、说明、分享标题和失败提示中,禁止出现“微信”“微信官方”“微信登录”“一键登录”等可能让用户误认为腾讯官方功能或官方产品的文案。
@@ -154,7 +154,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
154
154
  - `build:mp-weixin` 后必须扫描登录页源码和 `dist/build/mp-weixin/pages/login/` 产物中的可见文案,并对手机号快速验证前置页截图;发现混淆词、官方 Logo 或近似元素时阻止上传和提审。
155
155
 
156
156
  <!-- /microi-progressive:chunk -->
157
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=7598db1fdabfe127c2be7593b83dc3a246b1db852d9c0d4001f849d3e97aa273 -->
157
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=15dc4a001ce3bf6f3620b741cf1bf7dd92e4ff8372eeb256f01c5e2aabba8398 -->
158
158
  ## 3.2 微信小程序每个页面默认支持分享
159
159
 
160
160
  小程序项目必须默认支持转发给朋友和分享到朋友圈,不能只给首页或公开页添加分享。登录和权限控制属于访问阶段,不得用来隐藏分享能力。