@microi.net/cli 5.4.4 → 5.4.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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +3 -3
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-skills.meta.json +185 -185
- package/skills/.microi-skills-version.json +2 -2
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +13 -4
- package/skills/v8-api-config/SKILL.md +15 -8
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"url": "https://microi.net"
|
|
6
6
|
},
|
|
7
7
|
"description": "Microi吾码官方 AI 插件市场",
|
|
8
|
-
"version": "5.4.
|
|
8
|
+
"version": "5.4.5",
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "microi",
|
|
12
12
|
"source": ".",
|
|
13
13
|
"description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
|
|
14
|
-
"version": "5.4.
|
|
14
|
+
"version": "5.4.5",
|
|
15
15
|
"strict": true
|
|
16
16
|
}
|
|
17
17
|
]
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"url": "https://microi.net"
|
|
6
6
|
},
|
|
7
7
|
"description": "Microi吾码官方 AI 插件市场",
|
|
8
|
-
"version": "5.4.
|
|
8
|
+
"version": "5.4.5",
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "microi",
|
|
12
12
|
"source": ".",
|
|
13
13
|
"description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
|
|
14
|
-
"version": "5.4.
|
|
14
|
+
"version": "5.4.5",
|
|
15
15
|
"strict": true
|
|
16
16
|
}
|
|
17
17
|
]
|
package/assets/build-meta.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"builtAt": "2026-
|
|
3
|
-
"version": "5.4.
|
|
2
|
+
"builtAt": "2026-09-01T04:23:35.127Z",
|
|
3
|
+
"version": "5.4.5",
|
|
4
4
|
"sourceProducts": [
|
|
5
5
|
"vscode-extension",
|
|
6
6
|
"microi-cli",
|
|
@@ -13,6 +13,6 @@
|
|
|
13
13
|
"cli": "ac621fcaf8b2cbbd8072414f99aba20c30ee1134ef12c3094eaead85943b6b6c",
|
|
14
14
|
"router": "ffc14787fc2d3d6173b7a779b77139b759eb1d482cea787f71283f4017a4e223",
|
|
15
15
|
"broker": "caae2730cc411d11c20f33b367968f7538aae8f5b65a713fcc557deedaefcf70",
|
|
16
|
-
"dshBundle": "
|
|
16
|
+
"dshBundle": "2d9c408424c189370e90868c9eb86705513f7642a5f18f45f92e80c046f80125"
|
|
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.4.
|
|
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.4.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,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"builtAt": "2026-
|
|
2
|
+
"builtAt": "2026-09-01T04:23:34.302Z",
|
|
3
3
|
"source": "../microi.skills",
|
|
4
4
|
"extension": {
|
|
5
5
|
"name": "v8-engine",
|
|
6
|
-
"version": "5.4.
|
|
6
|
+
"version": "5.4.5",
|
|
7
7
|
"publisher": "Microi"
|
|
8
8
|
},
|
|
9
9
|
"skills": {
|
|
10
|
-
"version": "5.4.
|
|
10
|
+
"version": "5.4.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,10 +15,10 @@
|
|
|
15
15
|
"dir": "dist/microi.skills",
|
|
16
16
|
"files": 178,
|
|
17
17
|
"skills": 65,
|
|
18
|
-
"bytes":
|
|
18
|
+
"bytes": 2297034
|
|
19
19
|
},
|
|
20
20
|
"fileHashes": {
|
|
21
|
-
".microi-skills-version.json": "
|
|
21
|
+
".microi-skills-version.json": "e144a67aba713bf484af29dcb037474d99eae144e417c40c1751283808029860",
|
|
22
22
|
".progressive-disclosure-manifest.json": "2a16159d7ff1383c44ccb4a7fb79e6edc0879de80ea551f2d7655c55a3a395ea",
|
|
23
23
|
"README.md": "332aade05015acac5f1387829a42529f37fc203ff0fcfb2f16cc3afdbb23b1ed",
|
|
24
24
|
"ai-engine/SKILL.md": "df63cf56bd06027f30bd0597003c65b479049141fc0b4a31d33cbc9a5fa044cf",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"microi-ai-application/references/frontend-baseline.md": "c21a2d38292fd8d445a7538afb45d609881f624f32d39c0fc4bbbb3c2fa64a74",
|
|
44
44
|
"microi-client-frontend/SKILL.md": "097c2dc3b06741678bcaccca6eb24bb4b65770e356f5f947d5d9b087a2e8ae8c",
|
|
45
45
|
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "3aa2cdbd37ed6ff6927ba76b7fbd15a4e0855d8b84e77603793182a778a33438",
|
|
46
|
-
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "
|
|
46
|
+
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "0f796b5a89181cb40edc351337f43a3b4495c9a96101f661425222a42a5e5a4f",
|
|
47
47
|
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "bf78d9d2e2d6d1a8315f44f04f21889b21d845a02801d5f8e0eb11b3f490b6d1",
|
|
48
48
|
"microi-codex-installer/SKILL.md": "75bec07d087167ab6343c816d07d9c7e1e850871a05737f31aec115e7fa3cdce",
|
|
49
49
|
"microi-codex-installer/agents/openai.yaml": "e531219b74a70204893a156b1c22c69013a4c9d24b132ead912746b1b312cf80",
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
"unity-integration/references/sdk-api.md": "b473e7094b0c4cf7860cecb9acfbdd55025c7f851b4bd4bf92b4233091b182fa",
|
|
142
142
|
"unity-integration/references/toolbox-migration.md": "b9294ea7db2b2a0f31e650e6e80f6d8f69385037bff6ac39fd5525ea98f8c934",
|
|
143
143
|
"unity-integration/references/webgl-hosting.md": "5c19bda62d7c7a258b4fafc1d46e9a7c94e5400803d77d9aff44ce794083e745",
|
|
144
|
-
"v8-api-config/SKILL.md": "
|
|
144
|
+
"v8-api-config/SKILL.md": "cebc5acdb502ccd69d398d7a6842757ff1348d4678052baa38b492c0d4dc1004",
|
|
145
145
|
"v8-cache-pattern/SKILL.md": "66f55bc84ac56854804ae22f8957a62555a906aea55f983d39eb6f5eb90e7f11",
|
|
146
146
|
"v8-crud-api/SKILL.md": "f497a58bd87c6a77bafb1e0a753371489fe803ebe67c1e0eecb900bac58cd510",
|
|
147
147
|
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5264932207d1a011062e3f6a982b44ce3796470f7d3261ec3d6690322b28f61d",
|
|
@@ -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.4.
|
|
202
|
-
".progressive-disclosure-manifest.json": "5.4.
|
|
203
|
-
"README.md": "5.4.
|
|
204
|
-
"ai-engine/SKILL.md": "5.4.
|
|
205
|
-
"ai-engine/agents/openai.yaml": "5.4.
|
|
206
|
-
"ai-platform-governance/SKILL.md": "5.4.
|
|
207
|
-
"ai-platform-governance/references/progressive-01-功能开关.md": "5.4.
|
|
208
|
-
"app-store/SKILL.md": "5.4.
|
|
209
|
-
"app-store/agents/openai.yaml": "5.4.
|
|
210
|
-
"business-blueprint/SKILL.md": "5.4.
|
|
211
|
-
"datasource-engine/SKILL.md": "5.4.
|
|
212
|
-
"datasource-engine/agents/openai.yaml": "5.4.
|
|
213
|
-
"dos-orm/SKILL.md": "5.4.
|
|
214
|
-
"dos-orm/references/api-reference.md": "5.4.
|
|
215
|
-
"job-engine/SKILL.md": "5.4.
|
|
216
|
-
"job-engine/agents/openai.yaml": "5.4.
|
|
217
|
-
"message-notification/SKILL.md": "5.4.
|
|
218
|
-
"message-notification/agents/openai.yaml": "5.4.
|
|
219
|
-
"message-notification/references/contracts.md": "5.4.
|
|
220
|
-
"microi-ai-app-auth.js": "5.4.
|
|
221
|
-
"microi-ai-application/SKILL.md": "5.4.
|
|
222
|
-
"microi-ai-application/agents/openai.yaml": "5.4.
|
|
223
|
-
"microi-ai-application/references/frontend-baseline.md": "5.4.
|
|
224
|
-
"microi-client-frontend/SKILL.md": "5.4.
|
|
225
|
-
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.4.
|
|
226
|
-
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.4.
|
|
227
|
-
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.4.
|
|
228
|
-
"microi-codex-installer/SKILL.md": "5.4.
|
|
229
|
-
"microi-codex-installer/agents/openai.yaml": "5.4.
|
|
230
|
-
"microi-codex/SKILL.md": "5.4.
|
|
231
|
-
"microi-datasource-mapping/SKILL.md": "5.4.
|
|
232
|
-
"microi-db-schema/SKILL.md": "5.4.
|
|
233
|
-
"microi-db-schema/agents/openai.yaml": "5.4.
|
|
234
|
-
"microi-db-schema/references/core-tables.md": "5.4.
|
|
235
|
-
"microi-db-schema/references/form-component-options.md": "5.4.
|
|
236
|
-
"microi-db-schema/references/schema-overview.md": "5.4.
|
|
237
|
-
"microi-db-schema/references/schema.md": "5.4.
|
|
238
|
-
"microi-db-schema/references/table-catalog.md": "5.4.
|
|
239
|
-
"microi-deployment/SKILL.md": "5.4.
|
|
240
|
-
"microi-deployment/references/deployment-matrix.md": "5.4.
|
|
241
|
-
"microi-docs-coverage/SKILL.md": "5.4.
|
|
242
|
-
"microi-docs-coverage/references/capability-map.md": "5.4.
|
|
243
|
-
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.4.
|
|
244
|
-
"microi-form-engine/SKILL.md": "5.4.
|
|
245
|
-
"microi-form-engine/references/component-catalog.md": "5.4.
|
|
246
|
-
"microi-form-engine/references/data-source-events.md": "5.4.
|
|
247
|
-
"microi-form-layout/SKILL.md": "5.4.
|
|
248
|
-
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.4.
|
|
249
|
-
"microi-frontend-sdk/SKILL.md": "5.4.
|
|
250
|
-
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.4.
|
|
251
|
-
"microi-left-right-layout/SKILL.md": "5.4.
|
|
252
|
-
"microi-microservice/SKILL.md": "5.4.
|
|
253
|
-
"microi-microservice/references/runtime-delivery.md": "5.4.
|
|
254
|
-
"microi-mobile-app-quality/SKILL.md": "5.4.
|
|
255
|
-
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.4.
|
|
256
|
-
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.4.
|
|
257
|
-
"microi-solution-quotation/SKILL.md": "5.4.
|
|
258
|
-
"microi-solution-quotation/agents/openai.yaml": "5.4.
|
|
259
|
-
"microi-solution-quotation/scripts/build_solution_quote.py": "5.4.
|
|
260
|
-
"microi-sso/SKILL.md": "5.4.
|
|
261
|
-
"microi-sso/references/acceptance.md": "5.4.
|
|
262
|
-
"microi-sso/references/configuration-and-security.md": "5.4.
|
|
263
|
-
"microi-sso/references/inbound.md": "5.4.
|
|
264
|
-
"microi-sso/references/outbound.md": "5.4.
|
|
265
|
-
"microi-system-delivery/SKILL.md": "5.4.
|
|
266
|
-
"microi-system-delivery/references/progressive-01-标准工作流.md": "5.4.
|
|
267
|
-
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.4.
|
|
268
|
-
"microi-ui/SKILL.md": "5.4.
|
|
269
|
-
"microi-ui/references/progressive-01-移动端场景蓝图.md": "5.4.
|
|
270
|
-
"microi-uniapp-frontend/SKILL.md": "5.4.
|
|
271
|
-
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.4.
|
|
272
|
-
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.4.
|
|
273
|
-
"microi.v8.js": "5.4.
|
|
274
|
-
"module-engine/SKILL.md": "5.4.
|
|
275
|
-
"module-engine/references/module-config.md": "5.4.
|
|
276
|
-
"ocr-engine/SKILL.md": "5.4.
|
|
277
|
-
"ocr-engine/agents/openai.yaml": "5.4.
|
|
278
|
-
"page-engine/SKILL.md": "5.4.
|
|
279
|
-
"page-engine/references/progressive-01-所有组件类型.md": "5.4.
|
|
280
|
-
"page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.4.
|
|
281
|
-
"performance-testing/SKILL.md": "5.4.
|
|
282
|
-
"playwright-e2e/SKILL.md": "5.4.
|
|
283
|
-
"playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.4.
|
|
284
|
-
"playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.4.
|
|
285
|
-
"playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.4.
|
|
286
|
-
"playwright-e2e/references/progressive-04-ci-建议.md": "5.4.
|
|
287
|
-
"print-engine/SKILL.md": "5.4.
|
|
288
|
-
"production-readonly-audit/SKILL.md": "5.4.
|
|
289
|
-
"report-engine/SKILL.md": "5.4.
|
|
290
|
-
"report-engine/agents/openai.yaml": "5.4.
|
|
291
|
-
"scripts/optimize-progressive-disclosure.mjs": "5.4.
|
|
292
|
-
"scripts/refresh-progressive-disclosure.mjs": "5.4.
|
|
293
|
-
"scripts/validate-progressive-disclosure.mjs": "5.4.
|
|
294
|
-
"search-engine/SKILL.md": "5.4.
|
|
295
|
-
"search-engine/agents/openai.yaml": "5.4.
|
|
296
|
-
"spider-engine/SKILL.md": "5.4.
|
|
297
|
-
"system-observability/SKILL.md": "5.4.
|
|
298
|
-
"translate-engine/SKILL.md": "5.4.
|
|
299
|
-
"translate-engine/agents/openai.yaml": "5.4.
|
|
300
|
-
"ui-design/SKILL.md": "5.4.
|
|
301
|
-
"ui-design/assets/pattern-showcase/app.js": "5.4.
|
|
302
|
-
"ui-design/assets/pattern-showcase/index.html": "5.4.
|
|
303
|
-
"ui-design/assets/pattern-showcase/styles.css": "5.4.
|
|
304
|
-
"ui-design/assets/templates/MCI-DESIGN.md": "5.4.
|
|
305
|
-
"ui-design/references/design-pattern-library.md": "5.4.
|
|
306
|
-
"ui-design/references/mci-design-contract.md": "5.4.
|
|
307
|
-
"ui-design/references/motion-and-media.md": "5.4.
|
|
308
|
-
"ui-design/references/product-flow-recipes.md": "5.4.
|
|
309
|
-
"ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.4.
|
|
310
|
-
"ui-design/references/progressive-02-字体.md": "5.4.
|
|
311
|
-
"ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.4.
|
|
312
|
-
"ui-design/references/progressive-04-组件风格速查.md": "5.4.
|
|
313
|
-
"ui-design/references/progressive-05-移动端专用规范.md": "5.4.
|
|
314
|
-
"ui-design/references/progressive-06-主题切换实现.md": "5.4.
|
|
315
|
-
"ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.4.
|
|
316
|
-
"ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.4.
|
|
317
|
-
"uniapp-mall-assets/SKILL.md": "5.4.
|
|
318
|
-
"unity-integration/SKILL.md": "5.4.
|
|
319
|
-
"unity-integration/agents/openai.yaml": "5.4.
|
|
320
|
-
"unity-integration/references/ai-app-delivery.md": "5.4.
|
|
321
|
-
"unity-integration/references/sdk-api.md": "5.4.
|
|
322
|
-
"unity-integration/references/toolbox-migration.md": "5.4.
|
|
323
|
-
"unity-integration/references/webgl-hosting.md": "5.4.
|
|
324
|
-
"v8-api-config/SKILL.md": "5.4.
|
|
325
|
-
"v8-cache-pattern/SKILL.md": "5.4.
|
|
326
|
-
"v8-crud-api/SKILL.md": "5.4.
|
|
327
|
-
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5.4.
|
|
328
|
-
"v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.4.
|
|
329
|
-
"v8-debugging/SKILL.md": "5.4.
|
|
330
|
-
"v8-explorer-tree/SKILL.md": "5.4.
|
|
331
|
-
"v8-export-import/SKILL.md": "5.4.
|
|
332
|
-
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.4.
|
|
333
|
-
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5.4.
|
|
334
|
-
"v8-export-import/references/progressive-03-安全-性能注意.md": "5.4.
|
|
335
|
-
"v8-file-upload/SKILL.md": "5.4.
|
|
336
|
-
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.4.
|
|
337
|
-
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.4.
|
|
338
|
-
"v8-formengine-http/SKILL.md": "5.4.
|
|
339
|
-
"v8-frontend-events/SKILL.md": "5.4.
|
|
340
|
-
"v8-frontend-events/references/bluetooth-print-api.md": "5.4.
|
|
341
|
-
"v8-frontend-events/references/bluetooth-print.md": "5.4.
|
|
342
|
-
"v8-frontend-events/references/progressive-01-列表事件.md": "5.4.
|
|
343
|
-
"v8-http-integration/SKILL.md": "5.4.
|
|
344
|
-
"v8-http-integration/references/progressive-01-get-请求.md": "5.4.
|
|
345
|
-
"v8-http-integration/references/progressive-02-错误处理模式.md": "5.4.
|
|
346
|
-
"v8-image-processing/SKILL.md": "5.4.
|
|
347
|
-
"v8-image-processing/agents/openai.yaml": "5.4.
|
|
348
|
-
"v8-image-processing/references/api-reference.md": "5.4.
|
|
349
|
-
"v8-menu-buttons/SKILL.md": "5.4.
|
|
350
|
-
"v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.4.
|
|
351
|
-
"v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.4.
|
|
352
|
-
"v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.4.
|
|
353
|
-
"v8-mongodb/SKILL.md": "5.4.
|
|
354
|
-
"v8-mq-mqtt/SKILL.md": "5.4.
|
|
355
|
-
"v8-mq-mqtt/references/mqtt-production.md": "5.4.
|
|
356
|
-
"v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.4.
|
|
357
|
-
"v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.4.
|
|
358
|
-
"v8-saas-multi-tenant/SKILL.md": "5.4.
|
|
359
|
-
"v8-security/SKILL.md": "5.4.
|
|
360
|
-
"v8-security/references/progressive-01-2-权限校验.md": "5.4.
|
|
361
|
-
"v8-security/references/progressive-02-7-日志记录.md": "5.4.
|
|
362
|
-
"v8-sql-query/SKILL.md": "5.4.
|
|
363
|
-
"v8-table-event/SKILL.md": "5.4.
|
|
364
|
-
"v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.4.
|
|
365
|
-
"v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.4.
|
|
366
|
-
"v8-tcp-integration/SKILL.md": "5.4.
|
|
367
|
-
"v8-tcp-integration/agents/openai.yaml": "5.4.
|
|
368
|
-
"v8-template-engine/SKILL.md": "5.4.
|
|
369
|
-
"v8-utilities/SKILL.md": "5.4.
|
|
370
|
-
"v8-utilities/references/client-api-index.md": "5.4.
|
|
371
|
-
"v8-utilities/references/platform-http-routes.md": "5.4.
|
|
372
|
-
"v8-utilities/references/server-api-index.md": "5.4.
|
|
373
|
-
"v8-workflow/SKILL.md": "5.4.
|
|
374
|
-
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.4.
|
|
375
|
-
"workspace-conventions/SKILL.md": "5.4.
|
|
376
|
-
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.4.
|
|
377
|
-
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.4.
|
|
378
|
-
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.4.
|
|
201
|
+
".microi-skills-version.json": "5.4.5",
|
|
202
|
+
".progressive-disclosure-manifest.json": "5.4.5",
|
|
203
|
+
"README.md": "5.4.5",
|
|
204
|
+
"ai-engine/SKILL.md": "5.4.5",
|
|
205
|
+
"ai-engine/agents/openai.yaml": "5.4.5",
|
|
206
|
+
"ai-platform-governance/SKILL.md": "5.4.5",
|
|
207
|
+
"ai-platform-governance/references/progressive-01-功能开关.md": "5.4.5",
|
|
208
|
+
"app-store/SKILL.md": "5.4.5",
|
|
209
|
+
"app-store/agents/openai.yaml": "5.4.5",
|
|
210
|
+
"business-blueprint/SKILL.md": "5.4.5",
|
|
211
|
+
"datasource-engine/SKILL.md": "5.4.5",
|
|
212
|
+
"datasource-engine/agents/openai.yaml": "5.4.5",
|
|
213
|
+
"dos-orm/SKILL.md": "5.4.5",
|
|
214
|
+
"dos-orm/references/api-reference.md": "5.4.5",
|
|
215
|
+
"job-engine/SKILL.md": "5.4.5",
|
|
216
|
+
"job-engine/agents/openai.yaml": "5.4.5",
|
|
217
|
+
"message-notification/SKILL.md": "5.4.5",
|
|
218
|
+
"message-notification/agents/openai.yaml": "5.4.5",
|
|
219
|
+
"message-notification/references/contracts.md": "5.4.5",
|
|
220
|
+
"microi-ai-app-auth.js": "5.4.5",
|
|
221
|
+
"microi-ai-application/SKILL.md": "5.4.5",
|
|
222
|
+
"microi-ai-application/agents/openai.yaml": "5.4.5",
|
|
223
|
+
"microi-ai-application/references/frontend-baseline.md": "5.4.5",
|
|
224
|
+
"microi-client-frontend/SKILL.md": "5.4.5",
|
|
225
|
+
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.4.5",
|
|
226
|
+
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.4.5",
|
|
227
|
+
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.4.5",
|
|
228
|
+
"microi-codex-installer/SKILL.md": "5.4.5",
|
|
229
|
+
"microi-codex-installer/agents/openai.yaml": "5.4.5",
|
|
230
|
+
"microi-codex/SKILL.md": "5.4.5",
|
|
231
|
+
"microi-datasource-mapping/SKILL.md": "5.4.5",
|
|
232
|
+
"microi-db-schema/SKILL.md": "5.4.5",
|
|
233
|
+
"microi-db-schema/agents/openai.yaml": "5.4.5",
|
|
234
|
+
"microi-db-schema/references/core-tables.md": "5.4.5",
|
|
235
|
+
"microi-db-schema/references/form-component-options.md": "5.4.5",
|
|
236
|
+
"microi-db-schema/references/schema-overview.md": "5.4.5",
|
|
237
|
+
"microi-db-schema/references/schema.md": "5.4.5",
|
|
238
|
+
"microi-db-schema/references/table-catalog.md": "5.4.5",
|
|
239
|
+
"microi-deployment/SKILL.md": "5.4.5",
|
|
240
|
+
"microi-deployment/references/deployment-matrix.md": "5.4.5",
|
|
241
|
+
"microi-docs-coverage/SKILL.md": "5.4.5",
|
|
242
|
+
"microi-docs-coverage/references/capability-map.md": "5.4.5",
|
|
243
|
+
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.4.5",
|
|
244
|
+
"microi-form-engine/SKILL.md": "5.4.5",
|
|
245
|
+
"microi-form-engine/references/component-catalog.md": "5.4.5",
|
|
246
|
+
"microi-form-engine/references/data-source-events.md": "5.4.5",
|
|
247
|
+
"microi-form-layout/SKILL.md": "5.4.5",
|
|
248
|
+
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.4.5",
|
|
249
|
+
"microi-frontend-sdk/SKILL.md": "5.4.5",
|
|
250
|
+
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.4.5",
|
|
251
|
+
"microi-left-right-layout/SKILL.md": "5.4.5",
|
|
252
|
+
"microi-microservice/SKILL.md": "5.4.5",
|
|
253
|
+
"microi-microservice/references/runtime-delivery.md": "5.4.5",
|
|
254
|
+
"microi-mobile-app-quality/SKILL.md": "5.4.5",
|
|
255
|
+
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.4.5",
|
|
256
|
+
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.4.5",
|
|
257
|
+
"microi-solution-quotation/SKILL.md": "5.4.5",
|
|
258
|
+
"microi-solution-quotation/agents/openai.yaml": "5.4.5",
|
|
259
|
+
"microi-solution-quotation/scripts/build_solution_quote.py": "5.4.5",
|
|
260
|
+
"microi-sso/SKILL.md": "5.4.5",
|
|
261
|
+
"microi-sso/references/acceptance.md": "5.4.5",
|
|
262
|
+
"microi-sso/references/configuration-and-security.md": "5.4.5",
|
|
263
|
+
"microi-sso/references/inbound.md": "5.4.5",
|
|
264
|
+
"microi-sso/references/outbound.md": "5.4.5",
|
|
265
|
+
"microi-system-delivery/SKILL.md": "5.4.5",
|
|
266
|
+
"microi-system-delivery/references/progressive-01-标准工作流.md": "5.4.5",
|
|
267
|
+
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.4.5",
|
|
268
|
+
"microi-ui/SKILL.md": "5.4.5",
|
|
269
|
+
"microi-ui/references/progressive-01-移动端场景蓝图.md": "5.4.5",
|
|
270
|
+
"microi-uniapp-frontend/SKILL.md": "5.4.5",
|
|
271
|
+
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.4.5",
|
|
272
|
+
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.4.5",
|
|
273
|
+
"microi.v8.js": "5.4.5",
|
|
274
|
+
"module-engine/SKILL.md": "5.4.5",
|
|
275
|
+
"module-engine/references/module-config.md": "5.4.5",
|
|
276
|
+
"ocr-engine/SKILL.md": "5.4.5",
|
|
277
|
+
"ocr-engine/agents/openai.yaml": "5.4.5",
|
|
278
|
+
"page-engine/SKILL.md": "5.4.5",
|
|
279
|
+
"page-engine/references/progressive-01-所有组件类型.md": "5.4.5",
|
|
280
|
+
"page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.4.5",
|
|
281
|
+
"performance-testing/SKILL.md": "5.4.5",
|
|
282
|
+
"playwright-e2e/SKILL.md": "5.4.5",
|
|
283
|
+
"playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.4.5",
|
|
284
|
+
"playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.4.5",
|
|
285
|
+
"playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.4.5",
|
|
286
|
+
"playwright-e2e/references/progressive-04-ci-建议.md": "5.4.5",
|
|
287
|
+
"print-engine/SKILL.md": "5.4.5",
|
|
288
|
+
"production-readonly-audit/SKILL.md": "5.4.5",
|
|
289
|
+
"report-engine/SKILL.md": "5.4.5",
|
|
290
|
+
"report-engine/agents/openai.yaml": "5.4.5",
|
|
291
|
+
"scripts/optimize-progressive-disclosure.mjs": "5.4.5",
|
|
292
|
+
"scripts/refresh-progressive-disclosure.mjs": "5.4.5",
|
|
293
|
+
"scripts/validate-progressive-disclosure.mjs": "5.4.5",
|
|
294
|
+
"search-engine/SKILL.md": "5.4.5",
|
|
295
|
+
"search-engine/agents/openai.yaml": "5.4.5",
|
|
296
|
+
"spider-engine/SKILL.md": "5.4.5",
|
|
297
|
+
"system-observability/SKILL.md": "5.4.5",
|
|
298
|
+
"translate-engine/SKILL.md": "5.4.5",
|
|
299
|
+
"translate-engine/agents/openai.yaml": "5.4.5",
|
|
300
|
+
"ui-design/SKILL.md": "5.4.5",
|
|
301
|
+
"ui-design/assets/pattern-showcase/app.js": "5.4.5",
|
|
302
|
+
"ui-design/assets/pattern-showcase/index.html": "5.4.5",
|
|
303
|
+
"ui-design/assets/pattern-showcase/styles.css": "5.4.5",
|
|
304
|
+
"ui-design/assets/templates/MCI-DESIGN.md": "5.4.5",
|
|
305
|
+
"ui-design/references/design-pattern-library.md": "5.4.5",
|
|
306
|
+
"ui-design/references/mci-design-contract.md": "5.4.5",
|
|
307
|
+
"ui-design/references/motion-and-media.md": "5.4.5",
|
|
308
|
+
"ui-design/references/product-flow-recipes.md": "5.4.5",
|
|
309
|
+
"ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.4.5",
|
|
310
|
+
"ui-design/references/progressive-02-字体.md": "5.4.5",
|
|
311
|
+
"ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.4.5",
|
|
312
|
+
"ui-design/references/progressive-04-组件风格速查.md": "5.4.5",
|
|
313
|
+
"ui-design/references/progressive-05-移动端专用规范.md": "5.4.5",
|
|
314
|
+
"ui-design/references/progressive-06-主题切换实现.md": "5.4.5",
|
|
315
|
+
"ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.4.5",
|
|
316
|
+
"ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.4.5",
|
|
317
|
+
"uniapp-mall-assets/SKILL.md": "5.4.5",
|
|
318
|
+
"unity-integration/SKILL.md": "5.4.5",
|
|
319
|
+
"unity-integration/agents/openai.yaml": "5.4.5",
|
|
320
|
+
"unity-integration/references/ai-app-delivery.md": "5.4.5",
|
|
321
|
+
"unity-integration/references/sdk-api.md": "5.4.5",
|
|
322
|
+
"unity-integration/references/toolbox-migration.md": "5.4.5",
|
|
323
|
+
"unity-integration/references/webgl-hosting.md": "5.4.5",
|
|
324
|
+
"v8-api-config/SKILL.md": "5.4.5",
|
|
325
|
+
"v8-cache-pattern/SKILL.md": "5.4.5",
|
|
326
|
+
"v8-crud-api/SKILL.md": "5.4.5",
|
|
327
|
+
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5.4.5",
|
|
328
|
+
"v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.4.5",
|
|
329
|
+
"v8-debugging/SKILL.md": "5.4.5",
|
|
330
|
+
"v8-explorer-tree/SKILL.md": "5.4.5",
|
|
331
|
+
"v8-export-import/SKILL.md": "5.4.5",
|
|
332
|
+
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.4.5",
|
|
333
|
+
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5.4.5",
|
|
334
|
+
"v8-export-import/references/progressive-03-安全-性能注意.md": "5.4.5",
|
|
335
|
+
"v8-file-upload/SKILL.md": "5.4.5",
|
|
336
|
+
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.4.5",
|
|
337
|
+
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.4.5",
|
|
338
|
+
"v8-formengine-http/SKILL.md": "5.4.5",
|
|
339
|
+
"v8-frontend-events/SKILL.md": "5.4.5",
|
|
340
|
+
"v8-frontend-events/references/bluetooth-print-api.md": "5.4.5",
|
|
341
|
+
"v8-frontend-events/references/bluetooth-print.md": "5.4.5",
|
|
342
|
+
"v8-frontend-events/references/progressive-01-列表事件.md": "5.4.5",
|
|
343
|
+
"v8-http-integration/SKILL.md": "5.4.5",
|
|
344
|
+
"v8-http-integration/references/progressive-01-get-请求.md": "5.4.5",
|
|
345
|
+
"v8-http-integration/references/progressive-02-错误处理模式.md": "5.4.5",
|
|
346
|
+
"v8-image-processing/SKILL.md": "5.4.5",
|
|
347
|
+
"v8-image-processing/agents/openai.yaml": "5.4.5",
|
|
348
|
+
"v8-image-processing/references/api-reference.md": "5.4.5",
|
|
349
|
+
"v8-menu-buttons/SKILL.md": "5.4.5",
|
|
350
|
+
"v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.4.5",
|
|
351
|
+
"v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.4.5",
|
|
352
|
+
"v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.4.5",
|
|
353
|
+
"v8-mongodb/SKILL.md": "5.4.5",
|
|
354
|
+
"v8-mq-mqtt/SKILL.md": "5.4.5",
|
|
355
|
+
"v8-mq-mqtt/references/mqtt-production.md": "5.4.5",
|
|
356
|
+
"v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.4.5",
|
|
357
|
+
"v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.4.5",
|
|
358
|
+
"v8-saas-multi-tenant/SKILL.md": "5.4.5",
|
|
359
|
+
"v8-security/SKILL.md": "5.4.5",
|
|
360
|
+
"v8-security/references/progressive-01-2-权限校验.md": "5.4.5",
|
|
361
|
+
"v8-security/references/progressive-02-7-日志记录.md": "5.4.5",
|
|
362
|
+
"v8-sql-query/SKILL.md": "5.4.5",
|
|
363
|
+
"v8-table-event/SKILL.md": "5.4.5",
|
|
364
|
+
"v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.4.5",
|
|
365
|
+
"v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.4.5",
|
|
366
|
+
"v8-tcp-integration/SKILL.md": "5.4.5",
|
|
367
|
+
"v8-tcp-integration/agents/openai.yaml": "5.4.5",
|
|
368
|
+
"v8-template-engine/SKILL.md": "5.4.5",
|
|
369
|
+
"v8-utilities/SKILL.md": "5.4.5",
|
|
370
|
+
"v8-utilities/references/client-api-index.md": "5.4.5",
|
|
371
|
+
"v8-utilities/references/platform-http-routes.md": "5.4.5",
|
|
372
|
+
"v8-utilities/references/server-api-index.md": "5.4.5",
|
|
373
|
+
"v8-workflow/SKILL.md": "5.4.5",
|
|
374
|
+
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.4.5",
|
|
375
|
+
"workspace-conventions/SKILL.md": "5.4.5",
|
|
376
|
+
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.4.5",
|
|
377
|
+
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.4.5",
|
|
378
|
+
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.4.5"
|
|
379
379
|
},
|
|
380
380
|
"files": [
|
|
381
381
|
".microi-skills-version.json",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "5.4.
|
|
2
|
+
"version": "5.4.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-
|
|
5
|
+
"updatedAt": "2026-09-01T04:23:07.123Z"
|
|
6
6
|
}
|
|
@@ -165,16 +165,25 @@ DiyCommon.FormEngine.AddFormData("table_name", { Field: "value" }, function (res
|
|
|
165
165
|
- 远程地址或租户变化时清空旧验证码和 Token;登录失败时刷新验证码。未开启验证码时不得显示验证码输入,也不得提交空验证码字段。
|
|
166
166
|
- 远程响应头必须通过 CORS 暴露 `captchaid` 和 `authorization`;前端还应兼容登录响应体中的 Token,避免只依赖响应头。
|
|
167
167
|
|
|
168
|
-
### PC/移动自适应 Token 续签
|
|
168
|
+
### PC/移动自适应 Token 续签
|
|
169
169
|
|
|
170
170
|
- PC 登录传 `_ClientType:'PC'`;`diyStore.IsPhoneView` 的移动自适应登录传 `_ClientType:'Mobile'`。完整协议以 `microi-frontend-sdk/SKILL.md` 为准。
|
|
171
171
|
- `DiyCommon.getToken()` 是 Microi.Client 请求发送时的 Token 单一事实源;不得先用 Pinia、组件 data 或其它副本判断“是否需要携带 X-Token”,否则持久化恢复或并发续签后会把有效 Token 漏掉。受保护请求收到新 `authorization/token` 后,必须先更新公共存储,再同步 Pinia;登录成功也要在生成动态路由前完成同样的同步。
|
|
172
172
|
- `TokenExpires` 表示“下次应检查续签的时间”,不能固定成所有终端 15 分钟;应从 JWT `exp` 和 `MicroiTokenIssuedAt` 按 10% 提前量计算,最少 5 分钟、最多 1 天。
|
|
173
173
|
- `App.vue` 除一分钟维护定时器外,还必须监听 `visibilitychange`、`focus`、`pageshow`。标签页从浏览器休眠恢复时先走 single-flight RefreshToken,再发业务请求。
|
|
174
174
|
- `Code=1001/1002` 或明确的 `NoLogin / Token签名验证失败` 时展示后端原始 `Msg`。确认失败响应对应的仍是当前 Token 后,必须清理 Token,并携带当前 Hash 用 `location.replace` 完整进入登录页,重建旧页签的动态路由与组件状态,禁止停留在空白页。
|
|
175
|
-
- 多 Tab 共享 Token 时,旧请求返回不得覆盖新 Token,也不得因旧 Token 的失效响应清除另一个 Tab 已写入的新 Token。
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
- 多 Tab 共享 Token 时,旧请求返回不得覆盖新 Token,也不得因旧 Token 的失效响应清除另一个 Tab 已写入的新 Token。
|
|
176
|
+
|
|
177
|
+
### 复盘:Token 续签的瞬时角色查询失败清空按钮权限
|
|
178
|
+
|
|
179
|
+
- 触发场景:管理员已登录且业务页面仍可访问,但列表的新增、编辑等按钮偶发消失;重新登录后立即恢复。
|
|
180
|
+
- 根因:旧续签链在角色或角色权限查询异常时,把 `_IsAdmin=false`、`_Roles=[]`、`_RoleLimits=[]` 当作成功结果写回同一用户共享的 Redis 会话。路由守卫随后又把这份坏快照持久化并标记为已初始化,页面不会再主动修复。
|
|
181
|
+
- 通用规则:后端权限投影必须从主库完整构建,任一技术性读取失败都保持旧缓存不变,并且在成功投影之后才允许轮换 Token。会话写入须与 Token 轮换共用同一用户锁,锁内重读最新会话且只替换 `CurrentUser`,不得覆盖并发终端的 Token 集合;注销或吊销期间缓存消失、请求 Token 已失活时禁止重建会话。超级管理员由权威 `Level` 判断,不得因普通角色列表为空而降级。
|
|
182
|
+
- 通用规则:前端在生成动态路由和设置非空 `roles` 之前,必须验证完整授权快照。技术错误标记或 `Level>=9999 && _IsAdmin!==true` 属于待修复投影;同用户可以临时保留最后一份有效权限用于渲染,但必须携带显式修复标记并强制调用权威刷新接口。干净的普通用户 `false + []` 撤权仍应立即生效,访问密钥裁剪身份不得被自动提升。
|
|
183
|
+
- 通用规则:异步刷新结果只能写回与当前 Token 相同的 `UserId + OsClient`;登录切换或租户切换后的迟到响应必须丢弃。权限修复失败时不得提前把路由身份标记为已初始化。
|
|
184
|
+
- 自动化检查:单测覆盖失败投影保留最后有效权限、合法撤权、访问密钥、登录切换迟到响应和注销竞态;真实浏览器拦截一次坏的当前用户投影,确认页面无需重新登录即可自动刷新,并连续检查新增、编辑按钮及刷新接口返回的管理员权限始终完整。
|
|
185
|
+
|
|
186
|
+
<!-- /microi-progressive:chunk -->
|
|
178
187
|
<!-- microi-progressive:chunk id=microi-client-frontend-010 sha256=d89bb60734da788a027790c666287db8b6cda862e8f5fb3806543b07b3cce94c -->
|
|
179
188
|
## Microi 前端 SDK 约束
|
|
180
189
|
|
|
@@ -299,14 +299,21 @@ Body: {"ApiEngineKey":"your_key","Action":"Bootstrap"}
|
|
|
299
299
|
- 动态路由缓存未命中后允许从 `sys_apiengine` 权威回源并重建 `ApiEngineKey`、`ApiAddress` 两个别名。回源对象如果来自 `dynamic`,先转换为 `JObject`/`object`,并把字段显式赋给 `string`、`bool` 等强类型局部变量,再调用普通方法或扩展方法;禁止让 `dynamic` 调用链延续到 `DosIsNullOrWhiteSpace`、LINQ 或 JToken 扩展。
|
|
300
300
|
- 自动化必须覆盖“缓存预热命中”和“缓存为空首次请求”两条路径;首次请求不得 404,且回源后两个缓存别名均可再次命中。滚动发布、节点重启或缓存清理后要重复执行无 Header 与带 `apiengine: 1` 的真实 HTTP smoke test。
|
|
301
301
|
|
|
302
|
-
### 复盘:接口引擎冷缓存回源异常被吞成空 404
|
|
303
|
-
|
|
304
|
-
- 触发场景:接口配置、启用和匿名设置都正确,接口昨天可用;节点重启或缓存缺失后,小程序首次请求 `/apiengine/{key}` 返回空 body 404。
|
|
305
|
-
- 根因:动态路由从数据库回源成功后,局部变量仍沿着 `dynamic` 调用链传播;运行时对实际 `string` 绑定扩展方法失败,外层异常处理返回原路由值,最终由 ASP.NET Core 表现为无正文 404。
|
|
306
|
-
- 通用规则:数据库/缓存的动态对象在进入路由、鉴权、缓存键和 LINQ 逻辑前必须强类型落地;稳定接口引擎路径由 SDK 自动携带 `apiengine: 1` 作为直达兜底。
|
|
307
|
-
- 自动化检查:单元测试直接传入 `JObject` 验证回源别名强类型归一化;前端传输测试断言 `/apiengine/*` 自动携带 `apiengine: 1`,普通 `/api/*` 不误带;本地启动后清空专用测试别名并验证首次 HTTP 请求成功及缓存重建。
|
|
308
|
-
|
|
309
|
-
|
|
302
|
+
### 复盘:接口引擎冷缓存回源异常被吞成空 404
|
|
303
|
+
|
|
304
|
+
- 触发场景:接口配置、启用和匿名设置都正确,接口昨天可用;节点重启或缓存缺失后,小程序首次请求 `/apiengine/{key}` 返回空 body 404。
|
|
305
|
+
- 根因:动态路由从数据库回源成功后,局部变量仍沿着 `dynamic` 调用链传播;运行时对实际 `string` 绑定扩展方法失败,外层异常处理返回原路由值,最终由 ASP.NET Core 表现为无正文 404。
|
|
306
|
+
- 通用规则:数据库/缓存的动态对象在进入路由、鉴权、缓存键和 LINQ 逻辑前必须强类型落地;稳定接口引擎路径由 SDK 自动携带 `apiengine: 1` 作为直达兜底。
|
|
307
|
+
- 自动化检查:单元测试直接传入 `JObject` 验证回源别名强类型归一化;前端传输测试断言 `/apiengine/*` 自动携带 `apiengine: 1`,普通 `/api/*` 不误带;本地启动后清空专用测试别名并验证首次 HTTP 请求成功及缓存重建。
|
|
308
|
+
|
|
309
|
+
### 复盘:单段自定义 ApiAddress 被误判为 ApiEngineKey
|
|
310
|
+
|
|
311
|
+
- 触发场景:接口行已启用并允许匿名,显式配置了 `/apiengine/external-name`,但真实 `ApiEngineKey` 是另一个值;Query `?OsClient=` 与 `--OsClient--...--` 两种调用都返回 `NoExistData[ApiAddress]`。
|
|
312
|
+
- 根因:动态路由把所有单段 `/apiengine/{value}` 先解释成 `ApiEngineKey=value`,跳过了显式 `ApiAddress`;模型未加载时匿名开关尚未进入判断,因此调整 `AllowAnonymous` 无法修复。
|
|
313
|
+
- 通用规则:完整 `ApiAddress` 与 `ApiRoutes` 是路由第一事实源,只有权威主库确认该地址从未配置时,才允许把尾段作为兼容 Key 回退。停用但未软删除的地址仍占用路由,不能旁路到另一条同名 Key;Controller 只信任动态路由写入的真实 Key,未解析时保留完整地址,禁止再次猜 Key。
|
|
314
|
+
- 自动化检查:至少覆盖“显式地址尾段与 Key 不同”和“ApiAddress 为空的传统 Key 路由”,并分别验证 `?OsClient=`、`--OsClient--...--`、冷缓存首次请求、停用地址阻断及匿名关闭返回鉴权错误而非不存在。
|
|
315
|
+
|
|
316
|
+
## 请求内异步与可靠后台任务
|
|
310
317
|
|
|
311
318
|
接口默认同步返回。对本次请求必须完成的异步 I/O,调用真实的 `*Async` 方法并 `await`。常用入口包括 `V8.Http.*Async`、`V8.FormEngine.GetTableDataAsync` 和 `V8.ApiEngine.RunAsync`:
|
|
312
319
|
|