@microi.net/cli 5.2.4 → 5.2.5

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.
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "5.2.4",
8
+ "version": "5.2.5",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "5.2.4",
14
+ "version": "5.2.5",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "5.2.4",
3
+ "version": "5.2.5",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "5.2.4",
3
+ "version": "5.2.5",
4
4
  "description": "Microi吾码低代码平台的 Codex 开发插件,共享 VS Code/CLI 的连接、同步、MCP、V8 与交付能力。",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "5.2.4",
8
+ "version": "5.2.5",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "5.2.4",
14
+ "version": "5.2.5",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "5.2.4",
3
+ "version": "5.2.5",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
- "builtAt": "2026-08-23T04:41:58.569Z",
3
- "version": "5.2.4",
2
+ "builtAt": "2026-08-23T14:58:09.497Z",
3
+ "version": "5.2.5",
4
4
  "sourceProducts": [
5
5
  "vscode-extension",
6
6
  "microi-cli",
@@ -13,6 +13,6 @@
13
13
  "cli": "c7913339c61a9372d0a4570bfb3429867e9d93bfc50c50e0c43a1112111cc6f1",
14
14
  "router": "ffc14787fc2d3d6173b7a779b77139b759eb1d482cea787f71283f4017a4e223",
15
15
  "broker": "caae2730cc411d11c20f33b367968f7538aae8f5b65a713fcc557deedaefcf70",
16
- "dshBundle": "6d36918ff9355ecd2829ffe6db4040efefead3a236a65b25f3d5f2b7f220fde6"
16
+ "dshBundle": "ad8a1b556b7de043897524ab0a7cc9574fa3e22ac74603914013739b14310ae5"
17
17
  }
18
18
  }
package/cordis.patch.yml CHANGED
@@ -7,7 +7,7 @@
7
7
  serverName: microi
8
8
  transport: stdio
9
9
  command: !!js process.execPath
10
- args: ["-e","/*\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst packageName = '@microi.net/cli';\nconst expectedVersion = '5.2.4';\n\nfunction readJson(filePath) {\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\n catch { return undefined; }\n}\n\nfunction expandHome(value) {\n if (value === '~') return os.homedir();\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\nfunction validRoot(value) {\n const root = path.resolve(value);\n const pkg = readJson(path.join(root, 'package.json'));\n const patch = path.join(root, 'cordis.patch.yml');\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\n}\n\nfunction findPlugin() {\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\n if (explicit) {\n const plugin = validRoot(explicit);\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\n return plugin;\n }\n const configuredHome = String(process.env.DSH_HOME || '').trim();\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\n const profilesRoot = path.join(dshHome, 'profiles');\n const candidates = [];\n if (fs.existsSync(profilesRoot)) {\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\n const plugin = validRoot(root);\n if (plugin) candidates.push(plugin);\n }\n }\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\n return candidates[0];\n}\n\ntry {\n const plugin = findPlugin();\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_TOOL_SOURCE = 'dsh';\n process.env.MICROI_TOOL_VERSION = expectedVersion;\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\n process.argv[2] = plugin.router;\n require(plugin.adapter);\n} catch (error) {\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n"]
10
+ args: ["-e","/*\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst packageName = '@microi.net/cli';\nconst expectedVersion = '5.2.5';\n\nfunction readJson(filePath) {\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\n catch { return undefined; }\n}\n\nfunction expandHome(value) {\n if (value === '~') return os.homedir();\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\nfunction validRoot(value) {\n const root = path.resolve(value);\n const pkg = readJson(path.join(root, 'package.json'));\n const patch = path.join(root, 'cordis.patch.yml');\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\n}\n\nfunction findPlugin() {\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\n if (explicit) {\n const plugin = validRoot(explicit);\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\n return plugin;\n }\n const configuredHome = String(process.env.DSH_HOME || '').trim();\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\n const profilesRoot = path.join(dshHome, 'profiles');\n const candidates = [];\n if (fs.existsSync(profilesRoot)) {\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\n const plugin = validRoot(root);\n if (plugin) candidates.push(plugin);\n }\n }\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\n return candidates[0];\n}\n\ntry {\n const plugin = findPlugin();\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_TOOL_SOURCE = 'dsh';\n process.env.MICROI_TOOL_VERSION = expectedVersion;\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\n process.argv[2] = plugin.router;\n require(plugin.adapter);\n} catch (error) {\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n"]
11
11
  env:
12
12
  MICROI_TOOL_SOURCE: dsh
13
13
  cwd: !!js process.cwd()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microi.net/cli",
3
- "version": "5.2.4",
3
+ "version": "5.2.5",
4
4
  "description": "Microi吾码 AI 开发 CLI 与多宿主 Plugin:服务器连接、Skills、MCP、V8 同步和低代码交付",
5
5
  "license": "MIT",
6
6
  "homepage": "https://microi.net/doc/v8-engine/vs-code-plugin.html",
@@ -1,13 +1,13 @@
1
1
  {
2
- "builtAt": "2026-08-23T04:41:57.567Z",
2
+ "builtAt": "2026-08-23T14:58:08.574Z",
3
3
  "source": "../microi.skills",
4
4
  "extension": {
5
5
  "name": "v8-engine",
6
- "version": "5.2.4",
6
+ "version": "5.2.5",
7
7
  "publisher": "Microi"
8
8
  },
9
9
  "skills": {
10
- "version": "5.2.4",
10
+ "version": "5.2.5",
11
11
  "versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
12
12
  "managedBy": "Microi.VSCode/bump-version.js"
13
13
  },
@@ -15,17 +15,17 @@
15
15
  "dir": "dist/microi.skills",
16
16
  "files": 177,
17
17
  "skills": 64,
18
- "bytes": 2196071
18
+ "bytes": 2203781
19
19
  },
20
20
  "fileHashes": {
21
- ".microi-skills-version.json": "1fd9e365bae1ad365000ec91ce3030cce03daeff60a7784441a09b8ab5654624",
22
- ".progressive-disclosure-manifest.json": "852576d84d0c40d3171771ff8373b85b74e93c74f26a1a4d76c3577233a98b5a",
21
+ ".microi-skills-version.json": "edfcc8af8d98926cce19fe52c30446b22b5ba72c880fbfccc594798a191d45fe",
22
+ ".progressive-disclosure-manifest.json": "b5c82065e02f151ef3c70efa006bae125e0a059b8aee99543d2c5b53bed1ace1",
23
23
  "README.md": "d39c20a392145fe9aff9929bec11549bdd1fe1640e5af63228ac396b21173046",
24
24
  "ai-engine/SKILL.md": "0d91e157454569003b216ee4e6efa8b161dd7409788c4cae9f10f212531badc3",
25
25
  "ai-engine/agents/openai.yaml": "40deb07801006a46b9a7f0020d13251955eeadd04c8e591160210479936f8b5b",
26
26
  "ai-platform-governance/SKILL.md": "84ca4bcacf15deecd0c04dc1a664b23041a6a5f020d3a5288c5458b5e7da4b8e",
27
27
  "ai-platform-governance/references/progressive-01-功能开关.md": "ea46fb02267e9e3ace3d9d72e67b02183c61e5c198f4b2f27e8196d6ee6d0bec",
28
- "app-store/SKILL.md": "9e8b311bfa03e573cfdd00f256a8e27ca3684158fb1266822589480088556533",
28
+ "app-store/SKILL.md": "b9b800f0300b36d105026821039ae3c10719e8bb32cdb23be255b87e67bbba08",
29
29
  "app-store/agents/openai.yaml": "eda8f5cf043e7b8fb0e4fb3acf0625fef95eb49586b43187ced277cd0ae4a2c4",
30
30
  "business-blueprint/SKILL.md": "01619a3b6d37b5b67649ee59d2701301222006d3b943882b2802b1721c58f8a9",
31
31
  "datasource-engine/SKILL.md": "bed8352f1d43b55145e1c492d1ea0ca1ec8750b5c4d74e1e80cd71aa7b9a2e6f",
@@ -91,7 +91,7 @@
91
91
  "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "44df3c20120298f6565cf4388eadca70d98d097880c61168ce6d3ac03e80968b",
92
92
  "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "31a0a12e39ec785df038fb5c73d4978d6dec42d86c52b79e91082c9ac13f29cf",
93
93
  "microi.v8.js": "4e5b7bb819255159a3d7a9555af662618162e31ec41cb3b67b3d7cc01635c9ec",
94
- "module-engine/SKILL.md": "2580bd3405ad3fbcd203e5f01b1ca275d056fbb6c4b864842f372d9872e4dbc8",
94
+ "module-engine/SKILL.md": "64c899b916aca60189b5cb02abe6577d686bcd3820188970d32f751699196266",
95
95
  "module-engine/references/module-config.md": "9e8ac8a7f65d6b563f938193d4b7c6b230d878a3513fc2a90c8b780e70ddd353",
96
96
  "ocr-engine/SKILL.md": "239fed8ba28c0178fbbcc4c3dc8d4f3b8b8cf1d2b794db2014c2600ea7835da6",
97
97
  "ocr-engine/agents/openai.yaml": "3a6cc9984a246c41332c5f53d1badef31b78f81324333ea0d6337cb20c7fc898",
@@ -147,7 +147,7 @@
147
147
  "v8-crud-api/references/progressive-02-where-条件语法速查.md": "3ee7f1ef68b3546a5dacd0ed12f94e1ca7bf6cd10ecf5c3594bc4ecfb63f333d",
148
148
  "v8-debugging/SKILL.md": "32007f51d5ba0a6125f2220904bf1864a283820bb61ee6c0b2c9a0e8477f776c",
149
149
  "v8-explorer-tree/SKILL.md": "1c941d9b5b589a27ed2ce3000f69206c2209660f7d1c86b5b0cb0a82bc1d5003",
150
- "v8-export-import/SKILL.md": "f5c04ad68d1aea586ae01fab3c6a22942cf578e160ce59d4f16dc1667f7b9a5d",
150
+ "v8-export-import/SKILL.md": "9926cf41b8adaf22bfbabc7775a2138385ebe6a2c8d6855ec78252e8ee944a6c",
151
151
  "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "71ab3c94a6034f2d0c374de594104543770cb1313a6515494a213a1ecdf5baf7",
152
152
  "v8-export-import/references/progressive-02-powerpoint-导出.md": "5837905a195be7c38fe37e0abd40eee95a8bc26acdab1f3a9aba01c264a125ae",
153
153
  "v8-export-import/references/progressive-03-安全-性能注意.md": "a2acc492740eb693be5a0ad275cabcba7a813aa7378c844e43b04233d03a9d0c",
@@ -197,183 +197,183 @@
197
197
  "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "86db1f03700fd54dd824d28c553c678202e8f74b796fd0f9d91f63bf53a530b1"
198
198
  },
199
199
  "fileVersions": {
200
- ".microi-skills-version.json": "5.2.4",
201
- ".progressive-disclosure-manifest.json": "5.2.4",
202
- "README.md": "5.2.4",
203
- "ai-engine/SKILL.md": "5.2.4",
204
- "ai-engine/agents/openai.yaml": "5.2.4",
205
- "ai-platform-governance/SKILL.md": "5.2.4",
206
- "ai-platform-governance/references/progressive-01-功能开关.md": "5.2.4",
207
- "app-store/SKILL.md": "5.2.4",
208
- "app-store/agents/openai.yaml": "5.2.4",
209
- "business-blueprint/SKILL.md": "5.2.4",
210
- "datasource-engine/SKILL.md": "5.2.4",
211
- "datasource-engine/agents/openai.yaml": "5.2.4",
212
- "dos-orm/SKILL.md": "5.2.4",
213
- "dos-orm/references/api-reference.md": "5.2.4",
214
- "job-engine/SKILL.md": "5.2.4",
215
- "job-engine/agents/openai.yaml": "5.2.4",
216
- "message-notification/SKILL.md": "5.2.4",
217
- "message-notification/agents/openai.yaml": "5.2.4",
218
- "message-notification/references/contracts.md": "5.2.4",
219
- "microi-ai-app-auth.js": "5.2.4",
220
- "microi-ai-application/SKILL.md": "5.2.4",
221
- "microi-ai-application/agents/openai.yaml": "5.2.4",
222
- "microi-ai-application/references/frontend-baseline.md": "5.2.4",
223
- "microi-client-frontend/SKILL.md": "5.2.4",
224
- "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.2.4",
225
- "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.2.4",
226
- "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.2.4",
227
- "microi-codex-installer/SKILL.md": "5.2.4",
228
- "microi-codex-installer/agents/openai.yaml": "5.2.4",
229
- "microi-codex/SKILL.md": "5.2.4",
230
- "microi-datasource-mapping/SKILL.md": "5.2.4",
231
- "microi-db-schema/SKILL.md": "5.2.4",
232
- "microi-db-schema/agents/openai.yaml": "5.2.4",
233
- "microi-db-schema/references/core-tables.md": "5.2.4",
234
- "microi-db-schema/references/form-component-options.md": "5.2.4",
235
- "microi-db-schema/references/schema-overview.md": "5.2.4",
236
- "microi-db-schema/references/schema.md": "5.2.4",
237
- "microi-db-schema/references/table-catalog.md": "5.2.4",
238
- "microi-deployment/SKILL.md": "5.2.4",
239
- "microi-deployment/references/deployment-matrix.md": "5.2.4",
240
- "microi-docs-coverage/SKILL.md": "5.2.4",
241
- "microi-docs-coverage/references/capability-map.md": "5.2.4",
242
- "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.2.4",
243
- "microi-form-engine/SKILL.md": "5.2.4",
244
- "microi-form-engine/references/component-catalog.md": "5.2.4",
245
- "microi-form-engine/references/data-source-events.md": "5.2.4",
246
- "microi-form-layout/SKILL.md": "5.2.4",
247
- "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.2.4",
248
- "microi-frontend-sdk/SKILL.md": "5.2.4",
249
- "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.2.4",
250
- "microi-left-right-layout/SKILL.md": "5.2.4",
251
- "microi-microservice/SKILL.md": "5.2.4",
252
- "microi-microservice/references/runtime-delivery.md": "5.2.4",
253
- "microi-mobile-app-quality/SKILL.md": "5.2.4",
254
- "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.2.4",
255
- "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.2.4",
256
- "microi-solution-quotation/SKILL.md": "5.2.4",
257
- "microi-solution-quotation/agents/openai.yaml": "5.2.4",
258
- "microi-solution-quotation/scripts/build_solution_quote.py": "5.2.4",
259
- "microi-sso/SKILL.md": "5.2.4",
260
- "microi-sso/references/acceptance.md": "5.2.4",
261
- "microi-sso/references/configuration-and-security.md": "5.2.4",
262
- "microi-sso/references/inbound.md": "5.2.4",
263
- "microi-sso/references/outbound.md": "5.2.4",
264
- "microi-system-delivery/SKILL.md": "5.2.4",
265
- "microi-system-delivery/references/progressive-01-标准工作流.md": "5.2.4",
266
- "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.2.4",
267
- "microi-ui/SKILL.md": "5.2.4",
268
- "microi-ui/references/progressive-01-移动端场景蓝图.md": "5.2.4",
269
- "microi-uniapp-frontend/SKILL.md": "5.2.4",
270
- "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.2.4",
271
- "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.2.4",
272
- "microi.v8.js": "5.2.4",
273
- "module-engine/SKILL.md": "5.2.4",
274
- "module-engine/references/module-config.md": "5.2.4",
275
- "ocr-engine/SKILL.md": "5.2.4",
276
- "ocr-engine/agents/openai.yaml": "5.2.4",
277
- "page-engine/SKILL.md": "5.2.4",
278
- "page-engine/references/progressive-01-所有组件类型.md": "5.2.4",
279
- "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.2.4",
280
- "performance-testing/SKILL.md": "5.2.4",
281
- "playwright-e2e/SKILL.md": "5.2.4",
282
- "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.2.4",
283
- "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.2.4",
284
- "playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.2.4",
285
- "playwright-e2e/references/progressive-04-ci-建议.md": "5.2.4",
286
- "print-engine/SKILL.md": "5.2.4",
287
- "production-readonly-audit/SKILL.md": "5.2.4",
288
- "report-engine/SKILL.md": "5.2.4",
289
- "report-engine/agents/openai.yaml": "5.2.4",
290
- "scripts/optimize-progressive-disclosure.mjs": "5.2.4",
291
- "scripts/refresh-progressive-disclosure.mjs": "5.2.4",
292
- "scripts/validate-progressive-disclosure.mjs": "5.2.4",
293
- "search-engine/SKILL.md": "5.2.4",
294
- "search-engine/agents/openai.yaml": "5.2.4",
295
- "spider-engine/SKILL.md": "5.2.4",
296
- "translate-engine/SKILL.md": "5.2.4",
297
- "translate-engine/agents/openai.yaml": "5.2.4",
298
- "ui-design/SKILL.md": "5.2.4",
299
- "ui-design/assets/pattern-showcase/app.js": "5.2.4",
300
- "ui-design/assets/pattern-showcase/index.html": "5.2.4",
301
- "ui-design/assets/pattern-showcase/styles.css": "5.2.4",
302
- "ui-design/assets/templates/MCI-DESIGN.md": "5.2.4",
303
- "ui-design/references/design-pattern-library.md": "5.2.4",
304
- "ui-design/references/mci-design-contract.md": "5.2.4",
305
- "ui-design/references/motion-and-media.md": "5.2.4",
306
- "ui-design/references/product-flow-recipes.md": "5.2.4",
307
- "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.2.4",
308
- "ui-design/references/progressive-02-字体.md": "5.2.4",
309
- "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.2.4",
310
- "ui-design/references/progressive-04-组件风格速查.md": "5.2.4",
311
- "ui-design/references/progressive-05-移动端专用规范.md": "5.2.4",
312
- "ui-design/references/progressive-06-主题切换实现.md": "5.2.4",
313
- "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.2.4",
314
- "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.2.4",
315
- "uniapp-mall-assets/SKILL.md": "5.2.4",
316
- "unity-integration/SKILL.md": "5.2.4",
317
- "unity-integration/agents/openai.yaml": "5.2.4",
318
- "unity-integration/references/ai-app-delivery.md": "5.2.4",
319
- "unity-integration/references/sdk-api.md": "5.2.4",
320
- "unity-integration/references/toolbox-migration.md": "5.2.4",
321
- "unity-integration/references/webgl-hosting.md": "5.2.4",
322
- "v8-api-config/SKILL.md": "5.2.4",
323
- "v8-cache-pattern/SKILL.md": "5.2.4",
324
- "v8-crud-api/SKILL.md": "5.2.4",
325
- "v8-crud-api/references/progressive-01-查询列表-分页.md": "5.2.4",
326
- "v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.2.4",
327
- "v8-debugging/SKILL.md": "5.2.4",
328
- "v8-explorer-tree/SKILL.md": "5.2.4",
329
- "v8-export-import/SKILL.md": "5.2.4",
330
- "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.2.4",
331
- "v8-export-import/references/progressive-02-powerpoint-导出.md": "5.2.4",
332
- "v8-export-import/references/progressive-03-安全-性能注意.md": "5.2.4",
333
- "v8-file-upload/SKILL.md": "5.2.4",
334
- "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.2.4",
335
- "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.2.4",
336
- "v8-formengine-http/SKILL.md": "5.2.4",
337
- "v8-frontend-events/SKILL.md": "5.2.4",
338
- "v8-frontend-events/references/bluetooth-print-api.md": "5.2.4",
339
- "v8-frontend-events/references/bluetooth-print.md": "5.2.4",
340
- "v8-frontend-events/references/progressive-01-列表事件.md": "5.2.4",
341
- "v8-http-integration/SKILL.md": "5.2.4",
342
- "v8-http-integration/references/progressive-01-get-请求.md": "5.2.4",
343
- "v8-http-integration/references/progressive-02-错误处理模式.md": "5.2.4",
344
- "v8-image-processing/SKILL.md": "5.2.4",
345
- "v8-image-processing/agents/openai.yaml": "5.2.4",
346
- "v8-image-processing/references/api-reference.md": "5.2.4",
347
- "v8-menu-buttons/SKILL.md": "5.2.4",
348
- "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.2.4",
349
- "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.2.4",
350
- "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.2.4",
351
- "v8-mongodb/SKILL.md": "5.2.4",
352
- "v8-mq-mqtt/SKILL.md": "5.2.4",
353
- "v8-mq-mqtt/references/mqtt-production.md": "5.2.4",
354
- "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.2.4",
355
- "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.2.4",
356
- "v8-saas-multi-tenant/SKILL.md": "5.2.4",
357
- "v8-security/SKILL.md": "5.2.4",
358
- "v8-security/references/progressive-01-2-权限校验.md": "5.2.4",
359
- "v8-security/references/progressive-02-7-日志记录.md": "5.2.4",
360
- "v8-sql-query/SKILL.md": "5.2.4",
361
- "v8-table-event/SKILL.md": "5.2.4",
362
- "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.2.4",
363
- "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.2.4",
364
- "v8-tcp-integration/SKILL.md": "5.2.4",
365
- "v8-tcp-integration/agents/openai.yaml": "5.2.4",
366
- "v8-template-engine/SKILL.md": "5.2.4",
367
- "v8-utilities/SKILL.md": "5.2.4",
368
- "v8-utilities/references/client-api-index.md": "5.2.4",
369
- "v8-utilities/references/platform-http-routes.md": "5.2.4",
370
- "v8-utilities/references/server-api-index.md": "5.2.4",
371
- "v8-workflow/SKILL.md": "5.2.4",
372
- "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.2.4",
373
- "workspace-conventions/SKILL.md": "5.2.4",
374
- "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.2.4",
375
- "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.2.4",
376
- "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.2.4"
200
+ ".microi-skills-version.json": "5.2.5",
201
+ ".progressive-disclosure-manifest.json": "5.2.5",
202
+ "README.md": "5.2.5",
203
+ "ai-engine/SKILL.md": "5.2.5",
204
+ "ai-engine/agents/openai.yaml": "5.2.5",
205
+ "ai-platform-governance/SKILL.md": "5.2.5",
206
+ "ai-platform-governance/references/progressive-01-功能开关.md": "5.2.5",
207
+ "app-store/SKILL.md": "5.2.5",
208
+ "app-store/agents/openai.yaml": "5.2.5",
209
+ "business-blueprint/SKILL.md": "5.2.5",
210
+ "datasource-engine/SKILL.md": "5.2.5",
211
+ "datasource-engine/agents/openai.yaml": "5.2.5",
212
+ "dos-orm/SKILL.md": "5.2.5",
213
+ "dos-orm/references/api-reference.md": "5.2.5",
214
+ "job-engine/SKILL.md": "5.2.5",
215
+ "job-engine/agents/openai.yaml": "5.2.5",
216
+ "message-notification/SKILL.md": "5.2.5",
217
+ "message-notification/agents/openai.yaml": "5.2.5",
218
+ "message-notification/references/contracts.md": "5.2.5",
219
+ "microi-ai-app-auth.js": "5.2.5",
220
+ "microi-ai-application/SKILL.md": "5.2.5",
221
+ "microi-ai-application/agents/openai.yaml": "5.2.5",
222
+ "microi-ai-application/references/frontend-baseline.md": "5.2.5",
223
+ "microi-client-frontend/SKILL.md": "5.2.5",
224
+ "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.2.5",
225
+ "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.2.5",
226
+ "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.2.5",
227
+ "microi-codex-installer/SKILL.md": "5.2.5",
228
+ "microi-codex-installer/agents/openai.yaml": "5.2.5",
229
+ "microi-codex/SKILL.md": "5.2.5",
230
+ "microi-datasource-mapping/SKILL.md": "5.2.5",
231
+ "microi-db-schema/SKILL.md": "5.2.5",
232
+ "microi-db-schema/agents/openai.yaml": "5.2.5",
233
+ "microi-db-schema/references/core-tables.md": "5.2.5",
234
+ "microi-db-schema/references/form-component-options.md": "5.2.5",
235
+ "microi-db-schema/references/schema-overview.md": "5.2.5",
236
+ "microi-db-schema/references/schema.md": "5.2.5",
237
+ "microi-db-schema/references/table-catalog.md": "5.2.5",
238
+ "microi-deployment/SKILL.md": "5.2.5",
239
+ "microi-deployment/references/deployment-matrix.md": "5.2.5",
240
+ "microi-docs-coverage/SKILL.md": "5.2.5",
241
+ "microi-docs-coverage/references/capability-map.md": "5.2.5",
242
+ "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.2.5",
243
+ "microi-form-engine/SKILL.md": "5.2.5",
244
+ "microi-form-engine/references/component-catalog.md": "5.2.5",
245
+ "microi-form-engine/references/data-source-events.md": "5.2.5",
246
+ "microi-form-layout/SKILL.md": "5.2.5",
247
+ "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.2.5",
248
+ "microi-frontend-sdk/SKILL.md": "5.2.5",
249
+ "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.2.5",
250
+ "microi-left-right-layout/SKILL.md": "5.2.5",
251
+ "microi-microservice/SKILL.md": "5.2.5",
252
+ "microi-microservice/references/runtime-delivery.md": "5.2.5",
253
+ "microi-mobile-app-quality/SKILL.md": "5.2.5",
254
+ "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.2.5",
255
+ "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.2.5",
256
+ "microi-solution-quotation/SKILL.md": "5.2.5",
257
+ "microi-solution-quotation/agents/openai.yaml": "5.2.5",
258
+ "microi-solution-quotation/scripts/build_solution_quote.py": "5.2.5",
259
+ "microi-sso/SKILL.md": "5.2.5",
260
+ "microi-sso/references/acceptance.md": "5.2.5",
261
+ "microi-sso/references/configuration-and-security.md": "5.2.5",
262
+ "microi-sso/references/inbound.md": "5.2.5",
263
+ "microi-sso/references/outbound.md": "5.2.5",
264
+ "microi-system-delivery/SKILL.md": "5.2.5",
265
+ "microi-system-delivery/references/progressive-01-标准工作流.md": "5.2.5",
266
+ "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.2.5",
267
+ "microi-ui/SKILL.md": "5.2.5",
268
+ "microi-ui/references/progressive-01-移动端场景蓝图.md": "5.2.5",
269
+ "microi-uniapp-frontend/SKILL.md": "5.2.5",
270
+ "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.2.5",
271
+ "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.2.5",
272
+ "microi.v8.js": "5.2.5",
273
+ "module-engine/SKILL.md": "5.2.5",
274
+ "module-engine/references/module-config.md": "5.2.5",
275
+ "ocr-engine/SKILL.md": "5.2.5",
276
+ "ocr-engine/agents/openai.yaml": "5.2.5",
277
+ "page-engine/SKILL.md": "5.2.5",
278
+ "page-engine/references/progressive-01-所有组件类型.md": "5.2.5",
279
+ "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.2.5",
280
+ "performance-testing/SKILL.md": "5.2.5",
281
+ "playwright-e2e/SKILL.md": "5.2.5",
282
+ "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.2.5",
283
+ "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.2.5",
284
+ "playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.2.5",
285
+ "playwright-e2e/references/progressive-04-ci-建议.md": "5.2.5",
286
+ "print-engine/SKILL.md": "5.2.5",
287
+ "production-readonly-audit/SKILL.md": "5.2.5",
288
+ "report-engine/SKILL.md": "5.2.5",
289
+ "report-engine/agents/openai.yaml": "5.2.5",
290
+ "scripts/optimize-progressive-disclosure.mjs": "5.2.5",
291
+ "scripts/refresh-progressive-disclosure.mjs": "5.2.5",
292
+ "scripts/validate-progressive-disclosure.mjs": "5.2.5",
293
+ "search-engine/SKILL.md": "5.2.5",
294
+ "search-engine/agents/openai.yaml": "5.2.5",
295
+ "spider-engine/SKILL.md": "5.2.5",
296
+ "translate-engine/SKILL.md": "5.2.5",
297
+ "translate-engine/agents/openai.yaml": "5.2.5",
298
+ "ui-design/SKILL.md": "5.2.5",
299
+ "ui-design/assets/pattern-showcase/app.js": "5.2.5",
300
+ "ui-design/assets/pattern-showcase/index.html": "5.2.5",
301
+ "ui-design/assets/pattern-showcase/styles.css": "5.2.5",
302
+ "ui-design/assets/templates/MCI-DESIGN.md": "5.2.5",
303
+ "ui-design/references/design-pattern-library.md": "5.2.5",
304
+ "ui-design/references/mci-design-contract.md": "5.2.5",
305
+ "ui-design/references/motion-and-media.md": "5.2.5",
306
+ "ui-design/references/product-flow-recipes.md": "5.2.5",
307
+ "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.2.5",
308
+ "ui-design/references/progressive-02-字体.md": "5.2.5",
309
+ "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.2.5",
310
+ "ui-design/references/progressive-04-组件风格速查.md": "5.2.5",
311
+ "ui-design/references/progressive-05-移动端专用规范.md": "5.2.5",
312
+ "ui-design/references/progressive-06-主题切换实现.md": "5.2.5",
313
+ "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.2.5",
314
+ "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.2.5",
315
+ "uniapp-mall-assets/SKILL.md": "5.2.5",
316
+ "unity-integration/SKILL.md": "5.2.5",
317
+ "unity-integration/agents/openai.yaml": "5.2.5",
318
+ "unity-integration/references/ai-app-delivery.md": "5.2.5",
319
+ "unity-integration/references/sdk-api.md": "5.2.5",
320
+ "unity-integration/references/toolbox-migration.md": "5.2.5",
321
+ "unity-integration/references/webgl-hosting.md": "5.2.5",
322
+ "v8-api-config/SKILL.md": "5.2.5",
323
+ "v8-cache-pattern/SKILL.md": "5.2.5",
324
+ "v8-crud-api/SKILL.md": "5.2.5",
325
+ "v8-crud-api/references/progressive-01-查询列表-分页.md": "5.2.5",
326
+ "v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.2.5",
327
+ "v8-debugging/SKILL.md": "5.2.5",
328
+ "v8-explorer-tree/SKILL.md": "5.2.5",
329
+ "v8-export-import/SKILL.md": "5.2.5",
330
+ "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.2.5",
331
+ "v8-export-import/references/progressive-02-powerpoint-导出.md": "5.2.5",
332
+ "v8-export-import/references/progressive-03-安全-性能注意.md": "5.2.5",
333
+ "v8-file-upload/SKILL.md": "5.2.5",
334
+ "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.2.5",
335
+ "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.2.5",
336
+ "v8-formengine-http/SKILL.md": "5.2.5",
337
+ "v8-frontend-events/SKILL.md": "5.2.5",
338
+ "v8-frontend-events/references/bluetooth-print-api.md": "5.2.5",
339
+ "v8-frontend-events/references/bluetooth-print.md": "5.2.5",
340
+ "v8-frontend-events/references/progressive-01-列表事件.md": "5.2.5",
341
+ "v8-http-integration/SKILL.md": "5.2.5",
342
+ "v8-http-integration/references/progressive-01-get-请求.md": "5.2.5",
343
+ "v8-http-integration/references/progressive-02-错误处理模式.md": "5.2.5",
344
+ "v8-image-processing/SKILL.md": "5.2.5",
345
+ "v8-image-processing/agents/openai.yaml": "5.2.5",
346
+ "v8-image-processing/references/api-reference.md": "5.2.5",
347
+ "v8-menu-buttons/SKILL.md": "5.2.5",
348
+ "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.2.5",
349
+ "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.2.5",
350
+ "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.2.5",
351
+ "v8-mongodb/SKILL.md": "5.2.5",
352
+ "v8-mq-mqtt/SKILL.md": "5.2.5",
353
+ "v8-mq-mqtt/references/mqtt-production.md": "5.2.5",
354
+ "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.2.5",
355
+ "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.2.5",
356
+ "v8-saas-multi-tenant/SKILL.md": "5.2.5",
357
+ "v8-security/SKILL.md": "5.2.5",
358
+ "v8-security/references/progressive-01-2-权限校验.md": "5.2.5",
359
+ "v8-security/references/progressive-02-7-日志记录.md": "5.2.5",
360
+ "v8-sql-query/SKILL.md": "5.2.5",
361
+ "v8-table-event/SKILL.md": "5.2.5",
362
+ "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.2.5",
363
+ "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.2.5",
364
+ "v8-tcp-integration/SKILL.md": "5.2.5",
365
+ "v8-tcp-integration/agents/openai.yaml": "5.2.5",
366
+ "v8-template-engine/SKILL.md": "5.2.5",
367
+ "v8-utilities/SKILL.md": "5.2.5",
368
+ "v8-utilities/references/client-api-index.md": "5.2.5",
369
+ "v8-utilities/references/platform-http-routes.md": "5.2.5",
370
+ "v8-utilities/references/server-api-index.md": "5.2.5",
371
+ "v8-workflow/SKILL.md": "5.2.5",
372
+ "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.2.5",
373
+ "workspace-conventions/SKILL.md": "5.2.5",
374
+ "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.2.5",
375
+ "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.2.5",
376
+ "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.2.5"
377
377
  },
378
378
  "files": [
379
379
  ".microi-skills-version.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "5.2.4",
2
+ "version": "5.2.5",
3
3
  "versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
4
4
  "managedBy": "Microi.VSCode/bump-version.js",
5
- "updatedAt": "2026-08-23T04:41:26.232Z"
5
+ "updatedAt": "2026-08-23T14:57:38.632Z"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-08-23T00:53:50.403Z",
3
+ "generatedAt": "2026-08-23T11:33:47.095Z",
4
4
  "policy": {
5
5
  "maxEntryLines": 285,
6
6
  "referenceBudgetLines": 245,
@@ -2091,11 +2091,11 @@
2091
2091
  ]
2092
2092
  },
2093
2093
  "v8-export-import": {
2094
- "originalSha256": "76d9a977e0c510e72a3b3b938631970b5d0ba480b8ced4e3f2622db85c2692a8",
2095
- "originalLines": 608,
2094
+ "originalSha256": "161e52443dfefde5530e07509429ca19d18ca46a85807455d1b09b60dc72e866",
2095
+ "originalLines": 616,
2096
2096
  "prefixSha256": "db7143225a92851a015cc0d5e5a7dd40db9d16e6fcdffdc1e5116f32f52ebbda",
2097
2097
  "prefixBytes": 1120,
2098
- "entryLines": 198,
2098
+ "entryLines": 206,
2099
2099
  "chunks": [
2100
2100
  {
2101
2101
  "id": "v8-export-import-000",
@@ -2125,8 +2125,8 @@
2125
2125
  "id": "v8-export-import-003",
2126
2126
  "ordinal": 7,
2127
2127
  "destination": "v8-export-import/SKILL.md",
2128
- "sha256": "75977093346f025e91041b36bdb7887e2cacee854800c1f43e407e8fc037a166",
2129
- "lines": 36,
2128
+ "sha256": "51a6c3e7a44ca35dc17b5536545ac7a1d47a8915045283841d304a04c04cd219",
2129
+ "lines": 44,
2130
2130
  "heading": "解析上传的 Excel(导入)"
2131
2131
  },
2132
2132
  {
@@ -264,3 +264,18 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
264
264
  - 根因:跨租户自愈没有校验由服务端控制面持久化的目标租户保留标记,也没有要求任务拥有者与执行租户不同;把同租户自助批量和主租户代子租户执行混成了同一作用域。
265
265
  - 通用规则:运行前强制自愈只允许用于固定批量工作器、非空服务端目标标记、`owner != execution` 且标记精确等于执行租户的主→子任务。普通租户自助批量必须跳过跨租户复制,让持久计划按官方列表顺序优先安装/更新应用商城自身,再由新版导入器继续后续应用;不能要求官方发布源安装自己。
266
266
  - 自动化与真实验收:单元测试覆盖同租户无标记、同租户伪标记、跨租户正确标记、标记漂移和错误工作器 Key;真实旧租户先保留旧导入器发起自助批量,断言不再出现“子租户商城工作器执行前自愈失败”,计划第一项为应用商城,全部任务成功后立即执行零更新复跑。
267
+
268
+ ## 复盘:平台包跨旧租户安装时同时暴露结构闭包、元数据回读与目录脆弱性
269
+
270
+ - 触发场景:同一轮主租户批量任务在不同子租户分别报“数据集目标表尚未创建”“接口引擎写入后 HTTP 状态不一致”“既有菜单 Url 唯一冲突”或“未找到 OsClient”;父任务若在目录阶段对全部目标做有副作用自举,还会让一个坏租户阻断其余已可执行租户。
271
+ - 包结构闭包:任何 `DataSets.TableName` 都必须由同一包的 `DiyTables + DiyFields + DDLStatements + PhysicalColumns` 完整创建或由显式依赖声明保证先安装,不能只因为官方母库已有该表就省略。契约测试要逐个数据集反向验证目标表、主键、字段和物理 DDL,并在真实缺表旧租户执行首次安装与重复安装。
272
+ - 受管接口状态:旧库 `diy_field` 元数据可能落后于 `sys_apiengine` 物理列,导致 FormEngine 返回成功却忽略 `IsEnable/StopHttp`。仅对受信官方 `Managed` 接口的固定布尔控制列,允许在 FormEngine 写后不一致时按稳定 Id 参数化校准物理列、清理租户缓存并严格二次回读;源码、匿名权限、ApiAddress 和租户扩展不得借此绕过三方冲突或所有权保护,二次回读仍不一致必须整包失败。
273
+ - 菜单与目录隔离:更新既有菜单发生 Url 唯一冲突时,优先保留目标租户当前唯一路由;确需新路由时使用有界、可回读的稳定后缀,不得字符串拼 SQL。子租户目录发现必须是无副作用读取;运行时缺失在单目标投递前按 `sys_osclients` 受控热加载并只记录该租户失败,已经排队的子任务继续监控到终态,禁止一个 `未找到OsClient` 提前终止整批。
274
+ - 百租户并发边界:父协调任务继续使用集群级防重键;子安装任务必须使用固定商城工作器 `ConcurrencyKey` 在当前运行环境内串行。不能根据 `OsClient` 推断物理库隔离,因为多个子租户可能共享同一数据库;只有未来能由服务端权威连接指纹证明互不共享物理库并建立分组锁时,才允许在不同物理库组间并行。
275
+ - 兼容与验收:V8 协调器需要兼容尚未部署新 C# 原子的节点,在目录或单目标投递返回明确的缺失 OsClient 时最多热加载并重试一次,重复同一缺失或超过安全上限立即失败关闭。验收顺序固定为先更新主租户应用商城导入器,再用不可变 `StoreVersionId` 更新 SaaS 协调器,完成全部子租户父子任务收敛,最后立即执行 `Planned=0` 的无操作重跑;同时保留每个失败租户的独立任务和通知中心证据。
276
+
277
+ ## 复盘:旧对象存储节点缺少 MoveObject 导致编译资源无限重传
278
+
279
+ - 触发场景:平台微服务包只有少量 `BuildAssets`,但后台检查点长期停在 `ApplicationAssets / Build / AssetIndex=1`,`ApplicationAssetUploaded` 却持续超过包内资源总数。目标节点能够上传并回读公有对象,但不支持或拒绝 `MoveObject`;导入器每一片都重新上传同一文件,再因移动失败写回临时路径,下一片继续重复。
280
+ - 通用规则:新上传文件移动到租户稳定路径失败时,若上传结果已通过摘要和大小校验,应保留这个真实可读路径并写入显式兼容 scope(当前为 `PrivateSource+PublicBuildMoveFallback`)。后续分片只允许在同时命中 AppId、文件路径、摘要、大小、真实 HDFS 路径和该 scope 时直接复用,禁止再次调用 `MoveObject` 或上传;没有兼容标记的历史坏路径仍只允许一次有界重传修复,不能把任意旧元数据误当成有效对象。
281
+ - 自举与验收:主租户投递每个子任务前必须先复制最新版应用商城导入器和批量工作器,已经排队的任务不得假定会动态取得主租户新代码。回归测试要模拟“上传成功、MoveObject 不可用、下一分片恢复”,断言上传次数保持 1 且资源索引继续前进;真实旧租户验收必须观察 4 个编译资源在有界片数内完成,并在全租户成功后立即做 `Planned=0` 复跑。
@@ -112,10 +112,22 @@ Iframe 不把长期 Token、密码或连接串放 URL。第三方单点登录使
112
112
  - 查询接口替换、导入/导出替换和跨表动作属于复杂逻辑时,使用接口引擎。
113
113
  - 前端按钮只做确认、收集少量参数、调用接口和刷新;事务与最终校验在后端。
114
114
  - 预计超过 2 分钟、500 条、1000 个扇出或 100 次外部调用时使用真实后台任务。
115
- - 不复制官网旧“Redis 文本进度 + 长事务循环”导入示例作为新实现;必须有稳定
116
- 幂等键、业务任务状态、真实 Current/Total、失败恢复和必要的 checkpoint 分片。
117
-
118
- ## 跨端 ViewSchema
115
+ - 不复制官网旧“Redis 文本进度 + 长事务循环”导入示例作为新实现;必须有稳定
116
+ 幂等键、业务任务状态、真实 Current/Total、失败恢复和必要的 checkpoint 分片。
117
+
118
+ ### 菜单启动查询与字段元数据兼容
119
+
120
+ - 菜单树是登录后的启动控制面。读取 `sys_menu` 时,不能把浏览器传入的
121
+ `_SelectFields` 直接交给依赖 `diy_field` 的通用查询投影:旧库、空库或升级后缓存
122
+ 未同步时,物理列仍存在但元数据可能不完整,查询结果会退化成只含固定字段 `Id`。
123
+ - 服务端应先在已完成登录、租户与角色菜单范围校验的可信边界读取物理菜单行,再在内存中
124
+ 按请求字段投影;构建树所需的 `Id/ParentId/Sort` 必须保留。可信标记不得由浏览器 JSON
125
+ 绑定,不能借此绕过菜单、角色或数据权限。
126
+ - 底层菜单查询失败必须原样返回失败,禁止把失败结果转换成 `Code=1` 的空菜单。回归测试至少
127
+ 覆盖“不向表单引擎下传显式投影”“字段名大小写兼容”“投影仍保留树字段”“未指定字段时
128
+ 保留物理行”。
129
+
130
+ ## 跨端 ViewSchema
119
131
 
120
132
  顶层 PC 数据列表默认使用紧凑的新模块标题样式;即使未启用自定义表单视图,也不能退回无标题的旧外观。无指标头部固定 `44px`、含指标头部固定 `62px`,连同间距总纵向占用约 `50px / 68px`。子表、关联表、嵌入表不重复显示,移动端由固定导航栏承载标题。`Scene=List/Card` 的个性化标题、指标、复合列和卡片配置存在时必须直接生效;`EnableViewSchema` 只控制 Detail/Edit 自定义表单视图。
121
133
 
@@ -150,8 +150,8 @@ return {
150
150
  | `NumberFormat/HeaderStyle/Style` | 数字格式与列级样式 |
151
151
 
152
152
  <!-- /microi-progressive:chunk -->
153
- <!-- microi-progressive:chunk id=v8-export-import-003 sha256=75977093346f025e91041b36bdb7887e2cacee854800c1f43e407e8fc037a166 -->
154
- ## 解析上传的 Excel(导入)
153
+ <!-- microi-progressive:chunk id=v8-export-import-003 sha256=51a6c3e7a44ca35dc17b5536545ac7a1d47a8915045283841d304a04c04cd219 -->
154
+ ## 解析上传的 Excel / CSV(导入)
155
155
 
156
156
  ```javascript
157
157
  // 接口引擎接收 V8.FilesByteBase64
@@ -171,16 +171,24 @@ var dataList = parsed.Data; // [{ 列标题: 值, ... }, ...]
171
171
  return { Code: 1, Data: dataList, DataCount: dataList.length };
172
172
  ```
173
173
 
174
- `ExcelToList` 的增强参数为 `HeaderStartRow/HeaderEndRow/DataStartRow/DataEndRow/Columns/MaxDataRows/MaxColumns`。除 `SheetIndex` 和 `Columns[].ColumnIndex` 从 `0` 开始外,行号都从 `1` 开始;传增强范围后每行带 `_ExcelRow`。参数全省略时继续兼容“首行表头、第二行开始数据”。
174
+ `ExcelToList` 的增强参数为 `FileType/FileName/Encoding/Delimiter/HeaderStartRow/HeaderEndRow/DataStartRow/DataEndRow/Columns/MaxDataRows/MaxColumns`。CSV `FileType:'csv'` 或 `.csv` 文件名,编码和分隔符通常省略,由服务端自动识别 UTF-8/GBK 与逗号、制表符、分号、竖线;结果通过 `DataAppend.Encoding/Delimiter` 回传实际识别值。除 `SheetIndex` 和 `Columns[].ColumnIndex` 从 `0` 开始外,行号都从 `1` 开始;传增强范围后每行带 `_ExcelRow`。参数全省略时继续兼容“首行表头、第二行开始数据”。
175
175
 
176
176
  ### 固定版式模板与后台自定义导入
177
177
 
178
- 通用【导入】和 `V8.OpenImportDialog` 共用智能导入弹层:默认宽度 `80%`,选择文件后自动识别工作表、单行/多级合并表头、首条与末条数据行和字段映射;先按每页 `15` 条预览,用户确认后才写入。低可信度时必须允许用户人工指定表头/数据起止行和逐列映射。模板顶部图片、标题、说明文字以及 A 列为空的数据行都不能破坏识别。
178
+ 通用【导入】和 `V8.OpenImportDialog` 共用智能导入弹层:默认宽度 `80%`,支持 `.xls/.xlsx/.csv`,选择文件后自动识别工作表、单行/多级合并表头、首条与末条数据行和字段映射;先按每页 `15` 条预览,用户确认后才写入。数据预览必须独立保留全部源列、源行,不能因为零字段匹配而显示空白;未匹配列头以红色和悬停原因标记。低可信度时必须允许用户人工指定表头/数据起止行和逐列映射。模板顶部图片、标题、说明文字以及 A 列为空的数据行都不能破坏识别。
179
+
180
+ 【列映射】后的【原始工作簿】页签必须不依赖解析可信度,直接显示完整工作簿/CSV,包括所有工作表、合并表头、图片、说明、样式和原始数据;该视图只用于核对,不能绕过目标字段映射和服务端校验。
181
+
182
+ `.xlsx` 原始预览必须兼容 OpenPyXL 等生成器使用等价 DrawingML 默认命名空间的锚定图片。只允许在内存中的预览副本规范化 `xdr` 命名空间和关系目标;正式上传、接口引擎和服务端复核始终使用未经改写的原始文件。
179
183
 
180
184
  - 页面 V8 可只声明 `ApiEngineKey`;`Workbook.Cells/Columns/HeaderStartRow/HeaderEndRow/DataStartRow/DataEndRow/KeyField` 均为模板提示或固定约束,不传时自动识别。不得拼上传 DOM、传完整工作簿 Base64 或自行轮询。
181
- - `V8.OpenImportDialog` 后台接口引擎从 `V8.Param._ImportRowsJson` `_ImportMetaJson` 取值;必须重做模板、权限、字段、唯一性和状态校验。
182
- - 菜单【导入接口替换】仍接收原始文件 `V8.FilesByteBase64`,并新增 `_ImportMetaJson`。接口引擎必须把元数据里的 `SheetIndex/HeaderStartRow/HeaderEndRow/DataStartRow/DataEndRow/Columns` 传给 `V8.Office.ExcelToList`,由服务端按同一范围重读原文件,不能只信任浏览器预览,也不能固定读取第一行。
183
- - 先校验全部行再写入;接口引擎返回 `Code != 1` 时依靠平台事务整体回滚,禁止手动 Commit/Rollback。
185
+ - 弹层必须让用户在 `RollbackAll`(默认,任一错误整批回滚)和 `ContinueOnError`(逐行提交/跳过错误行)之间明确选择;未传时保持旧版 `RollbackAll`。最终值同时写入 `_ImportErrorPolicy` `_ImportMetaJson.ErrorPolicy`,不能由服务端静默改成另一策略。
186
+ - 当前表的唯一配置必须在上传前可读展示:每个 `Unique=1 + Config.Unique.Type=Alone` 字段各自是一条规则,全部 `Type=All` 字段共同组成一条组合规则;无唯一规则时明确警告“只能新增,重复导入可能产生重复数据”。
187
+ - 标准导入的服务端必须从权威 `diy_field` 重新计算唯一规则,不能信任前端快照。任一完整规则命中同一 Id 则按 Id 修改,均未命中则新增;不同规则命中不同 Id、或一条规则命中多条脏数据时按行报冲突,禁止任意选记录或按宽泛条件更新多行。
188
+ - `V8.OpenImportDialog` 后台接口引擎从 `V8.Param._ImportRowsJson`、`_ImportMetaJson`、`_ImportErrorPolicy` 和 `_ImportUniqueRulesJson` 取值;必须重做模板、权限、字段、唯一性和状态校验。v2.2 元数据中的 `UniqueRules` 只用于说明和诊断。
189
+ - 菜单【导入接口替换】仍接收原始文件 `V8.FilesByteBase64`,并接收上述策略/规则元数据。接口引擎必须把元数据里的 `FileType/SheetIndex/HeaderStartRow/HeaderEndRow/DataStartRow/DataEndRow/Columns` 传给 `V8.Office.ExcelToList`,由服务端按同一范围重读原文件;CSV 应省略固定 `Encoding/Delimiter` 让服务端独立识别,再用 `DataAppend` 与元数据交叉复核。不能只信任浏览器预览,也不能固定读取第一行。
190
+ - `RollbackAll` 在首个行错误时返回 `Code != 1`,依靠平台事务整体回滚;`ContinueOnError` 捕获并记录行错误、继续下一行,最后返回 `Code=1` 提交成功行。两种模式都禁止手动 Commit/Rollback;若底层异常使事务不可继续,必须先做整批预校验或使用平台允许的独立幂等行操作。
191
+ - 结果与进度必须分别统计 `Added/Updated/Failed/Errors`;整批回滚后成功、新增、修改数必须归零,不能把已回滚行计作成功。
184
192
  - 用 `V8.Method.UpdateBackgroundTask({Current,Total,Msg,Log})` 上报真实校验/写入工作量;未知总量保持不确定进度,不伪造百分比。
185
193
  - 业务幂等键使用后台任务 Id 或明确的导入操作 Id;重试前回读批次,避免重复写入。
186
194