@microi.net/cli 5.7.9 → 5.8.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.
Files changed (106) 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 +5 -5
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +106 -106
  10. package/scripts/microi-skills.meta.json +293 -290
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +441 -441
  13. package/skills/README.md +2 -1
  14. package/skills/ai-engine/SKILL.md +1 -1
  15. package/skills/ai-engine/references/ai-employees.md +4 -0
  16. package/skills/ai-platform-governance/SKILL.md +8 -8
  17. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +9 -9
  18. package/skills/app-store/SKILL.md +58 -4
  19. package/skills/job-engine/SKILL.md +4 -3
  20. package/skills/message-notification/SKILL.md +2 -1
  21. package/skills/microi/SKILL.md +14 -0
  22. package/skills/microi-ai-application/SKILL.md +16 -3
  23. package/skills/microi-client-frontend/SKILL.md +10 -5
  24. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +3 -3
  25. 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 +4 -4
  26. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +3 -3
  27. package/skills/microi-codex/SKILL.md +15 -0
  28. package/skills/microi-datasource-mapping/SKILL.md +4 -0
  29. package/skills/microi-deployment/SKILL.md +7 -0
  30. package/skills/microi-deployment/references/deployment-matrix.md +8 -0
  31. package/skills/microi-docs-coverage/references/capability-map.md +1 -0
  32. package/skills/microi-form-layout/SKILL.md +6 -6
  33. 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
  34. package/skills/microi-frontend-sdk/SKILL.md +6 -6
  35. 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 +7 -7
  36. package/skills/microi-microservice/SKILL.md +1 -0
  37. package/skills/microi-mobile-app-quality/SKILL.md +12 -8
  38. 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
  39. 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
  40. package/skills/microi-system-delivery/SKILL.md +5 -5
  41. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +1 -1
  42. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +6 -4
  43. package/skills/microi-ui/SKILL.md +6 -6
  44. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +5 -5
  45. package/skills/microi-uniapp-frontend/SKILL.md +10 -10
  46. 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
  47. 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
  48. package/skills/module-engine/SKILL.md +13 -0
  49. package/skills/page-engine/SKILL.md +19 -8
  50. 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
  51. 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
  52. package/skills/playwright-e2e/SKILL.md +11 -11
  53. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +5 -5
  54. 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 +3 -3
  55. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +7 -7
  56. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +4 -4
  57. package/skills/system-observability/SKILL.md +3 -0
  58. package/skills/ui-design/SKILL.md +7 -7
  59. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +2 -2
  60. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +3 -3
  61. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +2 -2
  62. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +1 -1
  63. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +3 -3
  64. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +2 -2
  65. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +4 -4
  66. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +5 -5
  67. package/skills/unity-integration/references/ai-app-delivery.md +16 -0
  68. package/skills/v8-api-config/SKILL.md +6 -0
  69. package/skills/v8-crud-api/SKILL.md +9 -7
  70. 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 +8 -8
  71. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +2 -2
  72. package/skills/v8-explorer-tree/SKILL.md +2 -2
  73. package/skills/v8-export-import/SKILL.md +4 -4
  74. 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
  75. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +4 -4
  76. 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
  77. package/skills/v8-file-upload/SKILL.md +32 -4
  78. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +3 -3
  79. 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 +3 -3
  80. package/skills/v8-frontend-events/SKILL.md +6 -6
  81. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +5 -5
  82. package/skills/v8-http-integration/SKILL.md +4 -4
  83. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +7 -7
  84. 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 +2 -2
  85. package/skills/v8-image-processing/SKILL.md +1 -1
  86. package/skills/v8-menu-buttons/SKILL.md +4 -4
  87. 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
  88. 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
  89. 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
  90. package/skills/v8-mq-mqtt/SKILL.md +3 -2
  91. package/skills/v8-mq-mqtt/references/mqtt-production.md +1 -1
  92. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +1 -1
  93. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +1 -1
  94. package/skills/v8-security/SKILL.md +15 -5
  95. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +3 -3
  96. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +8 -6
  97. package/skills/v8-table-event/SKILL.md +5 -5
  98. 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 +6 -6
  99. 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
  100. package/skills/v8-tcp-integration/SKILL.md +2 -2
  101. package/skills/v8-workflow/SKILL.md +42 -7
  102. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +7 -7
  103. package/skills/workspace-conventions/SKILL.md +19 -10
  104. 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 +8 -7
  105. 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 +21 -21
  106. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +1 -1
package/skills/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 包含的 Skills
10
10
 
11
- 当前仓库包含 67 个 `SKILL.md`。以下清单按任务类型组织;AI 必须先完整读取与当前任务匹配的 Skill,再执行源码、MCP、文档或交付操作。
11
+ 当前仓库包含 68 个 `SKILL.md`。以下清单按任务类型组织;AI 必须先完整读取与当前任务匹配的 Skill,再执行源码、MCP、文档或交付操作。
12
12
 
13
13
  ### V8 引擎核心(后端)
14
14
 
@@ -90,6 +90,7 @@
90
90
  | **v8-formengine-http** | 移动端/外部系统直接调用 FormEngine HTTP 路由的约定 | `v8-formengine-http/SKILL.md` |
91
91
  | **v8-explorer-tree** | VS Code 插件 V8 资源管理器目录规范和本地文件归档 | `v8-explorer-tree/SKILL.md` |
92
92
  | **workspace-conventions** | 工作区文件放置、临时产物、项目专属目录和根目录污染防护 | `workspace-conventions/SKILL.md` |
93
+ | **microi** | 吾码快捷入口,按任务读取工作区规则并选择已登录 MCP 连接 | `microi/SKILL.md` |
93
94
  | **microi-codex-installer** | Codex 插件立即检测、授权安装、旧 marketplace 迁移与验收 | `microi-codex-installer/SKILL.md` |
94
95
  | **microi-codex** | Codex 中连接租户、读取实时上下文并完成 Microi 等价工作流 | `microi-codex/SKILL.md` |
95
96
  | **production-readonly-audit** | 正式环境只读巡检,不改动线上数据的业务核对流程 | `production-readonly-audit/SKILL.md` |
@@ -49,7 +49,7 @@ description: Microi AI 引擎、MiniMax 图片/音乐/视频生成与预览、
49
49
 
50
50
  当前入口并不共用一条检索链路:普通 `Chat/ChatStream` 使用服务端会话上下文和固定核心规范 Prompt;`NL2SQL` 使用当前租户 Schema 双模式检索;`NL2V8` 使用 Skill 镜像与当前租户 Schema 双模式检索。默认模式不依赖 Ollama、`nomic-embed-text` 或 Qdrant;只有显式开启向量数据库时才增加向量通道。在线低代码建模在 `Microi.AI` 内建立同版 `microi.mcp` 会话,模型通过 `microi_codex` 执行工具循环。普通对话仍不调用 MCP;不能仅凭 Prompt 声称工具已执行,必须检查工具返回和回读。
51
51
 
52
- 在线 `/#/mic-ai-engine` 的低代码建模模式使用本地 Microi.Code 同一份 `microi.mcp` 工具目录:先 `list_tools`/`describe_tool`,再执行表、字段、菜单、接口引擎、Manifest 系统编排、删除等原 MCP 工具。用户在对话中明确要求写入时自动执行,不需要网页按钮;明确“只规划、不执行”时只调用只读工具。前端仅向 `Level >= 9999` 开放建模入口;服务端进入模式和每次工具调用前都以当前 DiyToken、主库账号及有效角色复核。工具原有确认值、审计和回读规则继续生效;超时或结果不确定时停止,不自动重试写操作。商城包不替换平台前后端程序。
52
+ 在线 `/#/mic-ai-engine` 的低代码建模模式使用本地 Microi.Agent 同一份 `microi.mcp` 工具目录:先 `list_tools`/`describe_tool`,再执行表、字段、菜单、接口引擎、Manifest 系统编排、删除等原 MCP 工具。用户在对话中明确要求写入时自动执行,不需要网页按钮;明确“只规划、不执行”时只调用只读工具。前端仅向 `Level >= 9999` 开放建模入口;服务端进入模式和每次工具调用前都以当前 DiyToken、主库账号及有效角色复核。工具原有确认值、审计和回读规则继续生效;超时或结果不确定时停止,不自动重试写操作。商城包不替换平台前后端程序。
53
53
 
54
54
  建模对话使用非流式 `/api/Ai/Chat` 获取服务端 MCP 工具循环最终答案和工具名称/状态;普通对话保持流式。完整系统先调用 `microi_get_db_schema`、`microi_get_manifest_schema`、`microi_plan_system`,用 `microi_generate_system(dryRun=true)` 验证,再按用户明确创建请求调用 `dryRun=false` 并用 `microi_validate_system` 回读。模型提交的参数由原 MCP Schema 校验,不能在前端绕过。
55
55
 
@@ -37,6 +37,10 @@
37
37
 
38
38
  ## 验收与边界
39
39
 
40
+ 桌面工作台未登录时只显示连接引导,不调用员工业务接口、不暴露原始 IPC 堆栈。已登录连接只读取当前租户/负责人的团队;切换连接时丢弃旧请求的迟到响应。任务需填写成果目标、验收标准和执行方式,依赖只可选择已验收任务;重复提交沿用请求标识,发生不确定结果时先回读。
41
+
42
+ 节点停止接单时不能在迟到的队列查询后继续领取,也不能丢弃正在生成或待回传成果。成果先持久化、后报告;云端接收后本地清理失败仍重放相同报告,不重新调用模型。测试必须分别覆盖真实云端模型、跨岗验收接力、真实本机 HTTP 协议和界面操作;界面夹具不代表真实 Gateway 已联调。
43
+
40
44
  覆盖幂等去重与内容冲突、负责人隔离、依赖未验收、同员工并发、旧租约报告、取消后迟到结果、退回后的独立成果、尝试上限、报告网络失败、预算并发、每日规划幂等、跨岗位草稿协作和进程重启。完整 24 小时验收还需真实节点与模型连续运行和跨日预算回读。
41
45
 
42
46
  财务、招聘、合同、营销和客服草稿不代表已付款、录用、签署或发送。测试计划与代码草稿不代表测试通过;实际完成需要执行日志、产物与独立回读。
@@ -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=db3f5112eb1f1fbf530fc846f27b062df2a0aca481a4488b3cd31ad2562a3571 -->
11
+ <!-- microi-progressive:chunk id=ai-platform-governance-000 sha256=48b82af9f11388d6872cf90aa2c74a1d35c1db948483f30615ce054989ef0d77 -->
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=854b349825066903060e0012a61c2e496e5241829ccb2ae743c17bc5ad716411 -->
27
+ <!-- microi-progressive:chunk id=ai-platform-governance-001 sha256=47197af80919be7e08ef051884e70900714bdf53f551fad16e119a86d6efb63c -->
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=f67f0ed08ec5b5d42a1bb2cc8b73db373c297d2ad78b646bd16a9ed08fe2d158 -->
39
+ <!-- microi-progressive:chunk id=ai-platform-governance-002 sha256=527f1cda978f88d0d1507d90aac71089f7585699f0ad7d5266dc7e40ba026b7c -->
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=620f19f67eae2f6c6b0888240423594df96c3c0fa96b9df0fe60327438b9209a -->
66
+ <!-- microi-progressive:chunk id=ai-platform-governance-003 sha256=3d43295846e19e8b5cb526442ff8aff8f0317db88f5be803b5798e63118546e2 -->
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=b112a5de375c999e536f5c216132db83d11d024a766b9a4deab71963a5a017f6 -->
93
+ <!-- microi-progressive:chunk id=ai-platform-governance-004 sha256=f4fbda7d2522d95e4aaa6f010637b6dfe652a7871614177ce489df7830b9c911 -->
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=0c1db1cd39cbe0878388da8871c4094d3853179815d0ede9ce99cbfa5fa849d0 -->
106
+ <!-- microi-progressive:chunk id=ai-platform-governance-005 sha256=6298a32cb0b0c2f226485697bba306936265dab62248bb48a1709e36f73241e9 -->
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=32b79f58d3ef41a3d7c550c50db8ce6bb4d00717282e9aa3fbaa35ea9ac9a33e -->
124
+ <!-- microi-progressive:chunk id=ai-platform-governance-006 sha256=ec5c949ac0615c9917ce1910a397f5ab1e7878fb56a35cb761cd5ebbdf96c714 -->
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=ad22d6e14c7ccdc2f6de6cf9285b9c94a949425f30be39e52949fedc60fd7d6a -->
151
+ <!-- microi-progressive:chunk id=ai-platform-governance-007 sha256=64f2699d58860ed29782136673b51bdb1488b87cd17b24b761e9d22479902ae5 -->
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=9e2dfb6ca71a12bc39c54aca498a6f0eafdb700716db2a9bd0f9dc6f14194e85 -->
5
+ <!-- microi-progressive:chunk id=ai-platform-governance-008 sha256=e3927151358f0c9e801c1027edb877332c8e148f245d58eade2eaae53ddb7948 -->
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=0ef9057b5d6a346f09931a7aac5007f6f0760096990b142931814b16043423c4 -->
17
+ <!-- microi-progressive:chunk id=ai-platform-governance-009 sha256=ca73d439788b802c1b999c0a7973e735caf8b4149d4be116511e470ca93d728e -->
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=09cf92ff56f8dfd4bb95872741da05e462d06b8027e934a3282b265c48203a40 -->
76
+ <!-- microi-progressive:chunk id=ai-platform-governance-010 sha256=cb8f46acd05462f4fb99d52517b34f9f9a7ae785f44d6ea0c0f1e79f050068d0 -->
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=9f62550921dccdb4f550a093183c44b0523822a2e75e9de3bfc3255406cecfe2 -->
96
+ <!-- microi-progressive:chunk id=ai-platform-governance-011 sha256=db964d7f412ce56112c7a8173a10a6a1f33c762761747b6db780463a0e07f79d -->
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=05f16e1c9370170a8bf20152439b3ebde4e85aa1bf360a6375c7c344380d2ace -->
125
+ <!-- microi-progressive:chunk id=ai-platform-governance-012 sha256=82e059f90494a679d4073693b83904826841a7c87e0ed1e5ab0e28575eedffac -->
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=17cce66f24e666271abc143a77319c9ecb43c476d4d9523f2da1dc3df2649d87 -->
136
+ <!-- microi-progressive:chunk id=ai-platform-governance-013 sha256=b286f47071ac64e9e7d75929134123e8a3ef65a05ddb86007554ae05099e1445 -->
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=1f931b62b510316d8e2b9e034b1348c7dc63e307166bee107e9e3430b1be5a2c -->
148
+ <!-- microi-progressive:chunk id=ai-platform-governance-014 sha256=9c5387dccbc2ff092470edc70b9600416700ac734f15df2c2e775bae0adf00c4 -->
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=763421b1b0bbf719255cfeee093fdd33517d4ead38ddd1c0043a5ba5ec3fe86a -->
164
+ <!-- microi-progressive:chunk id=ai-platform-governance-015 sha256=6fafd84efd63a1607c4c98c4a173d755b2ba22fb7a251a21ed4d4699556656a7 -->
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=195d1af8151cf8c8c846799418e822f3c9f17310fac91a0442af8944f3c39899 -->
178
+ <!-- microi-progressive:chunk id=ai-platform-governance-016 sha256=76dab40556ce9a5a732c398d2f534c16478a1a88d4c1efdcdeaa6ba76d4339df -->
179
179
  ## 双节点与浏览器验收
180
180
 
181
181
  至少覆盖:
@@ -39,6 +39,13 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
39
39
 
40
40
  ## 包内容
41
41
 
42
+ ### 仅共享编译运行产物
43
+
44
+ - 消费者只需运行应用、无需安装业务资源时,显式传 `RuntimeAssetsOnly=true`;只接受 `ProtocolVersion=3 + ApplicationType=Web + 显式 IncludeSource=false` 和通过现有 `CommittedProof`、运行清单校验的 `SharedPublicRuntime`。不能把“不包含源码”自动等同于此模式;省略或 `false` 保持原有打包行为。
45
+ - 请求的菜单、表、接口、移除接口、工作流、任务、数据、路由、页面及资源策略选择均必须为空;既有商城行的 `SelectMenu/SelectTable/SelectApiEngine/SelectData` 和 `PreparedAssets.MenuContract` 非空时拒绝,禁止静默清理历史选择。不能与 `DatabaseOnlyBuild` 混用。
46
+ - 现有 `microi_run_engine` 的 `params` 是动态对象,可传此开关,无需增加工具参数。对 `ai_app_publish_store` 的 `Action=InspectResourceSnapshot` 和 `Action=Publish` 都使用同一组冻结模式、版本、资产及提交证明,后者将前者返回的 `ResourceSnapshotHash` 作为 `ExpectedResourceSnapshotHash` 传入。MCP 的 `confirmExecution` 仍必须匹配引擎 Key。
47
+ - 下载真实发布包后,断言 `DDLStatements/PhysicalColumns/DiyTables/DiyFields/DataSets/SysMenus/WfFlowDesigns/WfNodes/WfLines/SysApiEngines/ScheduleJobs` 十一项数组全部为零,`SourceFiles/BuildAssets` 为零,`SourceZip/BuildZip` 为空,唯一运行交付为 `SharedPublicRuntime`。源码分发、服务端业务迁移和共享运行入口是独立事实,不能将共享公有编译产物当成目标租户已有业务接口或权限。
48
+
42
49
  ### 物理索引闭包
43
50
 
44
51
  标准导出器必须同时导出责任表的真实唯一索引和普通复合索引,按列顺序生成独立
@@ -67,10 +74,36 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
67
74
 
68
75
  - Manifest:应用 Key、版本、兼容平台版本、依赖和资源清单。
69
76
  - 数据模型:表、字段、菜单、角色权限、接口引擎、事件、数据源、页面、打印、工作流、任务。
70
- - 源码与构建:私有源码包与可部署构建包分离,记录 SHA-256。
77
+ - 源码与构建:私有源码包与可部署构建包分离,记录 SHA-256。源码 ZIP 必须按当前应用
78
+ `PrivateSourcePath` 的已提交活动根选择当前私有行(`VersionId` 为空、`StorageScope=Private`、
79
+ 非目录且未删除),禁止把历史版本、未提交源、上传会话或 `upload/v*` 编译文件混入。
80
+ 已完成原子同步后的活动根可以仍在 staged 目录,不能只按目录名猜测提交状态。
81
+ 缺失基线不回退历史;分页不完整、重复路径(含大小写)、对象后缀与归档路径不一致、
82
+ 大小或原始字节 SHA 漂移均停止。使用当前租户可信私有字节与已有 ZIP 原子,优先对同一
83
+ 返回归档调用可信 `ExtractZip`(兼容 `ReadZip`),完整核对每条路径、大小、原始字节 SHA、
84
+ 文件数与总量;原子存在但失败或不完整时不能回退。仅旧节点缺少解压核验原子时,逐文件
85
+ 校验真实字节,原生 CLR SHA 不可用则复用既有编译 ZIP 的 ES5 算法,不得跳过验签。
86
+ 前后重读权威账号、应用指针及清单;普通非拥有者、访问密钥会话、撤权、跨租户或存储错误
87
+ 不输出文件。节点缺少字节摘要能力时失败关闭。清单摘要沿用序数排序后的
88
+ `Path\tSha256\tSize` UTF-8 SHA-256;原始 ZIP 摘要与资产准备器 Base64 文本摘要分别核验。
89
+ 传输超时先回读对象和完整条目,已有正确 Build ZIP 可复用,但错误 Source ZIP 必须保留
90
+ 拒绝发布证据;新源码合格后通过既有准备器单独上传 Source,禁止盲目重跑未知写操作。
91
+ - 编译 ZIP 优先按 `ApplicationType` 选择运行类型,历史 `AppType` 只作缺少该字段时的兼容。真实文件仅接受 HTTP 200,调用既有 `RequireSsrfProtection:true` 禁止自动重定向;合法 JSON 与业务错误响应按已冻结的实际字节大小和 SHA-256 区分,不能把任何含 `Code` 的 JSON 一律拒绝。每个新 ZIP 的版本元数据必须包含非空 `RuntimeManifestHash`,等于完整已验文件清单的 `Path\tSha256\tSize` UTF-8 摘要;当前 V3 还须与精确所属应用的权威 `Completed` 版本和微服务清单一致,前后复读提交指针、请求指纹和行版本,漂移失败关闭。旧缺失哈希 ZIP 保留失败证据,不用于新正式包。
92
+ - 完整制包的现代 `.mjs/.cjs/.mts/.cts` 模块与既有脚本按 UTF-8 文本读取,优先调用当前租户私有文本原子且必须 `Code=1`。旧节点缺少原子或读取失败时保留既有审计 URL 回退,票据异常仍停止;不得以性能为由绕审计。二进制不转文本,最终模型逐项验证实际字节、大小与冻结 SHA。超时先查原执行链与失败原因,不并发重入。
93
+ - 独立源码 ZIP 必须在全新目录安装依赖并执行应用声明的全部责任测试,再核对类型与生产构建;仅构建通过不能证明测试闭包。默认测试不得依赖发布者临时树、兄弟应用或平台仓库 marker。历史兼容所需纯模块应从已发布真实源码按原字节随 owned fixtures 交付,记录版本、原路径、大小和完整 SHA;保留原业务断言,不构造替代历史行为。中央多应用契约检查继续由中央 Full 入口执行,不能重新成为独立下载源码的外部依赖。
71
94
  - 安装/升级脚本:幂等、可恢复、可回读;不包含租户密钥、Token、连接串或 License keys。
72
95
  - 迁移采用“先扩展、后迁移、再收缩”,支持新旧节点短暂并存。
73
96
 
97
+ 制包读取全局 v3 运行对象时,租户私有 HDFS 代理继续保持租户目录边界。发布器仅从当前
98
+ `sys_microistore.CommittedPublishVersionId` 精确读取一条所属应用的 Completed 版本,核对
99
+ `VersionNo / RuntimeManifestHash / RequestFingerprint`、微服务清单和每个文件的不可变完整路径、
100
+ 大小及 SHA-256,再由当前 `V8.SysConfig.ApiBase` 的可信 origin 与当前租户、应用 Key、文件
101
+ 相对路径构造 `/micro-app/v3/tenants/.../kinds/runtime/apps/.../assets/...` 读取地址。不能从较新的
102
+ staged 行、请求参数、`StableFilePathName` 或外部 CDN URL 推断版本和域名。HTTP 使用既有
103
+ 严格 SSRF 原子禁用自动重定向,只接受 200;提供的 ETag 必须等于文件 SHA-256。文本可使用
104
+ 解压后的 Content,二进制使用 RawBytes,两者仍须分别通过实际字节大小和 SHA-256 校验。
105
+ 清单、提交身份、HTTP 或字节不一致时停止制包;旧无 v3 提交字段的微服务保留原校验路径。
106
+
74
107
  ## 接口引擎资源所有权(强制)
75
108
 
76
109
  - 新发布包必须声明 `ResourcePolicies.ApiEngines`。不可随租户修改的核心使用 `{ Ownership:'Platform'|'Application', UpgradePolicy:'Managed' }`;提供给租户改业务的 Hook 使用 `{ Ownership:'Tenant', UpgradePolicy:'CreateIfMissing' }`。策略以本次选定且通过身份、版本、大小和 SHA-256 校验的包正文为准。
@@ -91,6 +124,18 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
91
124
  节点/连线的完整图形后再启用。未声明该策略的历史包保持原覆盖语义。
92
125
  - 节点稳定 Id 跨流程占用、配置读取失败、写入失败或字段/V8回读不一致均失败关闭。
93
126
  发布包只交付停用模板,目标用户、岗位、部门及业务配置不能从官方测试环境复制。
127
+ - 空绑定或停用模板仍须真实结构声明。预制包发布前逐项核对流程、节点和连线的全部属性
128
+ 与目标支持的物理列及类型;新增列必须由同包声明交付,未知属性即拒绝。`0`、空字符串
129
+ 或 `[]` 不能证明未知字段可落库,不得凭相近名称发明控制项或补默认值绕过严格回读。
130
+ - 导出器在原生导出及 `PreparedPersistPackageByteBase64` 持久发布中,从可信当前租户
131
+ 数据库读取 `wf_flowdesign/wf_node/wf_line` 的真实物理列,按大小写不敏感的字段名检查
132
+ 全部资源属性;包自报 `PhysicalColumns` 不授予字段合法性。实际数据库已有的定制列保持
133
+ 合法;新增列先由正规结构交付并回读,再制包。未知字段、大小写重复、列读取失败或数据库
134
+ 类型缺失/不支持均在 HDFS 上传、日志、发布 CAS 与指针更新前失败关闭。MySQL/MariaDB、
135
+ SQL Server 当前解析表和 Oracle 当前用户表使用各自目录,无工作流的老包不要求该目录。
136
+ - 生成安装模板时,只从当前母版定义提取业务正文,从历史映射提取稳定资源 Id;构建前逐节点
137
+ 核对完整 V8 正文与条件代码。私有源码同步、普通 Manifest 生成或管理员测试通过,不能证明
138
+ 实际安装包中的内联正文已更新。发布前核对正式包,升级后再以目标普通岗位核对原业务请求。
94
139
  - 验收必须包含已绑定审批人的真实租户升级与同版本重装,核对启用状态、目标绑定、受管代码
95
140
  更新、在途待办保护及业务配置未变;空模板安装成功不能替代该验收。
96
141
  - 安装器 `v3.0.0` 起,流程、节点、连线的新增、更新与配置/结果回读均显式传入同一个
@@ -126,7 +171,9 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
126
171
  - “全部安装/更新”固定只处理 `ApplicationType=Platform` 的官方平台应用中未安装与存在新版本的项目,不得把 UniApp、Web、MicroService 或其它社区/AI 应用整库安装;已是最新版的应用不重新安装。批量计划、子项状态、checkpoint 和进度必须持久化到共享数据库/后台任务,支持多节点抢占、失败重试和重启恢复,不能依赖进程内集合或浏览器状态。
127
172
  - 主租户批量维护全部子租户时,前端入口和接口引擎都必须校验主租户上下文及 `Level >= 9999`,再由可信控制面为每个启用子租户创建独立持久后台任务;父任务必须按子任务真实百分比聚合进度,等全部子任务终态后才成功或失败,并在通知中心保留每个租户、阶段和原始失败原因。所有子任务可立即创建,但固定商城工作器必须通过配置租户 Redis 的集群并发租约跨租户串行执行,避免共享物理库并发 DDL/元数据写入死锁;分片幂等任务使用足以覆盖短时死锁和滚动重启的有界重试预算,禁止无限重试。`MaxAttempts` 表示连续失败预算:任一分片成功写入 checkpoint 后必须把 `AttemptCount` 与陈旧 `LastError` 清零,不能让数百个成功分片之间偶发的网络错误按任务生命周期累计并误终结。分片重新入队后必须按 `COALESCE(NextRunTime, CreateTime)` 选取最早就绪任务,禁止只按 `CreateTime` 让最早长任务重复抢占全部分片。商城包属于只读权威数据,可对空响应做有界退避重试,并优先用完整响应的 `Content`、`RawBytes`、HTTP 状态和传输错误诊断;不得把该规则扩展到安装写入请求。目标租户固定商城工作器必须锁定并校验精确包快照;同版本重装、显式选择历史版本或目标端存在更新源码时,仍以所选包的 `Managed` 资源覆盖,不得用版本/源码差异制造冲突。历史空库缺少生成实体所需物理列时,导入器须在首次 FormEngine 调用前幂等补齐并回读,不能再把真实表结构错误包装成 `Value cannot be null (source)`。
128
173
  - 批量维护的权威目录按当前节点 `OsClientType + OsClientNetwork` 隔离;同一主租户同时存在 Internal、Internet 或其它活动分区时,必须在每个分区对应的主租户节点独立发起并验收,不能用一个分区的成功任务推断全平台成功。每个分区先回读精确预期租户数与名单,等待父子任务全部终态且 `SucceededCount=ExpectedCount、FailedCount=0`,再用新幂等键立即执行一次无操作复跑并确认零安装/零更新。禁止修改 `sys_osclients` 的网络字段来把租户临时塞进另一分区,也禁止让两个分区同时维护可能指向同一物理库的重复租户记录。
129
- - 必须随所有后端版本自动落地的平台基础能力,仍要封装成受信任的官方 Platform 应用包,再由升级器调用统一 `import-microi-store-package` 幂等导入;禁止把表、字段、页面或微服务复制成定制 C# 迁移。`app.microi.saas-engine.json` 可携带基础空库所需的 `mci_system_setting`、`mci_user_external_identity`、默认设置和平台内置微服务;系统账号的 `platform-user-update-preferences`、`platform-user-update-profile`、`platform-user-custom-hook` 只由 `app.microi.sys_user.json` 交付,租户设置的 `platform-tenant-system-settings`、`platform-system-settings-custom-hook` 只由 `app.microi.sys-config.json` 交付。SaaS/Store 不得保留这些 Key、策略或 RequiredPlatformCapabilities。默认行必须使用 `InsertIfMissing + ConfigKey`,只补缺失,不覆盖 `ValueSource=Tenant` 的租户值或租户后来明确关闭的功能。小型平台启动微服务应以 `Source=NotIncluded + Build=DatabaseOnly + StorageMode=db` 随程序集交付并接受 256 文件/5MB、逐文件哈希和无源码门禁,使新租户在 HDFS 故障时仍能打开商城与恢复入口;普通应用安装、源码编辑和文件能力继续失败关闭,不得伪装成全平台健康。
174
+ - 启动自动恢复的范围严格限制为正常启动、普通登录、菜单导航和商城安装/更新。完整官方应用源码、包、生成器和同步器位于 `Microi.Server/OfficialApplications/Resource/`;`build-bootstrap-package.mjs` 按显式清单生成 `Microi.Upgrade/Resource/app.microi.bootstrap.json` 与 `import-package.js`,升级程序集只嵌入这两项。SSO、AI、通知、备份、OCR、翻译等可选应用只由用户在商城手动安装更新,不能作为启动就绪或版本推进条件。必要共享物理列与安装元数据可恢复,但不导入业务种子、可选菜单、任务或租户配置值。
175
+ - 启动恢复使用共享租约、持久版本门、幂等和强回读;只有登录接口、商城菜单/服务/页面绑定及真实内联资产就绪后才前向推进版本。满足必要路由和安全标志的更高版本 Managed 接口及完整商城资产保留,不能降级用户的手动更新;这项规则仅适用于启动恢复,用户显式选择商城历史版本仍以所选包为准。生成资源变动后必须重新生成并用 `--check` 和完整门禁验证,不能在 Full 后悄悄改包。
176
+ - 完整 SaaS、系统账号、系统设置等官方包继续按其独立归属发布;商城页面之外的平台设置和个人中心由对应包交付。`Source=NotIncluded + Build=DatabaseOnly + StorageMode=db` 的小型恢复资产接受 256 文件/5MB 和逐文件哈希门禁。客户明确要求手动更新时,官方发布不得扩张为客户自动安装或服务器部署。
130
177
  - 批量任务已经以“一个应用”为外层持久化恢复单元。规模可控的小型官方包应在一个事务中完成,避免对同一包体按 8 个字段反复下载、解析和重新排队;超过字段、表、DDL、流程、随包数据或资产安全阈值的大包继续使用内部 checkpoint 分片。热更新发现旧版批量计划不含 `ApplicationType` 时,必须丢弃旧计划并重新盘点,不能继续安装历史计划中的社区应用。
131
178
  - MySQL 宽表触发 65,535 字节行内上限时,只允许把不参与索引的 `varchar` 配置列无损提升为 `mediumtext`,并把类型覆盖持久化到后台任务 checkpoint;索引列和非行宽错误必须失败关闭。发布包对长连接串、密钥、回调地址、域名/白名单等字段应直接使用 `mediumtext`,同时更新 `DiyFields` 与建表 DDL,不能长期依赖安装时猜测。
132
179
  - 卸载是破坏性操作,必须明确列出将删除/保留的资源、二次确认并优先软删除/归档业务数据。
@@ -134,6 +181,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
134
181
  ## 联邦商城源、公开范围与历史版本(强制)
135
182
 
136
183
  - 每个主租户和子租户都可以发布自己的应用;应用行用 `IsPublic` 表达公开范围,缺省/历史空值按公开兼容。公开应用允许未登录来源读取和安装,私有应用只允许来源登录成功后的授权身份读取,列表、详情、版本接口都必须重复执行这一权限判断。
184
+ - 组合包的 `ApplicationBundles[].Application` 必须由发布器从源应用实际记录携带 `IsPublic/IsApprove`,不接受请求参数替代。安装器只接受 `0/1`、`"0"/"1"` 和布尔值,显式源标记优先;未审批的源不能因 Build 成功变成已审批。历史包无公开标记时,已有目标保持原值(含历史空值),首次新增运行应用显式 `IsPublic=0`,不能继承目标 Switch 默认1。无效声明在直接包入口任何 I/O 前失败;下载包在读取正文后、该包资源/文件写入前失败,旧库既有物理前置兼容检查不因此重排。父商品 AppId/公开范围、目标拥有者和源码下载独立鉴权不得随运行标记改变;验收必须覆盖新私有、已有私有/公开、显式公开、旧包新建/重装、非法类型零包写入和即时撤权。
137
185
  - 新版安装包正文不得长期内联在 `sys_microistore.AppPakcet`,也不得随 `mic_data_version.Data` 重复复制。公开应用写入 HDFS 公有桶并记录 `HdfsPublic`,私有应用写入私有桶并记录 `HdfsPrivate`;数据库只保存 `PackageId/PackageHdfsPath/PackageSha256/PackageSize/PackageContentType/PackageFormatVersion/PackageUploadedAt`。`IsPublic` 历史空值按公开兼容,但所有新建应用必须显式落为 `1/0`。
138
186
  - 发布顺序必须是“UTF-8 JSON 上传 → HDFS 回读 → 字节数和 SHA-256 一致 → 写入不可变包索引及商城指针 → 以原值 CAS 清空 `AppPakcet`”。普通发布不得仅凭 Redis 命中跳过 HDFS 回读;只有受控历史压缩可复用内容寻址缓存,安装端仍必须独立下载并校验。公开包可通过 FileServer/CDN 公有地址读取;私有包只能由来源后端在当前授权身份下签发短期下载地址,Token、签名 URL 和包正文不得进入浏览器配置、日志或后台任务参数。
139
187
  - `mic_data_version` 历史快照保留不可变 `StoreVersionId` 和同一组包指针,因此旧版本仍可精确安装,不再要求 `Data` 内含完整 JSON。导入器先校验快照版本/应用身份,再按指针下载并在解析前核对大小与哈希;指针缺失时才回退旧版内联字段,禁止快照不匹配时退回当前版本。
@@ -183,7 +231,11 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
183
231
  ## 版本与回滚
184
232
 
185
233
  - 版本号单调递增,保存变更清单和前后哈希。
186
- - 公有发布必须同时保留两套入口:`/{OsClient}/ai-app-publish/{AppKey}/index.html` 永远指向最新版,`.../versions/{Version}/index.html` 永远保留该历史版本。先完整上传并逐字节验签不可变版本目录,再切换稳定入口。带 `data-microi-immutable-runtime` 的新入口通过版本目录解析全部资源,可先切换入口;旧入口仍在其它稳定资产之后切换。不能机械固定“入口永远最后”而破坏两种契约。
234
+ - 官方 Web、UniApp、MicroService 体验路径统一为公有桶对象键 `/{OsClient小写}/micro-app/{AppKey}/index.html`,通过 `https://static.itdos.com` 访问;`/{OsClient小写}/micro-app/{AppKey}/{Version}/index.html` 及同目录资源是不可变历史版本。私有桶按同样相对目录保存最新版与各历史版本的源码;编译包没有源码时明确记为 `NotIncluded`。v3 的 `microi/application-assets/v3/...` 仍可作为内部校验源,但 `/micro-app/v3/tenants/...` API resolver 和旧 `ai-app-publish` 不再作为官方商城体验链接。
235
+ - 发布顺序为完整上传并验证版本目录、复制私有源码快照、提升固定根的非入口资源、最后提升固定 `index.html`。CDN 对所有被覆写的固定路径做精确刷新并回读任务 `Complete`,再从 `static.itdos.com` 回读入口及引用资源,最后更新 `sys_microistore.PreviewUrl/PublicPublishPath`;任一步失败保留旧商城入口并进入可恢复状态。跨版本重发不得覆写历史目录的不同内容。官网列表、详情、二维码和“立即体验”只能展示固定根的 CDN URL,不带版本、请求指纹或缓存绕过参数。
236
+ - v3 数据库中的 `PreviewUrl/PublicPublishPath` 可以保存以 `/` 开头的对象路径,完成态检查依赖此相对值;官网接口和商城工作台使用租户 `FileServer` 生成完整 CDN 体验 URL。展示层修复不得直接改写 v3 记录为绝对 URL。
237
+ - 官方 CDN 凭据按当前租户系统设置 `Integration.Cdn.Aliyun.*`、`Integration.Dns.Aliyun.*`、历史 SaaS `AlidnsKeyId/AlidnsKeySecret` 顺序读取;半配置失败关闭,不静默跳过刷新。阿里云可能把并发 URL 合并为同一任务号,需等待该任务返回的全部 URL 完成并按原始字节哈希回读。批量迁移应按每日刷新配额限速或分日执行。
238
+ - 旧版对象若已丢失,只能从商城编译包、仍可访问的当前体验路由或本地归档取得逐文件匹配冻结清单的原始字节后补齐;哈希或长度不符时拒绝写入。历史版本无法恢复时保留原版本记录和链接并列出待补清单,可独立迁移已完整校验的当前版本,但不得把未恢复的历史目录标为已归档。
187
239
  - stage 前回读并冻结应用的 `CurrentVersion + AppVersion`;finalize 必须同时传 `ExpectedCurrentVersion + ExpectedAppVersion`,在以不可变 AppId 加锁后再次 compare-and-set。缺失前置条件、AppId/AppKey 漂移或旧请求晚到一律失败关闭;重新发布必须重新盘点,不能静默回退。
188
240
  - 新清单发布成功时,同应用 `dist/` 下不再出现的 active 文件元数据只能条件式改为可逆归档 scope,条件必须包含 AppId、路径、旧 scope 与版本;禁止删除 HDFS/数据库记录,也不得触碰 Private、非 `dist/` 或另一应用的行。
189
241
  - 官网、二维码和用户分享只使用无版本号根入口,不追加 `v/apiBase/OsClient`。目标租户的 `ApiBase/OsClient` 在发布或安装时写入入口 HTML 的 `window.__MICROI_APP_CONTEXT__ / MICROI_API_BASE / MICROI_OS_CLIENT`;安装包不得沿用发布端运行上下文。
@@ -251,7 +303,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
251
303
 
252
304
  ## 复盘:官网升级资源同步的三道门
253
305
 
254
- - 重型发布门禁之前先运行 `node Microi.Server/Microi.Upgrade/Resource/refresh-resources.mjs --validate-only`:该入口只校验本地全部候选,不联网、不发布、不推进共同基线,且不能与写入参数组合。正式发布仍须通过完整测试、三方同步、精确哈希回读,不能把本地预检当成发布成功。
306
+ - 重型发布门禁之前先运行 `node Microi.Server/OfficialApplications/Resource/refresh-resources.mjs --validate-only`:该入口只校验本地全部候选,不联网、不发布、不推进共同基线,且不能与写入参数组合。正式发布仍须通过完整测试、三方同步、精确哈希回读,不能把本地预检当成发布成功。
255
307
  - 控制面版本使用语义版本最低门槛,并同时严格核对鉴权、行锁、资源哈希、写后回读等能力;禁止把某个旧版本字符串写成唯一合法值。可选功能一旦由包内表或任意入口声明,就必须校验其完整接口闭包及资源策略;不能自动放行未知 Key,也不能只升级版本而缺失实际保护。预检自身必须进入 Node 自动回归,覆盖新版通过、旧版及缺保护失败、半套可选功能失败。
256
308
  - 官网当前资源只是三方合并的一侧,允许暂时落后于本地发布候选。下载阶段只校验固定白名单、稳定资源身份、JSON 可解析性及服务端返回 SHA-256;不能用“必须已包含本地最新功能标记”的规则提前拒绝旧官网,否则会形成“官网不够新所以永远无法发布新版”的循环依赖。
257
309
  - 本地输入和三方合并后的最终候选必须继续执行最低版本、功能标记、内嵌逻辑副本一致性等严格校验;发布成功并按内容哈希回读一致后才能推进 `.resource-sync-base`,不能把放宽读取门误做成放宽发布门。
@@ -355,6 +407,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
355
407
 
356
408
  - 触发场景:同一轮主租户批量任务在不同子租户分别报“数据集目标表尚未创建”“接口引擎写入后 HTTP 状态不一致”“既有菜单 Url 唯一冲突”或“未找到 OsClient”;父任务若在目录阶段对全部目标做有副作用自举,还会让一个坏租户阻断其余已可执行租户。
357
409
  - 包结构闭包:任何 `DataSets.TableName` 都必须由同一包的 `DiyTables + DiyFields + DDLStatements + PhysicalColumns` 完整创建或由显式依赖声明保证先安装,不能只因为官方母库已有该表就省略。契约测试要逐个数据集反向验证目标表、主键、字段和物理 DDL,并在真实缺表旧租户执行首次安装与重复安装。
410
+ - 无 `Type` 的 `TableChild` 是布局入口,通过真实子表和外键展示记录;不得凭控件名推断 `varchar` 物理列。以实时物理目录核对 DDL/PhysicalColumns,历史包虚构布局列只纠正声明,不远端 DROP、不删除控件/子表/数据,实际存在的同名定制物理列保持。官方资源生成器的精确接口列表必须与完整正式母版及当前包闭包一致,重复生成不得静默删除新增接口、正文、鉴权或 Managed/CreateIfMissing 策略;新增字段及索引也须进入真实计数和幂等深比较回归。
358
411
  - 随包固定自动编号:导入器 `v2.9.8` 根据目标 `diy_field.Component=AutoNumber`,仅恢复本次允许写入的显式非空编号,并使用共享事务的最小 `_ForceUpt` 更新和严格回读。`UpsertById` 重装修复旧流水号;`InsertIfMissing` 已有配置保持原编号和值。禁止把包内 `_ForceUpt` 当作可信控制参数,也不能只验证模板存在而不检查其业务检索编号。旧安装器先通过应用商城更新,再重装原不可变应用包;冲突、字段元数据读取失败或回读不一致必须失败回滚。
359
412
  - 配置子表种子不能硬编码官方父记录 Id。`InsertIfMissing` 数据集可声明 `ParentBinding:{Field:'SysConfigId',TableName:'sys_config',MatchField:'IsEnable',MatchValue:1}`,仅在目标端查询恰好一条父记录 Id,先绑定外键再检查冲突。0 条、多条、查询失败或不安全标识立即失败;不能覆盖父配置值。导出器须保留该声明,旧导入器必须先升级,不能忽略绑定后按官方 Id 写入。
360
413
  - 大表物理兼容必须覆盖全部 DDL 路径:`BIT` 不能落入 `varchar` 默认映射,整数显示宽度与纯标签/注释差异不能触发改列;同一个包的字段元数据变化交给物理列阶段统一比较,不能先改再改回。普通标量列仅默认值变化时使用 `ALTER COLUMN ... SET DEFAULT`,移除旧值必须设为 `NULL`,禁止 `DROP DEFAULT` 留下省略字段时触发 1364 的标志;强回读并禁止 COPY 回退。TEXT/BLOB 的缺失默认标志只能保留完整定义执行 `MODIFY COLUMN` 修复,不能用不支持的 `ALTER COLUMN SET DEFAULT NULL`。空字符串默认值不等同于 NULL。安装器时间辅助必须自包含,应用文件落库等新增分支也不得直接依赖租户的 DateNow。
@@ -387,6 +440,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
387
440
  - 根因:把平台运行依赖维护成手写短清单,并只复制 SaaS 单包;接口之间的 `V8.ApiEngine.Run` 依赖、其它官方平台应用和个性化 Hook 没有进入同一闭包,旧数据库也没有可靠的启动前自愈与逐项回读。
388
441
  - 强制规则:启动前接口闭包必须由全部内置官方平台应用包动态计算,并递归解析接口调用;当前官方基线为 9 个包、106 个接口(98 个 `Managed`、8 个 `CreateIfMissing`),数量只是发布快照,运行逻辑不得硬编码。门禁逐项校验 Key、地址、启用状态、匿名/HTTP 状态和源码策略;缺失时从受信内置包按原所有权补齐,所有项严格回读成功后才对外提供流量。`CreateIfMissing` 首次创建后永不覆盖客户代码。
389
442
  - 控制面自举:官方资源发布必须先保证 `get-microi-upgrade-resource` 自身达到当前协议,再发布其它包;若控制面旧版本不能校验新包,先只发布并回读这一项,刷新动态路由缓存后再发布剩余资源。发布响应超时或 Redis 广播失败时先按资源 SHA 回读判断提交/回滚,禁止盲目重放。
443
+ - 独立系统日志包的接口投影使用 `ReconcilePublishedApiEngines` 与显式 `ProjectionScope: 'SystemLog'`,仅允许单一 `app.microi.sys-log.json`,且包内 `PackageInfo.AppId` 必须为 `app.microi.sys-log`、`ExpectedSha256` 必须等于已发布完整包摘要。默认九包全量规则保持不变;未知范围、其它文件或部分九包选择都应拒绝。仍须执行官方鉴权、事务行锁、Managed/CreateIfMissing 规则及完整回读,不能将母版投影当作客户已安装。
390
444
  - 兼容与验收:历史 Controller 回退不能再转调可能缺失的同一个接口引擎;保留旧路由时必须使用可信 Core 原子或明确返回可诊断兼容结果。自动化测试应扫描 PC、UniApp、内置应用包和接口源码的全部 `/apiengine/` 与 `V8.ApiEngine.Run` 引用,证明每个依赖由官方包声明;真实启动必须对每个启用租户输出开始、缺项、修复、逐项成功及最终汇总日志,并同时验证匿名、登录态、商城批量计划和重复启动幂等。
391
445
 
392
446
  跨租户安装验收必须检查 `sys_microiservice.MsUrl`:受托管文件运行时的入口必须使用目标租户与目标 AppKey;数据库运行时保留 `db`,显式外部运行时保留外部地址。源码摘要与编译资源摘要仍需独立回读。
@@ -26,16 +26,17 @@ Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任
26
26
 
27
27
  ### 执行日志与只读诊断
28
28
 
29
- - 新执行/失败/跳过记录使用 `ScheduleExecutionLog` 进入系统日志队列,落入 `sys_log_<tenant>/log_yyyyMM`;固定 `TargetType=ScheduledJob`、`TargetId=JobName`,`EventId` 幂等重放。日志队列失败不得改变业务结果,不再回写关系库日志表。
29
+ - 新执行/失败/跳过记录使用 `ScheduleExecutionLog`,直接等待 MongoDB 确认写入 `sys_log_<tenant>/log_yyyyMM`;固定 `TargetType=ScheduledJob`、`TargetId=JobName`,`EventId` 幂等。MongoDB 确认失败才写当前租户的 `diy_schedule_job_log`,两者均失败不得改变业务结果。`AddSysLog` 仅代表异步入队,不能用作本能力的持久化确认。
30
30
  - 表单使用字段级 Tabs,分别放置“运行日志”和“历史日志”只读表格;仅显示的页签发起查询。历史 `diy_schedule_job_log` 保留,不自动删除、搬迁或清空。
31
31
  - `platform-schedule-job` 的 `logs/historylogs` 要求任务名、月份,每页最多 100 条,按时间+Id 游标多取一条判断 `HasMore`,不计算多年数据总数。Mongo 索引为 `(TargetType,TargetId,CreateTime,EventId)`;历史表索引 `(JobName,CreateTime,Id)` 通过声明式应用包交付并现场回读。
32
32
  - 用 `microi_query_job_runtime` 或 `microi_run_engine` 的 `Action=diagnostics` 核验启动、待机、实际执行数、领取进展、设置读取失败、触发器与心跳。一个租户的设置读取超时只能关闭该租户,不能拖住其它租户;每租户最多一个在途读,不能按轮询叠加请求。
33
- - MongoDB 连接或协议不兼容必须显示查询失败,不能伪装为空日志;先验证目标 Mongo 与驱动兼容。镜像更新不等于 Mongo 升级,队列接受不等于日志已持久化,spool 应在持久卷并验收恢复重放。
33
+ - `logs` 优先读 MongoDB,MongoDB 查询失败时自动读关系库;成功的空集合不回退。`historylogs` 固定读关系库。两个库都不可用必须显示查询失败,不能伪装为空日志。镜像更新不等于 Mongo 升级;后台系统日志队列的 spool 仍应在持久卷并验收恢复重放。
34
34
 
35
35
  ### 运行时间刷新与配置版本分离
36
36
 
37
37
  - Quartz 周期同步 `LastTime/NextTime` 是运行状态投影,不能调用通用 `UptFormData` 生成配置版本或数据日志;用户保存名称、Cron、代码等配置仍走原表单事件和版本链路。
38
38
  - 只读取 Id、任务名和两个时间列;时间未变化时不写入。变化时由可信调度内核向同一租户主库执行固定两列参数化 CAS,匹配原时间、任务名、正常状态与未删除条件;并发/陈旧结果命中 0 行时不重放。
39
+ - 编辑 Cron 重建触发器后,Quartz 的 PreviousFireTime 可能为空;同步时不得因此清空数据库已有的 `LastTime`,新的 `NextTime` 仍应更新。验收需覆盖“已执行任务改到当天已过时间,下一次排到次日”的场景,并分别核对新旧执行日志。
39
40
  - 历史版本保留不自动删除。持续高 CPU 时核对 `mic_data_version` 实际物理索引,不以应用包已声明索引推断旧库已安装;用 MCP 回读 `(TableId,TableRowId,CreateTime)`,并比较 MySQL digest 两次采样的执行数、扫描行数与耗时差值。
40
41
  - 此修复要求更新调度后端;既有 `platform-schedule-job`、任务元数据及 MCP 查询/保存协议保持兼容。验收覆盖两租户同名任务、两连接竞争、未变化、暂停/软删除/重命名后陈旧写入、主库选择和配置字段不变。
41
42
 
@@ -45,7 +46,7 @@ Quartz 管理能力包含查询、添加、更新、暂停、恢复、删除任
45
46
  - 开启时在 Quartz 领取触发器、处理 Misfire 之前按租户过滤;领取后、真正触发前重新读取系统设置缓存。禁止仅在 `IJob.Execute`、Listener veto 或业务 V8 入口 return:共享 Quartz 可能已经推进 NextFireTime,造成旧版漏执行。
46
47
  - 集群故障恢复也不得清理停用租户的在途记录或创建其补偿触发器。Quartz 以故障节点为单位清理记录,所以同一故障节点混有被停用租户时,新版推迟该故障节点整组恢复,交给旧节点或关闭开关后处理;其它健康节点仍正常领取。
47
48
  - 正常保存系统设置在事务提交后失效缓存,下一次调度检查生效,不用重启;不是强制中断,已经开始的任务允许完成。缓存/配置读取失败拒绝该租户的新领取,不影响其它健康租户;Redis/失效通知异常时不能承诺硬实时。
48
- - 停用期间只读观察周期计划,不推进共享触发器;每个“租户 + Job + Trigger + 计划时间”向 Mongo 日志队列提交确定性事件,包含 `Status=Skipped`、`Executed=false`、`Reason=SystemTaskSchedulingDisabled` 和中文说明。Redis 原子预留与 Mongo 确定性主键共同防止多新版节点重复记录;日志说明仅代表新版未执行,旧版仍可能正常执行。不补跑业务、不补写进程停机历史;新增/修改计划的日志目录最多约 10 秒更新。
49
+ - 停用期间只读观察周期计划,不推进共享触发器;每个“租户 + Job + Trigger + 计划时间”持久化确定性事件,包含 `Status=Skipped`、`Executed=false`、`Reason=SystemTaskSchedulingDisabled` 和中文说明。Redis 原子预留与日志确定性主键共同防止多新版节点重复记录;日志说明仅代表新版未执行,旧版仍可能正常执行。不补跑业务、不补写进程停机历史;新增/修改计划的日志目录最多约 10 秒更新。
49
50
  - 普通接口调用、MQ 消费、升级/应用安装等持久后台任务不属于此开关的范围。手动触发 Quartz 任务仍经过门禁。
50
51
  - 交付顺序:先安装字段并打开开关,再让新版节点参与调度;确认旧版所有调度进程已停止且在途任务完成后,关闭开关交接。不同业务库分别设置,不能用一个租户的值控制全部租户。
51
52
  - 验收至少覆盖:默认兼容、开关实时读取、租户隔离、共享库旧节点继续领取、领取后开关变化不推进触发器、Misfire 不误推进、多节点日志去重;不得在真实生产任务上制造副作用做测试。
@@ -132,9 +132,10 @@ await V8.Notification.MarkRead({ All: true });
132
132
  - `Users` 面向当前租户用户,`Tenants` 仅允许主租户选择当前环境和网络的启用子租户,`Editions` 仅由宿主现有 License 发放判断确定官方身份。官方选项需明确选择 `OpenSource / Personal / Enterprise`,不得默认给全部版本发送。请求中的用户、租户、官方标志和产品版本不构成授权。
133
133
  - 试用提醒只绑定一个子租户,配置到期时间和提前分钟数,不改 License。所有提醒都必须有有效结束时间,支持 `Once / EveryEntry / AfterServerRestart`;定时支持一次、每日、每周和分钟间隔。每日/每周是固定时间间隔;时间传 UTC,界面显示浏览器时区;恢复上线不补弹所有历史周期。
134
134
  - 后端三个 Managed Key 为 `platform-reminder-runtime / platform-reminder-official-feed / platform-reminder-tick`。运行时动作包括 `Capabilities / Recipients / List / Get / Validate / Save / Publish / Withdraw / History / Inbox / Presented / Acknowledge`。发布需草稿 Id、`ExpectedRevision` 和稳定 `RequestId`;每次进入模式的收件箱和回执需稳定的本页面 `EntryId`。
135
- - `AccountScope=SuperAdmins` 由接收服务的真实 DiyToken、数据库用户 Level >= 9999 和有效本地角色核验,不限 admin;`AllAccounts` 面向全部帐号。缺省字段保留旧公告的全部帐号语义;新 UI 和 MCP 的跨租户/版本默认范围为超级管理员。普通服务器不能伪造官方 License 发放身份。
135
+ - `AccountScope=SuperAdmins` 的提醒接收资格由接收服务的真实 DiyToken 与主库有效用户 Level >= 9999 双重核验,不限 admin 或指定角色;配置写权限继续额外核验有效管理员角色。`AllAccounts` 面向全部帐号。缺省字段保留旧公告的全部帐号语义;新 UI 和 MCP 的跨租户/版本默认范围为超级管理员。普通服务器不能伪造官方 License 发放身份。
136
136
  - 自动授权提醒通过 `LicensePolicyGet/LicensePolicyValidate/LicensePolicySave` 配置,`ScopeType=Editions` 仅官方,`Tenants` 仅主租户。Policy 为 `{Personal:{AdvanceDays:7,Content:''},Enterprise:{AdvanceDays:7,Content:''}}`,天数 1–3650;空文案回退默认,支持 `{版本}/{到期时间}/{倒计时}`,分钟倒计时总会保留。保存携带 ExpectedRevision(首次 0)并回读,不通过普通公告 Save/Withdraw 修改策略。MCP 复用 get_notification_context(recipientScope)和 manage_system_reminder(scopeType、policy),确认串 `LicensePolicySave:<scopeType>`。
137
137
  - 接收端先检查固定官方源,再独立检查主租户对子租户的授权提醒。签名期限、子租户期限和超级管理员身份只接受宿主可信上下文;每次真实登录分别去重,未确认刷新继续出现,站内“查看授权”不能写确认回执。右上角版本标签固定在不足 7 天时显示秒级倒计时。验收覆盖两层同时触发、各自确认、30 天配置、空默认与非 admin 管理员。
138
+ - 开源版无付费到期日;`DateTime.MinValue`(`0001-01-01`)不是已到期授权,不得生成“系统授权已到期”提醒或按付费版向官方源请求。官方 OpenSource 欢迎公告沿用已发布的 `Editions + OpenSource + SuperAdmins + AfterServerRestart` 规则,不另建硬编码弹窗;每名有效 `Level >= 9999` 帐号分别领取、确认,同批次不重复,下次 API 进程启动批次重新领取。真实已验签且有有效日期的付费合同到期后,仍保留其付费到期提醒。
138
139
  - `AfterServerRestart` 用可信后端进程启动标识和主租户当前运行分区的共享 Redis 最新批次计算 occurrence,`Presented` 按数据库稳定回执主键抢占领取资格;同帐号多页面只有一个领取,刷新和重新登录不再次弹出。展示成功前回执应已持久化;响应丢失以同一个页面 `EntryId` 恢复,不以 localStorage 作为事实源。`ShownAt` 与 `ClosedAt` 分离,当前已领取弹窗需保留到关闭、撤回或过期。
139
140
  - 超级管理员范围和重启频率的最低接收协议为 2;官方 feed 必须对协议 1 隐去此类公告,接收端出缓存后再次按当前身份裁剪。未知范围、异常协议或无法核验的启动批次失败关闭。重启频率不能再叠加周期计划;多节点滚动发布采用共享最新启动批次,验证负载切换不回退、不重复。
140
141
  - 定时任务 `platform-reminder-tick` 每分钟只发送唤醒信号;权威计划与回执保存在数据库。前端监听 `ReceivePlatformReminder` 后回读,SignalR 正常约 60 秒对账、断线约 15 秒轮询并对错误退避;关闭失败重试、撤回和过期收回,禁止使用本机定时器或 localStorage 作为已读事实源。
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: microi
3
+ description: Microi吾码快捷入口。连接租户、初始化 MCP、调用 V8 接口引擎、设计业务系统、AI 员工、自动化测试与发布时使用。可通过 /microi 调用。
4
+ ---
5
+
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
+
8
+ # Microi吾码
9
+
10
+ 默认使用简体中文。先完整读取同级 `../workspace-conventions/SKILL.md`,完成身份识别与四项同步检查,再完整读取 `../microi-codex/SKILL.md` 并按任务选择同级专项 Skill。
11
+
12
+ 使用已登录的 `microi` CLI/MCP 连接;多连接明确选择 profile,先只读盘点再执行已授权操作。复用当前租户接口引擎、应用商城和现有业务资源,不创建第二套 Token,不把凭据放入命令行、回答或公开产物。
13
+
14
+ 尚未连接时引导用户使用 Microi Agent 功能区的“服务器连接(MCP)”;官方 AI 账号在“Microi吾码 → 账号与资源”登录。工作区初始化后读取该工作区已有规则,不能覆盖客户已有改动。
@@ -88,13 +88,26 @@ UniApp 使用 Vue 3 + TypeScript 的官方 Vite 工具链,并同时遵守 `mic
88
88
  2. 依次执行类型检查、单元测试、生产构建和产物静态扫描。
89
89
  3. 检查 `dist/build` 不含源码、Token、密钥、localhost、source map 或陈旧 chunk。
90
90
  4. 同步私有源码,再流式发布公有构建目录;源码同步失败不得继续发布。发布前回读并冻结应用的 `CurrentVersion` 与 `AppVersion`,stage 只上传不可变版本资产,finalize 必须同时提交 `ExpectedCurrentVersion` 与 `ExpectedAppVersion` 做 compare-and-set;缺一项、状态漂移或回读不一致都停止,不能自动覆盖较新发布。
91
+ - v3 的应用基线、fence、应用行版本及 active/committed 指针是原始请求的不可变事实;stage 后只按回读更新版本行的 `ExpectedVersionRowVersion`。已提交但仍为 `ProjectionPending` 时,先回读版本与应用,保留原 `RequestId / RequestFingerprint / DeliveryBatchId` 和首次 finalize 的应用基线,重放原请求取得幂等完成回执;禁止把提交后的新指针或 fence 拼入旧请求。只有 `Completed=true` 与 CDN 文件完整性回读同时通过,才继续发布安装包。
91
92
  5. 每次创建、修改、升级或重新发布 AI 应用,必须在任何源码同步、stage、finalize 或商城制包之前,为目标精确 `AppVersion` 写入 `sys_microistore_changelog`。日志的 `StoreId / Version / Title / ChangeType / Content / ReleaseTime` 必须完整;发布工具显式传入含义一致且非空的 `changeSummary`,发布后同时回读商城子表与 `mci_ai_app_version.ChangeSummary`。缺日志或版本不一致必须停止发布。
92
- 6. Web/UniApp 使用 `/{OsClient}/ai-app-publish/{AppKey}/index.html`;MicroService 使用 `/micro-app/{OsClient}/{AppKey}/index.html`。不要因技术栈相同而混淆运行类型。
93
- 7. 官网、二维码、分享链接和商城“立即体验”只能使用不含 `/releases/`、`/requests/`、`/versions/` 与语义版本号的稳定当前入口;不得使用 `SharedPublicRuntime.EntryUrl` 或发布结果中的不可变版本 URL。固定入口必须以代理或全屏加载壳保持浏览器地址不变,不能用 30x、`meta refresh` 或 `location.replace` 把地址栏跳到版本产物。
94
- 8. `SharedPublicRuntime.EntryUrl` 和 `/versions/{Version}/index.html` 仅用于历史记录、回滚、摘要校验与审计。回读应用、版本、active 文件清单和 SHA-256;旧清单文件只能可逆归档,不能删除。再分别直接请求稳定当前入口、不可变版本入口及主要 JS/CSS,并断言前者完成加载后地址栏仍不含版本段。
93
+ 6. 官方 Web、UniApp、MicroService 的体验地址统一为 `https://static.itdos.com/{OsClient小写}/micro-app/{AppKey}/index.html`,公有桶对象键与域名后的路径完全一致;不再按运行类型分叉到 `ai-app-publish`,也不把 v3 内部 API resolver 用作公开体验地址。当前版本的全部编译文件写入该应用固定根,历史版本写入同根的 `/{Version}/` 目录;历史目录一旦验证不得覆写成不同字节。
94
+ 7. 同一版本私有源码文件使用相同的租户、应用、版本相对路径写入私有桶;固定根保存最近一次已完成发布的源码。确实不含源码的编译包在包声明中记录 `Source=NotIncluded`,运行时版本的 `SourceSnapshotPath` 保持空值,不得从公有产物伪造源码。先校验完整公有版本与私有源码快照,再提升固定根的非入口资产和 `index.html`;固定入口切换后提交 CDN 精确路径刷新,回读刷新任务终态和公有入口及引用资源,再更新商城 `PreviewUrl/PublicPublishPath`。刷新任务仅提交成功、单个 CDN 节点 200 或本地构建成功都不算完成。
95
+ 8. 官网、二维码、分享链接和商城“立即体验”只使用固定根 `index.html`;版本目录仅供回滚与显式历史预览。CDN 直接读取公有桶对象,不要求其做动态版本解析或反向代理。发布器必须使 HTML 引用的 JS/CSS 在切换时已存在,并验证从 `static.itdos.com` 打开的应用仍把业务 API 请求发往目标租户的 `ApiBase`。
96
+ v3 的 `sys_microistore.PreviewUrl/PublicPublishPath` 和版本 `PreviewUrl` 在数据库内保留以 `/` 开头的对象路径,后端完成态检查会与投影路径逐字比较;官网接口与商城工作台对外展示时使用租户 `FileServer` 转为完整 CDN URL。不得为统一展示直接把这些 v3 内部字段改写成绝对 URL。
97
+ 9. 新的官方 Web、UniApp、MicroService 发布统一使用支持固定 CDN 投影的 v3 目录流式发布;旧 `ai_app_build` 只保留历史兼容和迁移读取,不作为新版本发布入口。目标 API 的 `ApplicationCdnProjectionSupported` 未启用时先部署后端并停止新发布,不回退到 `ai-app-publish`。
98
+ 10. 官方 `static.itdos.com` 的刷新凭据从当前租户后端系统设置 `Integration.Cdn.Aliyun.*` 读取,兼容旧的 `Integration.Dns.Aliyun.*` 与 SaaS `AlidnsKeyId/AlidnsKeySecret`;必须成对配置并具备刷新及任务查询权限。刷新任务可能合并多个 URL 到同一任务号,应以全部任务 `Complete` 和 CDN 文件哈希回读为准;不得仅凭提交成功切换商城入口。批量发布须考虑 CDN 每日刷新配额。
99
+ 11. `SharedPublicRuntime.EntryUrl` 和历史版本目录仅用于历史记录、回滚、摘要校验与审计。回读应用、版本、active 文件清单和 SHA-256;旧清单文件只能可逆归档,不能删除。再分别直接请求稳定当前入口、不可变版本入口及主要 JS/CSS,并断言前者完成加载后地址栏仍不含版本段。
95
100
 
96
101
  ## 完成定义
97
102
 
103
+ ### 真实写入与源码包可执行性
104
+
105
+ - 遇到 Jint 的 CLR 类型解析或程序集缺失,先在目标后端复现。优先调用已公开且经过验证的 `V8.Method` 原子,禁止用 `Math.random` 代替正式随机源;使用 UUID 随机位时必须核对宿主运行时的随机保证、避开固定版本位并使用拒绝采样消除模偏差。
106
+ - 一次业务操作中的 SQL、行锁、请求幂等响应、库存、凭证和审计必须通过同一个 `V8.DbTrans` 执行。仅验证返回失败不足以证明回滚;自动化测试还须回读每类副作用与请求记录,确认没有永久 `Processing` 或部分提交。
107
+ - 领奖码等可逆业务秘密优先使用现有可信宿主的租户/接口绑定保护原子;兼容旧格式时只读旧密钥,不要求新安装租户人工补充未声明配置。真实测试覆盖生成、再次解密、过期、错误码和重复核销。
108
+ - 私有源码 ZIP 中的 `package.json`、lockfile、构建/检查脚本与行为测试必须自包含。下载到独立目录后仍可安装、测试并构建,不得引用开发工作区的父目录脚本或缺失工具链。构建回执绑定候选源码和逐文件产物哈希,任一漂移即失效。
109
+ - 从业务入口登录真实账号,完成首个写操作及整个生命周期;再验证不同身份、撤权、重复请求、并发与刷新恢复。静态截图、模拟登录或合同正则匹配不能替代这些验收。
110
+
98
111
  - `vue-tsc --noEmit`、单元测试和生产构建通过。
99
112
  - 源码、lockfile、Manifest、构建版本和远端文件哈希一致。
100
113
  - 匿名、登录、Token 失效、权限不足、弱网、重连和错误恢复有确定结果。
@@ -14,7 +14,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
14
14
  `SysConfig.HideSystemLicenseVersion` 缺省关闭,标签可点击跳转 `/license`,不能因一次请求失败永久消失。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=9b949c68b0867fc1ecf2e6cb1fd1bec45d22c01ad3be63485e0376d0183d1795 -->
17
+ <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=ea9cdd10772c42cc8202aa50ed3f8bec0a41588b16539b2968f256c7ee05cd3a -->
18
18
  ## 单行文本插槽按钮约定
19
19
 
20
20
  - `diy-input.vue` 的插槽按钮行为存储在 `diy_field.Config.SlotButtonV8Code`。
@@ -27,7 +27,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
27
27
  ---
28
28
 
29
29
  <!-- /microi-progressive:chunk -->
30
- <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=e9667a3a534e09b964c4a11796c003b48edc4093c66ed0c8777aefd4188a4ba8 -->
30
+ <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=83fb9902ca2edddfc8b72de9578f28a6a7df5cadb2626e5ffb0321d62caa0bb0 -->
31
31
  ## 1. 技术栈和源码入口
32
32
 
33
33
  ### 详情评论与代码版本的按需读取
@@ -58,7 +58,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
58
58
  ---
59
59
 
60
60
  <!-- /microi-progressive:chunk -->
61
- <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=9fae6ea3c3b238d5d830f308599d7512d1ed6364cb495d432278ada8680f769e -->
61
+ <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=794b802f6d332bf124d4b3e1c92e68b785299f4ef5d5b4f58e00ce84bb69488c -->
62
62
  ## 2. 表单引擎三层结构
63
63
 
64
64
  ### 模块级跨端视图
@@ -155,6 +155,11 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
155
155
 
156
156
  ### 用户级界面偏好(强制)
157
157
 
158
+ 右上角主题设置的边角风格默认圆角;已安装 `sys_user.CornerStyle` 时从账号偏好恢复,旧租户才使用浏览器本地兼容值。根元素 `data-mci-corner-style` 控制全局角半径,覆盖动态挂载的 Element Plus 弹层。顶栏入口统一使用 40px 触控区域和 20px 图标,AI 入口使用图标组件,不使用图片。模块 `HideTableBanner`、`HideFormBanner` 只在值明确为 `1/true` 时隐藏对应 Banner,并跳过其专属统计请求;未安装开关字段的旧菜单继续显示。
159
+
160
+ - 边角风格先读取当前用户 `CornerStyle`:`round/square` 显式覆盖;空值或 `System` 继承租户 `sys_config.CornerStyle`,租户空值默认为圆角。不得把空个人值提前归一为 `round`,否则会阻断租户直角设置。
161
+ - 桌面经典布局使用 `NavigationLayout=Side/Top`,个人空值或 `System` 继承租户,租户空值为侧边导航。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。右上角同时配置 `MenuChildExpandMode=System/Down/Right`,通过同一个个人偏好接口跨设备保存。
162
+ - 桌面壳层使用视口高度与可收缩的 flex 内容区,只有路由内容滚动,导航和 Tab 不随页面滚动;移动端仍保留文档滚动。用户入口含头像与姓名,不能使用纯图标的固定 flex 宽度;异步图表须在真实 DOM 挂载后观察尺寸变化,避免侧边/顶部导航切换后撑破卡片。
158
163
  - 主题色、浅色/深色、菜单子级展开方式等需要“换设备仍生效”的选择必须保存到当前 DiyToken 用户的 `sys_user` 白名单字段;`localStorage` 只作为未安装新字段租户和匿名启动阶段的兼容回退,不能作为跨设备事实源。
159
164
  - 已安装用户偏好字段时优先级固定为“当前用户显式值 → 租户 `sys_config` → 平台安全默认”;个人菜单值 `System` 表示继承租户配置。不得让上一位用户的浏览器本地主题覆盖下一位已登录用户。
160
165
  - 自助保存优先使用官方 `Managed` 接口引擎,由 `V8.CurrentUser.Id` 与 `V8.OsClient` 推导用户和租户,并在服务端构造固定白名单更新对象;接口参数禁止决定目标 Id/OsClient,也禁止写入 Account、Phone、Tenant、Dept、Role、Level、State、Pwd、认证因子和登录审计字段。只有缺少可复用可信原子能力时才新增 C# DTO/端点。保存成功后调用 `V8.Method.RefreshLoginUser` 刷新登录缓存,并让微服务宿主重新同步 `CurrentUser`。
@@ -163,7 +168,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
163
168
  ---
164
169
 
165
170
  <!-- /microi-progressive:chunk -->
166
- <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=a3e2b822a3c2aacea83d3cae796132786e3be45f3a18ceb621c477b6bd1a2442 -->
171
+ <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=301f766dc1ab1c6b021aa861a76b44844905d432393ab407472f58f00d6283cd -->
167
172
  ## 4. 工作流与表单提交
168
173
 
169
174
  工作流相关文件:
@@ -185,7 +190,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
185
190
  ---
186
191
 
187
192
  <!-- /microi-progressive:chunk -->
188
- <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=174028eca01dc0987236803041ab5ac1bf18705a6609a4ba640df0c553533c1e -->
193
+ <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=525059f87aac3236d8bfa5d7bbc3fd461618754ca3aa5fe4d7d5c133cfdffb5d -->
189
194
  ## 7. 验证建议
190
195
 
191
196
  ### 本地 ApiBase 与 OsClient 解析(强制)
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=2c4c3f197bcd921d147b892cb64ccd1b77461f67c0219cfc3107ec6c7c268d88 -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=189ca6438cd0fc58a5bf14bd13a3bad26a9254c766e4a6bed62ef2aeb1879e9d -->
6
6
  ## 3. 动态按钮系统
7
7
 
8
8
  按钮配置来自 `sys_menu`:
@@ -45,7 +45,7 @@ V8.Result = V8.Form.Status == '待审核';
45
45
  ---
46
46
 
47
47
  <!-- /microi-progressive:chunk -->
48
- <!-- microi-progressive:chunk id=microi-client-frontend-006 sha256=e92ec7faad68c55a2175580e301c0b2b6a63b90e8e7edba48b8b0073ae53c807 -->
48
+ <!-- microi-progressive:chunk id=microi-client-frontend-006 sha256=b5d89b5a0b17ffb02579d4512b15468e52b599ddf4573afba85b9e5d3f9f5d49 -->
49
49
  ## 5. 路由与打开方式
50
50
 
51
51
  登录首页支持“用户 > 系统 > 首个可访问菜单”的三级优先级:
@@ -114,7 +114,7 @@ Page 模式要特别注意:
114
114
  ---
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=microi-client-frontend-007 sha256=fa5d43239311945bd4a004763c0a6fa5295113b24965a73849e0f09d7b73d393 -->
117
+ <!-- microi-progressive:chunk id=microi-client-frontend-007 sha256=573d988999f9721cf7efe7654c203342213728b4f1ce61a718b10815595ae894 -->
118
118
  ## 6. 修改前必查清单
119
119
 
120
120
  ### `diy-table` 嵌入分页条数