@microi.net/cli 5.2.9 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "5.2.9",
8
+ "version": "5.3.1",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "5.2.9",
14
+ "version": "5.3.1",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "5.2.9",
3
+ "version": "5.3.1",
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.9",
3
+ "version": "5.3.1",
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.9",
8
+ "version": "5.3.1",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "5.2.9",
14
+ "version": "5.3.1",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "5.2.9",
3
+ "version": "5.3.1",
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-25T02:18:24.149Z",
3
- "version": "5.2.9",
2
+ "builtAt": "2026-08-25T16:02:29.739Z",
3
+ "version": "5.3.1",
4
4
  "sourceProducts": [
5
5
  "vscode-extension",
6
6
  "microi-cli",
@@ -13,6 +13,6 @@
13
13
  "cli": "19fa79f0727616fbaaa9cdffc2485dc58aede013931d3d5662baa36cdbf5eb07",
14
14
  "router": "ffc14787fc2d3d6173b7a779b77139b759eb1d482cea787f71283f4017a4e223",
15
15
  "broker": "caae2730cc411d11c20f33b367968f7538aae8f5b65a713fcc557deedaefcf70",
16
- "dshBundle": "0c611e7277e2064009b4d789f721282bb1854054f535b164fb5e8d58f5294ebc"
16
+ "dshBundle": "52be7f2c184779d6450f8411bb1d8f3ff7c0fd96cb421eb98c826a2b813f4c85"
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.9';\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.3.1';\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.9",
3
+ "version": "5.3.1",
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-25T02:18:22.909Z",
2
+ "builtAt": "2026-08-25T16:02:28.604Z",
3
3
  "source": "../microi.skills",
4
4
  "extension": {
5
5
  "name": "v8-engine",
6
- "version": "5.2.9",
6
+ "version": "5.3.1",
7
7
  "publisher": "Microi"
8
8
  },
9
9
  "skills": {
10
- "version": "5.2.9",
10
+ "version": "5.3.1",
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": 178,
17
17
  "skills": 65,
18
- "bytes": 2254645
18
+ "bytes": 2258104
19
19
  },
20
20
  "fileHashes": {
21
- ".microi-skills-version.json": "2d77a79b32af4fa267caa2bb96e98c9a4e4df9798ea6f14eca36518bb78623d3",
21
+ ".microi-skills-version.json": "17740c07538ee6375cf5a58e2316e31e1f9f53136f217bd841c793faf7c8192f",
22
22
  ".progressive-disclosure-manifest.json": "647fb9b710b958ca64713c45bb0e8a17252ec7f2913179327a26525a2cd5a31d",
23
23
  "README.md": "332aade05015acac5f1387829a42529f37fc203ff0fcfb2f16cc3afdbb23b1ed",
24
24
  "ai-engine/SKILL.md": "df63cf56bd06027f30bd0597003c65b479049141fc0b4a31d33cbc9a5fa044cf",
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": "55f03986168fb5bac82b631e88baa1bc0b666412e34c9b7b92b3302642c2324a",
28
+ "app-store/SKILL.md": "e05b00605910f2d0db27f1ad32742bf89d95468e238d70402997119bd5ebf585",
29
29
  "app-store/agents/openai.yaml": "eda8f5cf043e7b8fb0e4fb3acf0625fef95eb49586b43187ced277cd0ae4a2c4",
30
30
  "business-blueprint/SKILL.md": "01619a3b6d37b5b67649ee59d2701301222006d3b943882b2802b1721c58f8a9",
31
31
  "datasource-engine/SKILL.md": "bed8352f1d43b55145e1c492d1ea0ca1ec8750b5c4d74e1e80cd71aa7b9a2e6f",
@@ -170,12 +170,12 @@
170
170
  "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "d64938d7b17a77fd8a83e16baf9a34a35a79f05a96b47794cfd8401e173df6cc",
171
171
  "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "7a3ab56864a0485279e53bad65ff8f3f880a3495b16a48a4bbf9b71e9e83ea2a",
172
172
  "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "36487289e5f20ba7d0b4e4a2fba737d1ac45395ffba037b84c88a8d50ed44901",
173
- "v8-mongodb/SKILL.md": "526d77b0afd20417a0c03b2a8f958a6f8c99241f3f65bc01f642824ec55127ee",
173
+ "v8-mongodb/SKILL.md": "6aa9ffad6dc2495488ed63744e9353f6e24c38b2cf4eecd8dcba8f1898a35956",
174
174
  "v8-mq-mqtt/SKILL.md": "a96679cd2c87ade78dfe271a52d8562895c0d91b227cb28947cccbbf37a0320d",
175
175
  "v8-mq-mqtt/references/mqtt-production.md": "fec6dd18d58c0f0fc90a295286945f6e7cb7f43c60022c4fd9d48f9baafb35b9",
176
176
  "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "842c74bd8bc30b932346e34c0d4154edffc1bf6a5a8aaafaaa344f250394762c",
177
177
  "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "433b922578f37e95483a3d794ad0bf60ba6344fe9ea580eeb3d34b42c50d352f",
178
- "v8-saas-multi-tenant/SKILL.md": "24754fb8fe34d5c3b0bf76925b0e82c033736135fa70aa4e314677bc23547b4d",
178
+ "v8-saas-multi-tenant/SKILL.md": "5c6dc57f52ed55ac401c4e7debc81a5ee7c97aeba34c303995bcdb61d7bdc9b1",
179
179
  "v8-security/SKILL.md": "f7736752de7981deb6b62e468b20a2b7ca5654b6d7a93c56be1ce18a32a15e9b",
180
180
  "v8-security/references/progressive-01-2-权限校验.md": "a7e2314b8f2f9bf413956191ffeda6d2f823760def2b06bf6b4c1565e8f71816",
181
181
  "v8-security/references/progressive-02-7-日志记录.md": "2758de279da56e90587df8422e25a1ccfce5c3bdc1f1c363a90c666b6c3f298a",
@@ -188,8 +188,8 @@
188
188
  "v8-template-engine/SKILL.md": "19363a9e047737b62236f187946ac8398ee6cb19907de70ce0888681b75afb15",
189
189
  "v8-utilities/SKILL.md": "2cf8fc6d1a9296ea60bb89ea1b130ac5c9a1f9eb94802fed0cceaf8b61de1b30",
190
190
  "v8-utilities/references/client-api-index.md": "3362126197bd34191640d6bd532b16f1ed446c4a8a9d805f4973be5d58b90a4a",
191
- "v8-utilities/references/platform-http-routes.md": "36a28da8f294eac6cf0b853bb58c88050fe19ac0ffe98daff71cd0c786669da4",
192
- "v8-utilities/references/server-api-index.md": "8e4392ac26fcf0c2a4715d966d526cb142a077dfb68bea0a117971ffaf23bc15",
191
+ "v8-utilities/references/platform-http-routes.md": "b081b87dff5848eed9b948e2324d25ff27f26f14dc2045df486e9a66981bb74b",
192
+ "v8-utilities/references/server-api-index.md": "8728a1bff73ae5066d48560f2d6e276d7235dd7df6f887c3b7e06e6a1dd2016b",
193
193
  "v8-workflow/SKILL.md": "d068ceded6f338fece9443f354dff21dfcf744dd192dd6329b2e98692bb8181e",
194
194
  "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "9b6b01e7ac03c0a11bc837671a30107ff5c5f253029d74fd17713084104d7e99",
195
195
  "workspace-conventions/SKILL.md": "1ba87f3812a83469dfbec33e7efa34a401d3efda5bdbccb083c9c8e0f93f0321",
@@ -198,184 +198,184 @@
198
198
  "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "86db1f03700fd54dd824d28c553c678202e8f74b796fd0f9d91f63bf53a530b1"
199
199
  },
200
200
  "fileVersions": {
201
- ".microi-skills-version.json": "5.2.9",
202
- ".progressive-disclosure-manifest.json": "5.2.9",
203
- "README.md": "5.2.9",
204
- "ai-engine/SKILL.md": "5.2.9",
205
- "ai-engine/agents/openai.yaml": "5.2.9",
206
- "ai-platform-governance/SKILL.md": "5.2.9",
207
- "ai-platform-governance/references/progressive-01-功能开关.md": "5.2.9",
208
- "app-store/SKILL.md": "5.2.9",
209
- "app-store/agents/openai.yaml": "5.2.9",
210
- "business-blueprint/SKILL.md": "5.2.9",
211
- "datasource-engine/SKILL.md": "5.2.9",
212
- "datasource-engine/agents/openai.yaml": "5.2.9",
213
- "dos-orm/SKILL.md": "5.2.9",
214
- "dos-orm/references/api-reference.md": "5.2.9",
215
- "job-engine/SKILL.md": "5.2.9",
216
- "job-engine/agents/openai.yaml": "5.2.9",
217
- "message-notification/SKILL.md": "5.2.9",
218
- "message-notification/agents/openai.yaml": "5.2.9",
219
- "message-notification/references/contracts.md": "5.2.9",
220
- "microi-ai-app-auth.js": "5.2.9",
221
- "microi-ai-application/SKILL.md": "5.2.9",
222
- "microi-ai-application/agents/openai.yaml": "5.2.9",
223
- "microi-ai-application/references/frontend-baseline.md": "5.2.9",
224
- "microi-client-frontend/SKILL.md": "5.2.9",
225
- "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.2.9",
226
- "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.2.9",
227
- "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.2.9",
228
- "microi-codex-installer/SKILL.md": "5.2.9",
229
- "microi-codex-installer/agents/openai.yaml": "5.2.9",
230
- "microi-codex/SKILL.md": "5.2.9",
231
- "microi-datasource-mapping/SKILL.md": "5.2.9",
232
- "microi-db-schema/SKILL.md": "5.2.9",
233
- "microi-db-schema/agents/openai.yaml": "5.2.9",
234
- "microi-db-schema/references/core-tables.md": "5.2.9",
235
- "microi-db-schema/references/form-component-options.md": "5.2.9",
236
- "microi-db-schema/references/schema-overview.md": "5.2.9",
237
- "microi-db-schema/references/schema.md": "5.2.9",
238
- "microi-db-schema/references/table-catalog.md": "5.2.9",
239
- "microi-deployment/SKILL.md": "5.2.9",
240
- "microi-deployment/references/deployment-matrix.md": "5.2.9",
241
- "microi-docs-coverage/SKILL.md": "5.2.9",
242
- "microi-docs-coverage/references/capability-map.md": "5.2.9",
243
- "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.2.9",
244
- "microi-form-engine/SKILL.md": "5.2.9",
245
- "microi-form-engine/references/component-catalog.md": "5.2.9",
246
- "microi-form-engine/references/data-source-events.md": "5.2.9",
247
- "microi-form-layout/SKILL.md": "5.2.9",
248
- "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.2.9",
249
- "microi-frontend-sdk/SKILL.md": "5.2.9",
250
- "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.2.9",
251
- "microi-left-right-layout/SKILL.md": "5.2.9",
252
- "microi-microservice/SKILL.md": "5.2.9",
253
- "microi-microservice/references/runtime-delivery.md": "5.2.9",
254
- "microi-mobile-app-quality/SKILL.md": "5.2.9",
255
- "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.2.9",
256
- "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.2.9",
257
- "microi-solution-quotation/SKILL.md": "5.2.9",
258
- "microi-solution-quotation/agents/openai.yaml": "5.2.9",
259
- "microi-solution-quotation/scripts/build_solution_quote.py": "5.2.9",
260
- "microi-sso/SKILL.md": "5.2.9",
261
- "microi-sso/references/acceptance.md": "5.2.9",
262
- "microi-sso/references/configuration-and-security.md": "5.2.9",
263
- "microi-sso/references/inbound.md": "5.2.9",
264
- "microi-sso/references/outbound.md": "5.2.9",
265
- "microi-system-delivery/SKILL.md": "5.2.9",
266
- "microi-system-delivery/references/progressive-01-标准工作流.md": "5.2.9",
267
- "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.2.9",
268
- "microi-ui/SKILL.md": "5.2.9",
269
- "microi-ui/references/progressive-01-移动端场景蓝图.md": "5.2.9",
270
- "microi-uniapp-frontend/SKILL.md": "5.2.9",
271
- "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.2.9",
272
- "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.2.9",
273
- "microi.v8.js": "5.2.9",
274
- "module-engine/SKILL.md": "5.2.9",
275
- "module-engine/references/module-config.md": "5.2.9",
276
- "ocr-engine/SKILL.md": "5.2.9",
277
- "ocr-engine/agents/openai.yaml": "5.2.9",
278
- "page-engine/SKILL.md": "5.2.9",
279
- "page-engine/references/progressive-01-所有组件类型.md": "5.2.9",
280
- "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.2.9",
281
- "performance-testing/SKILL.md": "5.2.9",
282
- "playwright-e2e/SKILL.md": "5.2.9",
283
- "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.2.9",
284
- "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.2.9",
285
- "playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.2.9",
286
- "playwright-e2e/references/progressive-04-ci-建议.md": "5.2.9",
287
- "print-engine/SKILL.md": "5.2.9",
288
- "production-readonly-audit/SKILL.md": "5.2.9",
289
- "report-engine/SKILL.md": "5.2.9",
290
- "report-engine/agents/openai.yaml": "5.2.9",
291
- "scripts/optimize-progressive-disclosure.mjs": "5.2.9",
292
- "scripts/refresh-progressive-disclosure.mjs": "5.2.9",
293
- "scripts/validate-progressive-disclosure.mjs": "5.2.9",
294
- "search-engine/SKILL.md": "5.2.9",
295
- "search-engine/agents/openai.yaml": "5.2.9",
296
- "spider-engine/SKILL.md": "5.2.9",
297
- "system-observability/SKILL.md": "5.2.9",
298
- "translate-engine/SKILL.md": "5.2.9",
299
- "translate-engine/agents/openai.yaml": "5.2.9",
300
- "ui-design/SKILL.md": "5.2.9",
301
- "ui-design/assets/pattern-showcase/app.js": "5.2.9",
302
- "ui-design/assets/pattern-showcase/index.html": "5.2.9",
303
- "ui-design/assets/pattern-showcase/styles.css": "5.2.9",
304
- "ui-design/assets/templates/MCI-DESIGN.md": "5.2.9",
305
- "ui-design/references/design-pattern-library.md": "5.2.9",
306
- "ui-design/references/mci-design-contract.md": "5.2.9",
307
- "ui-design/references/motion-and-media.md": "5.2.9",
308
- "ui-design/references/product-flow-recipes.md": "5.2.9",
309
- "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.2.9",
310
- "ui-design/references/progressive-02-字体.md": "5.2.9",
311
- "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.2.9",
312
- "ui-design/references/progressive-04-组件风格速查.md": "5.2.9",
313
- "ui-design/references/progressive-05-移动端专用规范.md": "5.2.9",
314
- "ui-design/references/progressive-06-主题切换实现.md": "5.2.9",
315
- "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.2.9",
316
- "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.2.9",
317
- "uniapp-mall-assets/SKILL.md": "5.2.9",
318
- "unity-integration/SKILL.md": "5.2.9",
319
- "unity-integration/agents/openai.yaml": "5.2.9",
320
- "unity-integration/references/ai-app-delivery.md": "5.2.9",
321
- "unity-integration/references/sdk-api.md": "5.2.9",
322
- "unity-integration/references/toolbox-migration.md": "5.2.9",
323
- "unity-integration/references/webgl-hosting.md": "5.2.9",
324
- "v8-api-config/SKILL.md": "5.2.9",
325
- "v8-cache-pattern/SKILL.md": "5.2.9",
326
- "v8-crud-api/SKILL.md": "5.2.9",
327
- "v8-crud-api/references/progressive-01-查询列表-分页.md": "5.2.9",
328
- "v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.2.9",
329
- "v8-debugging/SKILL.md": "5.2.9",
330
- "v8-explorer-tree/SKILL.md": "5.2.9",
331
- "v8-export-import/SKILL.md": "5.2.9",
332
- "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.2.9",
333
- "v8-export-import/references/progressive-02-powerpoint-导出.md": "5.2.9",
334
- "v8-export-import/references/progressive-03-安全-性能注意.md": "5.2.9",
335
- "v8-file-upload/SKILL.md": "5.2.9",
336
- "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.2.9",
337
- "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.2.9",
338
- "v8-formengine-http/SKILL.md": "5.2.9",
339
- "v8-frontend-events/SKILL.md": "5.2.9",
340
- "v8-frontend-events/references/bluetooth-print-api.md": "5.2.9",
341
- "v8-frontend-events/references/bluetooth-print.md": "5.2.9",
342
- "v8-frontend-events/references/progressive-01-列表事件.md": "5.2.9",
343
- "v8-http-integration/SKILL.md": "5.2.9",
344
- "v8-http-integration/references/progressive-01-get-请求.md": "5.2.9",
345
- "v8-http-integration/references/progressive-02-错误处理模式.md": "5.2.9",
346
- "v8-image-processing/SKILL.md": "5.2.9",
347
- "v8-image-processing/agents/openai.yaml": "5.2.9",
348
- "v8-image-processing/references/api-reference.md": "5.2.9",
349
- "v8-menu-buttons/SKILL.md": "5.2.9",
350
- "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.2.9",
351
- "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.2.9",
352
- "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.2.9",
353
- "v8-mongodb/SKILL.md": "5.2.9",
354
- "v8-mq-mqtt/SKILL.md": "5.2.9",
355
- "v8-mq-mqtt/references/mqtt-production.md": "5.2.9",
356
- "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.2.9",
357
- "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.2.9",
358
- "v8-saas-multi-tenant/SKILL.md": "5.2.9",
359
- "v8-security/SKILL.md": "5.2.9",
360
- "v8-security/references/progressive-01-2-权限校验.md": "5.2.9",
361
- "v8-security/references/progressive-02-7-日志记录.md": "5.2.9",
362
- "v8-sql-query/SKILL.md": "5.2.9",
363
- "v8-table-event/SKILL.md": "5.2.9",
364
- "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.2.9",
365
- "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.2.9",
366
- "v8-tcp-integration/SKILL.md": "5.2.9",
367
- "v8-tcp-integration/agents/openai.yaml": "5.2.9",
368
- "v8-template-engine/SKILL.md": "5.2.9",
369
- "v8-utilities/SKILL.md": "5.2.9",
370
- "v8-utilities/references/client-api-index.md": "5.2.9",
371
- "v8-utilities/references/platform-http-routes.md": "5.2.9",
372
- "v8-utilities/references/server-api-index.md": "5.2.9",
373
- "v8-workflow/SKILL.md": "5.2.9",
374
- "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.2.9",
375
- "workspace-conventions/SKILL.md": "5.2.9",
376
- "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.2.9",
377
- "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.2.9",
378
- "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.2.9"
201
+ ".microi-skills-version.json": "5.3.1",
202
+ ".progressive-disclosure-manifest.json": "5.3.1",
203
+ "README.md": "5.3.1",
204
+ "ai-engine/SKILL.md": "5.3.1",
205
+ "ai-engine/agents/openai.yaml": "5.3.1",
206
+ "ai-platform-governance/SKILL.md": "5.3.1",
207
+ "ai-platform-governance/references/progressive-01-功能开关.md": "5.3.1",
208
+ "app-store/SKILL.md": "5.3.1",
209
+ "app-store/agents/openai.yaml": "5.3.1",
210
+ "business-blueprint/SKILL.md": "5.3.1",
211
+ "datasource-engine/SKILL.md": "5.3.1",
212
+ "datasource-engine/agents/openai.yaml": "5.3.1",
213
+ "dos-orm/SKILL.md": "5.3.1",
214
+ "dos-orm/references/api-reference.md": "5.3.1",
215
+ "job-engine/SKILL.md": "5.3.1",
216
+ "job-engine/agents/openai.yaml": "5.3.1",
217
+ "message-notification/SKILL.md": "5.3.1",
218
+ "message-notification/agents/openai.yaml": "5.3.1",
219
+ "message-notification/references/contracts.md": "5.3.1",
220
+ "microi-ai-app-auth.js": "5.3.1",
221
+ "microi-ai-application/SKILL.md": "5.3.1",
222
+ "microi-ai-application/agents/openai.yaml": "5.3.1",
223
+ "microi-ai-application/references/frontend-baseline.md": "5.3.1",
224
+ "microi-client-frontend/SKILL.md": "5.3.1",
225
+ "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.3.1",
226
+ "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.3.1",
227
+ "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.3.1",
228
+ "microi-codex-installer/SKILL.md": "5.3.1",
229
+ "microi-codex-installer/agents/openai.yaml": "5.3.1",
230
+ "microi-codex/SKILL.md": "5.3.1",
231
+ "microi-datasource-mapping/SKILL.md": "5.3.1",
232
+ "microi-db-schema/SKILL.md": "5.3.1",
233
+ "microi-db-schema/agents/openai.yaml": "5.3.1",
234
+ "microi-db-schema/references/core-tables.md": "5.3.1",
235
+ "microi-db-schema/references/form-component-options.md": "5.3.1",
236
+ "microi-db-schema/references/schema-overview.md": "5.3.1",
237
+ "microi-db-schema/references/schema.md": "5.3.1",
238
+ "microi-db-schema/references/table-catalog.md": "5.3.1",
239
+ "microi-deployment/SKILL.md": "5.3.1",
240
+ "microi-deployment/references/deployment-matrix.md": "5.3.1",
241
+ "microi-docs-coverage/SKILL.md": "5.3.1",
242
+ "microi-docs-coverage/references/capability-map.md": "5.3.1",
243
+ "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.3.1",
244
+ "microi-form-engine/SKILL.md": "5.3.1",
245
+ "microi-form-engine/references/component-catalog.md": "5.3.1",
246
+ "microi-form-engine/references/data-source-events.md": "5.3.1",
247
+ "microi-form-layout/SKILL.md": "5.3.1",
248
+ "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.3.1",
249
+ "microi-frontend-sdk/SKILL.md": "5.3.1",
250
+ "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.3.1",
251
+ "microi-left-right-layout/SKILL.md": "5.3.1",
252
+ "microi-microservice/SKILL.md": "5.3.1",
253
+ "microi-microservice/references/runtime-delivery.md": "5.3.1",
254
+ "microi-mobile-app-quality/SKILL.md": "5.3.1",
255
+ "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.3.1",
256
+ "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.3.1",
257
+ "microi-solution-quotation/SKILL.md": "5.3.1",
258
+ "microi-solution-quotation/agents/openai.yaml": "5.3.1",
259
+ "microi-solution-quotation/scripts/build_solution_quote.py": "5.3.1",
260
+ "microi-sso/SKILL.md": "5.3.1",
261
+ "microi-sso/references/acceptance.md": "5.3.1",
262
+ "microi-sso/references/configuration-and-security.md": "5.3.1",
263
+ "microi-sso/references/inbound.md": "5.3.1",
264
+ "microi-sso/references/outbound.md": "5.3.1",
265
+ "microi-system-delivery/SKILL.md": "5.3.1",
266
+ "microi-system-delivery/references/progressive-01-标准工作流.md": "5.3.1",
267
+ "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.3.1",
268
+ "microi-ui/SKILL.md": "5.3.1",
269
+ "microi-ui/references/progressive-01-移动端场景蓝图.md": "5.3.1",
270
+ "microi-uniapp-frontend/SKILL.md": "5.3.1",
271
+ "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.3.1",
272
+ "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.3.1",
273
+ "microi.v8.js": "5.3.1",
274
+ "module-engine/SKILL.md": "5.3.1",
275
+ "module-engine/references/module-config.md": "5.3.1",
276
+ "ocr-engine/SKILL.md": "5.3.1",
277
+ "ocr-engine/agents/openai.yaml": "5.3.1",
278
+ "page-engine/SKILL.md": "5.3.1",
279
+ "page-engine/references/progressive-01-所有组件类型.md": "5.3.1",
280
+ "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.3.1",
281
+ "performance-testing/SKILL.md": "5.3.1",
282
+ "playwright-e2e/SKILL.md": "5.3.1",
283
+ "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.3.1",
284
+ "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.3.1",
285
+ "playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.3.1",
286
+ "playwright-e2e/references/progressive-04-ci-建议.md": "5.3.1",
287
+ "print-engine/SKILL.md": "5.3.1",
288
+ "production-readonly-audit/SKILL.md": "5.3.1",
289
+ "report-engine/SKILL.md": "5.3.1",
290
+ "report-engine/agents/openai.yaml": "5.3.1",
291
+ "scripts/optimize-progressive-disclosure.mjs": "5.3.1",
292
+ "scripts/refresh-progressive-disclosure.mjs": "5.3.1",
293
+ "scripts/validate-progressive-disclosure.mjs": "5.3.1",
294
+ "search-engine/SKILL.md": "5.3.1",
295
+ "search-engine/agents/openai.yaml": "5.3.1",
296
+ "spider-engine/SKILL.md": "5.3.1",
297
+ "system-observability/SKILL.md": "5.3.1",
298
+ "translate-engine/SKILL.md": "5.3.1",
299
+ "translate-engine/agents/openai.yaml": "5.3.1",
300
+ "ui-design/SKILL.md": "5.3.1",
301
+ "ui-design/assets/pattern-showcase/app.js": "5.3.1",
302
+ "ui-design/assets/pattern-showcase/index.html": "5.3.1",
303
+ "ui-design/assets/pattern-showcase/styles.css": "5.3.1",
304
+ "ui-design/assets/templates/MCI-DESIGN.md": "5.3.1",
305
+ "ui-design/references/design-pattern-library.md": "5.3.1",
306
+ "ui-design/references/mci-design-contract.md": "5.3.1",
307
+ "ui-design/references/motion-and-media.md": "5.3.1",
308
+ "ui-design/references/product-flow-recipes.md": "5.3.1",
309
+ "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.3.1",
310
+ "ui-design/references/progressive-02-字体.md": "5.3.1",
311
+ "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.3.1",
312
+ "ui-design/references/progressive-04-组件风格速查.md": "5.3.1",
313
+ "ui-design/references/progressive-05-移动端专用规范.md": "5.3.1",
314
+ "ui-design/references/progressive-06-主题切换实现.md": "5.3.1",
315
+ "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.3.1",
316
+ "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.3.1",
317
+ "uniapp-mall-assets/SKILL.md": "5.3.1",
318
+ "unity-integration/SKILL.md": "5.3.1",
319
+ "unity-integration/agents/openai.yaml": "5.3.1",
320
+ "unity-integration/references/ai-app-delivery.md": "5.3.1",
321
+ "unity-integration/references/sdk-api.md": "5.3.1",
322
+ "unity-integration/references/toolbox-migration.md": "5.3.1",
323
+ "unity-integration/references/webgl-hosting.md": "5.3.1",
324
+ "v8-api-config/SKILL.md": "5.3.1",
325
+ "v8-cache-pattern/SKILL.md": "5.3.1",
326
+ "v8-crud-api/SKILL.md": "5.3.1",
327
+ "v8-crud-api/references/progressive-01-查询列表-分页.md": "5.3.1",
328
+ "v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.3.1",
329
+ "v8-debugging/SKILL.md": "5.3.1",
330
+ "v8-explorer-tree/SKILL.md": "5.3.1",
331
+ "v8-export-import/SKILL.md": "5.3.1",
332
+ "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.3.1",
333
+ "v8-export-import/references/progressive-02-powerpoint-导出.md": "5.3.1",
334
+ "v8-export-import/references/progressive-03-安全-性能注意.md": "5.3.1",
335
+ "v8-file-upload/SKILL.md": "5.3.1",
336
+ "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.3.1",
337
+ "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.3.1",
338
+ "v8-formengine-http/SKILL.md": "5.3.1",
339
+ "v8-frontend-events/SKILL.md": "5.3.1",
340
+ "v8-frontend-events/references/bluetooth-print-api.md": "5.3.1",
341
+ "v8-frontend-events/references/bluetooth-print.md": "5.3.1",
342
+ "v8-frontend-events/references/progressive-01-列表事件.md": "5.3.1",
343
+ "v8-http-integration/SKILL.md": "5.3.1",
344
+ "v8-http-integration/references/progressive-01-get-请求.md": "5.3.1",
345
+ "v8-http-integration/references/progressive-02-错误处理模式.md": "5.3.1",
346
+ "v8-image-processing/SKILL.md": "5.3.1",
347
+ "v8-image-processing/agents/openai.yaml": "5.3.1",
348
+ "v8-image-processing/references/api-reference.md": "5.3.1",
349
+ "v8-menu-buttons/SKILL.md": "5.3.1",
350
+ "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.3.1",
351
+ "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.3.1",
352
+ "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.3.1",
353
+ "v8-mongodb/SKILL.md": "5.3.1",
354
+ "v8-mq-mqtt/SKILL.md": "5.3.1",
355
+ "v8-mq-mqtt/references/mqtt-production.md": "5.3.1",
356
+ "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.3.1",
357
+ "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.3.1",
358
+ "v8-saas-multi-tenant/SKILL.md": "5.3.1",
359
+ "v8-security/SKILL.md": "5.3.1",
360
+ "v8-security/references/progressive-01-2-权限校验.md": "5.3.1",
361
+ "v8-security/references/progressive-02-7-日志记录.md": "5.3.1",
362
+ "v8-sql-query/SKILL.md": "5.3.1",
363
+ "v8-table-event/SKILL.md": "5.3.1",
364
+ "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.3.1",
365
+ "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.3.1",
366
+ "v8-tcp-integration/SKILL.md": "5.3.1",
367
+ "v8-tcp-integration/agents/openai.yaml": "5.3.1",
368
+ "v8-template-engine/SKILL.md": "5.3.1",
369
+ "v8-utilities/SKILL.md": "5.3.1",
370
+ "v8-utilities/references/client-api-index.md": "5.3.1",
371
+ "v8-utilities/references/platform-http-routes.md": "5.3.1",
372
+ "v8-utilities/references/server-api-index.md": "5.3.1",
373
+ "v8-workflow/SKILL.md": "5.3.1",
374
+ "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.3.1",
375
+ "workspace-conventions/SKILL.md": "5.3.1",
376
+ "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.3.1",
377
+ "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.3.1",
378
+ "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.3.1"
379
379
  },
380
380
  "files": [
381
381
  ".microi-skills-version.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "5.2.9",
2
+ "version": "5.3.1",
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-25T02:17:40.843Z"
5
+ "updatedAt": "2026-08-25T16:01:51.682Z"
6
6
  }
@@ -74,7 +74,8 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
74
74
  - 每次安装、更新、重新安装生成稳定 `OperationId`。官方计数服务用共享数据库事件表唯一约束去重,并在同一事务内登记事件和递增 `InstallCount`;重试、跨节点和响应丢失不得重复计数。
75
75
  - 安装次数回传属于非阻塞幂等遥测,不是应用导入事务的成功条件。来源节点返回旧格式 `True`、空响应、非 JSON、业务失败或请求异常时,只能写入带 `OperationId`/`InstallationKey` 的 warning 诊断,不得用 `_error_` 标记或回滚已经成功导入的应用;重试仍须复用同一幂等键。
76
76
  - “全部安装/更新”固定只处理 `ApplicationType=Platform` 的官方平台应用中未安装与存在新版本的项目,不得把 UniApp、Web、MicroService 或其它社区/AI 应用整库安装;已是最新版的应用不重新安装。批量计划、子项状态、checkpoint 和进度必须持久化到共享数据库/后台任务,支持多节点抢占、失败重试和重启恢复,不能依赖进程内集合或浏览器状态。
77
- - 主租户批量维护全部子租户时,前端入口和接口引擎都必须校验主租户上下文及 `Level >= 9999`,再由可信控制面为每个启用子租户创建独立持久后台任务;父任务必须按子任务真实百分比聚合进度,等全部子任务终态后才成功或失败,并在通知中心保留每个租户、阶段和原始失败原因。所有子任务可立即创建,但固定商城工作器必须通过配置租户 Redis 的集群并发租约跨租户串行执行,避免共享物理库并发 DDL/元数据写入死锁;分片幂等任务使用足以覆盖短时死锁和滚动重启的有界重试预算,禁止无限重试。`MaxAttempts` 表示连续失败预算:任一分片成功写入 checkpoint 后必须把 `AttemptCount` 与陈旧 `LastError` 清零,不能让数百个成功分片之间偶发的网络错误按任务生命周期累计并误终结。分片重新入队后必须按 `COALESCE(NextRunTime, CreateTime)` 选取最早就绪任务,禁止只按 `CreateTime` 让最早长任务重复抢占全部分片。商城包属于只读权威数据,可对空响应做有界退避重试,并优先用完整响应的 `Content`、`RawBytes`、HTTP 状态和传输错误诊断;不得把该规则扩展到安装写入请求。目标租户固定商城工作器只允许从受信任官方谱系向更高版本刷新;同版本不同源码、目标端更新版或未知谱系必须失败关闭。历史空库缺少生成实体所需物理列时,导入器须在首次 FormEngine 调用前幂等补齐并回读,不能再把真实表结构错误包装成 `Value cannot be null (source)`。
77
+ - 主租户批量维护全部子租户时,前端入口和接口引擎都必须校验主租户上下文及 `Level >= 9999`,再由可信控制面为每个启用子租户创建独立持久后台任务;父任务必须按子任务真实百分比聚合进度,等全部子任务终态后才成功或失败,并在通知中心保留每个租户、阶段和原始失败原因。所有子任务可立即创建,但固定商城工作器必须通过配置租户 Redis 的集群并发租约跨租户串行执行,避免共享物理库并发 DDL/元数据写入死锁;分片幂等任务使用足以覆盖短时死锁和滚动重启的有界重试预算,禁止无限重试。`MaxAttempts` 表示连续失败预算:任一分片成功写入 checkpoint 后必须把 `AttemptCount` 与陈旧 `LastError` 清零,不能让数百个成功分片之间偶发的网络错误按任务生命周期累计并误终结。分片重新入队后必须按 `COALESCE(NextRunTime, CreateTime)` 选取最早就绪任务,禁止只按 `CreateTime` 让最早长任务重复抢占全部分片。商城包属于只读权威数据,可对空响应做有界退避重试,并优先用完整响应的 `Content`、`RawBytes`、HTTP 状态和传输错误诊断;不得把该规则扩展到安装写入请求。目标租户固定商城工作器只允许从受信任官方谱系向更高版本刷新;同版本不同源码、目标端更新版或未知谱系必须失败关闭。历史空库缺少生成实体所需物理列时,导入器须在首次 FormEngine 调用前幂等补齐并回读,不能再把真实表结构错误包装成 `Value cannot be null (source)`。
78
+ - 批量维护的权威目录按当前节点 `OsClientType + OsClientNetwork` 隔离;同一主租户同时存在 Internal、Internet 或其它活动分区时,必须在每个分区对应的主租户节点独立发起并验收,不能用一个分区的成功任务推断全平台成功。每个分区先回读精确预期租户数与名单,等待父子任务全部终态且 `SucceededCount=ExpectedCount、FailedCount=0`,再用新幂等键立即执行一次无操作复跑并确认零安装/零更新。禁止修改 `sys_osclients` 的网络字段来把租户临时塞进另一分区,也禁止让两个分区同时维护可能指向同一物理库的重复租户记录。
78
79
  - 必须随所有后端版本自动落地的平台基础能力,仍要封装成受信任的官方 Platform 应用包,再由升级器调用统一 `import-microi-store-package` 幂等导入;禁止把表、字段、页面或微服务复制成定制 C# 迁移。`app.microi.saas-engine.json` 可携带基础空库所需的 `mci_system_setting`、`mci_user_external_identity`、默认设置和平台内置微服务;系统账号的 `platform-user-update-preferences`、`platform-user-update-profile`、`platform-user-custom-hook` 只由 `app.microi.sys_user.json` 交付,租户设置的 `platform-tenant-system-settings`、`platform-system-settings-custom-hook` 只由 `app.microi.sys-config.json` 交付。SaaS/Store 不得保留这些 Key、策略或 RequiredPlatformCapabilities。默认行必须使用 `InsertIfMissing + ConfigKey`,只补缺失,不覆盖 `ValueSource=Tenant` 的租户值或租户后来明确关闭的功能。小型平台启动微服务应以 `Source=NotIncluded + Build=DatabaseOnly + StorageMode=db` 随程序集交付并接受 256 文件/5MB、逐文件哈希和无源码门禁,使新租户在 HDFS 故障时仍能打开商城与恢复入口;普通应用安装、源码编辑和文件能力继续失败关闭,不得伪装成全平台健康。
79
80
  - 批量任务已经以“一个应用”为外层持久化恢复单元。规模可控的小型官方包应在一个事务中完成,避免对同一包体按 8 个字段反复下载、解析和重新排队;超过字段、表、DDL、流程、随包数据或资产安全阈值的大包继续使用内部 checkpoint 分片。热更新发现旧版批量计划不含 `ApplicationType` 时,必须丢弃旧计划并重新盘点,不能继续安装历史计划中的社区应用。
80
81
  - MySQL 宽表触发 65,535 字节行内上限时,只允许把不参与索引的 `varchar` 配置列无损提升为 `mediumtext`,并把类型覆盖持久化到后台任务 checkpoint;索引列和非行宽错误必须失败关闭。发布包对长连接串、密钥、回调地址、域名/白名单等字段应直接使用 `mediumtext`,同时更新 `DiyFields` 与建表 DDL,不能长期依赖安装时猜测。
@@ -163,8 +164,8 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
163
164
 
164
165
  - 触发场景:租户先升级新版前后端,登录后路由初始化固定调用 `/apiengine/platform-sys-menu`;目标库此前没有该接口。应用商城包只补了 `platform-background-task`,而菜单接口仍由安装顺序靠后的 SaaS 包顺带携带;启动完整性检查也只验证后台任务接口,于是数据库版本和商城版本都显示最新,但用户在进入应用商城之前已经因 `NoExistData sys_apiengine` 全站不可用。
165
166
  - 根因:把单个已修复依赖误当成完整的启动依赖集合,包资源闭包、`NeedRefresh` 完成判定和安装后强回读没有使用同一清单;发布验收只覆盖已有目标租户,未覆盖“新版二进制 + 历史库恰好缺少某一启动接口”的升级排列。
166
- - 通用规则:凡是登录、菜单构建、恢复入口或应用商城打开之前必调的表、接口引擎和微服务路由,都属于启动依赖闭包,必须由安装顺序最前的同一个官方 Platform 包原子交付。每项接口必须同时声明固定自定义地址、最低版本、启用/匿名/HTTP 状态、`Managed` 策略、V8 原子能力和包内能力标记;启动完整性检查与安装后回读必须遍历同一依赖清单,任意一项缺失都触发修复且失败不推进版本。其它后置应用携带相同资源只能作兼容副本,不能成为启动正确性的唯一来源。
167
- - 竞态与验收:前端可对明确的“启动 Managed 资源尚未落库”做不超过一分钟的有界退避,并在耗尽后显示精确包名和最低版本;它不能吞掉鉴权错误、普通网络错误,也不能代替服务端修复。契约测试须逐项删除或降级每个启动依赖,断言包校验、租户完整性判断和安装后回读都失败;真实验收至少覆盖一个历史缺失租户,先证明旧状态会失败,再安装精确商城版本、回读接口源码/地址/策略、执行菜单动作、刷新登录后页面,最后做同版本无操作复跑。
167
+ - 通用规则:凡是登录、菜单构建、恢复入口或应用商城打开之前必调的表、接口引擎和微服务路由,都属于启动依赖闭包。每项资源必须只有一个官方 Platform 包作为唯一所有者;需要跨包时,恢复计划必须固定列出全部所有者且按优先顺序形成不可拆分的精确闭包。当前 `platform-sys-menu` 由应用商城单一拥有,六项公开配置/用户/文件门面由 SaaS 引擎单一拥有。每项接口必须同时声明固定自定义地址、最低版本、启用/匿名/HTTP 状态、`Managed` 策略、V8 原子能力和包内能力标记;启动完整性检查与安装后回读必须遍历同一七项清单,任意一项缺失都触发修复且失败不推进任务终态。其它应用不得复制同 Key 形成竞争所有权。
168
+ - 竞态与验收:前端可对明确的“启动 Managed 资源尚未落库”做不超过一分钟的有界退避,并在耗尽后显示精确包名和最低版本;它不能吞掉鉴权错误、普通网络错误,也不能代替服务端修复。跨大量历史租户时可由受信持久任务启用只自举模式,从两个不可变官方包补齐七项接口并做物理强回读,成功后不写应用安装版本,普通完整安装保持不变。契约测试须覆盖伪造标志、错误应用范围、每项物理缺失、租户改码和已健康零操作;真实验收先证明旧状态失败,再回读接口源码/地址/策略、执行菜单动作、刷新真实页面,最后以新幂等键做全分区零操作复跑。
168
169
 
169
170
  ## 复盘:应用包切换 HDFS 后旧导入器无法更新自己
170
171
 
@@ -263,14 +264,14 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
263
264
  - 触发场景:父级 Monitor 已持久化全部子任务 Id,子任务仍在正常执行且 checkpoint 中没有业务失败;父任务汇总进度时偶发数据库死锁,却因调用方配置 `MaxAttempts=1` 立即进入 `Failed`,通知中心因此把仍可成功收敛的整批任务标红。
264
265
  - 根因:后台任务把数据库死锁、锁等待超时等基础设施瞬态竞争与接口返回失败共用同一业务重试预算。低业务重试次数无法覆盖工作器自身的领取、心跳、检查点或结果持久化竞争,也没有保留父子任务的真实运行语义。
265
266
  - 通用规则:后台任务存储层只对已知数据库死锁、锁等待超时、序列化竞争等稳定特征启用独立的有界基础设施重试;即使业务 `MaxAttempts=1`,也允许最多三次基础设施执行机会。重试必须保留原 TaskId、父子关系、checkpoint 和已产生的副作用,不得重新创建子任务;成功后清除瞬态错误,第三次仍竞争才按原业务规则终止。普通业务错误、数据冲突和 `Value cannot be null` 等非竞争错误不得借用该预算。
266
- - 自动化检查:覆盖嵌套 ProviderException 与外层包装异常、MySQL/SQL Server/PostgreSQL/Oracle 的稳定错误码或消息;断言第一次和第二次竞争回到可领取状态且不消耗业务 AttemptCount,第三次进入原终态,非竞争异常仍按 `MaxAttempts` 立即失败。真实验收必须等待原 8 个子任务全部收敛,再以 `MaxAttempts=1` 连续执行一轮完整汇总和一轮立即无操作重跑,父任务均应得到 `SucceededCount=8、FailedCount=0`。
267
+ - 自动化检查:覆盖嵌套 ProviderException 与外层包装异常、MySQL/SQL Server/PostgreSQL/Oracle 的稳定错误码或消息;断言第一次和第二次竞争回到可领取状态且不消耗业务 AttemptCount,第三次进入原终态,非竞争异常仍按 `MaxAttempts` 立即失败。真实验收必须在每个活跃运行分区等待该分区全部子任务收敛,再以 `MaxAttempts=1` 连续执行一轮完整汇总和一轮立即无操作重跑;两轮父任务都必须得到 `SucceededCount=ExpectedCount、FailedCount=0`,且无操作轮为零安装/零更新。
267
268
 
268
269
  ## 复盘:字段分片完成后后台安装卡在缓存失效广播
269
270
 
270
271
  - 触发场景:字段分片的数据库写入和 Schema 回读已经精确完成,但 `ChildCheckpoint` 长时间停在同一字段索引;任务取消也无法及时结束,进程内存、线程数和 CPU 持续增长。
271
272
  - 根因证据:两次托管转储的调用链都停在 `V8.ApiEngine.Run -> GetApiEngineModelInternal -> MicroiTwoLevelCache.SetAsync -> PublishInvalidateAsync -> PublishWithRetryAsync`。权威 Redis 写入已经成功,随后用于通知其它节点清理一级缓存的 Pub/Sub 广播没有完成时限,因而把业务调用永久挂住;与此同时,单字段元数据更新即使只变更 Label、Remark、布局或 V8,也会重复执行物理列 DDL,放大旧租户升级成本。
272
273
  - 通用规则:Redis 权威值写入成功后,跨节点一级缓存失效广播只能是有界、尽力而为的附属动作。队列等待和实际发布都必须有独立短超时,超时后观察迟到异常并开启短暂熔断冷却,防止悬挂发布任务无界堆积;不得因此回滚已经成功的权威写入。`UptDiyField` 只有列名或物理类型变化时才允许调用 `ChangeColumn`,显示名称、说明、布局和事件代码等纯元数据变化禁止触发 DDL。
273
- - 自动化与真实验收:缓存测试必须覆盖发布永久不返回时的有界退出、迟到异常观察和冷却期抑制;字段测试必须断言只有 Name/Type 变化才进入物理 DDL。应用商城资源契约测试、后台任务与 SaaS 回归测试通过后,还必须在真实主租户完成 8/8 子租户收敛并立即执行一轮 8/8 无操作重跑。验收期间若官方应用发布了新版本,应以新的不可变 `StoreVersionId` 启动独立追赶批次,禁止混入已经开始的旧版本分片。
274
+ - 自动化与真实验收:缓存测试必须覆盖发布永久不返回时的有界退出、迟到异常观察和冷却期抑制;字段测试必须断言只有 Name/Type 变化才进入物理 DDL。应用商城资源契约测试、后台任务与 SaaS 回归测试通过后,还必须在每个活跃运行分区完成 `ExpectedCount/ExpectedCount` 子租户收敛,并立即执行一轮相同数量的无操作重跑。验收期间若官方应用发布了新版本,应以新的不可变 `StoreVersionId` 启动独立追赶批次,禁止混入已经开始的旧版本分片。
274
275
 
275
276
  ## 复盘:最新版后端仍放行未锁快照的旧商城工作器
276
277
 
@@ -109,8 +109,8 @@ var result = V8.MongoDb.GetFormData({
109
109
 
110
110
  ```javascript
111
111
  var result = V8.MongoDb.GetTableData({
112
- DbName: 'sys_log_2024',
113
- TableName: 'log_2024_12',
112
+ DbName: 'sys_log_2024',
113
+ TableName: 'log_2024_12',
114
114
  _Where: [
115
115
  ['Type', '=', '访问菜单'],
116
116
  ['OR', 'Type', '=', '点击V8按钮']
@@ -120,9 +120,11 @@ var result = V8.MongoDb.GetTableData({
120
120
  _PageIndex: 1,
121
121
  _PageSize: 20
122
122
  });
123
- ```
124
-
125
- ## 实战模式
123
+ ```
124
+
125
+ `GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
126
+
127
+ ## 实战模式
126
128
 
127
129
  ### IoT 设备日志存储
128
130
 
@@ -57,6 +57,8 @@ V8.OsClientModel.AliOssPublicDomain // 可公开的文件域名
57
57
  - 官方租户开通固定由 SaaS 包的 `platform-create-tenant` 编排:`platform-runtime-custom-hook` 的 Before 阶段可以阻断,`AuthorizeCurrentUserTenantProvisioning` / `ProvisionCurrentUserTenant` 只从可信主租户 DiyToken 派生所有者与密码材料;创建完成后的 Hook/审计失败只能返回 Warning,不能诱导重复创建。系统账号偏好/资料与租户系统设置分别由 `app.microi.sys_user`、`app.microi.sys-config` 单一拥有,SaaS/Store 不得复制这些 Managed ApiEngineKey。
58
58
  - 旧版 UniApp 的 `microi-init` 是 SaaS 包继续托管的 Managed 兼容门面。匿名阶段只组合 `platform-os-client-by-domain` 与 `platform-sys-config` 的公开投影;原始 DiyToken 必须由 `GetCurrentToken` 和 `RefreshLoginUser(..., rawToken)` 在后端重新验证且绑定当前租户,菜单再由只允许该固定 Key 调用的 `GetLegacyInitMenuTree(rawToken, osClient?)` 复用 `SysMenuLogic` 权威角色过滤。禁止在匿名 V8 中直接通过 FormEngine 读取 `sys_menu`;域名解析到其它租户时返回目标 `OsClient` 并要求重试,禁止匿名跨租户读取配置或菜单。
59
59
  - 主租户由运行环境决定:优先读取环境变量 `OsClient`,其次读取 `appsettings.json` 的 `AppSettings:OsClient`。只有这条主租户 `sys_osclients` 数据中的平台级字段会作为全局配置生效。
60
+ - 同一个主租户可以同时运行在 `Product/Internal`、`Product/Internet` 等多个分区;租户目录、后台任务领取、通知和批量平台应用维护都必须按当前节点的 `OsClientType + OsClientNetwork` 隔离。一次全量维护只证明当前分区,事故恢复必须先盘点所有活跃分区,再从各分区对应节点分别执行并等待 `SucceededCount=ExpectedCount、FailedCount=0`,随后各自以新幂等键做零安装/零更新复跑。禁止临时改租户网络字段、跨分区借用任务或并发维护可能指向同一物理库的重复租户记录。
61
+ - 大范围启动事故只允许受信后台编排器使用 `MaintenanceScope=StartupDependencies`,精确闭包固定为 `app.microi.store + app.microi.saas-engine`,并可显式启用 `StartupDependencyBootstrapOnly=true`。编排器必须先用权威当前分区目录校验 `TargetOsClients`,再在子任务仍为 `Pending` 时原子写入并强回读两应用范围与只自举标志;失败即取消,禁止退化为完整安装。工作器只从官方不可变包补齐 `platform-sys-menu` 和六项 SaaS 启动门面,七项物理契约强回读通过后终止,不写安装版本。该模式只恢复可登录性,后续完整应用更新仍走普通商城任务;未带标志的任务行为不得改变。
60
62
  - API 启动配置只有十项白名单:`OsClient`、`OsClientType`、`OsClientNetwork`、`OsClientDbType`、`OsClientDbConn`、`OsClientRedisHost`、`OsClientRedisPort`、`OsClientRedisPwd`、`OsClientRedisDataBase`、`OsClientDbMongoConn`。除这十项外,部署/节点级运行参数与基础设施秘密从主控 `sys_osclients` 读取;允许子租户自行维护且需要浏览器判断的业务开关、入口显示和公开交互配置使用该租户 `sys_config` 实体字段,OAuth/第三方集成的凭据、RP/Origin/Issuer/Scope 与仅后端参数使用 `mci_system_setting`,未配置时使用代码安全默认值。官方 License 恢复次数/间隔与固定私钥挂载 `/app/microi_private.pem` 是信任链例外。禁止再增加 `MICROI_*`、`DOS_ORM_*`、自定义 `AppSettings` 节点或动态名称的环境变量读取。节点身份由平台自动生成。
61
63
  - 存量畅捷通/微信 OAuth C# 协议网关有一组已发布到 SaaS 引擎的兼容字段:`OAuthReturnUrlOrigins`、`ChanjetOAuthState`、`ChanjetAesKey`、`ChanjetAppKey`、`WeChatTemplateAppId`、`WeChatTemplateAppSecret`、`WeChatTemplateId`、`WeChatMiniProgramAppId`。只能通过 Core 的租户绑定协议设置原子按请求权威 `OsClient` 读取,禁止使用主租户 `ConfigHelper` RuntimeConfigurationReader;整组字段不得复制给新租户,其中 OAuthState/AES Key/AppKey/AppSecret 不得进入 `V8.OsClientModel` 或前端投影且必须在审计中掩码。新集成不得继续扩展该兼容集合,仍使用当前租户 `mci_system_setting` + Managed ApiEngine。
62
64
  - `ASPNETCORE_*`、`DOTNET_*` 仅用于 .NET 宿主;构建、安装、测试、MCP、发布脚本可使用自身进程变量,但 API 生产代码不得把它们当业务配置。新增 SaaS 运行字段必须配套独立或既有 Tab、幂等升级、缓存刷新、敏感字段脱敏、子租户不继承和源码扫描测试。
@@ -52,7 +52,8 @@
52
52
  | `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
53
53
  | `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
54
54
  | `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
55
- | `GET /api/Diagnostics/health` | 聚合健康状态 |
55
+ | `GET /apiengine/platform-service-health?OsClient={OsClient}` | 新版客户端固定匿名健康契约;返回 `Data.Status=Healthy`,新二进制同时返回真实后端版本;应用包先发布时版本可暂时为空,但健康结论不失败;不查询业务表 |
56
+ | `GET /api/Diagnostics/health` | 旧节点滚动升级兼容健康路由;新版客户端不以它作为主要契约 |
56
57
  | `GET /api/Diagnostics/liveness` | 进程存活检查,不代表已就绪接流量 |
57
58
 
58
59
  `/api/example`、`/api/example/1` 仅用于说明 `V8.Http` 的普通 Controller 地址,
@@ -49,7 +49,8 @@
49
49
  | API | 说明 |
50
50
  |---|---|
51
51
  | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
52
- | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
52
+ | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
53
+ | `V8.Method.GetBackendVersion()` | 当前 Microi.Core 运行程序集的公开发行版本,格式 `vX.Y.Z`;固定匿名健康接口使用,不返回路径或主机信息 |
53
54
  | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
54
55
  | `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
55
56
  | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |