@microi.net/cli 5.8.6 → 5.8.8

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 (27) 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/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/assets/build-meta.json +4 -4
  8. package/cordis.patch.yml +1 -1
  9. package/package.json +1 -1
  10. package/scripts/codex-marketplace.json +20 -20
  11. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  12. package/scripts/mcp-server.js +1 -1
  13. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  14. package/scripts/microi-cli-mcp.js +7 -7
  15. package/scripts/microi-skills.meta.json +206 -206
  16. package/skills/.microi-skills-version.json +2 -2
  17. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  18. package/skills/dos-orm/SKILL.md +4 -2
  19. package/skills/microi-client-frontend/SKILL.md +10 -7
  20. 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
  21. 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 +3 -3
  22. 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
  23. package/skills/microi-codex/SKILL.md +3 -1
  24. package/skills/microi-deployment/SKILL.md +3 -1
  25. package/skills/microi-microservice/SKILL.md +2 -2
  26. package/skills/microi-sso/SKILL.md +7 -1
  27. package/skills/system-observability/SKILL.md +5 -2
@@ -33,8 +33,10 @@ Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
33
33
 
34
34
  - 创建事务、准备读取器、打开连接、提交/回滚及批处理任一路径抛异常,都必须释放本层拥有的连接;借用外部事务或批处理连接时不能擅自关闭。保留原始异常,不因 Dispose 失败遮盖原始错误。
35
35
  - `DbTrans` 提交成功后先归还连接,再执行提交后通知。通知失败不能把已提交事务报告为回滚,也不能自动重放业务 SQL。调用者仍必须使用 `using`,防止业务异常绕过 Commit/Rollback。
36
- - `DatabasePoolExhausted`、`DatabaseCapacityExceeded`、`DatabaseEndpointUnreachable` 是不同故障;不要把应用池等待、数据库全局连接限制和慢 SQL 混为一谈。
37
- - 可信 C# 宿主通过 `Database.GetConnectionPoolSnapshot()` 读取脱敏状态,`ResetConnectionPool()` 只轮换准确匹配的 MySQL/SQL Server 池,`ProbeConnectionPoolAsync` 用原池执行固定 `SELECT 1`。不使用 `ClearAllPools`,不杀借出的事务,不重放 SQL。
36
+ - `DatabasePoolExhausted`、`DatabaseCapacityExceeded`、`DatabaseEndpointUnreachable` 是不同故障;不要把应用池等待、数据库全局连接限制和慢 SQL 混为一谈。
37
+ - 平台未显式配置的 MySQL 业务池上限为 100,最小池保持驱动默认 0,连接串显式值优先;不得因为数据库拒绝连接自动放大池。每节点/租户、独立读写池、Quartz 与外部客户端的容量须合计并保留管理余量。`Connection Lifetime` 是归还时按创建时间淘汰,不能当空闲超时。
38
+ - 可信 C# 宿主通过 `Database.GetConnectionPoolSnapshot()` 读取脱敏状态,`ResetConnectionPool()` 只轮换准确匹配的 MySQL/SQL Server 池,`ProbeConnectionPoolAsync` 用原池执行固定 `SELECT 1`。不使用 `ClearAllPools`,不杀借出的事务,不重放 SQL。
39
+ - 快照的 `MinimumPoolSize/ConnectionLifetimeSeconds` 是配置;`Database.GetConnectionPoolBudgetSnapshot` 按所选池身份去重合计最大/最小池。`CurrentNodeSelectedPools` 不包含其它节点、Quartz、扩展库或外部程序,不是已占用连接;未知驱动合计为 null,无池连接单列且不受池上限限制。
38
40
  - `BeginIsolatedConnections()` 仅用于有并发限制的可信应急鉴权作用域,设置无池连接与 5 秒连接/命令超时;未知驱动拒绝。不能给普通业务或 V8 增加绕过限流的开关,不能在此作用域内执行清池或把无池探测冒充原池恢复。
39
41
  - AI 在线恢复使用 `microi_manage_system_observability(action=ResetDatabasePools)` 的预览、确认和回读协议,详细决策见 [系统日志/监控](../system-observability/SKILL.md)。需要升级含 `database-pools/v1` 的后端和 MCP;事故恢复本身不要求重启数据库/API。
40
42
 
@@ -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=ea9cdd10772c42cc8202aa50ed3f8bec0a41588b16539b2968f256c7ee05cd3a -->
17
+ <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=9b949c68b0867fc1ecf2e6cb1fd1bec45d22c01ad3be63485e0376d0183d1795 -->
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=83fb9902ca2edddfc8b72de9578f28a6a7df5cadb2626e5ffb0321d62caa0bb0 -->
30
+ <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=112177bb326f8d26803e3bd9248011d839fe8d081431320d0e09f90f82487984 -->
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=794b802f6d332bf124d4b3e1c92e68b785299f4ef5d5b4f58e00ce84bb69488c -->
61
+ <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=bcb1222e9884f134d9902ed4937e6cb2753e5d3ed37096229efd99646320a4bc -->
62
62
  ## 2. 表单引擎三层结构
63
63
 
64
64
  ### 模块级跨端视图
@@ -158,17 +158,20 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
158
158
  右上角主题设置的边角风格默认圆角;已安装 `sys_user.CornerStyle` 时从账号偏好恢复,旧租户才使用浏览器本地兼容值。根元素 `data-mci-corner-style` 控制全局角半径,覆盖动态挂载的 Element Plus 弹层。顶栏入口统一使用 40px 触控区域和 20px 图标,AI 入口使用图标组件,不使用图片。模块 `HideTableBanner`、`HideFormBanner` 只在值明确为 `1/true` 时隐藏对应 Banner,并跳过其专属统计请求;未安装开关字段的旧菜单继续显示。
159
159
 
160
160
  - 边角风格先读取当前用户 `CornerStyle`:`round/square` 显式覆盖;空值或 `System` 继承租户 `sys_config.CornerStyle`,租户空值默认为圆角。不得把空个人值提前归一为 `round`,否则会阻断租户直角设置。
161
- - 桌面经典布局使用 `NavigationLayout=Side/Top`,个人空值或 `System` 继承租户,租户空值为侧边导航。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。右上角同时配置 `MenuChildExpandMode=System/Down/Right`,通过同一个个人偏好接口跨设备保存。
161
+ - 桌面经典布局使用 `NavigationLayout=Side/Top/TopSide`,个人空值或 `System` 继承租户,租户空值为侧边导航。`TopSide` 将一级放顶部,当前一级的二级及更深菜单复用原侧栏;单个子菜单仍留在侧栏,无可见子菜单时隐藏侧栏并释放内容宽度。侧栏仍支持收起及 `MenuChildExpandMode=System/Down/Right`。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。当前路由与一级归属由 `hybrid-navigation.js` 统一投影,禁止修改共享权限树。
162
+ - 顶部导航整行(含功能图标和账号姓名)使用主题运行时的 `--sidebar-*` 可读表面与前景;主题面板和业务弹层保留自身语义表面。主题入口为齿轮,界面密度在同一主题面板调整且仅保存在当前设备;AI 入口使用圆圈内 AI 字母 SVG,不能回退魔法棒或图片。
163
+ - 头像菜单【修改密码】使用标准 `DiyCustomDialog + MicroAppDialog` 打开现有平台服务 `/personal-settings`,仅传 `Data.Action=ChangePassword` 选择密码展示模式;不能用宿主输入决定目标账号/租户,不新建密码旁路。当前密码校验、Passkey/TOTP/严格人脸一次性票据与提交继续复用个人中心,成功或卸载清除密码输入。定向回归使用 `hybrid-navigation.spec.mjs`、`password-dialog.spec.mjs` 和个人偏好资源测试。
162
164
  - 桌面壳层使用视口高度与可收缩的 flex 内容区,只有路由内容滚动,导航和 Tab 不随页面滚动;移动端仍保留文档滚动。用户入口含头像与姓名,不能使用纯图标的固定 flex 宽度;异步图表须在真实 DOM 挂载后观察尺寸变化,避免侧边/顶部导航切换后撑破卡片。
163
165
  - 主题色、浅色/深色、菜单子级展开方式等需要“换设备仍生效”的选择必须保存到当前 DiyToken 用户的 `sys_user` 白名单字段;`localStorage` 只作为未安装新字段租户和匿名启动阶段的兼容回退,不能作为跨设备事实源。
164
166
  - 已安装用户偏好字段时优先级固定为“当前用户显式值 → 租户 `sys_config` → 平台安全默认”;个人菜单值 `System` 表示继承租户配置。不得让上一位用户的浏览器本地主题覆盖下一位已登录用户。
165
167
  - 自助保存优先使用官方 `Managed` 接口引擎,由 `V8.CurrentUser.Id` 与 `V8.OsClient` 推导用户和租户,并在服务端构造固定白名单更新对象;接口参数禁止决定目标 Id/OsClient,也禁止写入 Account、Phone、Tenant、Dept、Role、Level、State、Pwd、认证因子和登录审计字段。只有缺少可复用可信原子能力时才新增 C# DTO/端点。保存成功后调用 `V8.Method.RefreshLoginUser` 刷新登录缓存,并让微服务宿主重新同步 `CurrentUser`。
166
- - 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
168
+ - 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
169
+ - 导航切入或退出 `TopSide` 会重建顶栏组件;卸载前必须发送尚未保存的偏好,在途请求与后续选择共用按 store、API 地址、租户、账号和登录会话隔离的运行时队列。新顶栏继承失败状态和重试数据,旧响应不能覆盖更新的选择或跨账号合并队列;标准续签保留 `MicroiSessionId` 时也保留最终待保存选择,计算属性显式依赖 Pinia.Token。JWT 解码仅用于本地队列归属,服务端仍通过标准 DiyToken 验证授权;不得将会话凭据写入偏好存储、日志或响应。使用真实 Vue computed 和组件生命周期回归 `theme-select-autosave-lifecycle.spec.mjs` 验证卸载、在途合并、失败重试、续签及账号/租户/会话切换。
167
170
 
168
171
  ---
169
172
 
170
173
  <!-- /microi-progressive:chunk -->
171
- <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=301f766dc1ab1c6b021aa861a76b44844905d432393ab407472f58f00d6283cd -->
174
+ <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=a3e2b822a3c2aacea83d3cae796132786e3be45f3a18ceb621c477b6bd1a2442 -->
172
175
  ## 4. 工作流与表单提交
173
176
 
174
177
  工作流相关文件:
@@ -190,7 +193,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
190
193
  ---
191
194
 
192
195
  <!-- /microi-progressive:chunk -->
193
- <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=ab17865c6032884ccd896a0eb62387cf7f89edcf337c024f2251563f3bd0e4d9 -->
196
+ <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=d3a1a826c7b1870b83f9b49b58f488adeb7627626bad7462742956ca1719cdb7 -->
194
197
  ## 7. 验证建议
195
198
 
196
199
  ### 本地 ApiBase 与 OsClient 解析(强制)
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=189ca6438cd0fc58a5bf14bd13a3bad26a9254c766e4a6bed62ef2aeb1879e9d -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-005 sha256=2c4c3f197bcd921d147b892cb64ccd1b77461f67c0219cfc3107ec6c7c268d88 -->
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=b5d89b5a0b17ffb02579d4512b15468e52b599ddf4573afba85b9e5d3f9f5d49 -->
48
+ <!-- microi-progressive:chunk id=microi-client-frontend-006 sha256=e92ec7faad68c55a2175580e301c0b2b6a63b90e8e7edba48b8b0073ae53c807 -->
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=573d988999f9721cf7efe7654c203342213728b4f1ce61a718b10815595ae894 -->
117
+ <!-- microi-progressive:chunk id=microi-client-frontend-007 sha256=fa5d43239311945bd4a004763c0a6fa5295113b24965a73849e0f09d7b73d393 -->
118
118
  ## 6. 修改前必查清单
119
119
 
120
120
  ### `diy-table` 嵌入分页条数
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-008 sha256=8cd14b9e9483cd23cc4ea25411c5c69e015387ade54131252a385c88be3a1a17 -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-008 sha256=75a85c33adc8dcf89f3b1ad3efc004bc9378e1d41ff1eba6512f773ecee2db14 -->
6
6
  ## 8. 运行时高频坑复盘
7
7
 
8
8
  ### 前端 V8.Http 与后端同构契约
@@ -147,7 +147,7 @@ DiyCommon.FormEngine.AddFormData("table_name", { Field: "value" }, function (res
147
147
  - 修改后运行静态门禁,确认源码不存在内容型 `v-loading`、`ElLoading.service`、硬编码黑色 Loading mask 或加载期空态;再用真实浏览器验证菜单、首页、表格、表单详情在亮色、暗色、自定义主题和移动端下的骨架几何、对比度、`aria-busy`、reduced-motion 及请求失败收口。
148
148
 
149
149
  <!-- /microi-progressive:chunk -->
150
- <!-- microi-progressive:chunk id=microi-client-frontend-009 sha256=b1105375a6b9477eb397a275c67cd7e1074ae14948c41bd594e91deb4a2ba9b0 -->
150
+ <!-- microi-progressive:chunk id=microi-client-frontend-009 sha256=aec6ac1daf1566f4893c86ab0b12a17dcd156b0f46fa81a7ca387ca59f13fe17 -->
151
151
  ## 7.1 登录验证码与 Sys_Config
152
152
 
153
153
  修改 `Microi.Client/src/views/login/index.vue` 或任何 PC 端登录扩展时,必须遵守平台登录验证码契约:
@@ -184,7 +184,7 @@ DiyCommon.FormEngine.AddFormData("table_name", { Field: "value" }, function (res
184
184
  - 自动化检查:单测覆盖失败投影保留最后有效权限、合法撤权、访问密钥、登录切换迟到响应和注销竞态;真实浏览器拦截一次坏的当前用户投影,确认页面无需重新登录即可自动刷新,并连续检查新增、编辑按钮及刷新接口返回的管理员权限始终完整。
185
185
 
186
186
  <!-- /microi-progressive:chunk -->
187
- <!-- microi-progressive:chunk id=microi-client-frontend-010 sha256=2446aaeadddd95aa22dcd5935c5a9d60b51008bb1e0d5b5b7f6ee01f2fe9dd06 -->
187
+ <!-- microi-progressive:chunk id=microi-client-frontend-010 sha256=d89bb60734da788a027790c666287db8b6cda862e8f5fb3806543b07b3cce94c -->
188
188
  ## Microi 前端 SDK 约束
189
189
 
190
190
  当修改 `Microi.Client` 之外的 Vue3 前端、PC 官网、移动 H5 或定制微前端页面时,必须优先读取 `microi.skills/microi-frontend-sdk/SKILL.md` 并使用 `microi.skills/microi.v8.js`。`Microi.Client` 主后台已有平台请求与 Pinia 体系时,可以复用现有平台能力;但新增独立页面、外部站点、插件页、嵌入式页面不得再复制旧 Vue2/Vuex 版 `microi.v8.js`。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-client-frontend-011 sha256=4272be553eea5fd0ead8c7933b3b5231a6d8501bfed181294d1e5cf5965314d6 -->
5
+ <!-- microi-progressive:chunk id=microi-client-frontend-011 sha256=850ba16e253014a9d022582155cd3e18bf04dff375e82dd2947ea527bac4342a -->
6
6
  ## Vue3 前端微服务宿主规则
7
7
 
8
8
  `sys_menu.OpenType=MicroService` 时,动态路由必须把 `MicroServiceId`、`MicroServicePageId`、`MicroServiceRoutePath` 和真实入口 `MicroAppUrl` 写入 route meta;浏览器侧菜单路由使用 `/#/micro-app/{MsKey}/{RoutePath}`,不要再生成 `/micro-app-host/{menuId}`,否则地址过长且刷新或直接访问菜单路由容易加载空白页。
@@ -102,7 +102,7 @@ CurrentUser、ApiBase 和 OsClient。无痕窗口是人工第二租户的最低
102
102
  - 自动化检查:打开真实列表连续点击两次旧打印按钮,断言抽屉内出现打印引擎、打印数据接口成功、出现浏览器打印日志,并且没有未知组件警告、递归更新、页面异常或失败请求;保存首次和重复点击截图。
103
103
 
104
104
  <!-- /microi-progressive:chunk -->
105
- <!-- microi-progressive:chunk id=microi-client-frontend-012 sha256=4e579132c5176b46e6e9aa61e87982d63fe2c26c639f0ef3832614b2dacfcb3f -->
105
+ <!-- microi-progressive:chunk id=microi-client-frontend-012 sha256=77e4f6a9fd4ed647275e9abeee2ea9589271c19af11602db5a73f74950b937bf -->
106
106
  ## 在线 AI 应用与微服务页面协作
107
107
 
108
108
  Microi 的 AI 应用与应用商城只有一个主数据源:`sys_microistore`。运行类型写入 `ApplicationType`:普通平台离线包的新建默认值为 `Regular`,既有商城平台应用/通知仍使用 `Platform`,另外还有 `Web / UniApp / MicroService`;读取端必须兼容 `Regular/Platform`。`Category` 保存游戏、企业、行业、教育等业务分类,`PublisherType` 保存官方/社区来源;`mci_ai_app_file / mci_ai_app_version` 仅作为私有源码清单和构建版本从表,其 `AppId` 必须指向 `sys_microistore.Id`。禁止再向 `mci_ai_app` 创建新的主记录。MicroService 另外使用 `sys_microiservice / sys_microiservice_page` 保存运行元数据和页面路由。
@@ -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=57dc1ce4db6ce0aa4865b3d0ad11293a17e473a9f6bb92a084701ea239056d13 -->
152
+ <!-- microi-progressive:chunk id=microi-client-frontend-013 sha256=c4054f900b1f6af15ae9ffb483e7571570f9d2aa99a0e674ee0bb9a956f06172 -->
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。
@@ -91,7 +91,9 @@ Codex Router 启动后会异步调用 bundled CLI 的 `microi update --backgroun
91
91
  - Playwright:读取 `playwright-e2e/SKILL.md`,使用当前已登录浏览器或受控 Playwright;报告必须来自实际页面执行。
92
92
  - 其他领域:从本插件同级 Skills 里选择最小相关 Skill,并完整读取后执行。
93
93
 
94
- ## 同步与安全边界
94
+ ## 同步与安全边界
95
+
96
+ - 发布扩展与 CLI/AI Plugin 前检查实际 VSIX:完整清单、字节数、SHA-256 和敏感文件扫描回执保存在 `.tmp/development-tools-releases/<版本>/`;逐字节核对 MCP 输出/构建输入与 Skills 全部文件同源。归档超过 64 MiB 或混入签名资料、凭据、桌面安装包、工具链、apps、upstream、同步目录或 node_modules 时停止,修复误包后复测;断点补发使用同一门禁,不用 `vsce ls` 替代归档检查。npm Token 只绑定官方 HTTPS registry,私有 npmrc 仅引用 `${NPM_TOKEN}`;同时固定 `npm_config_userconfig` / `NPM_CONFIG_USERCONFIG` 与 registry 两种大小写变量,避免外层 `npm run` 的配置遮蔽有效 Token。不输出凭据,不因继承错误重复要求登录;已发布正确制品保留,发行内容变化使用新不可变版本。
95
97
 
96
98
  - `Microi-V8-Engine/.microi-config.json` 是三端连接配置事实源;未知字段必须保留。
97
99
  - CLI、VS Code、Codex 与 DeepSeek Harness 插件可以在同一工作区并存;各端必须复用同一配置/Token/MCP 协议,带版本写入实行较新 provider 优先,禁止旧入口回写降级。`doctor.coexistence` 未通过时准确报告兼容风险并后台修复,但不得因此停止无关工作。
@@ -102,7 +102,9 @@ Microi API 安装时,`AppSettings` 与同名容器环境变量只允许以下
102
102
 
103
103
  ## 一键安装脚本版本时间(强制)
104
104
 
105
- - 每次修改 `数据库、案例、文档、资料/install-microi.sh`,必须同时更新文件头版本和 `SCRIPT_VERSION`,两处完全一致。
105
+ - 每次修改 `数据库、案例、文档、资料/install-microi.sh`,必须同时更新文件头版本和 `SCRIPT_VERSION`,两处完全一致。
106
+ - 新装 MySQL 推荐 `max_connections=500`、最高 800,内存预算优先:宿主 95% 与已算共享父级预算取较小值,留出 30% 给 API/同机服务,扣除全局缓冲及固定开销后按 8MiB/连接估算,低内存明确降低并提示。连接数不等于重 SQL 并发;临时表等按负载实测,不能宣称绝对无 OOM。已有数据库不自动改全局配置。
107
+ - 未显式配置的 MySQL 业务池默认最大 100、最小 0,显式连接串优先;多个节点/租户、独立读写池、Quartz 与其它客户端须合计并保留管理员/备份/滚动发布余量。200 是否不足要看拒绝增量与总预算,大量 Sleep 不能证明泄漏,不默认杀连接、重启数据库或自动无限放大。
106
108
  - 固定格式为 `vYYYY-MM-DD HH:mm:ss`,使用 `Asia/Shanghai` 时间并精确到秒;禁止只写日期或沿用上一次修改时间。
107
109
  - 验收同时断言两处版本一致、格式正确,并以脚本实际启动输出为准;官网静态地址尚未发布新文件时,不能把本地版本误报为客户已经可下载。
108
110
  - 恢复旧数据库时,OCR、翻译等附加字段先出现不代表完整升级链已经成功。安装器必须先回读 `sys_config.ServerVersion` 达到本脚本最低版本并通过 API liveness/readiness,才能部署和配置附加能力;核心中间迁移失败或超时应失败关闭,禁止用部分字段就绪冒充整个平台升级成功,也禁止在升级事务仍执行时主动重启 API。
@@ -96,8 +96,8 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
96
96
  筛选、确认、导入参数或状态同步。验收需用旧版截图逐项核对标题、工具栏、选项、按钮、表格
97
97
  和分页,而不只确认组件已挂载。
98
98
 
99
- ### 本地源码同步禁止人工分段
100
-
99
+ ### 本地源码同步禁止人工分段
100
+
101
101
  - 完整工程拉取与 AI 上下文预览必须分开。IDE 先读取私有源码清单,再使用同源受权的 `GetApplicationFile` 逐文件流式解码到临时文件;`MaxFileBytes` 绑定清单中的真实大小,不能把预览的单文件/总正文限额当成工程下载容量。核对文件大小、SHA-256 与下载前后远端清单,全部通过才应用到本地;失败清理临时文件,保留本地工程和同步基线。二进制工具也要完整保留,不静默过滤。旧服务端缺少哈希时仅兼容计算实际内容哈希,不借此绕过现有推送三方比较/CAS。
102
102
 
103
103
  - 已有本地工程时,`microi_sync_microservice_source` 首选只传项目绝对路径 `directory`;先 dry-run 审阅文件数、总大小、逐文件哈希和清单哈希,再传 `confirmExecution`。
@@ -56,7 +56,13 @@ description: 设计、实现、配置、迁移、发布和验收 Microi 吾码
56
56
  4. 先把业务编排写成可随应用发布的接口引擎;仅当现有 V8 无法安全完成底层原子能力时,才扩展最小 `V8.Method`,并把调用权限制到精确官方接口 Key。禁止把整个流程放进新 Controller,也禁止让原子方法接受任意租户、回调地址或 Secret。
57
57
  5. 分别验证源码/单测、后端构建、前端构建、运行时端点、浏览器 UI、真实伙伴和多节点。
58
58
  6. 平台级资源通过官方应用包发布;官方源用 `microi_itdos` 更新并发布,普通目标租户走商城安装/升级任务。
59
- 7. 最终明确已验证与未验证边界,尤其是“配置包已发布”与“运行时代码已部署”的区别。
59
+ 7. 最终明确已验证与未验证边界,尤其是“配置包已发布”与“运行时代码已部署”的区别。
60
+
61
+ ### 签名异常排查
62
+
63
+ - 先区分 DiyToken 的 HS256、OIDC 的 RS256、SAML XML 签名和接口引擎 HTTP 响应内部签名,保留脱敏异常类型、TraceId、运行版本与失败请求顺序;截图中的“签名异常”不能直接判定为密钥错误。
64
+ - OIDC 第一次成功、第二次登录或退出失败且异常链包含已释放 RSA 时,检查请求级 RSA 与 IdentityModel 缓存签名器的生命周期。平台请求密钥统一使用 `SsoSecurity.CreateRequestScopedRsaKey`,禁用该密钥的签名器缓存;不能修改全局 `CryptoProviderFactory.Default`、取消验签、轮换 `AuthSecret` 或删除租户证书来掩盖错误。
65
+ - 回归须用实际发布依赖重复加载同一私钥,先复现旧缓存路径失败,再验证连续/并发签名、旧 `id_token_hint` 验签和篡改/错误密钥/issuer/audience 拒绝。后端原子修复没有声明式资源变化时,无需为空升版官方 SSO 应用,但必须独立核对后端渠道与客户部署边界。
60
66
 
61
67
  ## 官方应用合同
62
68
 
@@ -65,7 +65,9 @@ AI 第一次使用时先查询 `action=Capabilities`,再按返回的动作、
65
65
  - `microi_manage_system_observability(action=ResetDatabasePools,poolTarget=Both)` 无确认值时只预览。执行必须带同一预览的 `operationId`、`poolIds`、`poolTarget` 和 `confirmExecution=ResetDatabasePools:<operationId>`。预览票据 2 分钟有效;执行前仍复核配置摘要。
66
66
  - 请求超时或响应未知,使用查询动作 `DatabasePoolRecovery` 与原 `operationId` 回读,禁止换编号重试。每租户 60 秒冷却;命令期限 90 秒;回执保留 10 分钟,过期编号不能重新执行。
67
67
  - 回执逐节点区分 `Pending / Incomplete / PartialFailure / CompletedForRegisteredNodes`。只有最后一项证明已注册节点完成;未升级节点不在覆盖范围,最后还需验证原故障只读接口。不得把当前节点探测成功说成全站恢复。
68
- - 支持当前租户 MySQL/SQL Server 主、读池;`Both / Write / Read`,相同池去重。已加载的其它租户共享池时拒绝;扩展库和其它驱动明确不支持。池上限、驱动版本、退避和失败码可读,`Opening` 不等于驱动借出数。
68
+ - 支持当前租户 MySQL/SQL Server 主、读池;`Both / Write / Read`,相同池去重。已加载的其它租户共享池时拒绝;扩展库和其它驱动明确不支持。池上限、驱动版本、退避和失败码可读,`Opening` 不等于驱动借出数。
69
+ - `Pools[].MinimumPoolSize/ConnectionLifetimeSeconds` 回读保留策略;`CapacityBudget` 合计当前节点所选去重主/读池的配置最大/最小值,`Scope=CurrentNodeSelectedPools`。未知驱动合计为 null,无池连接单列;不包含其它节点、Quartz、扩展库或外部客户端,不用注册节点数虚构全局总量。多节点池预算须低于实例 max_connections 并保留管理/备份余量。
70
+ - 大量 `Sleep` 不证明泄漏;先比对两个窗口的拒绝增量、历史峰值、活跃事务和连接来源。MySQL 未显式配置的业务池默认 100、最小 0,显式值优先;安装器内存足够推荐 500、低内存降级,但现有数据库不会自动扩容。连接 Lifetime 是归还时淘汰过龄连接,不能当空闲回收期限。
69
71
  - 服务继续验证 DiyToken、Redis 有效会话和主库管理员;访问密钥需要 `mcp:admin`。仅鉴权使用有界无池连接,每节点应急请求最多 2 个、连接和命令超时各 5 秒;修复后的探测使用原业务池。不得创建匿名维护引擎或另设万能密码。
70
72
  - 不杀事务、不全局清池、不重放 SQL、不自动放大池上限,不以重启数据库/API 作为默认恢复。无有效会话、Redis/主库不可用或内存保护触发时不能绕过防护。持续泄漏、慢 SQL、容量与网络故障仍需定位根因。
71
73
  - 此功能属框架运行时应急协议,不新增表/菜单/引擎,不需要发布商城资源;责任同步为 Core/Dos.ORM、MCP、本文档与内嵌知识。验收必须覆盖真实池耗尽、HTTP 撤权/失效会话、两个独立进程、幂等重试、配置漂移与事务存活。
@@ -179,7 +181,8 @@ UnblockIp:<ip>
179
181
 
180
182
  - 请求热路径只做原子计数和有硬上限的分钟桶聚合;端点、IP、帐号、租户、内容类型限制基数并保留 TOP N。
181
183
  - 普通高频明细只保留短窗口内存;错误、慢请求、大文件和可疑传输进入有界队列,异步批量写 MongoDB。
182
- - 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert;5 分钟桶保留 48 小时、小时桶保留 45 天、天桶保留 400 天。页面不能每次扫描 Mongo 明细重新聚合总览。
184
+ - 长期趋势使用 MySQL 固定时间桶和确定性幂等键批量 upsert;5 分钟桶保留 48 小时、小时桶保留 45 天、天桶保留 400 天。页面不能每次扫描 Mongo 明细重新聚合总览。
185
+ - 流量桶的 `BucketStartUtc` / `LastSeenAtUtc` 是官方 `varchar(25)` UTC 文本,固定以 `yyyy-MM-dd HH:mm:ss` 19 字符参数写入;禁止直接传含微秒的 `DateTime`,驱动可能生成 26 字符而拒绝整桶。失败回滚、待桶重试和限速告警保持;已捕获的写入警告不能直接归因 `StopHost`,先核对退出码/宿主事件。不通过扩大字段或写生产数据库掩盖序列化根因。
183
186
  - 队列必须有硬容量、故障 spool/WAL、停机排空和幂等重放;禁止无界 `ConcurrentQueue` 或逐请求同步写 Mongo/MySQL。
184
187
  - Redis 适合短时热点结果、租约和限流;缓存 Key 包含租户、动作和过滤摘要,写入或治理后主动失效,并保留短 TTL 防止永久陈旧。
185
188