@microi.net/cli 5.8.5 → 5.8.7
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/LICENSE +21 -21
- package/README.md +71 -71
- package/assets/build-meta.json +7 -7
- package/assets/feature-matrix.json +138 -138
- package/assets/logo.svg +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-codex-stdio-adapter.js +0 -0
- package/scripts/mcp-server.js +1 -1
- package/scripts/microi-cli.js +66 -65
- package/scripts/microi-codex-broker.js +450 -450
- package/scripts/microi-codex-router.js +618 -618
- package/scripts/microi-skills.meta.json +384 -384
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +21 -21
- package/skills/README.md +287 -287
- package/skills/ai-engine/SKILL.md +269 -265
- package/skills/ai-engine/agents/openai.yaml +4 -4
- package/skills/ai-engine/references/ai-employees.md +48 -48
- package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +525 -525
- package/skills/app-store/agents/openai.yaml +4 -4
- package/skills/business-blueprint/SKILL.md +193 -193
- package/skills/datasource-engine/SKILL.md +93 -93
- package/skills/datasource-engine/agents/openai.yaml +4 -4
- package/skills/dos-orm/SKILL.md +97 -95
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +81 -81
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +176 -176
- package/skills/job-engine/agents/openai.yaml +4 -4
- package/skills/message-notification/SKILL.md +156 -156
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi/SKILL.md +14 -14
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +115 -115
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +246 -244
- package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
- 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 +196 -196
- package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +167 -167
- package/skills/microi-codex/SKILL.md +102 -100
- package/skills/microi-codex-installer/SKILL.md +231 -231
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +122 -122
- package/skills/microi-db-schema/SKILL.md +175 -175
- package/skills/microi-db-schema/agents/openai.yaml +4 -4
- package/skills/microi-db-schema/references/core-tables.md +695 -695
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +202 -202
- package/skills/microi-db-schema/references/schema.md +646 -646
- package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
- package/skills/microi-deployment/SKILL.md +222 -220
- package/skills/microi-deployment/references/deployment-matrix.md +109 -109
- package/skills/microi-docs-coverage/SKILL.md +133 -133
- package/skills/microi-docs-coverage/references/capability-map.md +91 -91
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +333 -333
- package/skills/microi-form-engine/references/component-catalog.md +218 -218
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +205 -205
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
- package/skills/microi-frontend-sdk/SKILL.md +194 -194
- package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +176 -176
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +328 -326
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- package/skills/microi-mobile-app-quality/SKILL.md +185 -185
- package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
- package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/SKILL.md +96 -90
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- package/skills/microi-system-delivery/SKILL.md +137 -137
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
- package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +217 -217
- package/skills/microi-ui/SKILL.md +192 -192
- package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
- package/skills/microi-uniapp-frontend/SKILL.md +193 -193
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
- package/skills/microi.v8.js +1921 -1921
- package/skills/module-engine/SKILL.md +255 -255
- package/skills/module-engine/references/module-config.md +204 -204
- package/skills/ocr-engine/SKILL.md +113 -113
- package/skills/ocr-engine/agents/openai.yaml +4 -4
- package/skills/page-engine/SKILL.md +206 -206
- package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
- package/skills/performance-testing/SKILL.md +221 -221
- package/skills/playwright-e2e/SKILL.md +196 -196
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
- package/skills/print-engine/SKILL.md +259 -259
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/report-engine/agents/openai.yaml +4 -4
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/sync-embedded-skills.mjs +46 -46
- package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/search-engine/agents/openai.yaml +4 -4
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +249 -246
- package/skills/system-observability/references/memory-incident-triage.md +77 -77
- package/skills/translate-engine/SKILL.md +140 -140
- package/skills/translate-engine/agents/openai.yaml +4 -4
- package/skills/ui-design/SKILL.md +223 -223
- package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
- package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
- package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
- package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
- package/skills/ui-design/references/design-pattern-library.md +184 -184
- package/skills/ui-design/references/mci-design-contract.md +163 -163
- package/skills/ui-design/references/motion-and-media.md +78 -78
- package/skills/ui-design/references/product-flow-recipes.md +94 -94
- package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
- package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
- package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
- package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
- package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
- package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
- package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
- package/skills/uniapp-mall-assets/SKILL.md +176 -176
- package/skills/unity-integration/SKILL.md +171 -171
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +119 -119
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-api-config/SKILL.md +388 -388
- package/skills/v8-cache-pattern/SKILL.md +312 -312
- package/skills/v8-crud-api/SKILL.md +178 -178
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
- package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
- package/skills/v8-debugging/SKILL.md +284 -284
- package/skills/v8-explorer-tree/SKILL.md +228 -228
- package/skills/v8-export-import/SKILL.md +219 -219
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
- package/skills/v8-file-upload/SKILL.md +284 -284
- package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +263 -263
- package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +161 -161
- package/skills/v8-formengine-http/SKILL.md +238 -238
- package/skills/v8-frontend-events/SKILL.md +180 -180
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
- package/skills/v8-http-integration/SKILL.md +182 -182
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +186 -186
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
- package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
- package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -104
- package/skills/v8-mongodb/SKILL.md +200 -200
- package/skills/v8-mq-mqtt/SKILL.md +176 -176
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
- package/skills/v8-security/SKILL.md +210 -210
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
- package/skills/v8-sql-query/SKILL.md +302 -302
- package/skills/v8-table-event/SKILL.md +176 -176
- package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -216
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
- package/skills/v8-tcp-integration/SKILL.md +147 -147
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +167 -167
- package/skills/v8-utilities/SKILL.md +104 -104
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +188 -188
- package/skills/v8-workflow/SKILL.md +252 -252
- package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
- package/skills/v8-workflow/references/workflow-configuration.md +49 -49
- package/skills/vision-engine/SKILL.md +160 -160
- package/skills/vision-engine/agents/openai.yaml +4 -4
- package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
- package/skills/workspace-conventions/SKILL.md +273 -273
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +209 -209
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +217 -217
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: microi-ai-application
|
|
3
|
-
description: Microi 吾码 AI 应用的创建、迁移、工程化开发和交付规范。用于 Web、MicroService、UniApp、H5、响应式网站或游戏类 AI 应用,尤其是选择前端技术栈、生成 Vue 工程、维护 TypeScript 源码、接入登录与接口引擎、构建发布、二次开发和多端验收。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
-
|
|
8
|
-
# Microi AI 应用
|
|
9
|
-
|
|
10
|
-
## 默认技术基线
|
|
11
|
-
|
|
12
|
-
新建或整体升级的 Web、MicroService 和 H5 AI 应用默认使用:
|
|
13
|
-
|
|
14
|
-
- Vue 3 单文件组件与 Composition API,优先 `<script setup lang="ts">`。
|
|
15
|
-
- Vite 作为开发服务器和生产构建工具,`base: './'`。
|
|
16
|
-
- TypeScript 严格类型检查;业务模型、接口入参、快照、事件和状态机不得长期使用散装 `any`。
|
|
17
|
-
- 原生 ESM 继续作为模块标准。Vue 与 Vite 本身就在 ESM 之上工作,不能把“ESM”和“Vue + Vite”描述成互斥方案。
|
|
18
|
-
- 依赖使用受支持的稳定版本并提交 lockfile。先验证 Node LTS、Vue、Vite、TypeScript 和插件的兼容范围,不盲目追随预发布版。
|
|
19
|
-
|
|
20
|
-
Vue Router 只在有多个可分享路由时引入;Pinia 只在跨页面或跨组件共享复杂状态时引入。单页局部状态使用组合函数。后台数据录入可以使用 Element Plus;独立 Web、官网和游戏界面使用 Microi.UI / MCI-UI token 与项目组件。
|
|
21
|
-
|
|
22
|
-
UniApp 使用 Vue 3 + TypeScript 的官方 Vite 工具链,并同时遵守 `microi-uniapp-frontend`。Canvas/WebGL 游戏仍让渲染循环保持独立模块,Vue 负责大厅、登录、房间、设置、HUD 和结算等 DOM 界面。
|
|
23
|
-
|
|
24
|
-
仅在用户明确要求、目标运行环境不能构建,或内容确实是一次性且无状态的极小静态页时,才允许原生 HTML/JavaScript 例外;在交付说明中记录原因、升级路径和验收范围。
|
|
25
|
-
|
|
26
|
-
详细目录、类型边界和配置样例见 [references/frontend-baseline.md](references/frontend-baseline.md)。
|
|
27
|
-
|
|
28
|
-
## 开始前
|
|
29
|
-
|
|
30
|
-
1. 调用 `microi_list_applications` 盘点目标 `ApiBase + OsClient` 的全部在线应用。
|
|
31
|
-
2. 对目标应用调用 `microi_get_application_context`,核对类型、源码清单、版本和构建产物;只读清单不能代替源码完整性检查。
|
|
32
|
-
3. 确认 `ApplicationType`:独立站点和游戏用 `Web`,宿主内多页面定制用 `MicroService`,跨端应用用 `UniApp`。
|
|
33
|
-
4. 读取 `microi-frontend-sdk`、`ui-design`;MicroService 再读取 `microi-microservice`,UniApp 再读取 `microi-uniapp-frontend`,游戏或复杂媒体再读取 `ui-design/references/motion-and-media.md`。
|
|
34
|
-
5. 在项目根目录维护 `.microi-micro-app.json`;源码必须位于当前租户的 `Microi-V8-Engine/.../AI应用/{appKey}`,不得跨租户复用目录。
|
|
35
|
-
|
|
36
|
-
当前服务器、当前租户的 `AI应用/{appKey}` 是每个 Web、UniApp、MicroService 或平台 AI 应用的唯一源码根。界面源码、Manifest、接口引擎、资源策略、安装测试、离线包生成与应用商城上传素材都必须归入对应应用目录共同演进;禁止创建平行的 `microi.apps/` 发行根或在应用目录中嵌套第二份可编辑工程。纯平台应用即使没有前端运行时,也放在官方租户的 `AI应用/{appKey}`,由自身构建脚本生成商城包。
|
|
37
|
-
|
|
38
|
-
## 工程边界
|
|
39
|
-
|
|
40
|
-
- `src/components` 保存可复用展示组件,`src/pages` 保存页面,`src/composables` 保存 UI 用例,`src/domain` 保存纯 TypeScript 业务规则,`src/services` 保存 API/实时通信适配,`src/platform` 保存 Microi 桥接。
|
|
41
|
-
- 规则核心不得依赖 Vue、DOM、localStorage 或 SignalR,保持确定性并可单元测试。
|
|
42
|
-
- 页面不得直接拼 `/apiengine`、Token、上传或文件地址;统一使用项目级 Microi SDK 实例和薄服务层。
|
|
43
|
-
- 公有 HDFS 应用使用标准 `microi-ai-app-auth.js` 登录桥。服务端始终从 Token 恢复 `V8.CurrentUser`,覆盖客户端提交的用户标识。
|
|
44
|
-
- 写操作、发牌、出牌、结算、库存或审批等业务事实走接口引擎或可信后端事务。通用 SignalR 只广播成功结果中 `DataAppend.RealtimeEvent` 的公共投影,私有或按用户裁剪的权威 Snapshot 继续走 HTTP 接口引擎;共享数据库、Redis 或状态机才是事实源。事件携带 `EventId` 与单调 `Version`,客户端检测版本缺口后重新拉取 Snapshot,断线重连按 EventId 幂等恢复。
|
|
45
|
-
- 新业务使用平台通用 v2 `/api-engine-realtime`,以普通登录 Token 调用 `SubscribeChannel`。30 秒时隙租约必须按返回的 `RenewAfterMilliseconds` 重复订阅续租,每次续租由 `realtime_{channel_key}_authorize` 按 `V8.CurrentUser` 重新授权;现有 AccessKey 在没有 `realtime:subscribe` scope 时拒绝。不要为每个游戏或业务再新增专用 C# Hub;旧 `/game-realtime` 仅作兼容。
|
|
46
|
-
- 环境配置从 `window.__MICROI_APP_CONTEXT__`、宿主上下文和模式文件解析。生产构建拒绝 localhost;开发地址只写 `.env.development.local`。
|
|
47
|
-
|
|
48
|
-
## 调用平台 AI
|
|
49
|
-
|
|
50
|
-
- 运行在吾码表单、表格、按钮或接口引擎上下文中的代码优先使用第一等 `V8.AI`:普通对话用 `await V8.AI.Chat(param)`,真实打字机输出用 `await V8.AI.ChatStream(param, onChunk, { Signal })`。前端实现会复用当前 ApiBase、登录 Token、设备/语言头和 Token 轮换;后端实现会固定绑定当前 `OsClient` 与认证用户。
|
|
51
|
-
- 独立 Web、MicroService、UniApp 的工程代码在 `src/services/ai.ts` 建立薄适配,调用当前平台 `POST /api/Ai/Chat` 或 SSE `POST /api/Ai/ChatStream`;从标准 Microi SDK/宿主上下文取得认证,不在页面中拼 Token、Endpoint、供应商 ApiKey 或任意 Header。
|
|
52
|
-
- 请求只传业务白名单字段,如 `UserChatMsg`、`AiModel`、`AiModelId`、`RelayModel`、`ConversationId`、`Mode`、`ReasoningEffort`、`Attachments`。服务端身份、租户、模型 Endpoint 和密钥不可由页面覆盖;NL2SQL 必须走专用受控入口,不能把页面提交的表名当授权。
|
|
53
|
-
- 外部 Agent 使用 MCP 的 `microi_chat` 获取最终对话结果;它不提供逐 token MCP 流,也不等于平台在线模型已经获得其它 MCP Tool 的 Agent Loop。需要写平台数据时仍调用对应写 Tool,执行确认、幂等和远端回读。
|
|
54
|
-
- 服务器 License 在本机通过官方公钥验签;有效 License 不要求每次 AI 调用访问官网。官方中转模型还会单独校验 `sk-microi-*` 和账号额度,这两套授权不能相互替代。
|
|
55
|
-
|
|
56
|
-
## Vue 实现规则
|
|
57
|
-
|
|
58
|
-
- SFC 模板承担真实 DOM 结构;事件使用 Vue 绑定,状态使用 `ref/reactive/computed`,副作用在组合函数的生命周期内注册并清理。
|
|
59
|
-
- 组件以业务语义命名,如 `RoomLobby`、`GameTable`、`AudioMixer`、`SettlementDialog`,不要按颜色或位置命名。
|
|
60
|
-
- 长连接、轮询、音频上下文、动画帧、观察器和全局事件必须在卸载时释放;页面隐藏时暂停非必要工作。
|
|
61
|
-
- 响应式布局至少覆盖 1440px 桌面和 390px 移动视口;使用安全区、44px 触控目标、键盘焦点和 `prefers-reduced-motion`。
|
|
62
|
-
- 音频应用必须区分背景音乐、人声和效果音,分别调节、静音和持久化;浏览器首次用户手势前不得强制播放。
|
|
63
|
-
- 不使用原生 `alert/confirm/prompt`;使用宿主反馈或可访问的 MCI 弹层。
|
|
64
|
-
|
|
65
|
-
## 存量迁移
|
|
66
|
-
|
|
67
|
-
### Cocos/WebGL 清晰度和资源生命周期
|
|
68
|
-
|
|
69
|
-
- 独立棋子/角色要求独立几何与身份,并不要求每个 glTF 重复上传整张纹理图集。同时核验磁盘资源和引擎实际 Texture2D/GFX bytes;主题切换时按自有 addRef/decRef 生命周期释放非活动模型和材质,迟到加载不得复活已销毁页面。
|
|
70
|
-
- Cocos 3.8.8 普通 Material 资产的宏与 pipeline states 在 initialize/copy 时设置;不能调用仅对实例有效的 recompileShaders/overridePipelineStates 后就假定生效。实际浏览器要复核绑定的贴图、法线、透明混合和叠加照明,类型检查不替代像素检查。
|
|
71
|
-
- 分开记录原生图片尺寸、局部材质密度、渲染缓冲分辨率、截图及真机画质。不得把放大、局部贴图或多图组合标为原生整幅 4K 母版;保留旧收藏与原始溯源。
|
|
72
|
-
- 七类动作等视觉测试应采集连续变化的真实网格状态;暂停引擎定格截图仅用于画面复核。FPS 必须在不暂停、不截屏的连续渲染区间单独计量,记录分辨率、GPU/软件渲染器与后台负载。
|
|
73
|
-
- 选中、起势、接触和吃子音效按时间轴独立触发。不得选棋就播放炮击或把每种兵种做成同一个音效的简单变调;新声音保留旧母版,削波/循环接缝通过不等于最终听感通过。
|
|
74
|
-
|
|
75
|
-
采用绞杀式迁移,避免一次重写破坏已经验证的规则:
|
|
76
|
-
|
|
77
|
-
1. 先把纯规则、API、音频和实时客户端固定为可测试模块。
|
|
78
|
-
2. 建立 Vue 3 + Vite + TypeScript 入口、SFC 页面壳和统一平台适配。
|
|
79
|
-
3. 按登录/大厅、房间、牌桌或舞台、设置、结算的顺序替换命令式 DOM。
|
|
80
|
-
4. 过渡代码只允许放在明确的 `legacy/` 目录,不得新增业务逻辑,并为剩余边界建立测试。
|
|
81
|
-
5. 只有命令式 DOM 查询/写入和全局事件已迁移、类型检查通过,才能声明“完整 Vue 架构迁移”;仅用 Vue 挂载旧 HTML 不算完成。
|
|
82
|
-
|
|
83
|
-
迁移期间保持接口引擎 Key、请求幂等键、版本字段、隐私投影和旧正式 URL 兼容。不要为追求框架统一重写已验证的游戏规则。
|
|
84
|
-
|
|
85
|
-
## 构建与发布
|
|
86
|
-
|
|
87
|
-
1. 先检查内存和已有 Node/Vite 进程,只运行一个高资源构建。
|
|
88
|
-
2. 依次执行类型检查、单元测试、生产构建和产物静态扫描。
|
|
89
|
-
3. 检查 `dist/build` 不含源码、Token、密钥、localhost、source map 或陈旧 chunk。
|
|
90
|
-
4. 同步私有源码,再流式发布公有构建目录;源码同步失败不得继续发布。发布前回读并冻结应用的 `CurrentVersion` 与 `AppVersion`,stage 只上传不可变版本资产,finalize 必须同时提交 `ExpectedCurrentVersion` 与 `ExpectedAppVersion` 做 compare-and-set;缺一项、状态漂移或回读不一致都停止,不能自动覆盖较新发布。
|
|
91
|
-
- v3 的应用基线、fence、应用行版本及 active/committed 指针是原始请求的不可变事实;stage 后只按回读更新版本行的 `ExpectedVersionRowVersion`。已提交但仍为 `ProjectionPending` 时,先回读版本与应用,保留原 `RequestId / RequestFingerprint / DeliveryBatchId` 和首次 finalize 的应用基线,重放原请求取得幂等完成回执;禁止把提交后的新指针或 fence 拼入旧请求。只有 `Completed=true` 与 CDN 文件完整性回读同时通过,才继续发布安装包。
|
|
92
|
-
5. 每次创建、修改、升级或重新发布 AI 应用,必须在任何源码同步、stage、finalize 或商城制包之前,为目标精确 `AppVersion` 写入 `sys_microistore_changelog`。日志的 `StoreId / Version / Title / ChangeType / Content / ReleaseTime` 必须完整;发布工具显式传入含义一致且非空的 `changeSummary`,发布后同时回读商城子表与 `mci_ai_app_version.ChangeSummary`。缺日志或版本不一致必须停止发布。
|
|
93
|
-
6. 官方 Web、UniApp、MicroService 的体验地址统一为 `https://static.itdos.com/{OsClient小写}/micro-app/{AppKey}/index.html`,公有桶对象键与域名后的路径完全一致;不再按运行类型分叉到 `ai-app-publish`,也不把 v3 内部 API resolver 用作公开体验地址。当前版本的全部编译文件写入该应用固定根,历史版本写入同根的 `/{Version}/` 目录;历史目录一旦验证不得覆写成不同字节。
|
|
94
|
-
7. 同一版本私有源码文件使用相同的租户、应用、版本相对路径写入私有桶;固定根保存最近一次已完成发布的源码。确实不含源码的编译包在包声明中记录 `Source=NotIncluded`,运行时版本的 `SourceSnapshotPath` 保持空值,不得从公有产物伪造源码。先校验完整公有版本与私有源码快照,再提升固定根的非入口资产和 `index.html`;固定入口切换后提交 CDN 精确路径刷新,回读刷新任务终态和公有入口及引用资源,再更新商城 `PreviewUrl/PublicPublishPath`。刷新任务仅提交成功、单个 CDN 节点 200 或本地构建成功都不算完成。
|
|
95
|
-
8. 官网、二维码、分享链接和商城“立即体验”只使用固定根 `index.html`;版本目录仅供回滚与显式历史预览。CDN 直接读取公有桶对象,不要求其做动态版本解析或反向代理。发布器必须使 HTML 引用的 JS/CSS 在切换时已存在,并验证从 `static.itdos.com` 打开的应用仍把业务 API 请求发往目标租户的 `ApiBase`。
|
|
96
|
-
v3 的 `sys_microistore.PreviewUrl/PublicPublishPath` 和版本 `PreviewUrl` 在数据库内保留以 `/` 开头的对象路径,后端完成态检查会与投影路径逐字比较;官网接口与商城工作台对外展示时使用租户 `FileServer` 转为完整 CDN URL。不得为统一展示直接把这些 v3 内部字段改写成绝对 URL。
|
|
97
|
-
9. 新的官方 Web、UniApp、MicroService 发布统一使用支持固定 CDN 投影的 v3 目录流式发布;旧 `ai_app_build` 只保留历史兼容和迁移读取,不作为新版本发布入口。目标 API 的 `ApplicationCdnProjectionSupported` 未启用时先部署后端并停止新发布,不回退到 `ai-app-publish`。
|
|
98
|
-
10. 官方 `static.itdos.com` 的刷新凭据从当前租户后端系统设置 `Integration.Cdn.Aliyun.*` 读取,兼容旧的 `Integration.Dns.Aliyun.*` 与 SaaS `AlidnsKeyId/AlidnsKeySecret`;必须成对配置并具备刷新及任务查询权限。刷新任务可能合并多个 URL 到同一任务号,应以全部任务 `Complete` 和 CDN 文件哈希回读为准;不得仅凭提交成功切换商城入口。批量发布须考虑 CDN 每日刷新配额。
|
|
99
|
-
11. `SharedPublicRuntime.EntryUrl` 和历史版本目录仅用于历史记录、回滚、摘要校验与审计。回读应用、版本、active 文件清单和 SHA-256;旧清单文件只能可逆归档,不能删除。再分别直接请求稳定当前入口、不可变版本入口及主要 JS/CSS,并断言前者完成加载后地址栏仍不含版本段。
|
|
100
|
-
|
|
101
|
-
## 完成定义
|
|
102
|
-
|
|
103
|
-
### 真实写入与源码包可执行性
|
|
104
|
-
|
|
105
|
-
- 遇到 Jint 的 CLR 类型解析或程序集缺失,先在目标后端复现。优先调用已公开且经过验证的 `V8.Method` 原子,禁止用 `Math.random` 代替正式随机源;使用 UUID 随机位时必须核对宿主运行时的随机保证、避开固定版本位并使用拒绝采样消除模偏差。
|
|
106
|
-
- 一次业务操作中的 SQL、行锁、请求幂等响应、库存、凭证和审计必须通过同一个 `V8.DbTrans` 执行。仅验证返回失败不足以证明回滚;自动化测试还须回读每类副作用与请求记录,确认没有永久 `Processing` 或部分提交。
|
|
107
|
-
- 领奖码等可逆业务秘密优先使用现有可信宿主的租户/接口绑定保护原子;兼容旧格式时只读旧密钥,不要求新安装租户人工补充未声明配置。真实测试覆盖生成、再次解密、过期、错误码和重复核销。
|
|
108
|
-
- 私有源码 ZIP 中的 `package.json`、lockfile、构建/检查脚本与行为测试必须自包含。下载到独立目录后仍可安装、测试并构建,不得引用开发工作区的父目录脚本或缺失工具链。构建回执绑定候选源码和逐文件产物哈希,任一漂移即失效。
|
|
109
|
-
- 从业务入口登录真实账号,完成首个写操作及整个生命周期;再验证不同身份、撤权、重复请求、并发与刷新恢复。静态截图、模拟登录或合同正则匹配不能替代这些验收。
|
|
110
|
-
|
|
111
|
-
- `vue-tsc --noEmit`、单元测试和生产构建通过。
|
|
112
|
-
- 源码、lockfile、Manifest、构建版本和远端文件哈希一致。
|
|
113
|
-
- 匿名、登录、Token 失效、权限不足、弱网、重连和错误恢复有确定结果。
|
|
114
|
-
- PC 和移动真实浏览器截图通过,控制台无错误,刷新/分享 URL 可恢复状态。
|
|
115
|
-
- 多人或分布式功能必须使用不同账号和至少两个 API 节点验收;本地单进程或静态代码检查不能宣称生产多人闭环。
|
|
1
|
+
---
|
|
2
|
+
name: microi-ai-application
|
|
3
|
+
description: Microi 吾码 AI 应用的创建、迁移、工程化开发和交付规范。用于 Web、MicroService、UniApp、H5、响应式网站或游戏类 AI 应用,尤其是选择前端技术栈、生成 Vue 工程、维护 TypeScript 源码、接入登录与接口引擎、构建发布、二次开发和多端验收。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
+
|
|
8
|
+
# Microi AI 应用
|
|
9
|
+
|
|
10
|
+
## 默认技术基线
|
|
11
|
+
|
|
12
|
+
新建或整体升级的 Web、MicroService 和 H5 AI 应用默认使用:
|
|
13
|
+
|
|
14
|
+
- Vue 3 单文件组件与 Composition API,优先 `<script setup lang="ts">`。
|
|
15
|
+
- Vite 作为开发服务器和生产构建工具,`base: './'`。
|
|
16
|
+
- TypeScript 严格类型检查;业务模型、接口入参、快照、事件和状态机不得长期使用散装 `any`。
|
|
17
|
+
- 原生 ESM 继续作为模块标准。Vue 与 Vite 本身就在 ESM 之上工作,不能把“ESM”和“Vue + Vite”描述成互斥方案。
|
|
18
|
+
- 依赖使用受支持的稳定版本并提交 lockfile。先验证 Node LTS、Vue、Vite、TypeScript 和插件的兼容范围,不盲目追随预发布版。
|
|
19
|
+
|
|
20
|
+
Vue Router 只在有多个可分享路由时引入;Pinia 只在跨页面或跨组件共享复杂状态时引入。单页局部状态使用组合函数。后台数据录入可以使用 Element Plus;独立 Web、官网和游戏界面使用 Microi.UI / MCI-UI token 与项目组件。
|
|
21
|
+
|
|
22
|
+
UniApp 使用 Vue 3 + TypeScript 的官方 Vite 工具链,并同时遵守 `microi-uniapp-frontend`。Canvas/WebGL 游戏仍让渲染循环保持独立模块,Vue 负责大厅、登录、房间、设置、HUD 和结算等 DOM 界面。
|
|
23
|
+
|
|
24
|
+
仅在用户明确要求、目标运行环境不能构建,或内容确实是一次性且无状态的极小静态页时,才允许原生 HTML/JavaScript 例外;在交付说明中记录原因、升级路径和验收范围。
|
|
25
|
+
|
|
26
|
+
详细目录、类型边界和配置样例见 [references/frontend-baseline.md](references/frontend-baseline.md)。
|
|
27
|
+
|
|
28
|
+
## 开始前
|
|
29
|
+
|
|
30
|
+
1. 调用 `microi_list_applications` 盘点目标 `ApiBase + OsClient` 的全部在线应用。
|
|
31
|
+
2. 对目标应用调用 `microi_get_application_context`,核对类型、源码清单、版本和构建产物;只读清单不能代替源码完整性检查。
|
|
32
|
+
3. 确认 `ApplicationType`:独立站点和游戏用 `Web`,宿主内多页面定制用 `MicroService`,跨端应用用 `UniApp`。
|
|
33
|
+
4. 读取 `microi-frontend-sdk`、`ui-design`;MicroService 再读取 `microi-microservice`,UniApp 再读取 `microi-uniapp-frontend`,游戏或复杂媒体再读取 `ui-design/references/motion-and-media.md`。
|
|
34
|
+
5. 在项目根目录维护 `.microi-micro-app.json`;源码必须位于当前租户的 `Microi-V8-Engine/.../AI应用/{appKey}`,不得跨租户复用目录。
|
|
35
|
+
|
|
36
|
+
当前服务器、当前租户的 `AI应用/{appKey}` 是每个 Web、UniApp、MicroService 或平台 AI 应用的唯一源码根。界面源码、Manifest、接口引擎、资源策略、安装测试、离线包生成与应用商城上传素材都必须归入对应应用目录共同演进;禁止创建平行的 `microi.apps/` 发行根或在应用目录中嵌套第二份可编辑工程。纯平台应用即使没有前端运行时,也放在官方租户的 `AI应用/{appKey}`,由自身构建脚本生成商城包。
|
|
37
|
+
|
|
38
|
+
## 工程边界
|
|
39
|
+
|
|
40
|
+
- `src/components` 保存可复用展示组件,`src/pages` 保存页面,`src/composables` 保存 UI 用例,`src/domain` 保存纯 TypeScript 业务规则,`src/services` 保存 API/实时通信适配,`src/platform` 保存 Microi 桥接。
|
|
41
|
+
- 规则核心不得依赖 Vue、DOM、localStorage 或 SignalR,保持确定性并可单元测试。
|
|
42
|
+
- 页面不得直接拼 `/apiengine`、Token、上传或文件地址;统一使用项目级 Microi SDK 实例和薄服务层。
|
|
43
|
+
- 公有 HDFS 应用使用标准 `microi-ai-app-auth.js` 登录桥。服务端始终从 Token 恢复 `V8.CurrentUser`,覆盖客户端提交的用户标识。
|
|
44
|
+
- 写操作、发牌、出牌、结算、库存或审批等业务事实走接口引擎或可信后端事务。通用 SignalR 只广播成功结果中 `DataAppend.RealtimeEvent` 的公共投影,私有或按用户裁剪的权威 Snapshot 继续走 HTTP 接口引擎;共享数据库、Redis 或状态机才是事实源。事件携带 `EventId` 与单调 `Version`,客户端检测版本缺口后重新拉取 Snapshot,断线重连按 EventId 幂等恢复。
|
|
45
|
+
- 新业务使用平台通用 v2 `/api-engine-realtime`,以普通登录 Token 调用 `SubscribeChannel`。30 秒时隙租约必须按返回的 `RenewAfterMilliseconds` 重复订阅续租,每次续租由 `realtime_{channel_key}_authorize` 按 `V8.CurrentUser` 重新授权;现有 AccessKey 在没有 `realtime:subscribe` scope 时拒绝。不要为每个游戏或业务再新增专用 C# Hub;旧 `/game-realtime` 仅作兼容。
|
|
46
|
+
- 环境配置从 `window.__MICROI_APP_CONTEXT__`、宿主上下文和模式文件解析。生产构建拒绝 localhost;开发地址只写 `.env.development.local`。
|
|
47
|
+
|
|
48
|
+
## 调用平台 AI
|
|
49
|
+
|
|
50
|
+
- 运行在吾码表单、表格、按钮或接口引擎上下文中的代码优先使用第一等 `V8.AI`:普通对话用 `await V8.AI.Chat(param)`,真实打字机输出用 `await V8.AI.ChatStream(param, onChunk, { Signal })`。前端实现会复用当前 ApiBase、登录 Token、设备/语言头和 Token 轮换;后端实现会固定绑定当前 `OsClient` 与认证用户。
|
|
51
|
+
- 独立 Web、MicroService、UniApp 的工程代码在 `src/services/ai.ts` 建立薄适配,调用当前平台 `POST /api/Ai/Chat` 或 SSE `POST /api/Ai/ChatStream`;从标准 Microi SDK/宿主上下文取得认证,不在页面中拼 Token、Endpoint、供应商 ApiKey 或任意 Header。
|
|
52
|
+
- 请求只传业务白名单字段,如 `UserChatMsg`、`AiModel`、`AiModelId`、`RelayModel`、`ConversationId`、`Mode`、`ReasoningEffort`、`Attachments`。服务端身份、租户、模型 Endpoint 和密钥不可由页面覆盖;NL2SQL 必须走专用受控入口,不能把页面提交的表名当授权。
|
|
53
|
+
- 外部 Agent 使用 MCP 的 `microi_chat` 获取最终对话结果;它不提供逐 token MCP 流,也不等于平台在线模型已经获得其它 MCP Tool 的 Agent Loop。需要写平台数据时仍调用对应写 Tool,执行确认、幂等和远端回读。
|
|
54
|
+
- 服务器 License 在本机通过官方公钥验签;有效 License 不要求每次 AI 调用访问官网。官方中转模型还会单独校验 `sk-microi-*` 和账号额度,这两套授权不能相互替代。
|
|
55
|
+
|
|
56
|
+
## Vue 实现规则
|
|
57
|
+
|
|
58
|
+
- SFC 模板承担真实 DOM 结构;事件使用 Vue 绑定,状态使用 `ref/reactive/computed`,副作用在组合函数的生命周期内注册并清理。
|
|
59
|
+
- 组件以业务语义命名,如 `RoomLobby`、`GameTable`、`AudioMixer`、`SettlementDialog`,不要按颜色或位置命名。
|
|
60
|
+
- 长连接、轮询、音频上下文、动画帧、观察器和全局事件必须在卸载时释放;页面隐藏时暂停非必要工作。
|
|
61
|
+
- 响应式布局至少覆盖 1440px 桌面和 390px 移动视口;使用安全区、44px 触控目标、键盘焦点和 `prefers-reduced-motion`。
|
|
62
|
+
- 音频应用必须区分背景音乐、人声和效果音,分别调节、静音和持久化;浏览器首次用户手势前不得强制播放。
|
|
63
|
+
- 不使用原生 `alert/confirm/prompt`;使用宿主反馈或可访问的 MCI 弹层。
|
|
64
|
+
|
|
65
|
+
## 存量迁移
|
|
66
|
+
|
|
67
|
+
### Cocos/WebGL 清晰度和资源生命周期
|
|
68
|
+
|
|
69
|
+
- 独立棋子/角色要求独立几何与身份,并不要求每个 glTF 重复上传整张纹理图集。同时核验磁盘资源和引擎实际 Texture2D/GFX bytes;主题切换时按自有 addRef/decRef 生命周期释放非活动模型和材质,迟到加载不得复活已销毁页面。
|
|
70
|
+
- Cocos 3.8.8 普通 Material 资产的宏与 pipeline states 在 initialize/copy 时设置;不能调用仅对实例有效的 recompileShaders/overridePipelineStates 后就假定生效。实际浏览器要复核绑定的贴图、法线、透明混合和叠加照明,类型检查不替代像素检查。
|
|
71
|
+
- 分开记录原生图片尺寸、局部材质密度、渲染缓冲分辨率、截图及真机画质。不得把放大、局部贴图或多图组合标为原生整幅 4K 母版;保留旧收藏与原始溯源。
|
|
72
|
+
- 七类动作等视觉测试应采集连续变化的真实网格状态;暂停引擎定格截图仅用于画面复核。FPS 必须在不暂停、不截屏的连续渲染区间单独计量,记录分辨率、GPU/软件渲染器与后台负载。
|
|
73
|
+
- 选中、起势、接触和吃子音效按时间轴独立触发。不得选棋就播放炮击或把每种兵种做成同一个音效的简单变调;新声音保留旧母版,削波/循环接缝通过不等于最终听感通过。
|
|
74
|
+
|
|
75
|
+
采用绞杀式迁移,避免一次重写破坏已经验证的规则:
|
|
76
|
+
|
|
77
|
+
1. 先把纯规则、API、音频和实时客户端固定为可测试模块。
|
|
78
|
+
2. 建立 Vue 3 + Vite + TypeScript 入口、SFC 页面壳和统一平台适配。
|
|
79
|
+
3. 按登录/大厅、房间、牌桌或舞台、设置、结算的顺序替换命令式 DOM。
|
|
80
|
+
4. 过渡代码只允许放在明确的 `legacy/` 目录,不得新增业务逻辑,并为剩余边界建立测试。
|
|
81
|
+
5. 只有命令式 DOM 查询/写入和全局事件已迁移、类型检查通过,才能声明“完整 Vue 架构迁移”;仅用 Vue 挂载旧 HTML 不算完成。
|
|
82
|
+
|
|
83
|
+
迁移期间保持接口引擎 Key、请求幂等键、版本字段、隐私投影和旧正式 URL 兼容。不要为追求框架统一重写已验证的游戏规则。
|
|
84
|
+
|
|
85
|
+
## 构建与发布
|
|
86
|
+
|
|
87
|
+
1. 先检查内存和已有 Node/Vite 进程,只运行一个高资源构建。
|
|
88
|
+
2. 依次执行类型检查、单元测试、生产构建和产物静态扫描。
|
|
89
|
+
3. 检查 `dist/build` 不含源码、Token、密钥、localhost、source map 或陈旧 chunk。
|
|
90
|
+
4. 同步私有源码,再流式发布公有构建目录;源码同步失败不得继续发布。发布前回读并冻结应用的 `CurrentVersion` 与 `AppVersion`,stage 只上传不可变版本资产,finalize 必须同时提交 `ExpectedCurrentVersion` 与 `ExpectedAppVersion` 做 compare-and-set;缺一项、状态漂移或回读不一致都停止,不能自动覆盖较新发布。
|
|
91
|
+
- v3 的应用基线、fence、应用行版本及 active/committed 指针是原始请求的不可变事实;stage 后只按回读更新版本行的 `ExpectedVersionRowVersion`。已提交但仍为 `ProjectionPending` 时,先回读版本与应用,保留原 `RequestId / RequestFingerprint / DeliveryBatchId` 和首次 finalize 的应用基线,重放原请求取得幂等完成回执;禁止把提交后的新指针或 fence 拼入旧请求。只有 `Completed=true` 与 CDN 文件完整性回读同时通过,才继续发布安装包。
|
|
92
|
+
5. 每次创建、修改、升级或重新发布 AI 应用,必须在任何源码同步、stage、finalize 或商城制包之前,为目标精确 `AppVersion` 写入 `sys_microistore_changelog`。日志的 `StoreId / Version / Title / ChangeType / Content / ReleaseTime` 必须完整;发布工具显式传入含义一致且非空的 `changeSummary`,发布后同时回读商城子表与 `mci_ai_app_version.ChangeSummary`。缺日志或版本不一致必须停止发布。
|
|
93
|
+
6. 官方 Web、UniApp、MicroService 的体验地址统一为 `https://static.itdos.com/{OsClient小写}/micro-app/{AppKey}/index.html`,公有桶对象键与域名后的路径完全一致;不再按运行类型分叉到 `ai-app-publish`,也不把 v3 内部 API resolver 用作公开体验地址。当前版本的全部编译文件写入该应用固定根,历史版本写入同根的 `/{Version}/` 目录;历史目录一旦验证不得覆写成不同字节。
|
|
94
|
+
7. 同一版本私有源码文件使用相同的租户、应用、版本相对路径写入私有桶;固定根保存最近一次已完成发布的源码。确实不含源码的编译包在包声明中记录 `Source=NotIncluded`,运行时版本的 `SourceSnapshotPath` 保持空值,不得从公有产物伪造源码。先校验完整公有版本与私有源码快照,再提升固定根的非入口资产和 `index.html`;固定入口切换后提交 CDN 精确路径刷新,回读刷新任务终态和公有入口及引用资源,再更新商城 `PreviewUrl/PublicPublishPath`。刷新任务仅提交成功、单个 CDN 节点 200 或本地构建成功都不算完成。
|
|
95
|
+
8. 官网、二维码、分享链接和商城“立即体验”只使用固定根 `index.html`;版本目录仅供回滚与显式历史预览。CDN 直接读取公有桶对象,不要求其做动态版本解析或反向代理。发布器必须使 HTML 引用的 JS/CSS 在切换时已存在,并验证从 `static.itdos.com` 打开的应用仍把业务 API 请求发往目标租户的 `ApiBase`。
|
|
96
|
+
v3 的 `sys_microistore.PreviewUrl/PublicPublishPath` 和版本 `PreviewUrl` 在数据库内保留以 `/` 开头的对象路径,后端完成态检查会与投影路径逐字比较;官网接口与商城工作台对外展示时使用租户 `FileServer` 转为完整 CDN URL。不得为统一展示直接把这些 v3 内部字段改写成绝对 URL。
|
|
97
|
+
9. 新的官方 Web、UniApp、MicroService 发布统一使用支持固定 CDN 投影的 v3 目录流式发布;旧 `ai_app_build` 只保留历史兼容和迁移读取,不作为新版本发布入口。目标 API 的 `ApplicationCdnProjectionSupported` 未启用时先部署后端并停止新发布,不回退到 `ai-app-publish`。
|
|
98
|
+
10. 官方 `static.itdos.com` 的刷新凭据从当前租户后端系统设置 `Integration.Cdn.Aliyun.*` 读取,兼容旧的 `Integration.Dns.Aliyun.*` 与 SaaS `AlidnsKeyId/AlidnsKeySecret`;必须成对配置并具备刷新及任务查询权限。刷新任务可能合并多个 URL 到同一任务号,应以全部任务 `Complete` 和 CDN 文件哈希回读为准;不得仅凭提交成功切换商城入口。批量发布须考虑 CDN 每日刷新配额。
|
|
99
|
+
11. `SharedPublicRuntime.EntryUrl` 和历史版本目录仅用于历史记录、回滚、摘要校验与审计。回读应用、版本、active 文件清单和 SHA-256;旧清单文件只能可逆归档,不能删除。再分别直接请求稳定当前入口、不可变版本入口及主要 JS/CSS,并断言前者完成加载后地址栏仍不含版本段。
|
|
100
|
+
|
|
101
|
+
## 完成定义
|
|
102
|
+
|
|
103
|
+
### 真实写入与源码包可执行性
|
|
104
|
+
|
|
105
|
+
- 遇到 Jint 的 CLR 类型解析或程序集缺失,先在目标后端复现。优先调用已公开且经过验证的 `V8.Method` 原子,禁止用 `Math.random` 代替正式随机源;使用 UUID 随机位时必须核对宿主运行时的随机保证、避开固定版本位并使用拒绝采样消除模偏差。
|
|
106
|
+
- 一次业务操作中的 SQL、行锁、请求幂等响应、库存、凭证和审计必须通过同一个 `V8.DbTrans` 执行。仅验证返回失败不足以证明回滚;自动化测试还须回读每类副作用与请求记录,确认没有永久 `Processing` 或部分提交。
|
|
107
|
+
- 领奖码等可逆业务秘密优先使用现有可信宿主的租户/接口绑定保护原子;兼容旧格式时只读旧密钥,不要求新安装租户人工补充未声明配置。真实测试覆盖生成、再次解密、过期、错误码和重复核销。
|
|
108
|
+
- 私有源码 ZIP 中的 `package.json`、lockfile、构建/检查脚本与行为测试必须自包含。下载到独立目录后仍可安装、测试并构建,不得引用开发工作区的父目录脚本或缺失工具链。构建回执绑定候选源码和逐文件产物哈希,任一漂移即失效。
|
|
109
|
+
- 从业务入口登录真实账号,完成首个写操作及整个生命周期;再验证不同身份、撤权、重复请求、并发与刷新恢复。静态截图、模拟登录或合同正则匹配不能替代这些验收。
|
|
110
|
+
|
|
111
|
+
- `vue-tsc --noEmit`、单元测试和生产构建通过。
|
|
112
|
+
- 源码、lockfile、Manifest、构建版本和远端文件哈希一致。
|
|
113
|
+
- 匿名、登录、Token 失效、权限不足、弱网、重连和错误恢复有确定结果。
|
|
114
|
+
- PC 和移动真实浏览器截图通过,控制台无错误,刷新/分享 URL 可恢复状态。
|
|
115
|
+
- 多人或分布式功能必须使用不同账号和至少两个 API 节点验收;本地单进程或静态代码检查不能宣称生产多人闭环。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
interface:
|
|
2
|
-
display_name: "Microi AI 应用开发"
|
|
3
|
-
short_description: "以 Vue 3、Vite、TypeScript 构建可维护的吾码 AI 应用"
|
|
4
|
-
default_prompt: "使用 $microi-ai-application 创建一个可维护、可发布并通过多端验收的吾码 AI 应用。"
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Microi AI 应用开发"
|
|
3
|
+
short_description: "以 Vue 3、Vite、TypeScript 构建可维护的吾码 AI 应用"
|
|
4
|
+
default_prompt: "使用 $microi-ai-application 创建一个可维护、可发布并通过多端验收的吾码 AI 应用。"
|
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
# Microi AI 应用前端基线
|
|
2
|
-
|
|
3
|
-
## 目录
|
|
4
|
-
|
|
5
|
-
1. 技术选择
|
|
6
|
-
2. 标准目录
|
|
7
|
-
3. 最小配置
|
|
8
|
-
4. 分层契约
|
|
9
|
-
5. 通用实时通信
|
|
10
|
-
6. 质量门
|
|
11
|
-
|
|
12
|
-
## 技术选择
|
|
13
|
-
|
|
14
|
-
“最主流”不是永远固定的单一框架。Microi 的默认标准选择 Vue 3 + Vite + TypeScript,是因为 Microi.Client、Microi.UI 和既有开发者能力均以 Vue 3 为主,同时 Vue 官方的新项目脚手架也是 Vite + TypeScript。需要 React/Next、Svelte 或其它框架时,用户必须明确选择,并仍遵守平台 SDK、租户、发布和验收契约。
|
|
15
|
-
|
|
16
|
-
版本策略:使用 Microi 当前维护的脚手架版本并提交 `package-lock.json`;升级依赖时单独提交、重新构建和截图,不让普通业务修改顺带漂移工具链。
|
|
17
|
-
|
|
18
|
-
## 标准目录
|
|
19
|
-
|
|
20
|
-
```text
|
|
21
|
-
AI应用/{appKey}/
|
|
22
|
-
.microi-micro-app.json
|
|
23
|
-
package.json
|
|
24
|
-
package-lock.json
|
|
25
|
-
tsconfig.json
|
|
26
|
-
vite.config.ts
|
|
27
|
-
index.html
|
|
28
|
-
src/
|
|
29
|
-
main.ts
|
|
30
|
-
App.vue
|
|
31
|
-
env.d.ts
|
|
32
|
-
components/
|
|
33
|
-
pages/
|
|
34
|
-
composables/
|
|
35
|
-
domain/
|
|
36
|
-
services/
|
|
37
|
-
platform/
|
|
38
|
-
microi.ts
|
|
39
|
-
microi.v8.js
|
|
40
|
-
tests/
|
|
41
|
-
dist/ # MicroService 默认;Web 项目可按清单使用 build/
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
`node_modules`、`dist/build`、覆盖率和本地环境文件不进入私有源码包。接口引擎源码按应用 Manifest 维护,但不被打进浏览器产物。
|
|
45
|
-
|
|
46
|
-
## 最小配置
|
|
47
|
-
|
|
48
|
-
```ts
|
|
49
|
-
// vite.config.ts
|
|
50
|
-
import { defineConfig } from 'vite'
|
|
51
|
-
import vue from '@vitejs/plugin-vue'
|
|
52
|
-
|
|
53
|
-
export default defineConfig({
|
|
54
|
-
base: './',
|
|
55
|
-
plugins: [vue()],
|
|
56
|
-
build: {
|
|
57
|
-
outDir: 'dist',
|
|
58
|
-
assetsDir: 'assets',
|
|
59
|
-
emptyOutDir: true,
|
|
60
|
-
target: 'es2020',
|
|
61
|
-
sourcemap: false,
|
|
62
|
-
},
|
|
63
|
-
})
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
```json
|
|
67
|
-
{
|
|
68
|
-
"compilerOptions": {
|
|
69
|
-
"target": "ES2022",
|
|
70
|
-
"module": "ESNext",
|
|
71
|
-
"moduleResolution": "Bundler",
|
|
72
|
-
"strict": true,
|
|
73
|
-
"noUncheckedIndexedAccess": true,
|
|
74
|
-
"useDefineForClassFields": true,
|
|
75
|
-
"isolatedModules": true,
|
|
76
|
-
"verbatimModuleSyntax": true,
|
|
77
|
-
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
78
|
-
"types": ["vite/client"],
|
|
79
|
-
"skipLibCheck": true
|
|
80
|
-
},
|
|
81
|
-
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "tests/**/*.ts"]
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
推荐脚本:
|
|
86
|
-
|
|
87
|
-
```json
|
|
88
|
-
{
|
|
89
|
-
"scripts": {
|
|
90
|
-
"dev": "vite --host 0.0.0.0",
|
|
91
|
-
"typecheck": "vue-tsc --noEmit",
|
|
92
|
-
"test": "vitest run",
|
|
93
|
-
"build": "npm run typecheck && vite build",
|
|
94
|
-
"preview": "vite preview --host 0.0.0.0",
|
|
95
|
-
"verify": "npm run test && npm run build"
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
没有浏览器业务测试时可以先用 Node 原生测试,但复杂应用应使用 Vitest;关键 UI 流程使用 Playwright。不要为了“看起来主流”无条件加入 Router、Pinia、Element Plus或大型渲染库。
|
|
101
|
-
|
|
102
|
-
## 分层契约
|
|
103
|
-
|
|
104
|
-
```text
|
|
105
|
-
Vue SFC/pages
|
|
106
|
-
-> composables/use-cases
|
|
107
|
-
-> domain pure TypeScript
|
|
108
|
-
-> services (ApiEngine / Realtime / Audio)
|
|
109
|
-
-> platform Microi SDK and host context
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
- `domain` 只接收普通数据并返回普通数据。
|
|
113
|
-
- `services` 负责协议和 DTO,不把 HTTP/SignalR 对象泄漏到页面。
|
|
114
|
-
- `composables` 负责生命周期、忙碌态和错误恢复。
|
|
115
|
-
- `components/pages` 只消费可显示状态和明确动作。
|
|
116
|
-
|
|
117
|
-
## 通用实时通信
|
|
118
|
-
|
|
119
|
-
需要订单进度、协同状态或多人房间等实时刷新时,默认使用接口引擎通用 SignalR v2 契约;不要为应用新建业务专用 Hub。业务命令、订阅授权、事务和按用户裁剪的 Snapshot 均由接口引擎实现,SignalR 只发送事务提交后的公共投影。
|
|
120
|
-
|
|
121
|
-
- Hub 固定为 `/api-engine-realtime`,客户端调用 `SubscribeChannel({ ChannelKey, SubjectId })`,监听 `RealtimeEvent`。
|
|
122
|
-
- 连接必须使用普通登录 Token。现有 AccessKey 没有 `realtime:subscribe` scope,平台会拒绝其连接;在平台正式增加并校验该 scope 前,不得绕过此限制。
|
|
123
|
-
- 每次订阅或续租都会重新调用 `realtime_{channel_key}_authorize`,授权接口必须以 `V8.CurrentUser` 为准,不能信任客户端传入的用户、租户或接口 Key。
|
|
124
|
-
- 订阅按 30 秒时隙租约管理。客户端以服务端返回的 `RenewAfterMilliseconds` 安排下一次 `SubscribeChannel`,不得写死续租周期;页面隐藏后仍需订阅时继续续租,退出资源、注销或组件卸载时调用 `UnsubscribeChannel` 并清理定时器。
|
|
125
|
-
- 客户端按 `EventId` 去重、按 `Version` 忽略旧事件并检测缺口。连接失败、续租失败、重连或版本跳跃时,立即回退到业务 HTTP `Snapshot`,且始终保留有界轮询兜底。
|
|
126
|
-
- 接口引擎只能在成功结果的 `DataAppend.RealtimeEvent` 中声明 `Data` 公共投影;私有手牌、Token、密钥、用户专属字段和完整服务端状态只能由鉴权后的 Snapshot 返回。
|
|
127
|
-
|
|
128
|
-
续租应串行执行,避免一个页面产生重叠授权请求:
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
const subscription = { ChannelKey: 'room_updates', SubjectId: roomId }
|
|
132
|
-
let renewTimer: ReturnType<typeof setTimeout> | undefined
|
|
133
|
-
|
|
134
|
-
async function renewRealtimeLease() {
|
|
135
|
-
clearTimeout(renewTimer)
|
|
136
|
-
try {
|
|
137
|
-
const lease = await connection.invoke<{
|
|
138
|
-
ProtocolVersion: number
|
|
139
|
-
RenewAfterMilliseconds: number
|
|
140
|
-
LeaseExpiresAt: string
|
|
141
|
-
}>('SubscribeChannel', subscription)
|
|
142
|
-
renewTimer = setTimeout(
|
|
143
|
-
() => void renewRealtimeLease(),
|
|
144
|
-
Math.max(1_000, lease.RenewAfterMilliseconds),
|
|
145
|
-
)
|
|
146
|
-
} catch {
|
|
147
|
-
await refreshSnapshot()
|
|
148
|
-
renewTimer = setTimeout(() => void renewRealtimeLease(), 3_000)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
当前服务端还会在共享 Redis 中按租户和用户限制订阅授权频率,所有标签页和 API 节点共享计数。应用不得依赖单节点内存节流,也不得通过并发续租消耗限额。
|
|
154
|
-
|
|
155
|
-
## 质量门
|
|
156
|
-
|
|
157
|
-
- TypeScript 严格检查无错误;`any` 只能位于有说明的平台兼容边界。
|
|
158
|
-
- 每个写接口有请求 Id、重复提交保护和服务端校验。
|
|
159
|
-
- 构建资产使用相对路径,稳定入口与不可变版本入口均可打开。
|
|
160
|
-
- stage 前冻结 `CurrentVersion + AppVersion`,finalize 同时提交两项前置条件;旧请求晚到、应用身份漂移或清单收缩对账失败时不切换稳定入口。
|
|
161
|
-
- 生产 JS 不含 localhost、凭据、私有牌面、服务端源码或 source map。
|
|
162
|
-
- 首屏、登录/未登录、加载、空、错误、权限、成功状态均有响应式截图。
|
|
163
|
-
- Canvas/WebGL、音频和实时连接在隐藏/卸载时释放,并有低性能降级。
|
|
164
|
-
- 实时客户端已验证续租会重复授权、Token/资格撤销后停止收到事件,以及 SignalR/Redis 暂不可用时可通过 HTTP Snapshot 收敛。
|
|
1
|
+
# Microi AI 应用前端基线
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. 技术选择
|
|
6
|
+
2. 标准目录
|
|
7
|
+
3. 最小配置
|
|
8
|
+
4. 分层契约
|
|
9
|
+
5. 通用实时通信
|
|
10
|
+
6. 质量门
|
|
11
|
+
|
|
12
|
+
## 技术选择
|
|
13
|
+
|
|
14
|
+
“最主流”不是永远固定的单一框架。Microi 的默认标准选择 Vue 3 + Vite + TypeScript,是因为 Microi.Client、Microi.UI 和既有开发者能力均以 Vue 3 为主,同时 Vue 官方的新项目脚手架也是 Vite + TypeScript。需要 React/Next、Svelte 或其它框架时,用户必须明确选择,并仍遵守平台 SDK、租户、发布和验收契约。
|
|
15
|
+
|
|
16
|
+
版本策略:使用 Microi 当前维护的脚手架版本并提交 `package-lock.json`;升级依赖时单独提交、重新构建和截图,不让普通业务修改顺带漂移工具链。
|
|
17
|
+
|
|
18
|
+
## 标准目录
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
AI应用/{appKey}/
|
|
22
|
+
.microi-micro-app.json
|
|
23
|
+
package.json
|
|
24
|
+
package-lock.json
|
|
25
|
+
tsconfig.json
|
|
26
|
+
vite.config.ts
|
|
27
|
+
index.html
|
|
28
|
+
src/
|
|
29
|
+
main.ts
|
|
30
|
+
App.vue
|
|
31
|
+
env.d.ts
|
|
32
|
+
components/
|
|
33
|
+
pages/
|
|
34
|
+
composables/
|
|
35
|
+
domain/
|
|
36
|
+
services/
|
|
37
|
+
platform/
|
|
38
|
+
microi.ts
|
|
39
|
+
microi.v8.js
|
|
40
|
+
tests/
|
|
41
|
+
dist/ # MicroService 默认;Web 项目可按清单使用 build/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`node_modules`、`dist/build`、覆盖率和本地环境文件不进入私有源码包。接口引擎源码按应用 Manifest 维护,但不被打进浏览器产物。
|
|
45
|
+
|
|
46
|
+
## 最小配置
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
// vite.config.ts
|
|
50
|
+
import { defineConfig } from 'vite'
|
|
51
|
+
import vue from '@vitejs/plugin-vue'
|
|
52
|
+
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
base: './',
|
|
55
|
+
plugins: [vue()],
|
|
56
|
+
build: {
|
|
57
|
+
outDir: 'dist',
|
|
58
|
+
assetsDir: 'assets',
|
|
59
|
+
emptyOutDir: true,
|
|
60
|
+
target: 'es2020',
|
|
61
|
+
sourcemap: false,
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"compilerOptions": {
|
|
69
|
+
"target": "ES2022",
|
|
70
|
+
"module": "ESNext",
|
|
71
|
+
"moduleResolution": "Bundler",
|
|
72
|
+
"strict": true,
|
|
73
|
+
"noUncheckedIndexedAccess": true,
|
|
74
|
+
"useDefineForClassFields": true,
|
|
75
|
+
"isolatedModules": true,
|
|
76
|
+
"verbatimModuleSyntax": true,
|
|
77
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
78
|
+
"types": ["vite/client"],
|
|
79
|
+
"skipLibCheck": true
|
|
80
|
+
},
|
|
81
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "tests/**/*.ts"]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
推荐脚本:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"scripts": {
|
|
90
|
+
"dev": "vite --host 0.0.0.0",
|
|
91
|
+
"typecheck": "vue-tsc --noEmit",
|
|
92
|
+
"test": "vitest run",
|
|
93
|
+
"build": "npm run typecheck && vite build",
|
|
94
|
+
"preview": "vite preview --host 0.0.0.0",
|
|
95
|
+
"verify": "npm run test && npm run build"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
没有浏览器业务测试时可以先用 Node 原生测试,但复杂应用应使用 Vitest;关键 UI 流程使用 Playwright。不要为了“看起来主流”无条件加入 Router、Pinia、Element Plus或大型渲染库。
|
|
101
|
+
|
|
102
|
+
## 分层契约
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
Vue SFC/pages
|
|
106
|
+
-> composables/use-cases
|
|
107
|
+
-> domain pure TypeScript
|
|
108
|
+
-> services (ApiEngine / Realtime / Audio)
|
|
109
|
+
-> platform Microi SDK and host context
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- `domain` 只接收普通数据并返回普通数据。
|
|
113
|
+
- `services` 负责协议和 DTO,不把 HTTP/SignalR 对象泄漏到页面。
|
|
114
|
+
- `composables` 负责生命周期、忙碌态和错误恢复。
|
|
115
|
+
- `components/pages` 只消费可显示状态和明确动作。
|
|
116
|
+
|
|
117
|
+
## 通用实时通信
|
|
118
|
+
|
|
119
|
+
需要订单进度、协同状态或多人房间等实时刷新时,默认使用接口引擎通用 SignalR v2 契约;不要为应用新建业务专用 Hub。业务命令、订阅授权、事务和按用户裁剪的 Snapshot 均由接口引擎实现,SignalR 只发送事务提交后的公共投影。
|
|
120
|
+
|
|
121
|
+
- Hub 固定为 `/api-engine-realtime`,客户端调用 `SubscribeChannel({ ChannelKey, SubjectId })`,监听 `RealtimeEvent`。
|
|
122
|
+
- 连接必须使用普通登录 Token。现有 AccessKey 没有 `realtime:subscribe` scope,平台会拒绝其连接;在平台正式增加并校验该 scope 前,不得绕过此限制。
|
|
123
|
+
- 每次订阅或续租都会重新调用 `realtime_{channel_key}_authorize`,授权接口必须以 `V8.CurrentUser` 为准,不能信任客户端传入的用户、租户或接口 Key。
|
|
124
|
+
- 订阅按 30 秒时隙租约管理。客户端以服务端返回的 `RenewAfterMilliseconds` 安排下一次 `SubscribeChannel`,不得写死续租周期;页面隐藏后仍需订阅时继续续租,退出资源、注销或组件卸载时调用 `UnsubscribeChannel` 并清理定时器。
|
|
125
|
+
- 客户端按 `EventId` 去重、按 `Version` 忽略旧事件并检测缺口。连接失败、续租失败、重连或版本跳跃时,立即回退到业务 HTTP `Snapshot`,且始终保留有界轮询兜底。
|
|
126
|
+
- 接口引擎只能在成功结果的 `DataAppend.RealtimeEvent` 中声明 `Data` 公共投影;私有手牌、Token、密钥、用户专属字段和完整服务端状态只能由鉴权后的 Snapshot 返回。
|
|
127
|
+
|
|
128
|
+
续租应串行执行,避免一个页面产生重叠授权请求:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const subscription = { ChannelKey: 'room_updates', SubjectId: roomId }
|
|
132
|
+
let renewTimer: ReturnType<typeof setTimeout> | undefined
|
|
133
|
+
|
|
134
|
+
async function renewRealtimeLease() {
|
|
135
|
+
clearTimeout(renewTimer)
|
|
136
|
+
try {
|
|
137
|
+
const lease = await connection.invoke<{
|
|
138
|
+
ProtocolVersion: number
|
|
139
|
+
RenewAfterMilliseconds: number
|
|
140
|
+
LeaseExpiresAt: string
|
|
141
|
+
}>('SubscribeChannel', subscription)
|
|
142
|
+
renewTimer = setTimeout(
|
|
143
|
+
() => void renewRealtimeLease(),
|
|
144
|
+
Math.max(1_000, lease.RenewAfterMilliseconds),
|
|
145
|
+
)
|
|
146
|
+
} catch {
|
|
147
|
+
await refreshSnapshot()
|
|
148
|
+
renewTimer = setTimeout(() => void renewRealtimeLease(), 3_000)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
当前服务端还会在共享 Redis 中按租户和用户限制订阅授权频率,所有标签页和 API 节点共享计数。应用不得依赖单节点内存节流,也不得通过并发续租消耗限额。
|
|
154
|
+
|
|
155
|
+
## 质量门
|
|
156
|
+
|
|
157
|
+
- TypeScript 严格检查无错误;`any` 只能位于有说明的平台兼容边界。
|
|
158
|
+
- 每个写接口有请求 Id、重复提交保护和服务端校验。
|
|
159
|
+
- 构建资产使用相对路径,稳定入口与不可变版本入口均可打开。
|
|
160
|
+
- stage 前冻结 `CurrentVersion + AppVersion`,finalize 同时提交两项前置条件;旧请求晚到、应用身份漂移或清单收缩对账失败时不切换稳定入口。
|
|
161
|
+
- 生产 JS 不含 localhost、凭据、私有牌面、服务端源码或 source map。
|
|
162
|
+
- 首屏、登录/未登录、加载、空、错误、权限、成功状态均有响应式截图。
|
|
163
|
+
- Canvas/WebGL、音频和实时连接在隐藏/卸载时释放,并有低性能降级。
|
|
164
|
+
- 实时客户端已验证续租会重复授权、Token/资格撤销后停止收到事件,以及 SignalR/Redis 暂不可用时可通过 HTTP Snapshot 收敛。
|