@microi.net/cli 5.4.4 → 5.4.6
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 +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-cli.js +59 -59
- package/scripts/microi-skills.meta.json +186 -186
- 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/microi-microservice/SKILL.md +6 -0
- package/skills/v8-api-config/SKILL.md +15 -8
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"builtAt": "2026-
|
|
2
|
+
"builtAt": "2026-09-01T13:17:33.554Z",
|
|
3
3
|
"source": "../microi.skills",
|
|
4
4
|
"extension": {
|
|
5
5
|
"name": "v8-engine",
|
|
6
|
-
"version": "5.4.
|
|
6
|
+
"version": "5.4.6",
|
|
7
7
|
"publisher": "Microi"
|
|
8
8
|
},
|
|
9
9
|
"skills": {
|
|
10
|
-
"version": "5.4.
|
|
10
|
+
"version": "5.4.6",
|
|
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": 2299086
|
|
19
19
|
},
|
|
20
20
|
"fileHashes": {
|
|
21
|
-
".microi-skills-version.json": "
|
|
21
|
+
".microi-skills-version.json": "f8b1be1cd5b9b3f26f07f3125d2a11793651e96e80b90cb19a1c82b5dbc0b95a",
|
|
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",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"microi-frontend-sdk/SKILL.md": "f05d35dc4427267582404e5e905654b240ffc0fdcd4c155516fa783eb38c5e14",
|
|
70
70
|
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5dea28edec5a31b6e6e5e15fefc03df9d1ad9bd4b583388fc77bd2aa67a19165",
|
|
71
71
|
"microi-left-right-layout/SKILL.md": "e2f051bce91e6b7cd103599ea526d543fd0f8caaa4c92c71e9e5d81b1a90cf7d",
|
|
72
|
-
"microi-microservice/SKILL.md": "
|
|
72
|
+
"microi-microservice/SKILL.md": "923de9ebe50ffb851dd48f383db405c843ee787befabd97153e7e6e8959b5116",
|
|
73
73
|
"microi-microservice/references/runtime-delivery.md": "538ae295826892942b365492b11aa4797599ea7047fc69409aae64ed99ecfe9b",
|
|
74
74
|
"microi-mobile-app-quality/SKILL.md": "5f096599d539faf2fd57da23686497cf85eb75b4e5c18cc26704c3a856f2f995",
|
|
75
75
|
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "ec938bd1a64b9896ff5d3165ad217ee5c68a22a51ddb690d8a8a0c7a9365c512",
|
|
@@ -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.6",
|
|
202
|
+
".progressive-disclosure-manifest.json": "5.4.6",
|
|
203
|
+
"README.md": "5.4.6",
|
|
204
|
+
"ai-engine/SKILL.md": "5.4.6",
|
|
205
|
+
"ai-engine/agents/openai.yaml": "5.4.6",
|
|
206
|
+
"ai-platform-governance/SKILL.md": "5.4.6",
|
|
207
|
+
"ai-platform-governance/references/progressive-01-功能开关.md": "5.4.6",
|
|
208
|
+
"app-store/SKILL.md": "5.4.6",
|
|
209
|
+
"app-store/agents/openai.yaml": "5.4.6",
|
|
210
|
+
"business-blueprint/SKILL.md": "5.4.6",
|
|
211
|
+
"datasource-engine/SKILL.md": "5.4.6",
|
|
212
|
+
"datasource-engine/agents/openai.yaml": "5.4.6",
|
|
213
|
+
"dos-orm/SKILL.md": "5.4.6",
|
|
214
|
+
"dos-orm/references/api-reference.md": "5.4.6",
|
|
215
|
+
"job-engine/SKILL.md": "5.4.6",
|
|
216
|
+
"job-engine/agents/openai.yaml": "5.4.6",
|
|
217
|
+
"message-notification/SKILL.md": "5.4.6",
|
|
218
|
+
"message-notification/agents/openai.yaml": "5.4.6",
|
|
219
|
+
"message-notification/references/contracts.md": "5.4.6",
|
|
220
|
+
"microi-ai-app-auth.js": "5.4.6",
|
|
221
|
+
"microi-ai-application/SKILL.md": "5.4.6",
|
|
222
|
+
"microi-ai-application/agents/openai.yaml": "5.4.6",
|
|
223
|
+
"microi-ai-application/references/frontend-baseline.md": "5.4.6",
|
|
224
|
+
"microi-client-frontend/SKILL.md": "5.4.6",
|
|
225
|
+
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.4.6",
|
|
226
|
+
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.4.6",
|
|
227
|
+
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.4.6",
|
|
228
|
+
"microi-codex-installer/SKILL.md": "5.4.6",
|
|
229
|
+
"microi-codex-installer/agents/openai.yaml": "5.4.6",
|
|
230
|
+
"microi-codex/SKILL.md": "5.4.6",
|
|
231
|
+
"microi-datasource-mapping/SKILL.md": "5.4.6",
|
|
232
|
+
"microi-db-schema/SKILL.md": "5.4.6",
|
|
233
|
+
"microi-db-schema/agents/openai.yaml": "5.4.6",
|
|
234
|
+
"microi-db-schema/references/core-tables.md": "5.4.6",
|
|
235
|
+
"microi-db-schema/references/form-component-options.md": "5.4.6",
|
|
236
|
+
"microi-db-schema/references/schema-overview.md": "5.4.6",
|
|
237
|
+
"microi-db-schema/references/schema.md": "5.4.6",
|
|
238
|
+
"microi-db-schema/references/table-catalog.md": "5.4.6",
|
|
239
|
+
"microi-deployment/SKILL.md": "5.4.6",
|
|
240
|
+
"microi-deployment/references/deployment-matrix.md": "5.4.6",
|
|
241
|
+
"microi-docs-coverage/SKILL.md": "5.4.6",
|
|
242
|
+
"microi-docs-coverage/references/capability-map.md": "5.4.6",
|
|
243
|
+
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.4.6",
|
|
244
|
+
"microi-form-engine/SKILL.md": "5.4.6",
|
|
245
|
+
"microi-form-engine/references/component-catalog.md": "5.4.6",
|
|
246
|
+
"microi-form-engine/references/data-source-events.md": "5.4.6",
|
|
247
|
+
"microi-form-layout/SKILL.md": "5.4.6",
|
|
248
|
+
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.4.6",
|
|
249
|
+
"microi-frontend-sdk/SKILL.md": "5.4.6",
|
|
250
|
+
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.4.6",
|
|
251
|
+
"microi-left-right-layout/SKILL.md": "5.4.6",
|
|
252
|
+
"microi-microservice/SKILL.md": "5.4.6",
|
|
253
|
+
"microi-microservice/references/runtime-delivery.md": "5.4.6",
|
|
254
|
+
"microi-mobile-app-quality/SKILL.md": "5.4.6",
|
|
255
|
+
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.4.6",
|
|
256
|
+
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.4.6",
|
|
257
|
+
"microi-solution-quotation/SKILL.md": "5.4.6",
|
|
258
|
+
"microi-solution-quotation/agents/openai.yaml": "5.4.6",
|
|
259
|
+
"microi-solution-quotation/scripts/build_solution_quote.py": "5.4.6",
|
|
260
|
+
"microi-sso/SKILL.md": "5.4.6",
|
|
261
|
+
"microi-sso/references/acceptance.md": "5.4.6",
|
|
262
|
+
"microi-sso/references/configuration-and-security.md": "5.4.6",
|
|
263
|
+
"microi-sso/references/inbound.md": "5.4.6",
|
|
264
|
+
"microi-sso/references/outbound.md": "5.4.6",
|
|
265
|
+
"microi-system-delivery/SKILL.md": "5.4.6",
|
|
266
|
+
"microi-system-delivery/references/progressive-01-标准工作流.md": "5.4.6",
|
|
267
|
+
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.4.6",
|
|
268
|
+
"microi-ui/SKILL.md": "5.4.6",
|
|
269
|
+
"microi-ui/references/progressive-01-移动端场景蓝图.md": "5.4.6",
|
|
270
|
+
"microi-uniapp-frontend/SKILL.md": "5.4.6",
|
|
271
|
+
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.4.6",
|
|
272
|
+
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.4.6",
|
|
273
|
+
"microi.v8.js": "5.4.6",
|
|
274
|
+
"module-engine/SKILL.md": "5.4.6",
|
|
275
|
+
"module-engine/references/module-config.md": "5.4.6",
|
|
276
|
+
"ocr-engine/SKILL.md": "5.4.6",
|
|
277
|
+
"ocr-engine/agents/openai.yaml": "5.4.6",
|
|
278
|
+
"page-engine/SKILL.md": "5.4.6",
|
|
279
|
+
"page-engine/references/progressive-01-所有组件类型.md": "5.4.6",
|
|
280
|
+
"page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.4.6",
|
|
281
|
+
"performance-testing/SKILL.md": "5.4.6",
|
|
282
|
+
"playwright-e2e/SKILL.md": "5.4.6",
|
|
283
|
+
"playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.4.6",
|
|
284
|
+
"playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.4.6",
|
|
285
|
+
"playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.4.6",
|
|
286
|
+
"playwright-e2e/references/progressive-04-ci-建议.md": "5.4.6",
|
|
287
|
+
"print-engine/SKILL.md": "5.4.6",
|
|
288
|
+
"production-readonly-audit/SKILL.md": "5.4.6",
|
|
289
|
+
"report-engine/SKILL.md": "5.4.6",
|
|
290
|
+
"report-engine/agents/openai.yaml": "5.4.6",
|
|
291
|
+
"scripts/optimize-progressive-disclosure.mjs": "5.4.6",
|
|
292
|
+
"scripts/refresh-progressive-disclosure.mjs": "5.4.6",
|
|
293
|
+
"scripts/validate-progressive-disclosure.mjs": "5.4.6",
|
|
294
|
+
"search-engine/SKILL.md": "5.4.6",
|
|
295
|
+
"search-engine/agents/openai.yaml": "5.4.6",
|
|
296
|
+
"spider-engine/SKILL.md": "5.4.6",
|
|
297
|
+
"system-observability/SKILL.md": "5.4.6",
|
|
298
|
+
"translate-engine/SKILL.md": "5.4.6",
|
|
299
|
+
"translate-engine/agents/openai.yaml": "5.4.6",
|
|
300
|
+
"ui-design/SKILL.md": "5.4.6",
|
|
301
|
+
"ui-design/assets/pattern-showcase/app.js": "5.4.6",
|
|
302
|
+
"ui-design/assets/pattern-showcase/index.html": "5.4.6",
|
|
303
|
+
"ui-design/assets/pattern-showcase/styles.css": "5.4.6",
|
|
304
|
+
"ui-design/assets/templates/MCI-DESIGN.md": "5.4.6",
|
|
305
|
+
"ui-design/references/design-pattern-library.md": "5.4.6",
|
|
306
|
+
"ui-design/references/mci-design-contract.md": "5.4.6",
|
|
307
|
+
"ui-design/references/motion-and-media.md": "5.4.6",
|
|
308
|
+
"ui-design/references/product-flow-recipes.md": "5.4.6",
|
|
309
|
+
"ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.4.6",
|
|
310
|
+
"ui-design/references/progressive-02-字体.md": "5.4.6",
|
|
311
|
+
"ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.4.6",
|
|
312
|
+
"ui-design/references/progressive-04-组件风格速查.md": "5.4.6",
|
|
313
|
+
"ui-design/references/progressive-05-移动端专用规范.md": "5.4.6",
|
|
314
|
+
"ui-design/references/progressive-06-主题切换实现.md": "5.4.6",
|
|
315
|
+
"ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.4.6",
|
|
316
|
+
"ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.4.6",
|
|
317
|
+
"uniapp-mall-assets/SKILL.md": "5.4.6",
|
|
318
|
+
"unity-integration/SKILL.md": "5.4.6",
|
|
319
|
+
"unity-integration/agents/openai.yaml": "5.4.6",
|
|
320
|
+
"unity-integration/references/ai-app-delivery.md": "5.4.6",
|
|
321
|
+
"unity-integration/references/sdk-api.md": "5.4.6",
|
|
322
|
+
"unity-integration/references/toolbox-migration.md": "5.4.6",
|
|
323
|
+
"unity-integration/references/webgl-hosting.md": "5.4.6",
|
|
324
|
+
"v8-api-config/SKILL.md": "5.4.6",
|
|
325
|
+
"v8-cache-pattern/SKILL.md": "5.4.6",
|
|
326
|
+
"v8-crud-api/SKILL.md": "5.4.6",
|
|
327
|
+
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5.4.6",
|
|
328
|
+
"v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.4.6",
|
|
329
|
+
"v8-debugging/SKILL.md": "5.4.6",
|
|
330
|
+
"v8-explorer-tree/SKILL.md": "5.4.6",
|
|
331
|
+
"v8-export-import/SKILL.md": "5.4.6",
|
|
332
|
+
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.4.6",
|
|
333
|
+
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5.4.6",
|
|
334
|
+
"v8-export-import/references/progressive-03-安全-性能注意.md": "5.4.6",
|
|
335
|
+
"v8-file-upload/SKILL.md": "5.4.6",
|
|
336
|
+
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.4.6",
|
|
337
|
+
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.4.6",
|
|
338
|
+
"v8-formengine-http/SKILL.md": "5.4.6",
|
|
339
|
+
"v8-frontend-events/SKILL.md": "5.4.6",
|
|
340
|
+
"v8-frontend-events/references/bluetooth-print-api.md": "5.4.6",
|
|
341
|
+
"v8-frontend-events/references/bluetooth-print.md": "5.4.6",
|
|
342
|
+
"v8-frontend-events/references/progressive-01-列表事件.md": "5.4.6",
|
|
343
|
+
"v8-http-integration/SKILL.md": "5.4.6",
|
|
344
|
+
"v8-http-integration/references/progressive-01-get-请求.md": "5.4.6",
|
|
345
|
+
"v8-http-integration/references/progressive-02-错误处理模式.md": "5.4.6",
|
|
346
|
+
"v8-image-processing/SKILL.md": "5.4.6",
|
|
347
|
+
"v8-image-processing/agents/openai.yaml": "5.4.6",
|
|
348
|
+
"v8-image-processing/references/api-reference.md": "5.4.6",
|
|
349
|
+
"v8-menu-buttons/SKILL.md": "5.4.6",
|
|
350
|
+
"v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.4.6",
|
|
351
|
+
"v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.4.6",
|
|
352
|
+
"v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.4.6",
|
|
353
|
+
"v8-mongodb/SKILL.md": "5.4.6",
|
|
354
|
+
"v8-mq-mqtt/SKILL.md": "5.4.6",
|
|
355
|
+
"v8-mq-mqtt/references/mqtt-production.md": "5.4.6",
|
|
356
|
+
"v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.4.6",
|
|
357
|
+
"v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.4.6",
|
|
358
|
+
"v8-saas-multi-tenant/SKILL.md": "5.4.6",
|
|
359
|
+
"v8-security/SKILL.md": "5.4.6",
|
|
360
|
+
"v8-security/references/progressive-01-2-权限校验.md": "5.4.6",
|
|
361
|
+
"v8-security/references/progressive-02-7-日志记录.md": "5.4.6",
|
|
362
|
+
"v8-sql-query/SKILL.md": "5.4.6",
|
|
363
|
+
"v8-table-event/SKILL.md": "5.4.6",
|
|
364
|
+
"v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.4.6",
|
|
365
|
+
"v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.4.6",
|
|
366
|
+
"v8-tcp-integration/SKILL.md": "5.4.6",
|
|
367
|
+
"v8-tcp-integration/agents/openai.yaml": "5.4.6",
|
|
368
|
+
"v8-template-engine/SKILL.md": "5.4.6",
|
|
369
|
+
"v8-utilities/SKILL.md": "5.4.6",
|
|
370
|
+
"v8-utilities/references/client-api-index.md": "5.4.6",
|
|
371
|
+
"v8-utilities/references/platform-http-routes.md": "5.4.6",
|
|
372
|
+
"v8-utilities/references/server-api-index.md": "5.4.6",
|
|
373
|
+
"v8-workflow/SKILL.md": "5.4.6",
|
|
374
|
+
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.4.6",
|
|
375
|
+
"workspace-conventions/SKILL.md": "5.4.6",
|
|
376
|
+
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.4.6",
|
|
377
|
+
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.4.6",
|
|
378
|
+
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.4.6"
|
|
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.6",
|
|
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-01T13:16:49.731Z"
|
|
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
|
|
|
@@ -72,6 +72,8 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
|
|
|
72
72
|
构建前遵守本地 OOM 保护;已有 dev server 可复用时不重复启动。新脚手架必须支持独立
|
|
73
73
|
访问时的平台帐号登录,但独立 Vite 预览仍没有菜单/弹窗等完整宿主上下文,不能替代宿主验收。
|
|
74
74
|
|
|
75
|
+
- Vite 微服务的 `package.json.scripts.dev` 必须存在且可直接启动,标准值为 `vite --host 0.0.0.0`。Microi VS Code 在创建、拉取、打开、保存项目文件、构建和推送前都要检查:缺失且能由 `vite.config.*`、Vite 依赖或既有构建脚本确认是 Vite 项目时幂等补齐;已有自定义 `dev` 命令必须原样保留;构建体系无法确认、`package.json` 非法或顶层不是对象时失败关闭,禁止猜测并改坏其它框架。
|
|
76
|
+
|
|
75
77
|
### 线上目标在本地 Microi.Client 复现(强制)
|
|
76
78
|
|
|
77
79
|
- 先在一次性隔离 browser context 打开线上友好路由并读取
|
|
@@ -106,6 +108,7 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
|
|
|
106
108
|
- `replace`、`ReplacePrivateSourceOnly` 和流式发布都不是覆盖他人代码的授权。发现远端版本、文件正文或哈希晚于本地基线时,禁止直接用本地目录整包覆盖;必须先完成上述合并,并让本地唯一事实源保存合并结果。
|
|
107
109
|
- 合并完成后冻结 `expectedCurrentVersion`、`expectedAppVersion`、`SourceManifestHash`、`RuntimeManifestHash` 与 `DeliveryBatchId`。在源码同步、stage、finalize 任一步之前再次回读;任一版本或哈希漂移都说明期间有人发布,必须废弃当前 stage,重新拉取、三方合并、构建和预检。
|
|
108
110
|
- 发布后必须逐文件回读远端私有源码与公有运行产物并核对哈希,再把该远端清单保存为下一次三方比较的共同 Base。只回读入口 `200`、只核对版本号或只保留本地构建目录,都不能证明多人协作发布没有丢代码。
|
|
111
|
+
- `CurrentVersion`、`AppVersion`、文件时间和语义版本字符串都不能单独决定谁是“新代码”;它们只作为 CAS 世代的一部分。最终事实必须同时满足三方文件合并、期望远端源码清单哈希和服务端应用锁内 CAS,任何一个不一致都拒绝切换。
|
|
109
112
|
|
|
110
113
|
## 发布
|
|
111
114
|
|
|
@@ -115,6 +118,9 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
|
|
|
115
118
|
- 每次创建、修改、升级或重新发布微服务,必须先为目标精确 `AppVersion` 在 `sys_microistore_changelog` 写入完整日志,再同步源码、stage、finalize 或制作商城包。日志必须关联真实 `StoreId`,包含 `Title / ChangeType / Content / ReleaseTime`;流式发布显式传入与日志含义一致的非空 `changeSummary`。发布后同时回读商城日志、`mci_ai_app_version.ChangeSummary` 与包内 `PackageInfo.ChangeLog`;缺失或版本不一致必须失败关闭。
|
|
116
119
|
- 发布动作必须明确区分两种模式:默认“源码+编译产物”先把完整工程同步到私有桶并逐文件回读 SHA-256,再把 `dist` 流式发布到公有桶;显式“仅编译产物”只更新公有桶,必须在界面中告知其他用户仍会拉取上一次私有源码,禁止暗示源码已同步。
|
|
117
120
|
- 私有源码同步使用 `ReplacePrivateSourceOnly` 精确清理过期源码;兼容调用可以继续接受 `replace`,但实现不得用旧式全表 `Replace=true` 删除同一应用的公有运行产物元数据。
|
|
121
|
+
- 私有源码正常通道使用 `StageMicroServiceSourceFile`:每个普通文件以 multipart 流从磁盘上传,同一 `DeliveryBatchId + RelativePath + SHA-256` 的暂存重试必须幂等;全部完成后由 `FinalizeMicroServiceSourceManifest` 在应用锁内核对 `ExpectedCurrentVersion / ExpectedAppVersion / ExpectedSourceManifestHash`,逐文件从私有 HDFS 回读大小与 SHA-256,再一次切换 `PrivateSourceStaged → Private` 并归档旧清单。禁止把源码复用到公有 `UploadApplicationAssetStream` 路径。
|
|
122
|
+
- `write EPIPE`、超时或连接关闭发生在 stage 时,只能对上述幂等暂存单元作有界重试;发生在 legacy 整包请求或 finalize 时提交结果未知,先按完整路径集合、字节数和 SHA-256 回读,完全一致才能按成功恢复,否则停止并要求重新三方检查,禁止盲目重放非幂等请求。
|
|
123
|
+
- 旧服务器没有私有源码流式能力时,只允许小于等于 8 MiB 的源码使用单 JSON Base64 兼容接口,并且 HTTP 请求体仍必须 64 KiB 分块、遵守 socket backpressure。超过上限必须明确要求升级后端,禁止为了“避免 EPIPE”人工拆源码文件、循环部分覆盖或调大代理请求体上限。
|
|
118
124
|
- `mci_ai_app_file` 同时存在私有源码和公有编译产物。源码拉取/差异比较必须优先按 `StorageScope=PublicBuildStream|PublicBuildStreamArchived|PublicBuildOnly` 排除公有产物,并保留旧数据中 `HdfsPath == PublishHdfsPath` 的兼容判断;不能仅靠两个路径相等识别,否则版本路径与稳定别名不同的流式产物会被误读成私有源码。
|
|
119
125
|
- 只有服务器不支持流式端点且产物很小时,才兼容 `microi_publish_microservice`。
|
|
120
126
|
- 正常发布支持最多 20,000 个文件、总计 20GB;逐文件从磁盘流入 HDFS,不生成整包 Buffer/Base64。几百 MB、1GB 级项目不得自动降级到旧 Base64 发布器。
|
|
@@ -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
|
|