@microi.net/cli 5.6.2 → 5.6.4

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 (45) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +2 -2
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/README.md +2 -2
  7. package/assets/build-meta.json +7 -6
  8. package/assets/feature-matrix.json +138 -129
  9. package/cordis.patch.yml +2 -2
  10. package/package.json +1 -1
  11. package/scripts/mcp-server.js +82 -80
  12. package/scripts/microi-cli.js +59 -58
  13. package/scripts/microi-skills.meta.json +225 -222
  14. package/skills/.microi-skills-version.json +3 -3
  15. package/skills/.progressive-disclosure-manifest.json +58 -58
  16. package/skills/app-store/SKILL.md +6 -0
  17. package/skills/email-engine/SKILL.md +3 -2
  18. package/skills/job-engine/SKILL.md +10 -3
  19. package/skills/microi-client-frontend/SKILL.md +5 -2
  20. package/skills/microi-codex/SKILL.md +59 -48
  21. package/skills/microi-codex-installer/SKILL.md +12 -3
  22. package/skills/microi-deployment/SKILL.md +2 -0
  23. package/skills/microi-form-engine/SKILL.md +18 -0
  24. package/skills/microi-form-engine/references/component-catalog.md +1 -1
  25. package/skills/page-engine/SKILL.md +11 -1
  26. package/skills/page-engine/examples/compact-dashboard.json +1444 -0
  27. package/skills/playwright-e2e/SKILL.md +8 -8
  28. 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 +3 -3
  29. 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 +2 -2
  30. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +3 -3
  31. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +3 -3
  32. package/skills/system-observability/SKILL.md +62 -8
  33. package/skills/v8-explorer-tree/SKILL.md +228 -226
  34. package/skills/v8-file-upload/SKILL.md +26 -1
  35. 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
  36. 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
  37. package/skills/v8-http-integration/SKILL.md +3 -1
  38. package/skills/v8-security/SKILL.md +3 -1
  39. package/skills/v8-sql-query/SKILL.md +141 -133
  40. package/skills/v8-tcp-integration/SKILL.md +2 -2
  41. package/skills/v8-workflow/SKILL.md +12 -4
  42. package/skills/workspace-conventions/SKILL.md +8 -6
  43. 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 +6 -6
  44. 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
  45. 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
@@ -7,7 +7,7 @@ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化
7
7
 
8
8
  # Microi 吾码 Playwright E2E 自动化测试
9
9
 
10
- > **2026-05 更新(重要)**:Microi.VSCode 插件生成的所有 E2E 产物现已统一隔离到 `<projectRoot>/.microi-e2e/` 目录,**不再**写入 `tests/e2e/`、根目录 `playwright.config.js` 或 `.env.e2e.example`。
10
+ > **2026-05 更新(重要)**:Microi.Code 插件生成的所有 E2E 产物现已统一隔离到 `<projectRoot>/.microi-e2e/` 目录,**不再**写入 `tests/e2e/`、根目录 `playwright.config.js` 或 `.env.e2e.example`。
11
11
  > - `playwright.config.js` 位于 `.microi-e2e/playwright.config.js`,`testDir` 为 `./` (即 `.microi-e2e/specs/`)
12
12
  > - 报告路径 `.microi-e2e/report/`,截图 `.microi-e2e/screenshots/`
13
13
  > - 上下文 `.microi-e2e/.microi-playwright-context.json`
@@ -38,7 +38,7 @@ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化
38
38
  不适合把 Playwright 用来替代 V8 单函数调试。单个接口引擎的入参输出优先用 VS Code 插件远程执行、MCP `microi_run_engine` 或后端单元测试。
39
39
 
40
40
  <!-- /microi-progressive:chunk -->
41
- <!-- microi-progressive:chunk id=playwright-e2e-002 sha256=a2524636727c51268a2daefdd617e5b90e105e245143b652bc095ac857ad4995 -->
41
+ <!-- microi-progressive:chunk id=playwright-e2e-002 sha256=639b5a0f2a7ced30cf682c71b260cbdeac2628bd939a33ea372e6834b7990874 -->
42
42
  ## 临时文件与产物放置规则(必须遵守)
43
43
 
44
44
  AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测试报告**等,**绝对不能放在工作区根目录**,必须放在以下指定位置:
@@ -47,7 +47,7 @@ AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测
47
47
  |------|---------|
48
48
  | 一次性 Python/JS/PS1 脚本 | `<workspace-root>/.tmp/` |
49
49
  | 诊断截图、调试输出 | `<workspace-root>/.tmp/screenshots/` 或子目录 |
50
- | E2E 测试产物(Microi.VSCode 插件生成) | `<workspace-root>/.microi-e2e/` |
50
+ | E2E 测试产物(Microi.Code 插件生成) | `<workspace-root>/.microi-e2e/` |
51
51
  | AI 一次性 Playwright 脚本、截图、日志、报告 | `<workspace-root>/.tmp/`、`<workspace-root>/.tmp/screenshots/`、`<workspace-root>/.tmp/reports/` |
52
52
  | 性能测试报告 | `<workspace-root>/.microi-performance/`(仅限此目录) |
53
53
 
@@ -55,7 +55,7 @@ AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测
55
55
 
56
56
  `.tmp/` 目录已在 `.gitignore` 中排除,AI 可以在此自由创建临时文件。任务完成后如无价值可以不清理,也可以整体删除该目录。
57
57
 
58
- **2026-06 强制补充**:AI 手写的一次性 Playwright 验证脚本、运行日志、截图和报告只能写到工作区根目录 `.tmp/`。不要写到 `Microi.Client/`、`Microi.Server/`、`microi.doc/` 或其它子项目目录,即使这些目录已有 `tests/` 目录也不例外。只有 Microi.VSCode 插件正式初始化的可复用 E2E 工程,才使用 `.microi-e2e/`。
58
+ **2026-06 强制补充**:AI 手写的一次性 Playwright 验证脚本、运行日志、截图和报告只能写到工作区根目录 `.tmp/`。不要写到 `Microi.Client/`、`Microi.Server/`、`microi.doc/` 或其它子项目目录,即使这些目录已有 `tests/` 目录也不例外。只有 Microi.Code 插件正式初始化的可复用 E2E 工程,才使用 `.microi-e2e/`。
59
59
 
60
60
  <!-- /microi-progressive:chunk -->
61
61
  <!-- microi-progressive:chunk id=playwright-e2e-003 sha256=69b8842a221a0de60f8605c5059deee391be0f16f0b6cbc5ddfb3cfd210268db -->
@@ -79,7 +79,7 @@ AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测
79
79
  ```
80
80
 
81
81
  <!-- /microi-progressive:chunk -->
82
- <!-- microi-progressive:chunk id=playwright-e2e-004 sha256=2f145cd29044043fb84cefd07fde14c86a4d0f4757443d56e75f5494516453cb -->
82
+ <!-- microi-progressive:chunk id=playwright-e2e-004 sha256=4f5e11baf4651c11b5f9819a0b4f33ce2590db1733d4db72814bd1a25daf56ff -->
83
83
  ## 必备环境变量
84
84
 
85
85
  ```bash
@@ -101,7 +101,7 @@ PW_HOME_PATH=/#/pages/index/index
101
101
  ```
102
102
 
103
103
  <!-- /microi-progressive:chunk -->
104
- <!-- microi-progressive:chunk id=playwright-e2e-005 sha256=a66696c3263f060d0b7be309a527fca6a9bad95dd534eabbe84f1b6539770d8e -->
104
+ <!-- microi-progressive:chunk id=playwright-e2e-005 sha256=51567cea5fca434f9b031fef0871454100cf4715dfb65695dc1722bd275399be -->
105
105
  ## 本地测试账号自动发现
106
106
 
107
107
  当没有显式传入 `PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD` / `MICROI_OSCLIENT` 时,AI 不要把账号密码写入后端配置来制造旁路:
@@ -126,7 +126,7 @@ PW_HOME_PATH=/#/pages/index/index
126
126
  Profile/`--user-data-dir`。自动化收尾只关闭自己创建的 context/browser。
127
127
 
128
128
  <!-- /microi-progressive:chunk -->
129
- <!-- microi-progressive:chunk id=playwright-e2e-006 sha256=6aeefebda3a9e598564c53c2f8028a4ccefe2291c4c7c7ae4781ca15fb5d0697 -->
129
+ <!-- microi-progressive:chunk id=playwright-e2e-006 sha256=88e1002cae934acd2de5af2f77f371a9ea152a525eecf11b49fe182b16a56044 -->
130
130
  ## 后端改动后的 E2E 前置动作
131
131
 
132
132
  如果本轮任务修改过 `Microi.Server/**` 后端源码、配置、控制器、服务、依赖项目或接口行为,跑 Playwright、页面截图、接口验收或前后端联调前,必须先按 `workspace-conventions` 的“后端代码改动后的重启验收”完成:
@@ -139,7 +139,7 @@ PW_HOME_PATH=/#/pages/index/index
139
139
  不要只说“代码已编译”或“需要用户自己重启后端”;除非用户明确要求不要中断当前服务,否则 AI 要主动完成重启。
140
140
 
141
141
  <!-- /microi-progressive:chunk -->
142
- <!-- microi-progressive:chunk id=playwright-e2e-007 sha256=8776ce89491f11cbf6c6e6e9ef0cd430aa21efc60c1dbe1559ec9e905c5d0a9e -->
142
+ <!-- microi-progressive:chunk id=playwright-e2e-007 sha256=73298ff43e319b3e1a86a7d369c284595383f5d0b1e5fbc7e0d483d8fd68003a -->
143
143
  ## 服务自启动纪律(必做)
144
144
 
145
145
  执行自动化测试、截图巡检、接口引擎回读、`/apiengine/{key}` 验收时,如果本地后端或前端不可达,不能把 `fetch failed`、`ECONNREFUSED`、`000 Failed to connect`、端口无人监听当作任务终点。必须先自动启动所需服务,再继续完整验证。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=playwright-e2e-008 sha256=353b1e7ec1d3e93d1fac92c8e9d6e520bf77b628a4141524a09404814f7affb7 -->
5
+ <!-- microi-progressive:chunk id=playwright-e2e-008 sha256=cd1cc086cbbabd4083f7037e64b4f1951b284f70392e6fc5d729b322a161c39d -->
6
6
  ## 全自动登录(免验证码,但不免密码)——必读
7
7
 
8
8
  E2E 自动化最容易卡在「登录页有图形验证码」。Microi 后端允许自动化跳过验证码,但账号和密码必须始终走真实校验;如果密码配置错了,登录接口必须返回账号或密码错误。源码见 `Microi.Server/Microi.net.Api/Controllers/SysUserController.cs`(`Login` 方法开头)。
@@ -66,7 +66,7 @@ export async function automationLogin(page, {
66
66
  > 直连接口验收(不进页面)使用自动化标记拿 Token;历史 `_DEV_BYPASS_`、Dev Key 和 `DevLoginBypass` 均不得继续使用。
67
67
 
68
68
  <!-- /microi-progressive:chunk -->
69
- <!-- microi-progressive:chunk id=playwright-e2e-009 sha256=f864be2aee2ce2490d2a8e241e5852fbd0777590f771397fd3c7973017889ae7 -->
69
+ <!-- microi-progressive:chunk id=playwright-e2e-009 sha256=bd153761389635cb99ac6d3e2809f1e49ca78926176a05ad555dc83702837790 -->
70
70
  ## 表单引擎卡死/递归更新全自动化诊断
71
71
 
72
72
  当用户反馈“新增抽屉卡死”“设计页卡死”“点击控件无响应”“Maximum recursive updates exceeded”等表单引擎问题时,优先做可复现的 Playwright 诊断,而不是只靠猜测改代码。
@@ -145,7 +145,7 @@ uni-app H5、移动商城、分享海报、首页改版这类任务不能只跑
145
145
  - 如果某项属于后台元数据或数据库配置,仍需通过接口/数据库回读给出证据;前端截图只能证明展示,不等价于后台配置已改。
146
146
 
147
147
  <!-- /microi-progressive:chunk -->
148
- <!-- microi-progressive:chunk id=playwright-e2e-012 sha256=1fcd0a28af8226af4f1e4608645c74bf2fe503ce195f05ffd115c590fafabd06 -->
148
+ <!-- microi-progressive:chunk id=playwright-e2e-012 sha256=a6ed859419114f601d611534e3d07bbfce0055ea6b7809daea9200da962391b6 -->
149
149
  ## 移动端/H5 回归纪律
150
150
 
151
151
  处理 uni-app H5 移动商城的交易、资产、登录、购物车、抢购、充值、分享或图片相关问题时,不能只改代码后让用户手工发现问题。完成实现后必须至少执行(以下变量按项目实际情况替换):
@@ -72,7 +72,7 @@ expect(lowContrast, '低对比度文字: ' + JSON.stringify(lowContrast.slice(0,
72
72
  5. 价格区间、状态、筛选这类**导航/筛选元素出现在列表中部作为标题**——必须移到顶部 sticky 工具栏,并与正文形成色彩区隔。
73
73
 
74
74
  <!-- /microi-progressive:chunk -->
75
- <!-- microi-progressive:chunk id=playwright-e2e-014 sha256=e5858cce6f743573d699ed7d2d07f958d15be96c28028a91163e841f6d3c016a -->
75
+ <!-- microi-progressive:chunk id=playwright-e2e-014 sha256=3eea01cf70e67d545fede1724b049ed852da60cf0a4ea0bda6b2e1d6de84400d -->
76
76
  ## 安装
77
77
 
78
78
  ```bash
@@ -122,7 +122,7 @@ npx playwright test
122
122
  手写 Playwright 脚本时读取 `PW_CHROMIUM_EXECUTABLE` / `PW_BROWSER_EXECUTABLE` 并传给 `chromium.launch({ executablePath })`;Playwright Test 配置中通过 `use.launchOptions.executablePath` 读取该环境变量。只有 CDN、系统浏览器和本地缓存都不可用时,才报告浏览器不可用。
123
123
 
124
124
  <!-- /microi-progressive:chunk -->
125
- <!-- microi-progressive:chunk id=playwright-e2e-015 sha256=b9adf7af700e045fd919bdfde321b10df89660561dd8ab476a12cba310855875 -->
125
+ <!-- microi-progressive:chunk id=playwright-e2e-015 sha256=9b937381fb4cda1a8a010c5a0f803d48861c9dbcf503774a4b1dba4c0d33985a -->
126
126
  ## playwright.config.js 模板
127
127
 
128
128
  ```js
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=playwright-e2e-016 sha256=63d4ded296636335a96cbdd5a9ada0ec8b42ad9cc616b621c88bd6e45904f7fa -->
5
+ <!-- microi-progressive:chunk id=playwright-e2e-016 sha256=9fa2a956427cf2c1c6a6f37cc2c960e58ac09ab43aff037ab762d447eadf912a -->
6
6
  ## Microi helper 模板
7
7
 
8
8
  ```js
@@ -134,7 +134,7 @@ test('公开接口引擎返回标准 DosResult', async ({ request }) => {
134
134
  6. 退出登录能清理 Token 并回到登录页。
135
135
 
136
136
  <!-- /microi-progressive:chunk -->
137
- <!-- microi-progressive:chunk id=playwright-e2e-020 sha256=3ae1a183eefdcdcbc5924d3205802eb7594da02074cadfbdfb85d88b2005f192 -->
137
+ <!-- microi-progressive:chunk id=playwright-e2e-020 sha256=7c8cc732cd5d460b6bde2c7e151d55f51aa0f853995492946aedbe781da01a9a -->
138
138
  ## 完整业务验收门槛
139
139
 
140
140
  当用户要求“完整测试”“全面测试”“不要让我手工测出接口 null/404/权限漏洞”时,不能只生成浅冒烟。至少补齐以下测试文件:
@@ -183,7 +183,7 @@ tests/e2e/
183
183
  - 首页运营 banner 推荐从公告或配置表驱动;E2E 要同时断言接口返回、图片真实加载、点击进入详情页。
184
184
 
185
185
  <!-- /microi-progressive:chunk -->
186
- <!-- microi-progressive:chunk id=playwright-e2e-021 sha256=48af1507276053c301e489b5b261b92657ce79ed2045933d4a462d7c71eb96a8 -->
186
+ <!-- microi-progressive:chunk id=playwright-e2e-021 sha256=50a36935911be6a6201c9406e89b5e8470b65d87f6d8cd0a57effedf146082b2 -->
187
187
  ## 与 MCP 的配合
188
188
 
189
189
  - `microi_get_db_schema`:写测试前确认表和字段。
@@ -28,7 +28,7 @@ jobs:
28
28
  ```
29
29
 
30
30
  <!-- /microi-progressive:chunk -->
31
- <!-- microi-progressive:chunk id=playwright-e2e-024 sha256=b939c97eef28fab71caa54d134ea524d7ed7c8381deec09e38a7d694b15f53c0 -->
31
+ <!-- microi-progressive:chunk id=playwright-e2e-024 sha256=a2897a35d5fd0c4bd944fae8bf15e8d52648e916a5453d0bb6012574f97af12a -->
32
32
  ## 常见问题
33
33
 
34
34
  | 现象 | 原因 | 处理 |
@@ -90,7 +90,7 @@ OsClient 仍为空时调用目标站点域名租户解析接口或从成功请
90
90
  Profile 或独立 `--user-data-dir`。
91
91
 
92
92
  <!-- /microi-progressive:chunk -->
93
- <!-- microi-progressive:chunk id=playwright-e2e-025 sha256=be071153d695081b7c20d34cb5e9563480e3f09d9cd0292f2ca4b0245438787b -->
93
+ <!-- microi-progressive:chunk id=playwright-e2e-025 sha256=fb26231352e397437331ab5255b908ecaa100129bd365779dad7aaf944062584 -->
94
94
  ## 前端微服务 E2E 必测点
95
95
 
96
96
  测试 Vue3 MicroApp 微服务时,不能只验证 `/micro-app/{OsClient}/{appKey}/index.html` 或带 token 的临时 URL。必须先建立真实登录态,再访问用户实际使用的不带 token 菜单路由,例如 `/#/micro-app/{MsKey}/{RoutePath}`,并确认地址栏没有退回旧的 `micro-app-host` 长地址。
@@ -102,7 +102,7 @@ Profile 或独立 `--user-data-dir`。
102
102
  如果页面内提供 Microi SDK 调用按钮,必须点击并断言返回 `Code=1`,同时确认没有 `登录身份已过期`、`1001`、`1002`。只看到标题文本不代表鉴权链路通过。
103
103
 
104
104
  <!-- /microi-progressive:chunk -->
105
- <!-- microi-progressive:chunk id=playwright-e2e-026 sha256=3c8a1e8bbe281064f30f406703230d8df213f1f1e1d124edb8f9fc8a1df782ea -->
105
+ <!-- microi-progressive:chunk id=playwright-e2e-026 sha256=591700cfd4b78c63d7f69db5c5d4a5f57c48d85c8508112d2bccbaae06b24192 -->
106
106
  ## 动态模块按钮验收
107
107
 
108
108
  修复或新增 `MoreBtns/FormBtns/PageBtns/PageTabs` 时,运行页看到按钮只证明“最终渲染结果”,不能证明入口确实可由模块引擎维护。至少同时保留三类证据:
@@ -1,4 +1,4 @@
1
- ---
1
+ ---
2
2
  name: system-observability
3
3
  description: Microi 系统日志/监控查询、诊断与治理规范。用于分析系统日志、Trace、热点接口、CPU/内存吃满、OOM、异常分配、接口引擎/V8 事件归因、重启事故恢复、网络流量、安全事件和监控性能成本。
4
4
  ---
@@ -9,7 +9,41 @@ description: Microi 系统日志/监控查询、诊断与治理规范。用于
9
9
 
10
10
  本 Skill 用于读取、解释、扩展和验收 Microi 的统一【系统日志/监控】能力。它不授权查看其它租户、绕过菜单/平台管理员权限,或把当前节点样本扩写成全局结论。
11
11
 
12
- ## 先选入口
12
+ ## 大权限对象与 SQL 参数处理回归
13
+ - 浏览器 Pinia 持久化应按已选字段独立深度监听,缓存序列化片段;非持久化的时钟/加载状态不得触发完整权限遍历,主题变化不得重新序列化用户。权限嵌套修改、登录退出、显式保存、恢复钩子、失败恢复和 dispose 必须回归,嵌入 WebOS 窗口保持只读存储边界。前端镜像验收与后端分开记录。
14
+ 待办的多项只读计数由内部 `IFormEngineReadOnlyCountRuntime` 在一个批次中拥有一份独立身份;业务参数不能提供非空 `_CurrentUser`,每项仍经过原表单查询与租户/角色/数据范围检查,事务内顺序执行。抄送分页及可能执行行 V8 的 CRUD 保留独立身份。私有文件 HTTP 原子可接收本次 DiyToken 验证后独占的身份,后台可信上下文仍复制;资源引用、权限、审计和 `Limit=true` 不变。上述优化需要更新后端镜像,不能靠修改 V8 参数来启用或跳过鉴权。
15
+
16
+ - `FromSection.formatSql` 是 ORM 结果缓存键处理,独立于页面 SQL 展示。大型 IN 权限快照需测试这条真实路径的分配量、参数前缀、字面量、替换值含参数文本、空值和缓存键稳定性;禁止用逐参数 `String.Replace`。单对象 HTTP 表单仅可转交本次 DiyToken 验证后独立身份,批量行与已有 JSON 持有者必须保留副本,不能推广为共享可变身份缓存。
17
+
18
+ - 保持用户需要的 `PrintSqlToPage` 开启。参数准备、页面可执行 SQL 与慢日志不得逐参数扫描和复制整条 SQL;使用单次扫描,并测试字符串、注释、参数名前缀、替换值含参数文本及完整页面输出。
19
+ - 动态 FormEngine 参数不得把 `_CurrentUser` 复制进业务行数据;一轮转换只拥有一份独立身份树,不能为性能共享可变用户缓存或修改调用方对象。用接近实际规模的权限树测量分配,并验证租户、访问密钥、角色和可变子对象隔离。
20
+ - 接口引擎正常、异常与慢日志使用 `ApiEngineLogParameters.Serialize`,在序列化前排除顶层内部 `_CurrentUser`,用户仍由独立 UserId/UserName 字段记录;业务嵌套同名字段、类型和空值保留,不修改原参数。不允许先深复制/序列化权限树再截断。托管文件 URL、后台任务和菜单接口向可信原子只投影业务参数,后端仍独立验证身份、租户和资源权限。
21
+
22
+ 登录身份权限异常膨胀时,先比对 sys_rolelimit 的有效行与 IsDeleted=1 历史行。原生权限快照与菜单授权编辑只加载有效权限,IsDeleted 为 NULL 的存量记录仍有效;没有该列的旧表保持兼容,新增列后立即采用过滤,元数据或查询异常不回退为全量授权。该修复需要更新后端镜像;已有登录缓存通过正常重新登录或 RefreshToken 刷新,不删除权限历史,不改变 DiyToken、角色/数据范围或 PrintSqlToPage。用真实数据库回归旧表、新列、撤销权限、无权限角色、注入参数和查询失败,不能仅凭身份体积下降宣称请求耗时已经恢复。
23
+
24
+ 接口引擎构造脚本参数时,顶层 `_CurrentUser` 属于宿主保留身份,不再复制到 `V8.Param`;脚本读取已认证身份应使用 `V8.CurrentUser`。权限树仍保留完整内容,身份验证、令牌撤销、访问密钥范围、跨租户检查和独立脚本快照保持执行;嵌套业务对象中同名字段仍保留。实时通知检测只读取成功结果的 Code 与 DataAppend,避免为了检查不存在的事件而序列化整份用户/列表/文件 Data;事件字段白名单、大小限制、提交后发送和订阅权限不变。两项优化都需要更新后端镜像。
25
+ - 公共鉴权的角色基础权限读取只检查 `_Roles`,不得复制整份用户的表/菜单权限树;显式 Bearer 请求在同一过滤器中只加载一次有效会话。优化必须保留签名、过期、安全版本、租户一致性、Redis 活动令牌、历史敏感字段清理及访问密钥撤销/范围检查;不得用跨请求身份缓存或共享可变 V8 用户对象换取速度。
26
+ - 分层归因同时核对 `FormAuthorization` 与其内部 `AuthorizationVersion`;原生 Redis 授权版本读取不经过通用 `RedisRead`,不能只用后者排除缓存等待。
27
+ - HTTP Controller 到首个接口引擎可单次交接已经实时验证的身份;交接必须绑定原始参数对象和同一 HttpContext,不能放入 JSON/可复制注解。参数克隆、租户或身份投影变化、重复消费、后续请求及嵌套调用均回到原验证路径。脱敏须继续覆盖全部嵌套字段,优化临时分配不能跳过大权限树。
28
+ - V8 AI 代理在创建时固定不可变身份,首次调用 AI 才构造可变 JSON;普通 V8 不应为未使用的 AI 复制完整权限树。必须测试脚本修改后的身份隔离、全部权限保留、JSON 类型/注解和二进制值隔离,不能延迟读取仍由脚本持有的身份对象。
29
+ - 原生统计失败时不自动重跑全部兼容查询。兼容回退只处理能力确实缺失的旧后端,避免故障放大。
30
+ - 用相同测试记录修复前失败、修复后通过;实际请求需区分冷启动、稳定调用、页面并发、数据库执行与 HTTP 总耗时。镜像、应用包和线上节点分别验收。
31
+
32
+ ## 请求等待分层归因
33
+
34
+ - 用唯一 TraceId 对齐浏览器计时与 `RecentRequests[].Latency`,分别解释发出前排队、首字节等待、响应接收和服务端顺序阶段;不能将总耗时减 TTFB 当作下载时间。
35
+ - `Latency.Parts` 是含子调用、可能并行的累计墙钟时间,不可相加或等同 CPU。连接打开/连接池等待与 SQL 命令分开;Reader 后续读行不计入 DatabaseCommand。
36
+ - `RuntimeIntervals` 是当前节点最近 30 个约 1 秒同窗样本。分别核对 CPU 执行、I/O wait、steal、GC 暂停、线程池积压、采样唤醒延迟和 cgroup 节流;缺值按不可用处理。旧 Linux CPU 百分比包含 I/O wait,不能直接判定计算饱和。
37
+ - `Memory.HelperProcesses.Collector/RecoveryAnalyzer` 是当前 API 管理的诊断采集/恢复子进程。两次查询间的 CPU 结合 PID、启动时间和 RSS 判断监控成本;首次、重建、不可用时 CPU 为 null。它不是 NAS 全部进程清单,不能将剩余主机负载直接归给某个服务。
38
+ - `Snapshot(includeHost:true)` 的 `Host.Processes`(`process-resources/v1`)每 5 秒持续采样,CPU/RSS/Swap/I/O 前 10 名及最近 12 次样本;核对 Fresh、Scope、HostProcessesVisible、不可读/缺项计数。CPU 100% 是一核;首次、PID 重用、计数重置为 null,RSS 不能累加作独占内存。不采命令行/环境变量。Linux 无固定只读 `/proc:/host/proc:ro` 挂载时只声明当前 PID 命名空间,不能声称看到了全部宿主进程;镜像更新不能新增挂载,不能为诊断开放 Docker socket 或特权容器。
39
+ - `Host.DiskIO.Devices` 包含 SATA/NVMe/RAID/映射设备的速率、IOPS、BusyPercent、AwaitMs 和 InFlight;分区按 sysfs 标记识别,名称以数字结尾不能排除。汇总只累加物理整盘,避免与 RAID/dm 双计;独立时间窗,首次/重置速率为 null。Docker 不可访问不等于宿主没有 Docker。
40
+ - 宿主进程排名的 CPU/IO 速率分别使用每个进程计数器的实际读取时间窗 `CpuWindowSeconds / IoWindowSeconds`,顶层 `WindowSeconds` 只是扫描周期。GC 或调度暂停导致扫描耗时变长时,不能继续用扫描开始时间作为计数分母;单次计数读取超过 250 ms 则该次时间无效,速率为 null。旧后端长扫描的 CPU 尖峰不能直接用来证明宿主饱和。
41
+ - `Trace.RuntimeRequests` 只从当前租户、当前节点最近 500 个请求中返回最多 20 个匹配记录;淘汰和重启导致缺证,不代表快。协议为 `request-latency/v1`,现有 MCP 查询参数不变;本次底层指标没有新增商城声明式资源,后端升级即可读取。
42
+
43
+ - 批量角标/计数变慢时核对 Identity 次数是否随项数增长。只读 `GetTableDataCountBatch` 允许批内复用一份脱离缓存的可信身份;保留逐项表权限/数据范围、跨批次实时校验及普通 CRUD 的可变身份隔离,不能把该优化扩展为跨请求缓存权限或共享脚本可修改身份。
44
+ - `RoutingMs` 包含在 `BeforeActionMs` 中;路由阶段也可能访问缓存和数据库,不可只看 Controller/表单内部计时。
45
+
46
+ ## 先选入口
13
47
 
14
48
  | 目标 | 推荐入口 |
15
49
  |---|---|
@@ -142,9 +176,16 @@ UnblockIp:<ip>
142
176
 
143
177
  需要压测或修改热路径时同时读取 `../performance-testing/SKILL.md`;排查 V8/日志写法时读取 `../v8-debugging/SKILL.md`。
144
178
 
145
- ## AI 诊断顺序
146
-
147
- 1. 先查 `Capabilities`,确认当前版本和边界。
179
+ ## AI 诊断顺序
180
+
181
+ ### 宿主数据库进程高 CPU
182
+
183
+ - `Host.Processes` 确认 `mysqld` 高 CPU 后,继续用 `microi_query_external_database` 对已授权实例只读查询实际 `performance_schema`/`information_schema`。先核对数据库版本与可用列;使用规范化 `DIGEST_TEXT`,不回传连接串或含业务值的 SQL 正文。
184
+ - 至少间隔一个业务周期采集两次 `events_statements_summary_by_digest`,计算 `COUNT_STAR/SUM_TIMER_WAIT/SUM_ROWS_EXAMINED/SUM_SELECT_SCAN` 差值;累计总耗时与并发墙钟时间不等于 CPU。当前页面 SQL 很快不能排除后台任务在同库扫描。
185
+ - 核对实际索引与锁/事务状态。典型例子是 `mic_data_version` 缺少 `(TableId,TableRowId,CreateTime)`,定时任务运行时间刷新又不断生成版本,形成越来越重的历史扫描。索引由所属应用声明,新旧库都应交付;在线修复后必须回读并观察后续 digest 和同窗宿主进程。
186
+ - 原生建索引工具若不能表达生产所需的在线算法、锁等待上限,应通过受控管理员数据库工具预览固定语句,再按已有明确修复授权执行并回读;不得因响应超时重复建索引,不做表重建或删除历史来掩盖问题。
187
+
188
+ 1. 先查 `Capabilities`,确认当前版本和边界。
148
189
  2. 查 `Snapshot`,记录节点、窗口、请求率、活动请求、CPU/内存、队列、HTTP 流量与未归因残差。
149
190
  内存问题同时查 `Memory`、`MemoryIncidents`、`MemoryIncident`,先确定采集健康,再关联接口/V8 事件、表/工作流节点、代码哈希和 Trace。
150
191
  3. 查 `ApiRank` 和 `TrafficHistory` 的 Endpoint/IP/User/Tenant/ContentType 维度,区分“计算慢”与“传输大”;再用 `TrafficDetails` 定位具体帐号/匿名、IP、接口、文件元数据和 TraceId。
@@ -154,9 +195,22 @@ UnblockIp:<ip>
154
195
  7. 对匿名上传、大响应、重复轮询或攻击信号先核对业务合法性,再限流、对象存储直传/CDN、Range、压缩或封禁。
155
196
  8. 优化后用相同窗口与负载复测 P50/P95/P99、RPS、错误率、CPU、内存、分配率和网络字节,不能只凭单次页面刷新下结论。
156
197
 
157
- ## 扩展与商城交付
158
-
159
- - 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
198
+ ## 扩展与商城交付
199
+
200
+ ### CDN 模块
201
+
202
+ - 现有 `microi-platform-service` 的系统日志页增加 CDN Tab;不另建同名应用。固定管理员入口为 `mci-cdn-manager`,内部 `mci-cdn-core / mci-cdn-aliyun / mci-cdn-worker` 均 `StopHttp=1`,四个引擎归 `app.microi.sys-log` 的 Managed 资源。
203
+ - 通过当前租户 MCP 的 `microi_run_engine` 先查 `Capabilities`,再使用 `Domains / Trend / ReportList / Reports / Sls / Configs / Config / Rules / Operations`。现有执行、源码、元数据及发布工具已覆盖此模块,不为 CDN 新增旁路鉴权或通用 HTTP 代理。
204
+ - 凭据优先级为当前租户 `Integration.Cdn.Aliyun.*` 完整私密组 → `Integration.Dns.Aliyun.*` 私密组 → 当前租户 SaaS 的兼容 DNS 字段。半组配置必须失败,不能混组或回退主租户。新增密钥写 `mci_system_setting` Secret,由可信后端解密到后端 `ServerPrivateSettings`;不返回原文。
205
+ - Aliyun 运营报表 ID:1/3 URL 请求/流量、5/7 Referer 请求/流量、9/11 回源 URL 请求/流量、13/15 IP 请求/流量、17 域名、19 PV/UV、21 地区、23 运营商。未订阅不能伪造成零流量,也不能将历史 TOP 当作分钟级规则数据;未知流量单位保持原始值。
206
+ - 报表参数按类型分开:只有 13/15 传非空 Area,1/3/9/11 传非空 HttpCode,21/23 传 IsOverseas;17 不传 DomainName。不得统一附加无关或空筛选项,否则阿里云返回 InvalidParameter。内嵌调用的 V8.Param 可能是 CLR JObject,不向它写入配置对象,创建独立 JS 请求并从服务端读取接入配置。
207
+ - SLS 只用固定查询模板与已校验域名/项目/地域/Logstore;自动判断基于 `remote_ip`、`response_size` 字节以及完整窗口、采集延迟、连续命中、白名单、冷却与限额。私网/环回/链路本地/组播和与保护 CIDR 重叠的地址不封禁。动态阈值须满足历史样本数,默认观察。
208
+ - 云端变更先 `Preview` 再 `Submit`,请求号幂等、配置快照比较、独立持久化状态和租约不可省略。超时/崩溃记 Unknown 并 `Reconcile`,不能自动重发不确定写入。到期只删除本应用新增条目,重叠封禁延后回收。
209
+ - 单域名 IP 黑名单与全账号海量封禁必须分开;后者需阿里云开通,须明确 `ALL_CDN_DOMAINS`,不在验收时自动开通付费服务。`limit_rate` 是至少 100 KB/s 的下载速率,不是 QPS;日志规则也不等于实时边缘 WAF。
210
+ - `mci-cdn-security-tick` 回收到期封禁;每条启用规则通过 `V8.Method.SaveScheduleJob` 创建错峰任务并使用独立数据库租约。安装包包含基础调度及三张表的结构,不带云密钥、规则实例、白名单或任何测试 IP。
211
+ - 验收分开记录 Node 行为测试、真实管理员/云端只读、文档保留 IP 的受控封禁/到期恢复、真实宿主页面、包正文 SHA 与安装。日志未投递或海量服务未开通时,如实标为待配置,不伪造云端通过。
212
+
213
+ - 普通查询和汇总优先在 `mci-system-observability-query` 接口引擎编排。
160
214
  - 只有接口引擎缺少宿主进程、Docker、Mongo 聚合、安全运行态等可复用底层能力时,才扩展最小 V8 原子方法;Controller 不承载业务编排。
161
215
  - 官方引擎声明 `ResourcePolicies.ApiEngines=Managed`,由本次已校验包正文覆盖其拥有的资源;客户扩展使用独立 Key 或 `CreateIfMissing`,既有扩展不被覆盖。不得把 Managed 的旧本地改动当作拒绝应用升级的理由,也不得扩大到无关资源。
162
216
  - 按应用发布契约交付表、字段、索引/DDL、接口引擎、菜单、版本日志和微服务运行产物;私有源码由源码同步链交付。`DatabaseOnly/SourceNotIncluded` 必须如实标识,不能声称商城包包含全部源码。安装后回读固定版本快照并在真实页面验收。