@microi.net/cli 5.2.6 → 5.2.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 (47) 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 +59 -59
  10. package/scripts/microi-cli.js +15 -0
  11. package/scripts/microi-skills.meta.json +218 -218
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +93 -93
  14. package/skills/ai-engine/SKILL.md +1 -1
  15. package/skills/app-store/SKILL.md +13 -9
  16. package/skills/microi-client-frontend/SKILL.md +1 -1
  17. 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 +1 -1
  18. 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 +2 -2
  19. package/skills/microi-docs-coverage/references/capability-map.md +2 -1
  20. package/skills/microi-form-layout/SKILL.md +6 -6
  21. package/skills/microi-frontend-sdk/SKILL.md +6 -6
  22. package/skills/microi-sso/SKILL.md +1 -1
  23. package/skills/microi-sso/references/acceptance.md +1 -1
  24. package/skills/microi-sso/references/configuration-and-security.md +1 -1
  25. package/skills/microi-system-delivery/SKILL.md +2 -2
  26. 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
  27. package/skills/microi.v8.js +1 -1
  28. package/skills/system-observability/SKILL.md +25 -7
  29. package/skills/translate-engine/SKILL.md +3 -0
  30. package/skills/ui-design/SKILL.md +1 -1
  31. package/skills/v8-api-config/SKILL.md +31 -9
  32. package/skills/v8-cache-pattern/SKILL.md +304 -289
  33. package/skills/v8-file-upload/SKILL.md +3 -3
  34. 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 +1 -1
  35. package/skills/v8-menu-buttons/SKILL.md +1 -1
  36. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +1 -1
  37. package/skills/v8-mq-mqtt/SKILL.md +130 -109
  38. package/skills/v8-mq-mqtt/references/mqtt-production.md +3 -2
  39. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +14 -16
  40. package/skills/v8-security/SKILL.md +7 -5
  41. package/skills/v8-table-event/SKILL.md +1 -1
  42. 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 +1 -1
  43. package/skills/v8-utilities/SKILL.md +1 -1
  44. package/skills/v8-utilities/references/platform-http-routes.md +4 -2
  45. package/skills/v8-utilities/references/server-api-index.md +6 -3
  46. package/skills/v8-workflow/SKILL.md +1 -1
  47. package/skills/workspace-conventions/SKILL.md +1 -1
@@ -149,7 +149,7 @@ Microi 的 AI 应用与应用商城只有一个主数据源:`sys_microistore`
149
149
  - 同一份 ApiKey/Token 摘要在 Overview 与 AI 页面复用同一个组件;Token 额度统一展示“总量/Total”,不要把总量写成“赠送”。复制密钥必须有明确成功或失败提示,并提供 Clipboard API 不可用时的兼容复制。
150
150
 
151
151
  <!-- /microi-progressive:chunk -->
152
- <!-- microi-progressive:chunk id=microi-client-frontend-013 sha256=41c4bd99de48ccd402eb1d2dc551cf19a4472abce542b7904bf7ee61bdd43f0a -->
152
+ <!-- microi-progressive:chunk id=microi-client-frontend-013 sha256=8f876b46e20dce5020e17f87ac6f9acfb37c908ab27f7c9568d59e9e7a00d3b2 -->
153
153
  ## 浏览器访问密钥路由
154
154
 
155
155
  - 固定看板免登录使用常量匿名路由 `/access-login`,密钥使用 `microi_ak_` 前缀,完整链接格式为 `{Microi.Client前端WebBase}/?OsClient={当前租户}#/access-login?access_key={密钥}&redirect={encodeURIComponent后的站内Hash路由}`。例如目标路由 `/mic/data-dashboard/preview/01KK988A0YPHKAM8SF216917HX` 必须生成 `redirect=%2Fmic%2Fdata-dashboard%2Fpreview%2F01KK988A0YPHKAM8SF216917HX`。生成器只复制当前 `OsClient`,不能把其它页面查询参数带进凭据链接,也不能把 API Server 当成前端 WebBase。
@@ -159,7 +159,7 @@ Microi 的 AI 应用与应用商城只有一个主数据源:`sys_microistore`
159
159
  - 兑换通过 `POST /api/SysUserAccessKey/Exchange` 的 JSON Body 完成。响应头中的短期 Token 继续交给平台统一请求层保存和轮换。
160
160
  - 创建界面默认按页面名称勾选,也支持粘贴完整页面网址自动解析;不能要求普通用户手写路由和物理表名。页面/数据均可选择“全部已授权”,内部值为 `*`,含义只是取消密钥层二次白名单,仍与目标帐号实时菜单、表单和行权限取交集。接口引擎与数据源引擎 Key 仍必须准确选择。
161
161
  - `_AccessKeySession=true` 且页面为准确白名单时只允许清单路径;页面范围为 `*` 时才加载目标帐号实时可用的动态路由,以便全部已授权菜单可访问。该前端限制只是体验和泄露面收窄,服务端仍必须校验 API、表和引擎权限。
162
- - 全部页面模式会调用 `/api/SysMenu/GetSysMenuStep`,服务端只能在 `page:open + AllowedRoutes=*` 时放行;准确页面模式不得为了省事请求完整菜单树。页面渲染过程中使用 `FormEngineKey`、`TableId`、`ModuleEngineKey` 或 `_SysMenuId` 的请求都必须能被服务端映射到同一份表范围,不能通过换参数名绕过,也不能把合法的菜单 Id 请求误判为缺少表引用。
162
+ - 全部页面模式会调用 `/apiengine/platform-sys-menu?Action=GetSysMenuStep`,服务端只能在 `page:open + AllowedRoutes=*` 时放行;准确页面模式不得为了省事请求完整菜单树。页面渲染过程中使用 `FormEngineKey`、`TableId`、`ModuleEngineKey` 或 `_SysMenuId` 的请求都必须能被服务端映射到同一份表范围,不能通过换参数名绕过,也不能把合法的菜单 Id 请求误判为缺少表引用。
163
163
  - 列表和表单会把表 Key 或菜单 Id 放进动态友好地址,例如 `/api/FormEngine/GetTableData-{table-key}` 和 `/api/FormEngine/GetFormData-{table-key}`。访问密钥服务端必须先把这些地址归一化为标准 action,再按 `form:read/form:write` 对 URL 后缀与请求体中的表/菜单引用做一致性校验,并把菜单 Id 映射回绑定的 `DiyTableId` 校验数据范围;不能要求前端为了密钥会话退回另一套 URL,也不能对整个 `FormEngine` Controller 无条件放行。
164
164
  - 不要因为底层帐号是管理员而在访问密钥会话展示控制面入口或触发控制面预加载。`_AccessKeySession=true` 时,密码显示、密钥管理、表/字段/菜单设计、缓存/服务器管理、查看或踢出其它终端等功能必须保持不可用;后台任务中心最多读取和管理当前用户自己的任务。
165
165
  - `/access-login` 必须在普通 SSO 发现之前直接放行,兑换最多等待 20 秒并给出明确错误,不能让页面永久停在“正在自动登录”。
@@ -40,6 +40,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
40
40
  | `system-engine/app-store.md` | app-store | 应用包、安装、升级和回滚 |
41
41
  | `system-engine/databases.md` | dos-orm, v8-sql-query, microi-deployment | 扩展数据库与迁移 |
42
42
  | `system-engine/datasource-engine.md` | datasource-engine | 数据源定义、执行和供数 |
43
+ | `system-engine/cache.md` | v8-cache-pattern, v8-saas-multi-tenant | L1/L2 架构、租户 Redis、Pub/Sub 失效、V8 安全代理与 Redis 管理器 |
43
44
  | `system-engine/file-manage.md` | v8-file-upload, microi-client-frontend | 文件柜、公私桶管理、在线预览、回收站、跨平台与 MinIO 同步 |
44
45
  | `system-engine/job.md` | job-engine | 调度、后台任务和分布式恢复 |
45
46
  | `system-engine/micro-app.md` | microi-microservice, microi-ai-application | 微服务/AI 前端应用的工程架构与交付 |
@@ -47,7 +48,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
47
48
  | `system-engine/microi-ui.md` | microi-ui | Microi.UI 组件和主题 |
48
49
  | `system-engine/message-notification.md` | message-notification | 平台内部消息、SignalR 与多通道通知 |
49
50
  | `system-engine/module-engine.md` | module-engine, v8-menu-buttons, v8-template-engine, microi-mobile-app-quality | 菜单统计、模块指标、复合列、移动卡片、按钮角标和页面入口 |
50
- | `system-engine/mq.md` | v8-mq-mqtt | RabbitMQ 生产与消费 |
51
+ | `system-engine/mq.md` | v8-mq-mqtt | RabbitMQ 租户连接、队列规范化、事务发布、消费确认、有限重试、幂等与多节点运行 |
51
52
  | `system-engine/mqtt-engine.md` | v8-mq-mqtt | MQTT Broker、SaaS 认证、Topic ACL、V8 事件、设备路由、下行与生产部署 |
52
53
  | `system-engine/page-engine.md` | page-engine | 界面引擎 JSON |
53
54
  | `system-engine/print-engine.md` | print-engine, v8-frontend-events | 服务端模板打印与蓝牙直连边界 |
@@ -33,7 +33,7 @@ Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明
33
33
  - 配置表采用“表级 Tab + Tab 内 CollapseGroup”时,CollapseGroup 必须与成员字段写入同一个 `Tab`,并用连续 `Sort` 保证作用范围在下一个布局节点前结束。发布前必须打开真实编辑表单验证,不能只凭元数据字符串判断布局成功。
34
34
 
35
35
  <!-- microi-progressive:begin -->
36
- <!-- microi-progressive:chunk id=microi-form-layout-000 sha256=cade6a415454aa04f5fcf840e6d9df1323ac9751c0e3c8e1b07b360007413819 -->
36
+ <!-- microi-progressive:chunk id=microi-form-layout-000 sha256=79fcf1787c0fbdbe51363f25fcf72b060b714eed9cbc5593760f9080cff48e31 -->
37
37
  ## 1. 三种分组能力速查
38
38
 
39
39
  | 能力 | 存储位置 | 控件 | 核心作用 | 适用场景 |
@@ -44,7 +44,7 @@ Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明
44
44
  | **D. 不分组(默认平铺)** | 无 | — | 全部字段在第一屏 | 总有效表单行 ≤ 6、没有复杂控件,且没有必须强调的业务分组 |
45
45
 
46
46
  <!-- /microi-progressive:chunk -->
47
- <!-- microi-progressive:chunk id=microi-form-layout-001 sha256=f43f8c6f1c156ef3669f0c1f9a9d9d2cb7baf630d0b0cb2f48307a31f3f82ae2 -->
47
+ <!-- microi-progressive:chunk id=microi-form-layout-001 sha256=eb8f9a306f46484217f8fc6094a7dc8ea1f5315187430329d79fa71134c3b2da -->
48
48
  ## 2. 黄金决策流程(AI 必须按此顺序判断)
49
49
 
50
50
  ### 2.1 先算“有效表单行”,禁止只数字段
@@ -95,7 +95,7 @@ Q1: 核心可见字段数、子表和强任务域?
95
95
  | 工作流审批表(≤10 字段) | D. 不分组 | 禁止使用 Tab |
96
96
 
97
97
  <!-- /microi-progressive:chunk -->
98
- <!-- microi-progressive:chunk id=microi-form-layout-002 sha256=9165f561ba90696ce130d24f71a0e56c521b5f8935eac2ddcffb852f3af5d9b2 -->
98
+ <!-- microi-progressive:chunk id=microi-form-layout-002 sha256=119311f1ec30de83c323a0604c0aefb12676da7c421fc459d1555b0a1a7858d0 -->
99
99
  ## 4. AI 生成表单布局的标准动作
100
100
 
101
101
  ### 4.1 必做顺序
@@ -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=c737fc8b0d488548e5a3de616ff172b8b645553c818fb09e70a196f4e9c0e2ae -->
140
+ <!-- microi-progressive:chunk id=microi-form-layout-003 sha256=02934831afff7bd9065406b074f5780cb5686ccdb63fcb350b8c409dad315c74 -->
141
141
  ## 5. 必填与禁止
142
142
 
143
143
  ### 5.1 必填
@@ -167,7 +167,7 @@ V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.C
167
167
  - ❌ **禁止**用普通新增字段或通用表单数据写入创建布局节点;这类路径可能对目标业务表执行物理 DDL。
168
168
 
169
169
  <!-- /microi-progressive:chunk -->
170
- <!-- microi-progressive:chunk id=microi-form-layout-004 sha256=539ae919554ca9eda5b5a26ac405181f601f4195f6a59baf1fd368d315987e6c -->
170
+ <!-- microi-progressive:chunk id=microi-form-layout-004 sha256=5de749261dec123edd0fc9186188cb90887892490298dad9d6944670457177df -->
171
171
  ## 6. 验收清单
172
172
 
173
173
  修改或新建表单布局后,AI 必须按以下顺序验收:
@@ -188,7 +188,7 @@ V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.C
188
188
  通常跳过这些运行态事件;未完成这一步不得直接判定为 Microi.Client 渲染缺陷。
189
189
 
190
190
  <!-- /microi-progressive:chunk -->
191
- <!-- microi-progressive:chunk id=microi-form-layout-005 sha256=db6759bef83e520e5f137347070f85df1275e14dcbc742bebfdaac4da14be375 -->
191
+ <!-- microi-progressive:chunk id=microi-form-layout-005 sha256=941d45f4389751946df34ec388e28adbbe9965d6ad9f637f48fd35cc6aca5065 -->
192
192
  ## 9. 与其他 Skill 的关系
193
193
 
194
194
  - 字段创建流程:`v8-table-event/SKILL.md` 写 InFormV8 / SubmitFormV8 等。
@@ -10,7 +10,7 @@ description: Microi 前端 SDK 使用规范,适用于 Vue 3、uni-app、H5、P
10
10
  所有 Vue 3 前端项目都应使用 `microi.skills/microi.v8.js` 作为统一的 Microi 前端 SDK。新项目不要复制旧版 Vue2/Vuex 请求封装,也不要重新手写 token、上传、文件 URL、ApiEngine 或 FormEngine 层。
11
11
 
12
12
  <!-- microi-progressive:begin -->
13
- <!-- microi-progressive:chunk id=microi-frontend-sdk-000 sha256=06f944bc009a4e773ae6d5496d435d3e4a4fdb23d59107dac9cedffcfdf18f86 -->
13
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-000 sha256=4b1d4f626b1c4de344339a2fba6b2eaf48e9e5a018c2faa1f7480b90254a4cfb -->
14
14
  ## 必须采用的模式
15
15
 
16
16
  将 SDK 复制到项目源码目录,通常是:
@@ -56,7 +56,7 @@ export function createApp() {
56
56
  页面和业务接口模块应从项目请求模块导入已配置实例或薄封装函数,不要直接从标准 skill 文件导入。
57
57
 
58
58
  <!-- /microi-progressive:chunk -->
59
- <!-- microi-progressive:chunk id=microi-frontend-sdk-001 sha256=f1c2ab1fadc01dbe8ea4b9de98f7c02192c3f2cfed8b792fe62f8ef516b67d83 -->
59
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-001 sha256=c418c6c9e6846d2ce4db04501520036e2c6b0f162c282d6e099e802c9b83f72d -->
60
60
  ## 必须委托 SDK 的能力
61
61
 
62
62
  - `ApiEngine.Run`:直接调用 `/apiengine/{key}` 时使用 `V8.ApiEngine.Run(key, data)`。
@@ -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=5842c30af751f60041e4435efe5c993144a874cb2e9d97c41fb37d1f06d6474e -->
74
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-002 sha256=54b302bfe2a8830a3043ae7804ca775d6159453bea0cfdeac61c3b97d36466ed -->
75
75
  ## 登录与验证码封装
76
76
 
77
77
  SDK 或项目请求模块必须提供登录所需的系统配置和验证码薄封装,不要让页面散落手写。
@@ -120,7 +120,7 @@ AI 生成的前端微服务不能假定永远在主平台 iframe/micro-app 宿
120
120
  - 宿主额外传入 `permissionContext={sysMenuId,moduleEngineKey,diyTableId}`。SDK/服务层需要访问 FormEngine 时使用真实授权 `moduleEngineKey`;该对象不能代替后端权限,也不能成为放宽匿名接口的理由。
121
121
 
122
122
  <!-- /microi-progressive:chunk -->
123
- <!-- microi-progressive:chunk id=microi-frontend-sdk-003 sha256=d5d1984e6cd4efbb2340f984473146c66bb342d60bb571454c457f5673b1c68f -->
123
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-003 sha256=fd0dbc19f767d1b69c41582a99d2c578c2e4ee8c871df89fd67ed054641d1931 -->
124
124
  ## 请求头规则
125
125
 
126
126
  SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业务 wrapper 或上传逻辑各自拼接租户和鉴权头。
@@ -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=c5f546fd4ef770459d42239b40af81d52399a3623340472b703cffe09a7b5d1e -->
135
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-004 sha256=f5644fc45280e53988d1eed432e57afc2c56fc58b1232505950359219b5220d2 -->
136
136
  ## 上传规则
137
137
 
138
138
  `V8.uploadFile` 是 Microi 前端唯一允许的上传入口。SDK 实现必须:
@@ -150,7 +150,7 @@ SDK 的 `buildHeaders` 必须集中处理所有请求头,不能让页面、业
150
150
  当上传突然报 `移动端文件上传路径不合法!` 时,先检查实际 multipart 表单字段和请求头。在 Microi 移动端/会员 Token 流程中,后端会在 HDFS 上传前校验 `Path`;错误的 `Content-Type` 会导致后端读不到表单字段,并表现为路径错误。
151
151
 
152
152
  <!-- /microi-progressive:chunk -->
153
- <!-- microi-progressive:chunk id=microi-frontend-sdk-005 sha256=1a9d0a33adbff849decf01d114e72cad96f80a6122f0b281cecf9092bbcd0c42 -->
153
+ <!-- microi-progressive:chunk id=microi-frontend-sdk-005 sha256=ea5ffc6757b73bb3251b34d26b2902674c3a0c7f5277dcf8745e39ff11fe6b56 -->
154
154
  ## 项目封装规则
155
155
 
156
156
  面向业务页面的函数名要保持稳定。如果已有项目导出 `callEngine`、`formEngineGet`、`getImageUrl`、`parseImages` 或 `uploadFile`,保留这些导出,内部委托给 `V8`。这样既能统一 SDK,又能避免大面积改页面。
@@ -40,7 +40,7 @@ description: 设计、实现、配置、迁移、发布和验收 Microi 吾码
40
40
  7. 外部角色、邮箱或昵称不能直接获得管理员权限。默认 `BoundOnly`,JIT 必须显式默认角色、唯一性、回收和审计。
41
41
  8. HTTP 200、构建成功、商城任务入队或包可下载都不是完整 SSO 验收。
42
42
  9. SSO 业务逻辑必须接口引擎优先:连接投影、绑定/JIT、角色与 Claim 映射、审计、登录完成和租户扩展不得重新写进 Controller。只有协议报文、签名验签、Secret/私钥隔离、一次性票据与 DiyToken 等可信原子可以保留 C#。
43
- 10. 客户端调用应用接口使用稳定 `/api/ApiEngine/Run?OsClient=`;应用未安装时必须得到结构化错误,禁止重新依赖可能由网关缺失而 404 的动态 `/apiengine/*` 或已删除的 `/api/Sso/Capabilities` 等定制路由。
43
+ 10. 客户端调用固定应用接口必须优先使用 `/apiengine/{ApiEngineKey}?OsClient=`,让系统日志/监控按真实接口引擎归因;新版宿主即使接口尚未安装也会返回结构化缺失错误。`/api/ApiEngine/Run` 只保留给无法预知 Key 的旧版兼容调用,禁止新增固定业务依赖;同样禁止调用已删除的 `/api/Sso/Capabilities` 等定制路由。
44
44
 
45
45
  ## 标准工作流
46
46
 
@@ -43,7 +43,7 @@
43
43
 
44
44
  ## 404 与应用缺失回归
45
45
 
46
- - 客户端能力发现和登录完成只允许调用 `/api/ApiEngine/Run?OsClient=`,请求体携带精确 `ApiEngineKey`。
46
+ - 客户端能力发现和登录完成只允许调用 `/apiengine/{ApiEngineKey}?OsClient=`;固定业务不得新增 `/api/ApiEngine/Run` 依赖。
47
47
  - 在未安装 `app.microi.sso` 的租户调用通用入口,应返回结构化“接口引擎不存在”;不能返回 `/api/Sso/Capabilities` 路由 404。
48
48
  - 安装后回读 11 个 `sys_apiengine` 行并刷新缓存,再验证 `sso_capabilities` 为 `Code=1`。
49
49
  - `/api/Sso/Capabilities`、`LegacyCapabilities`、`CompleteLogin`、`RotateClientSecret` 与 `/api/SysUser/SsoPengrui` 必须保持删除,防止业务逻辑重新漂回 Controller。
@@ -12,7 +12,7 @@
12
12
 
13
13
  `diy_sso` 是管理员专用平台表。匿名能力接口只投影 ConnectionKey、名称、协议、图标、说明和发起地址;旧兼容投影只允许同源 `/api/` 路径与安全 Token 参数名。
14
14
 
15
- 匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;Controller 不得直接查询并返回 `diy_sso`。内部协议网关通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端统一调用 `/api/ApiEngine/Run?OsClient=`,避免应用尚未安装或网关未注册动态路由时出现 404。
15
+ 匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;Controller 不得直接查询并返回 `diy_sso`。内部协议网关通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端统一调用 `/apiengine/{ApiEngineKey}?OsClient=`,让观测数据保留真实 Key;新版宿主对未安装引擎返回结构化缺失错误,不再因动态路由尚未注册而直接 404。
16
16
 
17
17
  ## Secret 与证书
18
18
 
@@ -16,7 +16,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
16
16
  模块引擎或 `sys_menu`。逐步建模在字段完成后调用 `microi_configure_form_banner` 回读验收。
17
17
 
18
18
  <!-- microi-progressive:begin -->
19
- <!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=b09c3f2d05e2927322de0c42913f85813296e9001bccf31b6dc85779cbe3099f -->
19
+ <!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=088aaa73360be7d63b64ca476e884371140c7807d118c05f04d87a12de0c7701 -->
20
20
  ## 交付总原则
21
21
 
22
22
  1. **先事实源,后建模**:先读需求文档、截图、现有蓝图、数据库结构和菜单结构,形成业务蓝图;不要边猜边建表、边猜边写接口。
@@ -45,7 +45,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
45
45
  最终回复必须按原始编号逐项汇总:哪些已实现、哪些未实现、是否通过全自动化测试、是否通过截图验证。不能只给总括性“都完成了”。如果某项没有测试或没有截图,必须明说“未覆盖/未截图”,并说明原因。
46
46
 
47
47
  <!-- /microi-progressive:chunk -->
48
- <!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=aa3d244481565608bc92f7c389f8647e8cd551d241aabad9a9d876f1d15aab52 -->
48
+ <!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=5b929c8ab1cf588601fb0e27149ef05893bc5000eecf05e58961c4f785251e31 -->
49
49
  ## 平台安全与存量兼容验收(强制)
50
50
 
51
51
  AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
@@ -7,7 +7,7 @@
7
7
  统计都应来自真实字段或真实接口引擎;配置写 `diy_table`,禁止写入 `sys_menu`。即使用户
8
8
  没有逐项指定,也必须写入类型感知的合理默认值,不能交付空 Banner。
9
9
 
10
- <!-- microi-progressive:chunk id=microi-system-delivery-005 sha256=e27ee98421974395b858927ab7b7fbebe27f314e54a8f616064b9c77c01ba808 -->
10
+ <!-- microi-progressive:chunk id=microi-system-delivery-005 sha256=8e90f8c4618b882000935a83b8ed581ff20c32d9b888f74eb0ace8c39439a46e -->
11
11
  ## 标准工作流
12
12
 
13
13
  ### 1. 需求蓝图阶段
@@ -1510,7 +1510,7 @@ export function createMicroiV8(options = {}) {
1510
1510
  UniappUploadAnonymous: '/api/HDFS/uniappUploadAnonymous',
1511
1511
  GetCurrentUser: '/api/SysUser/getCurrentUser',
1512
1512
  GetDateTimeNow: '/api/os/getDateTimeNow',
1513
- AddSysLog: '/api/SysLog/addSysLog',
1513
+ AddSysLog: '/apiengine/platform-client-log',
1514
1514
  GetOsClientByDomain: '/api/Os/getOsClientByDomain',
1515
1515
  ApiEngine: {}
1516
1516
  };
@@ -39,21 +39,31 @@ AI 第一次使用时先查询 `action=Capabilities`,再按返回的动作、
39
39
  | `AppLogs` | 当前 API 进程日志尾部 | `lines=20..1000` |
40
40
  | `PlatformStats` | 表、菜单、接口引擎、租户、用户和排行 | 无 |
41
41
  | `SecurityData` | 访问、攻击或封锁记录 | `kind=Access|Attack|Block`、分页 |
42
- | `TrafficHistory` | MySQL 固定时间桶流量历史 | `dimensionType`、`hours=1..168`、分页 |
42
+ | `TrafficHistory` | MySQL 固定时间桶流量趋势 | `rangeKey`;可选 `dimensionType` |
43
+ | `HistoricalDashboard` | 同一时间范围内的热点接口、IP、帐号、租户、内容类型与请求/流量总览 | `rangeKey=live5|today|yesterday|3d|7d|15d|30d|3m|6m|1y`、`top` |
44
+ | `TrafficDetails` | 跨月大文件、上传下载和可疑传输 MongoDB 明细 | `rangeKey`、`pageIndex/pageSize`;可选 `keyword/transferAction/ip/userId/endpoint` |
43
45
 
44
46
  示例:
45
47
 
46
48
  ```json
47
49
  {
48
- "action": "TrafficHistory",
49
- "dimensionType": "Endpoint",
50
- "hours": 24,
50
+ "action": "HistoricalDashboard",
51
+ "rangeKey": "30d",
52
+ "top": 15
53
+ }
54
+ ```
55
+
56
+ ```json
57
+ {
58
+ "action": "TrafficDetails",
59
+ "rangeKey": "7d",
60
+ "transferAction": "Upload",
51
61
  "pageIndex": 1,
52
62
  "pageSize": 15
53
63
  }
54
64
  ```
55
65
 
56
- 所有列表默认按 15 条开始;扩大分页前先增加过滤条件。日志和安全数据每页最多 200 条,Trace 与流量历史最多 500 条。不得循环拉取无时间边界的全量日志。
66
+ 所有列表默认按 15 条开始;扩大分页前先增加过滤条件。日志和安全数据每页最多 200 条,Trace 最多 500 条。历史总览由固定聚合桶一次返回有界 TOP,不得循环拉取无时间边界的全量日志。
57
67
 
58
68
  ## 安全治理动作
59
69
 
@@ -73,6 +83,7 @@ UnblockIp:<ip>
73
83
  3. HTTP 可归因流量只统计经过 API 中间件的请求体和响应体。网卡、容器 NetIO 还包含 TLS/HTTP 头、重传、数据库、Redis、MongoDB、MQ、对象存储、外部 HTTP、健康检查和同机其它进程。
74
84
  4. “未归因流量”只能作为排查线索,不能强行归属给某个帐号、IP 或接口。
75
85
  5. IP 必须注明是可信代理解析后的客户端地址还是直接连接地址;代理链未配置正确前不要据此处罚用户。
86
+ 6. 进程 CPU“多核原始值”可超过 100%;247.7% 表示约占用 2.48 个逻辑核心。判断整机压力应使用主机归一值并结合持续时间、请求率与热点排行。
76
87
 
77
88
  ## 隐私与权限
78
89
 
@@ -86,17 +97,24 @@ UnblockIp:<ip>
86
97
 
87
98
  - 请求热路径只做原子计数和有硬上限的分钟桶聚合;端点、IP、帐号、租户、内容类型限制基数并保留 TOP N。
88
99
  - 普通高频明细只保留短窗口内存;错误、慢请求、大文件和可疑传输进入有界队列,异步批量写 MongoDB。
89
- - 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert;页面不能每次扫描 Mongo 明细重新聚合总览。
100
+ - 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert;5 分钟桶保留 48 小时、小时桶保留 45 天、天桶保留 400 天。页面不能每次扫描 Mongo 明细重新聚合总览。
90
101
  - 队列必须有硬容量、故障 spool/WAL、停机排空和幂等重放;禁止无界 `ConcurrentQueue` 或逐请求同步写 Mongo/MySQL。
91
102
  - Redis 适合短时热点结果、租约和限流;缓存 Key 包含租户、动作和过滤摘要,写入或治理后主动失效,并保留短 TTL 防止永久陈旧。
92
103
 
104
+ ## 接口引擎归因规范
105
+
106
+ - PC、UniApp、内置微服务、MCP 和应用包中的固定接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎唯一 `ApiAddress`;新增代码禁止调用 `/api/ApiEngine/Run`。
107
+ - SDK 的普通 `ApiEngine.Run` 必须自动生成真实引擎路径;旧通用入口只能封装在显式 `RunLegacy` 中,供不能立即升级的历史客户端使用。
108
+ - 监控中保留通用入口的兼容识别,但不能依赖读取请求正文才能知道 Key;真实路由、访问日志、限流和流量排行应直接显示接口引擎 Key。
109
+ - 代码审计要区分运行调用与文档/兼容测试;发布门至少扫描 Microi.Client、UniApp、微服务源码、MCP 与应用包,确保没有新增固定业务依赖。
110
+
93
111
  需要压测或修改热路径时同时读取 `../performance-testing/SKILL.md`;排查 V8/日志写法时读取 `../v8-debugging/SKILL.md`。
94
112
 
95
113
  ## AI 诊断顺序
96
114
 
97
115
  1. 先查 `Capabilities`,确认当前版本和边界。
98
116
  2. 查 `Snapshot`,记录节点、窗口、请求率、活动请求、CPU/内存、队列、HTTP 流量与未归因残差。
99
- 3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度,区分“计算慢”与“传输大”。
117
+ 3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度,区分“计算慢”与“传输大”;再用 `TrafficDetails` 定位具体帐号/匿名、IP、接口、文件元数据和 TraceId。
100
118
  4. 按异常接口或 TraceId 查 `Logs`、`Signal`、`Trace`;先处理时间线中的首个根因。
101
119
  5. 对慢 SQL 核对执行计划、索引、返回字段、分页、排序/Join 和锁等待;不要先盲目加 Redis。
102
120
  6. 对高频只读结果评估短 TTL Redis,并明确更新/删除时的失效路径;对写接口先批量化 I/O、缩小事务和消除逐行远程调用。
@@ -7,6 +7,8 @@ description: Microi 翻译引擎与多语言词条规范。用于 V8.TranslateEn
7
7
 
8
8
  # Microi TranslateEngine
9
9
 
10
+ 翻译运行时源码位于开源类库 `Microi.Server/Microi.Translate`,NuGet 包名为 `Microi.Translate`。可复用的供应商、租户隔离、缓存和模型契约必须维护在该类库;闭源 `Microi.net` 只允许保留 License 授权或平台私有装配边界,不能重新复制翻译业务实现。
11
+
10
12
  ## API
11
13
 
12
14
  ```js
@@ -111,6 +113,7 @@ MCP 固定工具:`microi_translate`、`microi_detect_language`、`microi_list_
111
113
 
112
114
  ## 验收清单
113
115
 
116
+ - [ ] `Microi.Translate` 能独立编译、打包并由发布脚本推送 NuGet,`Microi.net/TranslateEngine` 不再残留重复源码
114
117
  - [ ] `Translate` 的 `DosResult` 契约处理正确
115
118
  - [ ] 词条优先,动态翻译只用于动态内容
116
119
  - [ ] 普通租户无法伪造 `OsClient`
@@ -63,7 +63,7 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
63
63
  ---
64
64
 
65
65
  <!-- /microi-progressive:chunk -->
66
- <!-- microi-progressive:chunk id=ui-design-002 sha256=4339d981ddbc6340663729c1bd89f6be9f9215fa1c6768260377b6feaf202505 -->
66
+ <!-- microi-progressive:chunk id=ui-design-002 sha256=0d1bac0d19d61d288a6eb25f18fc15a045bca3df9a01399d5ce5224c8accffd3 -->
67
67
  ## 高端视觉标准
68
68
 
69
69
  - 每个新页面必须有首屏视觉重心:核心数据、主任务、产品/品牌对象或可操作内容应在第一屏明确出现,不能只有说明文字或空白装饰。
@@ -19,7 +19,8 @@ description: Microi V8 接口引擎配置指南。用于设置 ApiEngineKey、Ap
19
19
  | `ParamType` | `form` / `json` / `url` —— 但 V8.Param 都能统一接收 | `Both` |
20
20
  | `IsAnonymous` | 允许匿名调用(无 Token) | `false` |
21
21
  | `StopHttp` | 禁止外部 HTTP 调用(仅允许 V8.ApiEngine.Run 内部调用) | `false` |
22
- | `IsResponseFile` | 是否响应文件(开启后 Data 必须是文件结构) | `false` |
22
+ | `IsResponseFile` | 是否响应文件(开启后 Data 必须是文件结构) | `false` |
23
+ | `ResponseType` | `JSON/String/File/HTML/Stream`;`Stream` 开启 SSE/NDJSON | 自动识别 |
23
24
  | `LockKey` | 分布式锁 Key(同一时刻全集群只能执行一次) | 空 |
24
25
  | `LockTimeout` | 锁超时秒数 | `30` |
25
26
  | `LockMsg` | 加锁失败时返回提示 | `操作过于频繁` |
@@ -35,9 +36,25 @@ description: Microi V8 接口引擎配置指南。用于设置 ApiEngineKey、Ap
35
36
  - 嵌套调用不重复占用全局/租户并发名额,同一调用树重入同 Key 也不会自锁;不同子接口 Key 仍受自己的 Key 并发门保护。
36
37
  - `V8.Limits` 可读取本片有效预算和当前深度。异常优先检查 `DataAppend.V8Limit.Code`,不要看到“2GB”就判断服务器真实吃满 2GB。
37
38
  - 后台任务使用同一执行引擎。总任务可以运行数小时,但单片仍受 `Timeout/MaxStatements/LimitMemory` 约束;超过 10 分钟必须返回 `HasMore + Checkpoint` 分片续跑,不能只把 `Timeout` 调到 1800/3600。
38
- - 接口引擎使用正向 `V8Limit`:默认 `0/false`,不设置当前 Jint Engine 的单次超时、语句、函数递归、累计分配和 Promise 固定等待预算;只有 `1/true` 才应用 `Timeout/MaxStatements/LimitMemory/LimitRecursion`。常驻内存保护、取消令牌、并发、接口嵌套深度、权限沙箱及数据库限制在两种状态下都保留。老 `V8Unlimited` 只作协议兼容;MCP/Manifest 新配置统一写 `v8Limit`。
39
-
40
- ### 通用实时事件(SignalR
39
+ - 接口引擎使用正向 `V8Limit`:默认 `0/false`,不设置当前 Jint Engine 的单次超时、语句、函数递归、累计分配和 Promise 固定等待预算;只有 `1/true` 才应用 `Timeout/MaxStatements/LimitMemory/LimitRecursion`。常驻内存保护、取消令牌、并发、接口嵌套深度、权限沙箱及数据库限制在两种状态下都保留。老 `V8Unlimited` 只作协议兼容;MCP/Manifest 新配置统一写 `v8Limit`。
40
+
41
+ ### 流式响应(ResponseType=Stream
42
+
43
+ ```javascript
44
+ for (var i = 0; i < rows.length; i++) {
45
+ var pushed = await V8.Stream.WriteAsync(rows[i], 'chunk', String(i));
46
+ if (pushed.Code !== 1) return pushed;
47
+ }
48
+ return { Code: 1, Data: { Count: rows.length } };
49
+ ```
50
+
51
+ - 默认协议为 SSE;客户端请求 `Accept: application/x-ndjson` 或 `streamFormat=ndjson` 可使用 NDJSON。
52
+ - `V8.Stream.Write/WriteAsync` 输出的分片统一标记 `Provisional:true`。宿主保留 `open/done/error/heartbeat`,并且只有事务提交后才发送 `done + Committed:true`;收到 `error` 时客户端不得把暂态分片当成已提交数据。
53
+ - 每次写入都要检查 `Code`,客户端断开或超过大小上限后立即停止循环。请求取消会传入当前 Jint 执行链,但不能替代业务幂等和事务。
54
+ - 当前租户在 `sys_osclients` 配置单分片、累计响应和心跳:`ApiEngineStreamMaxChunkKB` 默认 256(4–1024)、`ApiEngineStreamMaxTotalMB` 默认 16(1–256)、`ApiEngineStreamHeartbeatSeconds` 默认 15(5–60)。
55
+ - 流式传输用于在线增量反馈;大型文件走 HDFS/文件响应,可靠长任务走后台任务 + Checkpoint,广播状态走提交后 SignalR。禁止用流式响应绕过这些边界。
56
+
57
+ ### 通用实时事件(SignalR)
41
58
 
42
59
  订单、协作、设备、审批或多人房间需要实时刷新时,业务写命令仍由接口引擎执行并提交事务;成功结果通过 `DataAppend.RealtimeEvent` 声明提交后事件。新业务统一使用通用 v2 Hub `/api-engine-realtime`,不要再新建业务专用 Hub 或把权威状态放进 C# 进程内字典。
43
60
 
@@ -205,11 +222,16 @@ POST /apiengine/{ApiEngineKey}
205
222
  Headers: Content-Type=application/json, osclient={OsClient}, apiengine=1
206
223
  Body: {"Action":"Bootstrap","OsClient":"{OsClient}"}
207
224
 
208
- # 兼容旧入口
209
- POST /api/ApiEngine/Run
210
- Headers: Content-Type=application/json, OsClient={OsClient}
211
- Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
212
- ```
225
+ # 仅用于不能立即升级的旧客户端;新增或可修改代码禁止使用
226
+ POST /api/ApiEngine/Run
227
+ Headers: Content-Type=application/json, OsClient={OsClient}
228
+ Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
229
+ ```
230
+
231
+ 固定业务接口必须调用 `/apiengine/{ApiEngineKey}` 或该引擎配置的唯一
232
+ `ApiAddress`。禁止新增 `/api/ApiEngine/Run` 依赖,否则反向代理、限流、审计和
233
+ 系统日志/监控只能看到同一个通用入口,难以按真实接口引擎准确归因。SDK 只可在
234
+ 显式命名的 `RunLegacy` 兼容方法中保留旧地址,普通 `Run` 必须生成动态地址。
213
235
 
214
236
  复测重点:
215
237