@microi.net/cli 6.1.0 → 6.1.1
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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +78 -78
- package/scripts/microi-skills.meta.json +230 -230
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +39 -39
- package/skills/README.md +287 -287
- package/skills/ai-engine/SKILL.md +273 -273
- package/skills/app-store/SKILL.md +531 -531
- package/skills/message-notification/SKILL.md +1 -1
- package/skills/microi-client-frontend/SKILL.md +19 -19
- package/skills/microi-codex-installer/SKILL.md +233 -233
- package/skills/microi-datasource-mapping/SKILL.md +9 -0
- package/skills/microi-deployment/SKILL.md +1 -1
- package/skills/microi-microservice/SKILL.md +353 -353
- package/skills/microi-sso/references/acceptance.md +51 -51
- package/skills/microi-system-delivery/SKILL.md +115 -115
- package/skills/microi-system-delivery/references/context-quality.md +54 -54
- package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +65 -65
- package/skills/page-engine/SKILL.md +24 -24
- package/skills/playwright-e2e/SKILL.md +2 -0
- package/skills/unity-integration/references/ai-app-delivery.md +119 -119
- package/skills/v8-api-config/SKILL.md +400 -400
- package/skills/v8-formengine-http/SKILL.md +238 -238
- package/skills/v8-saas-multi-tenant/SKILL.md +309 -305
- package/skills/v8-security/SKILL.md +2 -0
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +9 -3
- package/skills/v8-tcp-integration/SKILL.md +225 -158
- package/skills/v8-utilities/SKILL.md +105 -104
- package/skills/v8-utilities/references/server-api-index.md +189 -188
- package/skills/workspace-conventions/SKILL.md +168 -168
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +32 -32
- package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +188 -188
|
@@ -2,70 +2,70 @@
|
|
|
2
2
|
|
|
3
3
|
> 原规则按适用范围无损迁移;触发对应工作时必须完整读取相关章节。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=
|
|
6
|
-
## 平台安全与存量兼容验收(强制)
|
|
7
|
-
|
|
8
|
-
AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
|
|
9
|
-
|
|
10
|
-
### FormEngine 混合授权
|
|
11
|
-
|
|
12
|
-
- Token 只完成身份认证,不是任意表的访问凭证。浏览器、UniApp、SDK 等外部请求必须继续校验表、菜单、角色、操作权限和数据范围。
|
|
13
|
-
- 显式 `_SysMenuId` / `ModuleEngineKey` 进入精确菜单校验;伪造、传错或借用其它表菜单时失败关闭,不能退回兼容推断。
|
|
14
|
-
- 为兼容存量前端 V8,无菜单请求由后端从当前用户真正拥有的菜单授权快照中推断目标表权限。没有候选菜单、范围无法安全合并或解析失败时失败关闭;不要要求所有历史项目一次性补 `_SysMenuId`。
|
|
15
|
-
- 标准 PC facade 只给当前菜单绑定的当前表注入菜单 Id,跨表调用不借用主表菜单。没有菜单入口的 SDK/定制页才使用最小【高级表权限】。
|
|
16
|
-
- 后端接口引擎、后端表单 V8 和平台内部调用由服务端建立可信上下文,不要求 `_SysMenuId`;客户端伪造 `_TrustedServerInvocation` 或 `_InvokeType:'Server'` 不能获得信任。
|
|
17
|
-
- `TableChild` 使用父记录范围内委托:验证父菜单、父表字段配置、子菜单、父记录数据范围和外键,并由服务端强制注入外键。隐藏子菜单不要求存量角色逐个补权限。
|
|
18
|
-
- 菜单 `SqlWhere` / `SqlJoin` 只约束列表、计数、导出等集合查询;单行详情只校验同表菜单访问权。主表写入由 `Add` / `Edit` / `Del` / `Import` 专项权限控制,不把查询范围追加到写入 SQL,也不因查询 Join 拒绝。行级写业务限制放在后端表单 V8 或专用接口引擎。
|
|
19
|
-
|
|
20
|
-
### 保护表、控制面与缓存
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
- 权限缓存使用按 `OsClient` 隔离的共享 Redis `epoch`、用户快照、短 TTL L1/L2。用户/角色/菜单/权限变化后提升 `epoch`;验收至少使用两个节点确认无需清 Redis或重启即可生效。
|
|
25
|
-
- Upgrade15 只清理普通角色的保护表直接授权,不能删除正常业务菜单权限。
|
|
26
|
-
|
|
27
|
-
### 上传、私有文件与 SaaS
|
|
28
|
-
|
|
29
|
-
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
30
|
-
- 无字段上下文的普通交互式上传默认私有桶,一级安全目录为 `file`、`img`、`avatar`、`editor`;可由管理员在普通 `sys_config.HdfsUploadRules` 按真实角色授权业务目录与公有权限。通配符必须有界并先校验实际路径,保留目录与跨租户不能放行。标准表单仍按权威字段配置执行。可信后端 V8 仍受全局文件大小硬上限。
|
|
31
|
-
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
32
|
-
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
33
|
-
- `V8.OsClientModel` / `V8.SysConfig` 只使用脱敏副本,不返回整个对象。新租户不能复制主租户整条 `sys_osclients`;数据库、认证、Redis、存储、MQ/MQTT、搜索凭据必须独立创建或由服务端托管。
|
|
34
|
-
- Redis 管理器只允许超级管理员使用当前租户或已保存连接;匿名/temporary 任意 Host 连接必须拒绝,MCP 写操作必须 `confirmExecution`,禁止传递 Redis 密码。
|
|
35
|
-
|
|
36
|
-
### 网络、登录和发布兼容
|
|
37
|
-
|
|
38
|
-
- `CorsAllowOrigins` 和全局 CORS 来源都为空时默认允许任意来源;配置后才按精确来源/通配符收紧。CORS 不是鉴权边界。
|
|
39
|
-
- 严格 SSRF 默认关闭,未配置时不得拒绝存量非 HTTP(S)、URL 凭据、私网、云元数据和重定向调用;显式启用后才执行严格拦截与精确主机白名单。
|
|
40
|
-
- 登录 RSA 仅避免密码在请求体直接显示,HTTPS 才是安全边界。必须保留历史 RSA fallback,专属公私钥成对切换,不能因删除旧常量造成所有客户无法登录。
|
|
41
|
-
- 登录传 `_ClientType`,请求携带稳定 `did`,每次响应接收 `authorization`。多标签续签 single-flight;`TokenReplaced` 先检查新 Token,旧响应不能清掉新登录态。
|
|
42
|
-
- 安全升级不得删除私有子 Git 的 `Microi.Server/Microi.net/License/keys/`。授权签名资产与登录 RSA 用途不同,禁止以安全清理为由混删。
|
|
43
|
-
- 不得修改默认 CORS/SSRF/RSA 行为后只用新装环境验收;必须覆盖旧前端、历史 V8、滚动升级和至少两个节点。
|
|
44
|
-
|
|
45
|
-
### 安全自动化最低断言
|
|
46
|
-
|
|
47
|
-
1. 普通角色保护表读写、伪造菜单、伪造可信标记均失败。
|
|
48
|
-
2. 真实菜单、历史无菜单推断和父记录范围内 TableChild 均成功,跨父记录失败。
|
|
49
|
-
3. 查询范围在列表、计数、导出中生效;详情按同表菜单访问权成功;有写权限的单表/Join 模块写入成功,无写权限失败,后端 V8 行级业务校验可回滚。
|
|
50
|
-
4. 节点 A 改权限后节点 B 无需重启生效。
|
|
51
|
-
5. 上传大小/数量/双日额度、多节点并发和 Redis 故障行为正确。
|
|
52
|
-
6. 私有文件跨菜单/记录/字段失败,授权访问成功,匿名失败。
|
|
53
|
-
7. CORS 空配置兼容、配置后收紧;SSRF 默认兼容、严格模式拦截。
|
|
54
|
-
8. 历史 RSA fallback 和专属匹配密钥均可登录;并发续签不反复退出。
|
|
55
|
-
9. SaaS 脱敏投影不包含基础设施密钥,Redis anonymous/temporary/非管理员管理失败。
|
|
56
|
-
|
|
5
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=b4cd10b169b54235314d170c8e74f17bf6bcb5f658d0d4d2e10c73dc8aa37ef7 -->
|
|
6
|
+
## 平台安全与存量兼容验收(强制)
|
|
7
|
+
|
|
8
|
+
AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
|
|
9
|
+
|
|
10
|
+
### FormEngine 混合授权
|
|
11
|
+
|
|
12
|
+
- Token 只完成身份认证,不是任意表的访问凭证。浏览器、UniApp、SDK 等外部请求必须继续校验表、菜单、角色、操作权限和数据范围。
|
|
13
|
+
- 显式 `_SysMenuId` / `ModuleEngineKey` 进入精确菜单校验;伪造、传错或借用其它表菜单时失败关闭,不能退回兼容推断。
|
|
14
|
+
- 为兼容存量前端 V8,无菜单请求由后端从当前用户真正拥有的菜单授权快照中推断目标表权限。没有候选菜单、范围无法安全合并或解析失败时失败关闭;不要要求所有历史项目一次性补 `_SysMenuId`。
|
|
15
|
+
- 标准 PC facade 只给当前菜单绑定的当前表注入菜单 Id,跨表调用不借用主表菜单。没有菜单入口的 SDK/定制页才使用最小【高级表权限】。
|
|
16
|
+
- 后端接口引擎、后端表单 V8 和平台内部调用由服务端建立可信上下文,不要求 `_SysMenuId`;客户端伪造 `_TrustedServerInvocation` 或 `_InvokeType:'Server'` 不能获得信任。
|
|
17
|
+
- `TableChild` 使用父记录范围内委托:验证父菜单、父表字段配置、子菜单、父记录数据范围和外键,并由服务端强制注入外键。隐藏子菜单不要求存量角色逐个补权限。
|
|
18
|
+
- 菜单 `SqlWhere` / `SqlJoin` 只约束列表、计数、导出等集合查询;单行详情只校验同表菜单访问权。主表写入由 `Add` / `Edit` / `Del` / `Import` 专项权限控制,不把查询范围追加到写入 SQL,也不因查询 Join 拒绝。行级写业务限制放在后端表单 V8 或专用接口引擎。
|
|
19
|
+
|
|
20
|
+
### 保护表、控制面与缓存
|
|
21
|
+
|
|
22
|
+
- 平台表按 `PlatformResourceSecurity` 的管理员专用、只读委托、按角色管理三类校验,不使用过时的统一硬拒绝清单。`sys_apiengine` 的标准 FormEngine 管理按真实菜单/表操作授权,不能因 `Level < 9999` 拒绝已获授权的开发角色;无授权、伪造菜单、匿名和撤权必须拒绝。
|
|
23
|
+
- 接口代码写权限只授予可信开发角色;任务、Redis 等其它控制面门禁、接口运行权限和 MCP 专用开发权限仍独立执行,不能只靠前端隐藏菜单,也不能从接口管理菜单权限推导其它控制面权限。
|
|
24
|
+
- 权限缓存使用按 `OsClient` 隔离的共享 Redis `epoch`、用户快照、短 TTL L1/L2。用户/角色/菜单/权限变化后提升 `epoch`;验收至少使用两个节点确认无需清 Redis或重启即可生效。
|
|
25
|
+
- Upgrade15 只清理普通角色的保护表直接授权,不能删除正常业务菜单权限。
|
|
26
|
+
|
|
27
|
+
### 上传、私有文件与 SaaS
|
|
28
|
+
|
|
29
|
+
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
30
|
+
- 无字段上下文的普通交互式上传默认私有桶,一级安全目录为 `file`、`img`、`avatar`、`editor`;可由管理员在普通 `sys_config.HdfsUploadRules` 按真实角色授权业务目录与公有权限。通配符必须有界并先校验实际路径,保留目录与跨租户不能放行。标准表单仍按权威字段配置执行。可信后端 V8 仍受全局文件大小硬上限。
|
|
31
|
+
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
32
|
+
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
33
|
+
- `V8.OsClientModel` / `V8.SysConfig` 只使用脱敏副本,不返回整个对象。新租户不能复制主租户整条 `sys_osclients`;数据库、认证、Redis、存储、MQ/MQTT、搜索凭据必须独立创建或由服务端托管。
|
|
34
|
+
- Redis 管理器只允许超级管理员使用当前租户或已保存连接;匿名/temporary 任意 Host 连接必须拒绝,MCP 写操作必须 `confirmExecution`,禁止传递 Redis 密码。
|
|
35
|
+
|
|
36
|
+
### 网络、登录和发布兼容
|
|
37
|
+
|
|
38
|
+
- `CorsAllowOrigins` 和全局 CORS 来源都为空时默认允许任意来源;配置后才按精确来源/通配符收紧。CORS 不是鉴权边界。
|
|
39
|
+
- 严格 SSRF 默认关闭,未配置时不得拒绝存量非 HTTP(S)、URL 凭据、私网、云元数据和重定向调用;显式启用后才执行严格拦截与精确主机白名单。
|
|
40
|
+
- 登录 RSA 仅避免密码在请求体直接显示,HTTPS 才是安全边界。必须保留历史 RSA fallback,专属公私钥成对切换,不能因删除旧常量造成所有客户无法登录。
|
|
41
|
+
- 登录传 `_ClientType`,请求携带稳定 `did`,每次响应接收 `authorization`。多标签续签 single-flight;`TokenReplaced` 先检查新 Token,旧响应不能清掉新登录态。
|
|
42
|
+
- 安全升级不得删除私有子 Git 的 `Microi.Server/Microi.net/License/keys/`。授权签名资产与登录 RSA 用途不同,禁止以安全清理为由混删。
|
|
43
|
+
- 不得修改默认 CORS/SSRF/RSA 行为后只用新装环境验收;必须覆盖旧前端、历史 V8、滚动升级和至少两个节点。
|
|
44
|
+
|
|
45
|
+
### 安全自动化最低断言
|
|
46
|
+
|
|
47
|
+
1. 普通角色保护表读写、伪造菜单、伪造可信标记均失败。
|
|
48
|
+
2. 真实菜单、历史无菜单推断和父记录范围内 TableChild 均成功,跨父记录失败。
|
|
49
|
+
3. 查询范围在列表、计数、导出中生效;详情按同表菜单访问权成功;有写权限的单表/Join 模块写入成功,无写权限失败,后端 V8 行级业务校验可回滚。
|
|
50
|
+
4. 节点 A 改权限后节点 B 无需重启生效。
|
|
51
|
+
5. 上传大小/数量/双日额度、多节点并发和 Redis 故障行为正确。
|
|
52
|
+
6. 私有文件跨菜单/记录/字段失败,授权访问成功,匿名失败。
|
|
53
|
+
7. CORS 空配置兼容、配置后收紧;SSRF 默认兼容、严格模式拦截。
|
|
54
|
+
8. 历史 RSA fallback 和专属匹配密钥均可登录;并发续签不反复退出。
|
|
55
|
+
9. SaaS 脱敏投影不包含基础设施密钥,Redis anonymous/temporary/非管理员管理失败。
|
|
56
|
+
|
|
57
57
|
<!-- /microi-progressive:chunk -->
|
|
58
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-003 sha256=
|
|
59
|
-
## 前端交付检查清单
|
|
60
|
-
|
|
61
|
-
- 底部 tabBar 图标不 404。
|
|
62
|
-
- 首页、分类、详情、Banner、头像、订单凭证图全部真实加载。
|
|
63
|
-
- 主题切换是全局生效,不是只对一个页面生效。
|
|
64
|
-
- 列表页和详情页显示同一主体名称、头像、状态,不能列表对、详情错。
|
|
65
|
-
- 关联人名不得退化成“卖家BMB9”“匿名卖家”等可推断 Id 的兜底,除非确实无数据。
|
|
66
|
-
- 关键业务资产不得默认选中第一条,必须用户手动选择。
|
|
67
|
-
- 自己不能抢自己的单,不能约自己的单,必须给明确提示。
|
|
68
|
-
- 消息/待办/约单/审核类提醒必须有未读角标,已读后消失。
|
|
69
|
-
- 订单状态角标只给需要处理的状态,不给“全部/已完成/已取消”等静态分类堆数字。
|
|
70
|
-
|
|
58
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-003 sha256=479ccdb65450c7741b052a30d8e4a11917bc19d80bf9b4ac89ea00092b4aaa73 -->
|
|
59
|
+
## 前端交付检查清单
|
|
60
|
+
|
|
61
|
+
- 底部 tabBar 图标不 404。
|
|
62
|
+
- 首页、分类、详情、Banner、头像、订单凭证图全部真实加载。
|
|
63
|
+
- 主题切换是全局生效,不是只对一个页面生效。
|
|
64
|
+
- 列表页和详情页显示同一主体名称、头像、状态,不能列表对、详情错。
|
|
65
|
+
- 关联人名不得退化成“卖家BMB9”“匿名卖家”等可推断 Id 的兜底,除非确实无数据。
|
|
66
|
+
- 关键业务资产不得默认选中第一条,必须用户手动选择。
|
|
67
|
+
- 自己不能抢自己的单,不能约自己的单,必须给明确提示。
|
|
68
|
+
- 消息/待办/约单/审核类提醒必须有未读角标,已读后消失。
|
|
69
|
+
- 订单状态角标只给需要处理的状态,不给“全部/已完成/已取消”等静态分类堆数字。
|
|
70
|
+
|
|
71
71
|
<!-- /microi-progressive:chunk -->
|
|
@@ -52,8 +52,8 @@ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_pag
|
|
|
52
52
|
|
|
53
53
|
你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
|
|
54
54
|
|
|
55
|
-
<!-- microi-progressive:begin -->
|
|
56
|
-
<!-- microi-progressive:chunk id=page-engine-000 sha256=44233416e71cc6ff3712347308dadd26e55b14938b81b8a2401478c6bc14921b -->
|
|
55
|
+
<!-- microi-progressive:begin -->
|
|
56
|
+
<!-- microi-progressive:chunk id=page-engine-000 sha256=44233416e71cc6ff3712347308dadd26e55b14938b81b8a2401478c6bc14921b -->
|
|
57
57
|
## 设计器源码事件
|
|
58
58
|
|
|
59
59
|
设计器选中事件只能在 `isDesignMode` 为真时执行 `preventDefault/stopPropagation` 和选中状态写入。运行和预览页面必须保留 HTML 链接、按钮与键盘激活的浏览器默认行为。链接使用实际授权菜单路由,保存后逐一点击验证,不以 JSON 中存在 href 代替跳转验收;回归入口为 `Microi.Client/tests/page-engine-runtime-click.spec.mjs`。
|
|
@@ -65,8 +65,8 @@ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_pag
|
|
|
65
65
|
组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
|
|
66
66
|
触发多次;普通页面 JSON 生成不需要注册事件总线。
|
|
67
67
|
|
|
68
|
-
<!-- /microi-progressive:chunk -->
|
|
69
|
-
<!-- microi-progressive:chunk id=page-engine-001 sha256=57717991f9c7de557b524ec36fc9bdd716080b71b682439f1b6662b0b9b2f45c -->
|
|
68
|
+
<!-- /microi-progressive:chunk -->
|
|
69
|
+
<!-- microi-progressive:chunk id=page-engine-001 sha256=57717991f9c7de557b524ec36fc9bdd716080b71b682439f1b6662b0b9b2f45c -->
|
|
70
70
|
## 核心数据结构
|
|
71
71
|
|
|
72
72
|
```
|
|
@@ -84,8 +84,8 @@ formData(页面)
|
|
|
84
84
|
└── widgetParams[] // 组件私有参数
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
<!-- /microi-progressive:chunk -->
|
|
88
|
-
<!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
|
|
87
|
+
<!-- /microi-progressive:chunk -->
|
|
88
|
+
<!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
|
|
89
89
|
## formConfig 页面全局配置
|
|
90
90
|
|
|
91
91
|
```json
|
|
@@ -102,8 +102,8 @@ formData(页面)
|
|
|
102
102
|
}
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
<!-- /microi-progressive:chunk -->
|
|
106
|
-
<!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
|
|
105
|
+
<!-- /microi-progressive:chunk -->
|
|
106
|
+
<!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
|
|
107
107
|
## 容器类型
|
|
108
108
|
|
|
109
109
|
| type | label | 说明 |
|
|
@@ -157,8 +157,8 @@ formData(页面)
|
|
|
157
157
|
}
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
<!-- /microi-progressive:chunk -->
|
|
161
|
-
<!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
|
|
160
|
+
<!-- /microi-progressive:chunk -->
|
|
161
|
+
<!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
|
|
162
162
|
## 组件通用结构
|
|
163
163
|
|
|
164
164
|
```json
|
|
@@ -178,8 +178,8 @@ formData(页面)
|
|
|
178
178
|
}
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
<!-- /microi-progressive:chunk -->
|
|
182
|
-
<!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
|
|
181
|
+
<!-- /microi-progressive:chunk -->
|
|
182
|
+
<!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
|
|
183
183
|
## widgetParams 参数类型
|
|
184
184
|
|
|
185
185
|
| type | 说明 | value 类型 |
|
|
@@ -193,8 +193,8 @@ formData(页面)
|
|
|
193
193
|
| `select` | 下拉选择 | `string` |
|
|
194
194
|
| `radio` | 单选组 | `string` |
|
|
195
195
|
|
|
196
|
-
<!-- /microi-progressive:chunk -->
|
|
197
|
-
<!-- microi-progressive:chunk id=page-engine-006 sha256=2c021e43f4f0d730da1f5a5cf6a2d314589435e2bb9ff573148c787538a8cc86 -->
|
|
196
|
+
<!-- /microi-progressive:chunk -->
|
|
197
|
+
<!-- microi-progressive:chunk id=page-engine-006 sha256=2c021e43f4f0d730da1f5a5cf6a2d314589435e2bb9ff573148c787538a8cc86 -->
|
|
198
198
|
## 数据来源(widgetParams[0])
|
|
199
199
|
|
|
200
200
|
大多数组件的第一个参数(sort=0)是"数据来源":
|
|
@@ -206,8 +206,8 @@ formData(页面)
|
|
|
206
206
|
$ApiBase$/apiengine/{ApiEngineKey}
|
|
207
207
|
```
|
|
208
208
|
|
|
209
|
-
<!-- /microi-progressive:chunk -->
|
|
210
|
-
<!-- microi-progressive:chunk id=page-engine-007 sha256=4170c6e274fc773427057d8606c4800a5bbd5fabd62d63e931aaa388262a51e9 -->
|
|
209
|
+
<!-- /microi-progressive:chunk -->
|
|
210
|
+
<!-- microi-progressive:chunk id=page-engine-007 sha256=4170c6e274fc773427057d8606c4800a5bbd5fabd62d63e931aaa388262a51e9 -->
|
|
211
211
|
## 运行态布局与滚动规范
|
|
212
212
|
|
|
213
213
|
- 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
|
|
@@ -221,11 +221,11 @@ $ApiBase$/apiengine/{ApiEngineKey}
|
|
|
221
221
|
- `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
|
|
222
222
|
- 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
|
|
223
223
|
|
|
224
|
-
<!-- /microi-progressive:chunk -->
|
|
225
|
-
## 详细参考路由(渐进披露)
|
|
226
|
-
|
|
227
|
-
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
228
|
-
|
|
229
|
-
- [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
|
|
230
|
-
- [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
|
|
231
|
-
<!-- microi-progressive:end -->
|
|
224
|
+
<!-- /microi-progressive:chunk -->
|
|
225
|
+
## 详细参考路由(渐进披露)
|
|
226
|
+
|
|
227
|
+
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
228
|
+
|
|
229
|
+
- [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
|
|
230
|
+
- [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
|
|
231
|
+
<!-- microi-progressive:end -->
|
|
@@ -21,6 +21,8 @@ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化
|
|
|
21
21
|
|
|
22
22
|
真实依赖与发布范围沿用 `../workspace-conventions/SKILL.md` 的“平台回归与独立应用测试归属”:常规验证指定 MCP 实际使用的 MySQL、MongoDB、Redis 和 MinIO 或 OSS/HDFS,不要求额外 SQL Server 环境;仅用户明确指定 SQL Server 问题时才做其专项。按 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 记录实际覆盖,保留正常登录、业务闭环与资源收尾,不以连接成功代替真实读写验收。
|
|
23
23
|
|
|
24
|
+
桌面人工补充或新建浏览器验收默认只选一个常规 CSS 视口:优先复现用户实际浏览器尺寸,未知时用 1920×1080。截图文件像素还受设备缩放影响,不能据此强制 4K;仅用户明确要求或问题涉及超宽屏时追加 4K,移动端或响应式改动按需补充相关窄屏。沿用已有有效验收,不为截图分辨率重复整套用例;正式脚本既有 Full 不在运行中删减。核心发布已冻结后,新增规范文案独立交付,不因此重启合格候选的构建、测试或上传。
|
|
25
|
+
|
|
24
26
|
<!-- microi-progressive:begin -->
|
|
25
27
|
<!-- microi-progressive:chunk id=playwright-e2e-000 sha256=a6ef528a2a940fd0f58efaee6b73eb5dbc159db93d95afedf41c7b8642536d18 -->
|
|
26
28
|
## 是否需要 `-e2e` 后缀
|
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
# Unity AI 应用与商城交付
|
|
2
|
-
|
|
3
|
-
## 唯一源码
|
|
4
|
-
|
|
5
|
-
官方 AI 应用源码放在当前官方连接对应的:
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
Microi-V8-Engine/<connection>/<product>/AI应用/<appKey>/
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
同一应用的 Vue 外壳、Unity 构建接入、V8 源码、Manifest、资源策略、测试和发布合约都从这里生成。Unity 工程可以保留服务端镜像,但必须由唯一源码生成并做一致性检查。
|
|
12
|
-
|
|
13
|
-
最小文件:
|
|
14
|
-
|
|
15
|
-
```text
|
|
16
|
-
.microi-micro-app.json
|
|
17
|
-
app.json
|
|
18
|
-
package.json
|
|
19
|
-
microi.routes.json
|
|
20
|
-
package-contract.json
|
|
21
|
-
resource-policies.json
|
|
22
|
-
system.manifest.json
|
|
23
|
-
src/
|
|
24
|
-
public/
|
|
25
|
-
server/engines/
|
|
26
|
-
scripts/
|
|
27
|
-
tests/
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Web 外壳
|
|
31
|
-
|
|
32
|
-
- Vue 3 + Vite + TypeScript。
|
|
33
|
-
- 复用工作区标准 `microi.v8.js` 与 `microi-ai-app-auth.js`,不要复制改造出第二套认证协议。
|
|
34
|
-
- 匿名模式可以承载公开多人玩法,但必须使用服务端签发、只存哈希、可过期的会话秘密;个人持久化接口仍要求 DiyToken。
|
|
35
|
-
- `ApplicationType=Web`,独立入口为 `index.html`。
|
|
36
|
-
- 构建状态明确区分 `available` 与 `publishable`;无真实 Unity WASM/Data 时禁止正式发布。
|
|
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` 只能做无音轨占位,不算同步验收。
|
|
39
|
-
|
|
40
|
-
## 多人租约与公屏交付
|
|
41
|
-
|
|
42
|
-
- 在线角色的事实源使用按 `OsClient` 隔离的共享数据库/Redis,不能使用 API 节点静态字典;客户端心跳周期必须短于租约超时。
|
|
43
|
-
- 加入响应只向本人返回会话秘密;数据库保存 SHA-256,位置快照只公开昵称、受限坐标、朝向、动作与房间版本。
|
|
44
|
-
- 正常卸载/离开主动调用 leave;浏览器崩溃、断网或 `kill -9` 依靠服务端租约自然失效,并通过两个真实客户端测量消失时间。
|
|
45
|
-
- 公屏接口校验在线会话、内容长度、表情白名单、速率窗口和请求幂等;公开读取只返回有限时间窗和有限条数。浏览器验收用真实按键输入中文、字母、数字、标点、Shift 符号和输入法组合文本,并由第二个独立会话核对原文;直接调用 `fill()`/赋值只能验证服务端,不能证明键盘链路。
|
|
46
|
-
- 轮询是兼容基线;接入 WebSocket/SignalR 时仍保留共享租约为事实源,并用 V8 授权接口签发短期频道权限。
|
|
47
|
-
|
|
48
|
-
## WebGL 与 Windows 双端交付
|
|
49
|
-
|
|
50
|
-
- WebGL 与 Windows 必须来自同一个 Unity 工程、场景和语义版本;禁止用旧本地包搭配新网页版本。
|
|
51
|
-
- Windows 默认交付 x64 安装包,至少包含当前用户安装、开始菜单入口和卸载信息;没有明确需求时不申请管理员权限。
|
|
52
|
-
- 外壳应给出醒目的本地版下载入口,并同时显示版本、文件大小与 SHA-256;文件名包含语义版本,旧版本 URL 不覆盖。
|
|
53
|
-
- 安装包属于公开运行资产,不属于私有源码。同步 `directory` 前必须排除 `public/downloads` 等生成目录,再把完整安装包随 `dist` 走流式资产发布;禁止拆分 Base64 或伪装成源码规避单文件上限。
|
|
54
|
-
- 单文件大于 128 MiB 时,MCP 与 `@microi.net/cli` 共用协议 v3:默认 16 MiB 原始字节分片、逐片 HDFS 回读、整文件 SHA-256 和确定性会话。重启后必须先查状态并只补缺片;5 GiB 文件应规划为 320 片,不得重新从 0 开始。
|
|
55
|
-
- v3 不设置 Microi 产品级文件/目录字节上限;对象存储、磁盘、代理与协议技术边界仍需容量预检。发布期间在“系统引擎 → 超大文件上传记录”回读字节进度、心跳、失败原因和恢复建议,终态记录保留用于审计。
|
|
56
|
-
- 发布后从公网地址重新下载完整 EXE,比较字节数和 SHA-256;本地制包成功、MCP 返回文件 Id 或 HTTP HEAD 成功都不能替代完整回读。
|
|
57
|
-
- 本地验收至少覆盖静默安装、主程序存在、可启动和卸载入口;签名状态、SmartScreen 信誉和硬件帧率必须单独如实说明。
|
|
58
|
-
|
|
59
|
-
## 商城资源
|
|
60
|
-
|
|
61
|
-
游戏进度表使用应用前缀 `app_*`,不要占用平台保留的 `mci_*` 名称。技术幂等表可以不创建可见菜单;玩家运营表创建父菜单 + 子数据菜单,隐藏 UserId、RequestId、哈希等技术字段。
|
|
62
|
-
|
|
63
|
-
接口策略示例:
|
|
64
|
-
|
|
65
|
-
```json
|
|
66
|
-
{
|
|
67
|
-
"SchemaVersion": 1,
|
|
68
|
-
"ApiEngines": {
|
|
69
|
-
"app_game_bootstrap": { "Ownership": "Application", "UpgradePolicy": "Managed" },
|
|
70
|
-
"app_game_save": { "Ownership": "Application", "UpgradePolicy": "Managed" },
|
|
71
|
-
"app_game_after_save": { "Ownership": "Tenant", "UpgradePolicy": "CreateIfMissing" }
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
租户 Hook 使用新的稳定 Key;首次安装后归租户维护,同 Key 后续版本不能改回 `Managed`。
|
|
77
|
-
|
|
78
|
-
### 仅共享编译运行产物
|
|
79
|
-
|
|
80
|
-
消费者只获得运行应用、不安装业务资源时,商城发布显式传
|
|
81
|
-
`RuntimeAssetsOnly=true`。只接受 `ProtocolVersion=3`、`ApplicationType=Web`、
|
|
82
|
-
显式 `IncludeSource=false` 和已通过提交证明校验的 `SharedPublicRuntime`。
|
|
83
|
-
源码是否在本地或私有开发端保管,与消费者包不含源码分别验收;此模式本身不要求上传本地源码。
|
|
84
|
-
|
|
85
|
-
- 请求资源选择、历史 `SelectMenu/SelectTable/SelectApiEngine/SelectData` 和
|
|
86
|
-
`PreparedAssets.MenuContract` 均为空,非空时拒绝,不自动抹除;禁止混用 `DatabaseOnlyBuild`。
|
|
87
|
-
- 通过既有 `microi_run_engine.params` 向 `ai_app_publish_store` 传入开关,先
|
|
88
|
-
`InspectResourceSnapshot` 再 `Publish + ExpectedResourceSnapshotHash`,两次使用同一组冻结参数。
|
|
89
|
-
- 回读真实包的十一项资源数组、`SourceFiles/BuildAssets` 均为零,`SourceZip/BuildZip` 为空,
|
|
90
|
-
只保留共享运行交付。完整数组和兼容条件见 [应用商城 Skill](../../app-store/SKILL.md#仅共享编译运行产物)。
|
|
91
|
-
- 此模式的目标验收检查编译入口、宿主身份和实际服务契约;没有声明的表、菜单、接口及 Hook
|
|
92
|
-
不应在消费者租户生成。需要租户业务资源时使用普通资源包流程。
|
|
93
|
-
|
|
94
|
-
## 官方发布顺序
|
|
95
|
-
|
|
96
|
-
只有当前 MCP 明确绑定官方 `https://api.microi.net`、`OsClient=iTdos` 且用户已授权写入时才执行:
|
|
97
|
-
|
|
98
|
-
1. `microi_list_applications` 按精确 AppKey/中文名查重。
|
|
99
|
-
2. 读取远端应用上下文、源码版本、运行版本、行版本/围栏与路由快照。
|
|
100
|
-
3. 本地完成类型检查、测试、真实 Unity 构建和 dist 完整性校验。
|
|
101
|
-
4. 先同步私有源码;生成的 Unity、安装包与构建证据目录不得混入源码清单。任何期望版本不一致都停止重基线。
|
|
102
|
-
5. 发布不可变 Web 运行版本,回读入口、文件数、哈希、状态与公开 URL。
|
|
103
|
-
- 官网、二维码、分享与商城“立即体验”必须指向不带版本号的固定当前入口,且游戏加载完成后地址栏仍保持该入口;不能把 `SharedPublicRuntime.EntryUrl`、`/releases/{Version}/requests/...` 或 `/versions/{Version}/` 当作当前体验地址,也不能用 30x、`meta refresh`、`location.replace` 伪装稳定入口。
|
|
104
|
-
- 不可变版本 URL 只写入历史版本记录、回滚和审计。固定入口可以使用同源全屏加载壳承载当前不可变产物,并必须透传 `autoplay`、`fullscreen` 与 `gamepad` 权限。
|
|
105
|
-
6. 若同时交付 Windows,从稳定公网地址下载完整安装包并核对大小、SHA-256 和版本;在线入口还要加载真实 WASM/Data。
|
|
106
|
-
7. 调用官方 `ai_app_publish_store` 生成并发布精确版本的应用商城包。超时属于结果不确定,必须回读包正文和 ZIP 后才能决定是否重试。
|
|
107
|
-
8. 回读 `sys_microistore` 的 AppKey、版本、状态、预览图、包摘要与资源策略,断言 `AppVersion == PackageInfo.Version == PreparedAssets.PackageVersion`。
|
|
108
|
-
9. 在官网 `/apps.html` 和 `/app-detail.html?app=<appKey>` 做公开页面回读。
|
|
109
|
-
10. 在一个非官方测试租户安装,回读表、菜单、接口和 Hook 所有权;再验证升级不覆盖租户 Hook。
|
|
110
|
-
11. 多人应用用两个独立浏览器会话互相验证昵称、位置、公屏;强制关闭一端,确认超过约定租约后另一端不再看到该角色。
|
|
111
|
-
|
|
112
|
-
源码同步、运行发布、商城发布、官网可见、目标租户安装是五项独立事实。任一步只有受理 ID 或 `doing` 状态,都不能报告最终成功。
|
|
113
|
-
|
|
114
|
-
## 版本与回滚
|
|
115
|
-
|
|
116
|
-
- 运行产物不可变;相同版本不可覆盖为不同哈希。
|
|
117
|
-
- 商城版本必须精确对应已验证运行版本与 Manifest。
|
|
118
|
-
- 升级遵循先扩展、后迁移、再收缩;新旧运行版本短暂并存时协议向前/向后兼容。
|
|
119
|
-
- 回滚恢复上一不可变运行版本;数据库变更需要显式兼容/补偿方案,不能用文件回滚伪装数据回滚。
|
|
1
|
+
# Unity AI 应用与商城交付
|
|
2
|
+
|
|
3
|
+
## 唯一源码
|
|
4
|
+
|
|
5
|
+
官方 AI 应用源码放在当前官方连接对应的:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
Microi-V8-Engine/<connection>/<product>/AI应用/<appKey>/
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
同一应用的 Vue 外壳、Unity 构建接入、V8 源码、Manifest、资源策略、测试和发布合约都从这里生成。Unity 工程可以保留服务端镜像,但必须由唯一源码生成并做一致性检查。
|
|
12
|
+
|
|
13
|
+
最小文件:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
.microi-micro-app.json
|
|
17
|
+
app.json
|
|
18
|
+
package.json
|
|
19
|
+
microi.routes.json
|
|
20
|
+
package-contract.json
|
|
21
|
+
resource-policies.json
|
|
22
|
+
system.manifest.json
|
|
23
|
+
src/
|
|
24
|
+
public/
|
|
25
|
+
server/engines/
|
|
26
|
+
scripts/
|
|
27
|
+
tests/
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Web 外壳
|
|
31
|
+
|
|
32
|
+
- Vue 3 + Vite + TypeScript。
|
|
33
|
+
- 复用工作区标准 `microi.v8.js` 与 `microi-ai-app-auth.js`,不要复制改造出第二套认证协议。
|
|
34
|
+
- 匿名模式可以承载公开多人玩法,但必须使用服务端签发、只存哈希、可过期的会话秘密;个人持久化接口仍要求 DiyToken。
|
|
35
|
+
- `ApplicationType=Web`,独立入口为 `index.html`。
|
|
36
|
+
- 构建状态明确区分 `available` 与 `publishable`;无真实 Unity WASM/Data 时禁止正式发布。
|
|
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` 只能做无音轨占位,不算同步验收。
|
|
39
|
+
|
|
40
|
+
## 多人租约与公屏交付
|
|
41
|
+
|
|
42
|
+
- 在线角色的事实源使用按 `OsClient` 隔离的共享数据库/Redis,不能使用 API 节点静态字典;客户端心跳周期必须短于租约超时。
|
|
43
|
+
- 加入响应只向本人返回会话秘密;数据库保存 SHA-256,位置快照只公开昵称、受限坐标、朝向、动作与房间版本。
|
|
44
|
+
- 正常卸载/离开主动调用 leave;浏览器崩溃、断网或 `kill -9` 依靠服务端租约自然失效,并通过两个真实客户端测量消失时间。
|
|
45
|
+
- 公屏接口校验在线会话、内容长度、表情白名单、速率窗口和请求幂等;公开读取只返回有限时间窗和有限条数。浏览器验收用真实按键输入中文、字母、数字、标点、Shift 符号和输入法组合文本,并由第二个独立会话核对原文;直接调用 `fill()`/赋值只能验证服务端,不能证明键盘链路。
|
|
46
|
+
- 轮询是兼容基线;接入 WebSocket/SignalR 时仍保留共享租约为事实源,并用 V8 授权接口签发短期频道权限。
|
|
47
|
+
|
|
48
|
+
## WebGL 与 Windows 双端交付
|
|
49
|
+
|
|
50
|
+
- WebGL 与 Windows 必须来自同一个 Unity 工程、场景和语义版本;禁止用旧本地包搭配新网页版本。
|
|
51
|
+
- Windows 默认交付 x64 安装包,至少包含当前用户安装、开始菜单入口和卸载信息;没有明确需求时不申请管理员权限。
|
|
52
|
+
- 外壳应给出醒目的本地版下载入口,并同时显示版本、文件大小与 SHA-256;文件名包含语义版本,旧版本 URL 不覆盖。
|
|
53
|
+
- 安装包属于公开运行资产,不属于私有源码。同步 `directory` 前必须排除 `public/downloads` 等生成目录,再把完整安装包随 `dist` 走流式资产发布;禁止拆分 Base64 或伪装成源码规避单文件上限。
|
|
54
|
+
- 单文件大于 128 MiB 时,MCP 与 `@microi.net/cli` 共用协议 v3:默认 16 MiB 原始字节分片、逐片 HDFS 回读、整文件 SHA-256 和确定性会话。重启后必须先查状态并只补缺片;5 GiB 文件应规划为 320 片,不得重新从 0 开始。
|
|
55
|
+
- v3 不设置 Microi 产品级文件/目录字节上限;对象存储、磁盘、代理与协议技术边界仍需容量预检。发布期间在“系统引擎 → 超大文件上传记录”回读字节进度、心跳、失败原因和恢复建议,终态记录保留用于审计。
|
|
56
|
+
- 发布后从公网地址重新下载完整 EXE,比较字节数和 SHA-256;本地制包成功、MCP 返回文件 Id 或 HTTP HEAD 成功都不能替代完整回读。
|
|
57
|
+
- 本地验收至少覆盖静默安装、主程序存在、可启动和卸载入口;签名状态、SmartScreen 信誉和硬件帧率必须单独如实说明。
|
|
58
|
+
|
|
59
|
+
## 商城资源
|
|
60
|
+
|
|
61
|
+
游戏进度表使用应用前缀 `app_*`,不要占用平台保留的 `mci_*` 名称。技术幂等表可以不创建可见菜单;玩家运营表创建父菜单 + 子数据菜单,隐藏 UserId、RequestId、哈希等技术字段。
|
|
62
|
+
|
|
63
|
+
接口策略示例:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"SchemaVersion": 1,
|
|
68
|
+
"ApiEngines": {
|
|
69
|
+
"app_game_bootstrap": { "Ownership": "Application", "UpgradePolicy": "Managed" },
|
|
70
|
+
"app_game_save": { "Ownership": "Application", "UpgradePolicy": "Managed" },
|
|
71
|
+
"app_game_after_save": { "Ownership": "Tenant", "UpgradePolicy": "CreateIfMissing" }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
租户 Hook 使用新的稳定 Key;首次安装后归租户维护,同 Key 后续版本不能改回 `Managed`。
|
|
77
|
+
|
|
78
|
+
### 仅共享编译运行产物
|
|
79
|
+
|
|
80
|
+
消费者只获得运行应用、不安装业务资源时,商城发布显式传
|
|
81
|
+
`RuntimeAssetsOnly=true`。只接受 `ProtocolVersion=3`、`ApplicationType=Web`、
|
|
82
|
+
显式 `IncludeSource=false` 和已通过提交证明校验的 `SharedPublicRuntime`。
|
|
83
|
+
源码是否在本地或私有开发端保管,与消费者包不含源码分别验收;此模式本身不要求上传本地源码。
|
|
84
|
+
|
|
85
|
+
- 请求资源选择、历史 `SelectMenu/SelectTable/SelectApiEngine/SelectData` 和
|
|
86
|
+
`PreparedAssets.MenuContract` 均为空,非空时拒绝,不自动抹除;禁止混用 `DatabaseOnlyBuild`。
|
|
87
|
+
- 通过既有 `microi_run_engine.params` 向 `ai_app_publish_store` 传入开关,先
|
|
88
|
+
`InspectResourceSnapshot` 再 `Publish + ExpectedResourceSnapshotHash`,两次使用同一组冻结参数。
|
|
89
|
+
- 回读真实包的十一项资源数组、`SourceFiles/BuildAssets` 均为零,`SourceZip/BuildZip` 为空,
|
|
90
|
+
只保留共享运行交付。完整数组和兼容条件见 [应用商城 Skill](../../app-store/SKILL.md#仅共享编译运行产物)。
|
|
91
|
+
- 此模式的目标验收检查编译入口、宿主身份和实际服务契约;没有声明的表、菜单、接口及 Hook
|
|
92
|
+
不应在消费者租户生成。需要租户业务资源时使用普通资源包流程。
|
|
93
|
+
|
|
94
|
+
## 官方发布顺序
|
|
95
|
+
|
|
96
|
+
只有当前 MCP 明确绑定官方 `https://api.microi.net`、`OsClient=iTdos` 且用户已授权写入时才执行:
|
|
97
|
+
|
|
98
|
+
1. `microi_list_applications` 按精确 AppKey/中文名查重。
|
|
99
|
+
2. 读取远端应用上下文、源码版本、运行版本、行版本/围栏与路由快照。
|
|
100
|
+
3. 本地完成类型检查、测试、真实 Unity 构建和 dist 完整性校验。
|
|
101
|
+
4. 先同步私有源码;生成的 Unity、安装包与构建证据目录不得混入源码清单。任何期望版本不一致都停止重基线。
|
|
102
|
+
5. 发布不可变 Web 运行版本,回读入口、文件数、哈希、状态与公开 URL。
|
|
103
|
+
- 官网、二维码、分享与商城“立即体验”必须指向不带版本号的固定当前入口,且游戏加载完成后地址栏仍保持该入口;不能把 `SharedPublicRuntime.EntryUrl`、`/releases/{Version}/requests/...` 或 `/versions/{Version}/` 当作当前体验地址,也不能用 30x、`meta refresh`、`location.replace` 伪装稳定入口。
|
|
104
|
+
- 不可变版本 URL 只写入历史版本记录、回滚和审计。固定入口可以使用同源全屏加载壳承载当前不可变产物,并必须透传 `autoplay`、`fullscreen` 与 `gamepad` 权限。
|
|
105
|
+
6. 若同时交付 Windows,从稳定公网地址下载完整安装包并核对大小、SHA-256 和版本;在线入口还要加载真实 WASM/Data。
|
|
106
|
+
7. 调用官方 `ai_app_publish_store` 生成并发布精确版本的应用商城包。超时属于结果不确定,必须回读包正文和 ZIP 后才能决定是否重试。
|
|
107
|
+
8. 回读 `sys_microistore` 的 AppKey、版本、状态、预览图、包摘要与资源策略,断言 `AppVersion == PackageInfo.Version == PreparedAssets.PackageVersion`。
|
|
108
|
+
9. 在官网 `/apps.html` 和 `/app-detail.html?app=<appKey>` 做公开页面回读。
|
|
109
|
+
10. 在一个非官方测试租户安装,回读表、菜单、接口和 Hook 所有权;再验证升级不覆盖租户 Hook。
|
|
110
|
+
11. 多人应用用两个独立浏览器会话互相验证昵称、位置、公屏;强制关闭一端,确认超过约定租约后另一端不再看到该角色。
|
|
111
|
+
|
|
112
|
+
源码同步、运行发布、商城发布、官网可见、目标租户安装是五项独立事实。任一步只有受理 ID 或 `doing` 状态,都不能报告最终成功。
|
|
113
|
+
|
|
114
|
+
## 版本与回滚
|
|
115
|
+
|
|
116
|
+
- 运行产物不可变;相同版本不可覆盖为不同哈希。
|
|
117
|
+
- 商城版本必须精确对应已验证运行版本与 Manifest。
|
|
118
|
+
- 升级遵循先扩展、后迁移、再收缩;新旧运行版本短暂并存时协议向前/向后兼容。
|
|
119
|
+
- 回滚恢复上一不可变运行版本;数据库变更需要显式兼容/补偿方案,不能用文件回滚伪装数据回滚。
|