@microi.net/cli 5.5.9 → 5.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +5 -5
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +99 -99
- package/scripts/microi-cli.js +39 -36
- package/scripts/microi-skills.meta.json +341 -338
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +4 -4
- package/skills/ai-engine/SKILL.md +45 -45
- 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 +21 -4
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +15 -0
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +80 -80
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +154 -154
- package/skills/message-notification/SKILL.md +27 -1
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -102
- 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 +47 -41
- 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 +4 -4
- 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 +30 -30
- 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 +58 -58
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-codex-installer/SKILL.md +216 -216
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +67 -67
- package/skills/microi-db-schema/SKILL.md +6 -6
- package/skills/microi-db-schema/references/core-tables.md +18 -18
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +11 -11
- package/skills/microi-db-schema/references/schema.md +46 -46
- package/skills/microi-db-schema/references/table-catalog.md +57 -57
- package/skills/microi-deployment/SKILL.md +18 -1
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/SKILL.md +10 -0
- package/skills/microi-docs-coverage/references/capability-map.md +3 -2
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +27 -3
- 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 +13 -13
- 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 +4 -4
- 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 +175 -175
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +2 -1
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- 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-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 +6 -0
- 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 +5 -4
- 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 +7 -2
- package/skills/microi-ui/SKILL.md +7 -2
- package/skills/microi-uniapp-frontend/SKILL.md +134 -134
- 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 +136 -136
- 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 +124 -124
- package/skills/module-engine/SKILL.md +30 -14
- package/skills/ocr-engine/SKILL.md +2 -2
- package/skills/ocr-engine/agents/openai.yaml +1 -1
- package/skills/page-engine/SKILL.md +28 -28
- 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 +126 -126
- 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 +42 -42
- package/skills/performance-testing/SKILL.md +120 -120
- package/skills/playwright-e2e/SKILL.md +84 -84
- 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 +68 -68
- 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 +64 -64
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
- package/skills/print-engine/SKILL.md +11 -3
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- 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 -0
- package/skills/scripts/validate-progressive-disclosure.mjs +8 -3
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +169 -157
- package/skills/system-observability/references/memory-incident-triage.md +73 -73
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +3 -1
- package/skills/uniapp-mall-assets/SKILL.md +170 -170
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- 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 +4 -0
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +29 -29
- 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 +56 -56
- package/skills/v8-debugging/SKILL.md +143 -143
- package/skills/v8-explorer-tree/SKILL.md +64 -64
- 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 +201 -201
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
- 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 +32 -32
- package/skills/v8-file-upload/SKILL.md +5 -2
- 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 +2 -2
- 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 +138 -138
- package/skills/v8-formengine-http/SKILL.md +126 -108
- package/skills/v8-frontend-events/SKILL.md +22 -22
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
- package/skills/v8-http-integration/SKILL.md +106 -106
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
- 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 +5 -5
- 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 +103 -103
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
- 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 +43 -43
- package/skills/v8-mongodb/SKILL.md +65 -65
- package/skills/v8-mq-mqtt/SKILL.md +175 -175
- 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 +137 -137
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
- package/skills/v8-security/SKILL.md +1 -1
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
- package/skills/v8-sql-query/SKILL.md +7 -5
- package/skills/v8-table-event/SKILL.md +9 -2
- 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 +1 -1
- 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 +15 -15
- package/skills/v8-tcp-integration/SKILL.md +1 -1
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +59 -59
- package/skills/v8-utilities/SKILL.md +92 -92
- 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 +74 -74
- package/skills/v8-workflow/SKILL.md +13 -4
- package/skills/vision-engine/SKILL.md +19 -19
- package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
- package/skills/workspace-conventions/SKILL.md +35 -12
- 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 +2 -2
- 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 +179 -179
- 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 +21 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: business-blueprint
|
|
3
|
-
description: Microi 业务架构蓝图(System Blueprint)— 设计期系统知识图谱,AI 生成低代码系统时防幻觉的唯一事实源
|
|
3
|
+
description: Microi 业务架构蓝图(System Blueprint)— 设计期系统知识图谱,AI 生成低代码系统时防幻觉的唯一事实源
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
@@ -9,7 +9,7 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
|
|
|
9
9
|
|
|
10
10
|
## 这是什么
|
|
11
11
|
|
|
12
|
-
业务架构蓝图是 Microi 吾码的 **设计期系统总图**,不是 n8n / Dify / ComfyUI 那种运行时工作流。它一次同时承担三个职责:
|
|
12
|
+
业务架构蓝图是 Microi 吾码的 **设计期系统总图**,不是 n8n / Dify / ComfyUI 那种运行时工作流。它一次同时承担三个职责:
|
|
13
13
|
|
|
14
14
|
1. **可视化总图** — 用户在前端 X6 画布拖拽节点,完整描述一个业务系统的组成
|
|
15
15
|
2. **AI 事实源** — AI 生成代码、表、接口引擎、菜单前必读的"宪法",防止幻觉
|
|
@@ -39,17 +39,17 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
|
|
|
39
39
|
|---|---|---|
|
|
40
40
|
| `microi_get_blueprint_schema` | 读取蓝图协议指南 | 否 |
|
|
41
41
|
| `microi_list_blueprints` | 列出当前 OsClient 所有蓝图 | 否 |
|
|
42
|
-
| `microi_get_blueprint` | 读取单个蓝图(含 BlueprintData) | 否 |
|
|
43
|
-
| `microi_list_blueprint_history` | 分页读取不可变历史元数据与当前哈希 | 否 |
|
|
44
|
-
| `microi_get_blueprint_history` | 读取指定历史快照 | 否 |
|
|
45
|
-
| `microi_compare_blueprint_versions` | 结构化比较两个快照或历史与当前草稿 | 否 |
|
|
46
|
-
| `microi_export_blueprint` | 导出 `microi.blueprint.v1` 设计包与稳定哈希 | 否 |
|
|
47
|
-
| `microi_save_blueprint` | 创建或更新蓝图 + 自动写历史 + 重建反向索引 | 是(需 confirmExecution) |
|
|
48
|
-
| `microi_rollback_blueprint` | 带 `ExpectedCurrentHash` 回滚并重建反向索引 | 是(需 confirmExecution) |
|
|
49
|
-
| `microi_delete_blueprint` | 软删除蓝图 | 是 |
|
|
50
|
-
| `microi_validate_blueprint` | 漂移检测:所有 refs 是否仍存在 | 否 |
|
|
51
|
-
|
|
52
|
-
保存前必须从详情或历史列表取得当前哈希,并把它作为蓝图对象的 `ExpectedCurrentHash`。哈希冲突时先比较版本再合并,不得移除并发保护强行覆盖。回滚会先保存回滚前快照,再在同一事务中恢复目标内容并重建反向索引;历史不会被删除。
|
|
42
|
+
| `microi_get_blueprint` | 读取单个蓝图(含 BlueprintData) | 否 |
|
|
43
|
+
| `microi_list_blueprint_history` | 分页读取不可变历史元数据与当前哈希 | 否 |
|
|
44
|
+
| `microi_get_blueprint_history` | 读取指定历史快照 | 否 |
|
|
45
|
+
| `microi_compare_blueprint_versions` | 结构化比较两个快照或历史与当前草稿 | 否 |
|
|
46
|
+
| `microi_export_blueprint` | 导出 `microi.blueprint.v1` 设计包与稳定哈希 | 否 |
|
|
47
|
+
| `microi_save_blueprint` | 创建或更新蓝图 + 自动写历史 + 重建反向索引 | 是(需 confirmExecution) |
|
|
48
|
+
| `microi_rollback_blueprint` | 带 `ExpectedCurrentHash` 回滚并重建反向索引 | 是(需 confirmExecution) |
|
|
49
|
+
| `microi_delete_blueprint` | 软删除蓝图 | 是 |
|
|
50
|
+
| `microi_validate_blueprint` | 漂移检测:所有 refs 是否仍存在 | 否 |
|
|
51
|
+
|
|
52
|
+
保存前必须从详情或历史列表取得当前哈希,并把它作为蓝图对象的 `ExpectedCurrentHash`。哈希冲突时先比较版本再合并,不得移除并发保护强行覆盖。回滚会先保存回滚前快照,再在同一事务中恢复目标内容并重建反向索引;历史不会被删除。
|
|
53
53
|
|
|
54
54
|
## AI 工作流(强制约定)
|
|
55
55
|
|
|
@@ -59,11 +59,11 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
|
|
|
59
59
|
1. microi_list_blueprints # 看是否已有相关蓝图
|
|
60
60
|
2. microi_get_blueprint(id) # 有则读取作为上下文
|
|
61
61
|
3. microi_get_manifest_schema # 读 manifest 协议
|
|
62
|
-
4. microi_plan_system / generate_system
|
|
63
|
-
5. microi_get_table_indexes / microi_create_table_index
|
|
64
|
-
# 按蓝图查询与业务不变量创建并回读索引
|
|
65
|
-
6. microi_save_blueprint # 同步写入/更新蓝图(含本次新增的表/引擎/菜单引用)
|
|
66
|
-
7. microi_validate_blueprint # 验收
|
|
62
|
+
4. microi_plan_system / generate_system
|
|
63
|
+
5. microi_get_table_indexes / microi_create_table_index
|
|
64
|
+
# 按蓝图查询与业务不变量创建并回读索引
|
|
65
|
+
6. microi_save_blueprint # 同步写入/更新蓝图(含本次新增的表/引擎/菜单引用)
|
|
66
|
+
7. microi_validate_blueprint # 验收
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
### 场景 B:用户让 AI 修改某张表 / 加字段 / 改接口引擎
|
|
@@ -115,73 +115,73 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
|
|
|
115
115
|
]
|
|
116
116
|
}
|
|
117
117
|
],
|
|
118
|
-
"domainModel": {
|
|
119
|
-
"entities": [
|
|
120
|
-
{ "table": "crm_customer", "x": 50, "y": 50,
|
|
121
|
-
"relations": [{ "to": "crm_contact", "type": "1:N", "via": "CustomerId" }],
|
|
122
|
-
"indexes": [
|
|
123
|
-
{ "name": "uk_crm_customer_osclient_code", "columns": ["OsClient", "Code"], "unique": true, "purpose": "租户内客户编码唯一" },
|
|
124
|
-
{ "name": "idx_crm_customer_osclient_status_createtime", "columns": ["OsClient", "Status", "CreateTime"], "unique": false, "purpose": "客户状态列表" }
|
|
125
|
-
] }
|
|
126
|
-
]
|
|
127
|
-
},
|
|
128
|
-
"menuTree": {
|
|
129
|
-
"requiredDepth": 2,
|
|
130
|
-
"groups": [
|
|
131
|
-
{ "name": "客户中心", "children": ["客户管理", "联系人管理"] },
|
|
132
|
-
{ "name": "业务运营", "children": ["工单管理", "服务记录"] },
|
|
133
|
-
{ "name": "报表中心", "children": ["检测报告", "阅读日志"] }
|
|
134
|
-
]
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
`refs` 内可填的资源类型:`tables` `fields`("table.field")`engines` `menus` `v8Events`("table:eventType")`dataSources` `printTemplates` `workflows` `pages` `jobs`。
|
|
140
|
-
|
|
141
|
-
领域层每张实体表还必须描述真实查询需要的 `indexes`(名称、有序字段、唯一性、用途)。关系的 `via` 外键、租户内业务唯一键、幂等键、待办/重试扫描字段都必须评估索引。蓝图或需求一旦明确索引,生成 Manifest 时不得遗漏 `tables[].indexes`,落地必须调用 `microi_create_table_index` 并以 `microi_get_table_indexes` 回读;禁止在 V8 中手写 DDL。
|
|
142
|
-
|
|
143
|
-
### 关系基数先于表单控件(强制)
|
|
144
|
-
|
|
145
|
-
- 每条领域关系必须先写清 `1:1`、`N:1` 或 `1:N`,再决定控件。自然语言中的“子表、
|
|
146
|
-
明细、清单、条目、行项目、多个记录”默认按 `1:N` 建模,除非用户明确说明只关联一条。
|
|
147
|
-
- `1:N` 的 `via` 必须是**子表上的真实外键**,例如
|
|
148
|
-
`order -> order_detail, type: 1:N, via: OrderId`;Manifest 同时生成子表外键、
|
|
149
|
-
`(OsClient, OrderId)` 回查索引、隐藏子菜单和主表 `TableChild` 控件。
|
|
150
|
-
- `JoinForm` 只映射“主表保存一个目标 Id,并内嵌一条独立目标记录”的 `N:1`/`1:1`
|
|
151
|
-
关系。禁止把 `1:N` 蓝图映射为 `JoinForm`,禁止让 `JoinForm` 指向当前表。
|
|
152
|
-
- 如果蓝图写了 `1:N`,而 Manifest 只有主表 `XxxId`/`JoinForm`,或缺少子表 `via`
|
|
153
|
-
外键、子菜单、回查索引,蓝图检查必须失败,不能进入 `dryRun:false`。
|
|
154
|
-
- 基数仍有歧义时,在任何 MCP 写入前询问用户;不得为了避免询问而选择 `JoinForm`。
|
|
155
|
-
|
|
156
|
-
后台菜单必须在蓝图阶段规划为至少两级结构。客户、设备、工单、报告、日志、配置等业务域应先形成父级菜单,再把具体 CRUD/报表/日志页面作为子菜单写入 Manifest/MCP;不要把所有模块平铺为一级菜单。
|
|
157
|
-
|
|
158
|
-
如果是改造已生成系统,蓝图不能停留在建议层。必须列出现有一级菜单、目标父级菜单、每个子菜单的 `ParentId` 迁移关系,并通过 MCP 回读 `sys_menu` 验证迁移完成。
|
|
159
|
-
|
|
160
|
-
## 角色与权限蓝图
|
|
161
|
-
|
|
162
|
-
从自然语言需求生成 Microi 业务系统时,必须把角色、菜单权限、移动端能力和数据范围写进蓝图,而不是只建表和菜单。
|
|
163
|
-
|
|
164
|
-
要求:
|
|
165
|
-
|
|
166
|
-
- 内部账号默认使用 `sys_user`,角色来源为 `sys_user.RoleIds` 关联 `sys_role`。移动端和接口引擎都应按 `RoleIds` / `V8.CurrentUser` 判断能力。
|
|
167
|
-
- 蓝图中至少列出角色矩阵:角色名、使用端、后台菜单范围、移动端可见页面、关键动作、数据范围。常见角色如超级管理员、客服、售后师傅、客户账号。
|
|
168
|
-
- 多角色账号按能力并集处理;只有服务端已确认的超级管理员(`Level>=9999`)默认拥有全部内部能力。前端角色名、“超级管理员”文案和 `_IsAdmin` 只能控制展示,不能代替后端授权。
|
|
169
|
-
- 客户账号不能简单获得后台客户、工单、报告全量菜单。客户侧数据应通过客户手机号登录 token、客户绑定表和接口行级过滤提供。
|
|
170
|
-
- 菜单权限使用 `sys_rolelimit` 控制入口;接口引擎仍要做业务级权限和行级数据过滤,不能只依赖菜单是否可见。
|
|
171
|
-
- Manifest/MCP 交付后必须回读 `sys_role`、`sys_menu`、`sys_rolelimit`,验证角色存在、菜单授权正确。
|
|
172
|
-
- 如果 MCP 的通用角色写入工具因 `UpdateTime cannot be null` 等系统字段问题失败,要记录工具缺口并使用平台修复后的专用角色工具。临时迁移可用一次性接口引擎和参数化 `V8.Db` 补建角色,但必须回读验证,且不要把临时接口作为长期业务接口。
|
|
173
|
-
|
|
174
|
-
角色矩阵示例:
|
|
175
|
-
|
|
176
|
-
| 角色 | 后台菜单 | 移动端能力 | 数据范围 |
|
|
177
|
-
|---|---|---|---|
|
|
178
|
-
| 售后师傅 | 维保运营、工单、维保记录、检测报告 | 查看工单、接单、到场、提交记录、生成报告 | 分配给自己或待接单工单 |
|
|
179
|
-
| 客服 | 客户中心、维保运营、客户报修、报告中心、资讯 | 查看客户与报修、调度工单、查看报告 | 公司内部客户服务数据 |
|
|
180
|
-
| 客户账号 | 默认无后台菜单 | 查看绑定客户的计划、记录、报告,提交报修 | 仅绑定客户 |
|
|
181
|
-
|
|
182
|
-
## 不要做的事
|
|
183
|
-
|
|
184
|
-
- ❌ 不要把蓝图当成运行时执行器(它不会自动跑接口、不会调度任务)
|
|
118
|
+
"domainModel": {
|
|
119
|
+
"entities": [
|
|
120
|
+
{ "table": "crm_customer", "x": 50, "y": 50,
|
|
121
|
+
"relations": [{ "to": "crm_contact", "type": "1:N", "via": "CustomerId" }],
|
|
122
|
+
"indexes": [
|
|
123
|
+
{ "name": "uk_crm_customer_osclient_code", "columns": ["OsClient", "Code"], "unique": true, "purpose": "租户内客户编码唯一" },
|
|
124
|
+
{ "name": "idx_crm_customer_osclient_status_createtime", "columns": ["OsClient", "Status", "CreateTime"], "unique": false, "purpose": "客户状态列表" }
|
|
125
|
+
] }
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"menuTree": {
|
|
129
|
+
"requiredDepth": 2,
|
|
130
|
+
"groups": [
|
|
131
|
+
{ "name": "客户中心", "children": ["客户管理", "联系人管理"] },
|
|
132
|
+
{ "name": "业务运营", "children": ["工单管理", "服务记录"] },
|
|
133
|
+
{ "name": "报表中心", "children": ["检测报告", "阅读日志"] }
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`refs` 内可填的资源类型:`tables` `fields`("table.field")`engines` `menus` `v8Events`("table:eventType")`dataSources` `printTemplates` `workflows` `pages` `jobs`。
|
|
140
|
+
|
|
141
|
+
领域层每张实体表还必须描述真实查询需要的 `indexes`(名称、有序字段、唯一性、用途)。关系的 `via` 外键、租户内业务唯一键、幂等键、待办/重试扫描字段都必须评估索引。蓝图或需求一旦明确索引,生成 Manifest 时不得遗漏 `tables[].indexes`,落地必须调用 `microi_create_table_index` 并以 `microi_get_table_indexes` 回读;禁止在 V8 中手写 DDL。
|
|
142
|
+
|
|
143
|
+
### 关系基数先于表单控件(强制)
|
|
144
|
+
|
|
145
|
+
- 每条领域关系必须先写清 `1:1`、`N:1` 或 `1:N`,再决定控件。自然语言中的“子表、
|
|
146
|
+
明细、清单、条目、行项目、多个记录”默认按 `1:N` 建模,除非用户明确说明只关联一条。
|
|
147
|
+
- `1:N` 的 `via` 必须是**子表上的真实外键**,例如
|
|
148
|
+
`order -> order_detail, type: 1:N, via: OrderId`;Manifest 同时生成子表外键、
|
|
149
|
+
`(OsClient, OrderId)` 回查索引、隐藏子菜单和主表 `TableChild` 控件。
|
|
150
|
+
- `JoinForm` 只映射“主表保存一个目标 Id,并内嵌一条独立目标记录”的 `N:1`/`1:1`
|
|
151
|
+
关系。禁止把 `1:N` 蓝图映射为 `JoinForm`,禁止让 `JoinForm` 指向当前表。
|
|
152
|
+
- 如果蓝图写了 `1:N`,而 Manifest 只有主表 `XxxId`/`JoinForm`,或缺少子表 `via`
|
|
153
|
+
外键、子菜单、回查索引,蓝图检查必须失败,不能进入 `dryRun:false`。
|
|
154
|
+
- 基数仍有歧义时,在任何 MCP 写入前询问用户;不得为了避免询问而选择 `JoinForm`。
|
|
155
|
+
|
|
156
|
+
后台菜单必须在蓝图阶段规划为至少两级结构。客户、设备、工单、报告、日志、配置等业务域应先形成父级菜单,再把具体 CRUD/报表/日志页面作为子菜单写入 Manifest/MCP;不要把所有模块平铺为一级菜单。
|
|
157
|
+
|
|
158
|
+
如果是改造已生成系统,蓝图不能停留在建议层。必须列出现有一级菜单、目标父级菜单、每个子菜单的 `ParentId` 迁移关系,并通过 MCP 回读 `sys_menu` 验证迁移完成。
|
|
159
|
+
|
|
160
|
+
## 角色与权限蓝图
|
|
161
|
+
|
|
162
|
+
从自然语言需求生成 Microi 业务系统时,必须把角色、菜单权限、移动端能力和数据范围写进蓝图,而不是只建表和菜单。
|
|
163
|
+
|
|
164
|
+
要求:
|
|
165
|
+
|
|
166
|
+
- 内部账号默认使用 `sys_user`,角色来源为 `sys_user.RoleIds` 关联 `sys_role`。移动端和接口引擎都应按 `RoleIds` / `V8.CurrentUser` 判断能力。
|
|
167
|
+
- 蓝图中至少列出角色矩阵:角色名、使用端、后台菜单范围、移动端可见页面、关键动作、数据范围。常见角色如超级管理员、客服、售后师傅、客户账号。
|
|
168
|
+
- 多角色账号按能力并集处理;只有服务端已确认的超级管理员(`Level>=9999`)默认拥有全部内部能力。前端角色名、“超级管理员”文案和 `_IsAdmin` 只能控制展示,不能代替后端授权。
|
|
169
|
+
- 客户账号不能简单获得后台客户、工单、报告全量菜单。客户侧数据应通过客户手机号登录 token、客户绑定表和接口行级过滤提供。
|
|
170
|
+
- 菜单权限使用 `sys_rolelimit` 控制入口;接口引擎仍要做业务级权限和行级数据过滤,不能只依赖菜单是否可见。
|
|
171
|
+
- Manifest/MCP 交付后必须回读 `sys_role`、`sys_menu`、`sys_rolelimit`,验证角色存在、菜单授权正确。
|
|
172
|
+
- 如果 MCP 的通用角色写入工具因 `UpdateTime cannot be null` 等系统字段问题失败,要记录工具缺口并使用平台修复后的专用角色工具。临时迁移可用一次性接口引擎和参数化 `V8.Db` 补建角色,但必须回读验证,且不要把临时接口作为长期业务接口。
|
|
173
|
+
|
|
174
|
+
角色矩阵示例:
|
|
175
|
+
|
|
176
|
+
| 角色 | 后台菜单 | 移动端能力 | 数据范围 |
|
|
177
|
+
|---|---|---|---|
|
|
178
|
+
| 售后师傅 | 维保运营、工单、维保记录、检测报告 | 查看工单、接单、到场、提交记录、生成报告 | 分配给自己或待接单工单 |
|
|
179
|
+
| 客服 | 客户中心、维保运营、客户报修、报告中心、资讯 | 查看客户与报修、调度工单、查看报告 | 公司内部客户服务数据 |
|
|
180
|
+
| 客户账号 | 默认无后台菜单 | 查看绑定客户的计划、记录、报告,提交报修 | 仅绑定客户 |
|
|
181
|
+
|
|
182
|
+
## 不要做的事
|
|
183
|
+
|
|
184
|
+
- ❌ 不要把蓝图当成运行时执行器(它不会自动跑接口、不会调度任务)
|
|
185
185
|
- ❌ 不要在审批工作流(jsPlumb / wf_flowdesign)里用蓝图替代 — 两者并存,蓝图是设计图,工作流是执行图
|
|
186
186
|
- ❌ 不要跳过 `microi_get_blueprint` 直接生成代码 — 会产生幻觉(编造字段名、引用不存在的引擎)
|
|
187
187
|
- ❌ 写入 BlueprintData 必须是合法 JSON 字符串(后端会用 JObject.Parse 校验)
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: datasource-engine
|
|
3
|
-
description: Microi 数据源引擎设计、调用与安全规范。用于配置 sys_datasource 的 SQL、V8、JSON 数据源,为表单选项、报表、接口或远程搜索供数,以及通过前后端 V8.DataSourceEngine.Run 调用和验收。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
-
|
|
8
|
-
# Microi 数据源引擎
|
|
9
|
-
|
|
10
|
-
## 适用边界
|
|
11
|
-
|
|
12
|
-
数据源引擎适合复用“只读或计算型数据获取”,支持 `SQL`、`V8`、`JSON`。需要跨表事务、状态推进、扣减库存或外部副作用时应创建接口引擎,不要把数据源当业务命令。
|
|
13
|
-
|
|
14
|
-
数据源定义保存在 `sys_datasource`,属于平台控制面:创建、修改、删除、匿名开关和角色配置只允许 `Level >= 9999` 的可信管理链路。普通角色只能调用已经授权的数据源。
|
|
15
|
-
|
|
16
|
-
## 标准调用
|
|
17
|
-
|
|
18
|
-
前端 V8:
|
|
19
|
-
|
|
20
|
-
```js
|
|
21
|
-
var result = await V8.DataSourceEngine.Run('product_options', {
|
|
22
|
-
Keyword: V8.Form.Keyword || ''
|
|
23
|
-
});
|
|
24
|
-
if (result.Code !== 1) V8.Tips(result.Msg || '加载数据失败', false);
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
后端 V8:
|
|
28
|
-
|
|
29
|
-
```js
|
|
30
|
-
var result = await V8.DataSourceEngine.RunAsync({
|
|
31
|
-
DataSourceKey: 'product_options',
|
|
32
|
-
Keyword: V8.Param.Keyword || ''
|
|
33
|
-
});
|
|
34
|
-
return result;
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
兼容代码可以使用 callback;新代码优先 `await`。`DataSourceKey` 也兼容数据源 Id,但发布配置应使用稳定、可读且租户内唯一的 Key。
|
|
38
|
-
|
|
39
|
-
## SQL 数据源
|
|
40
|
-
|
|
41
|
-
- 动态值必须参数化;禁止拼接用户输入、Token、排序字段或原始 `_Where`。
|
|
42
|
-
- 默认仅查询当前租户数据库,查询中必须保留 `OsClient` 隔离;扩展库由可信配置引用,不能让客户端传连接串。
|
|
43
|
-
- 只选择需要的列并设置结果上限。下拉远程搜索必须分页,不能一次返回整张大表。
|
|
44
|
-
- `$CurrentUser.*$` 等平台替换变量只能用于服务端已验证的当前用户,不能把客户端对象当身份。
|
|
45
|
-
- 菜单数据范围不是任意数据源 SQL 的自动授权。涉及客户、订单、合同等受限数据时,应在 SQL/V8 中显式应用当前用户范围,或改为受菜单授权的 FormEngine/接口引擎。
|
|
46
|
-
- 第三方数据库结构先通过 `microi_inspect_external_database` 发现;数据源只引用已保存的可信 DbKey,不能把浏览器或普通调用者传入的连接字符串交给 `V8.Dbs.Open`。
|
|
47
|
-
|
|
48
|
-
## V8 与 JSON 数据源
|
|
49
|
-
|
|
50
|
-
- V8 数据源按接口引擎安全标准处理:校验参数、限制返回字段、避免泄露堆栈和密钥。
|
|
51
|
-
- JSON 数据源只存非敏感静态枚举。密钥、连接串和 Token 不得放入 JSON 或返回给浏览器。
|
|
52
|
-
- 数据源 V8 在 `V8TenantContext` 中只能使用当前租户。普通租户伪造 `OsClient` 不会获得跨租户权限。
|
|
53
|
-
- 匿名数据源必须是无身份、无敏感数据、有限结果且可限流的公开能力;不能因为“只读”就默认匿名。
|
|
54
|
-
|
|
55
|
-
## 表单字段配置
|
|
56
|
-
|
|
57
|
-
选择类字段使用数据源引擎时,至少配置:
|
|
58
|
-
|
|
59
|
-
```json
|
|
60
|
-
{
|
|
61
|
-
"DataSource": "DataSource",
|
|
62
|
-
"DataSourceId": "product_options",
|
|
63
|
-
"SelectLabel": "Name",
|
|
64
|
-
"SelectSaveField": "Id",
|
|
65
|
-
"DataSourceSqlRemote": true
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
保存后回读 `diy_field.Component/Data/Config`,刷新字段/菜单缓存,再从真实表单验证显示值、保存值、搜索、清空和权限。
|
|
70
|
-
|
|
71
|
-
## MCP 工作流
|
|
72
|
-
|
|
73
|
-
1. `microi_get_db_schema` 读取 `sys_datasource`、目标表和菜单关系。
|
|
74
|
-
2. 使用 `microi_save_data_source` 保存;写入必须有用户确认。
|
|
75
|
-
3. 回读数据源定义,确认 Key、类型、匿名、角色和代码/SQL。
|
|
76
|
-
4. 用普通角色、无权限角色和管理员分别调用。
|
|
77
|
-
5. 对 SQL 注入、超大分页、跨租户 `OsClient` 和匿名访问做负向测试。
|
|
78
|
-
|
|
79
|
-
## 缓存与分布式
|
|
80
|
-
|
|
81
|
-
结果缓存 Key 至少包含 `OsClient + DataSourceKey + 权限主体/角色版本 + 参数哈希`。权限相关结果不能只按数据源 Key 缓存。缓存是优化,不是授权事实源;配置更新后使用共享版本或发布订阅让所有节点失效,不能依赖单机静态字典。
|
|
82
|
-
|
|
83
|
-
## 验收清单
|
|
84
|
-
|
|
85
|
-
- [ ] 普通用户不能维护 `sys_datasource`
|
|
86
|
-
- [ ] 调用只在当前租户执行,伪造 `OsClient` 失败
|
|
87
|
-
- [ ] SQL 参数化、有列清单、分页和上限
|
|
88
|
-
- [ ] 敏感数据应用真实业务权限/数据范围
|
|
89
|
-
- [ ] 匿名、角色和错误响应不泄露内部配置
|
|
90
|
-
- [ ] 字段显示值与保存值真实回读通过
|
|
91
|
-
- [ ] 多节点配置更新后无需逐节点重启
|
|
1
|
+
---
|
|
2
|
+
name: datasource-engine
|
|
3
|
+
description: Microi 数据源引擎设计、调用与安全规范。用于配置 sys_datasource 的 SQL、V8、JSON 数据源,为表单选项、报表、接口或远程搜索供数,以及通过前后端 V8.DataSourceEngine.Run 调用和验收。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
+
|
|
8
|
+
# Microi 数据源引擎
|
|
9
|
+
|
|
10
|
+
## 适用边界
|
|
11
|
+
|
|
12
|
+
数据源引擎适合复用“只读或计算型数据获取”,支持 `SQL`、`V8`、`JSON`。需要跨表事务、状态推进、扣减库存或外部副作用时应创建接口引擎,不要把数据源当业务命令。
|
|
13
|
+
|
|
14
|
+
数据源定义保存在 `sys_datasource`,属于平台控制面:创建、修改、删除、匿名开关和角色配置只允许 `Level >= 9999` 的可信管理链路。普通角色只能调用已经授权的数据源。
|
|
15
|
+
|
|
16
|
+
## 标准调用
|
|
17
|
+
|
|
18
|
+
前端 V8:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
var result = await V8.DataSourceEngine.Run('product_options', {
|
|
22
|
+
Keyword: V8.Form.Keyword || ''
|
|
23
|
+
});
|
|
24
|
+
if (result.Code !== 1) V8.Tips(result.Msg || '加载数据失败', false);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
后端 V8:
|
|
28
|
+
|
|
29
|
+
```js
|
|
30
|
+
var result = await V8.DataSourceEngine.RunAsync({
|
|
31
|
+
DataSourceKey: 'product_options',
|
|
32
|
+
Keyword: V8.Param.Keyword || ''
|
|
33
|
+
});
|
|
34
|
+
return result;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
兼容代码可以使用 callback;新代码优先 `await`。`DataSourceKey` 也兼容数据源 Id,但发布配置应使用稳定、可读且租户内唯一的 Key。
|
|
38
|
+
|
|
39
|
+
## SQL 数据源
|
|
40
|
+
|
|
41
|
+
- 动态值必须参数化;禁止拼接用户输入、Token、排序字段或原始 `_Where`。
|
|
42
|
+
- 默认仅查询当前租户数据库,查询中必须保留 `OsClient` 隔离;扩展库由可信配置引用,不能让客户端传连接串。
|
|
43
|
+
- 只选择需要的列并设置结果上限。下拉远程搜索必须分页,不能一次返回整张大表。
|
|
44
|
+
- `$CurrentUser.*$` 等平台替换变量只能用于服务端已验证的当前用户,不能把客户端对象当身份。
|
|
45
|
+
- 菜单数据范围不是任意数据源 SQL 的自动授权。涉及客户、订单、合同等受限数据时,应在 SQL/V8 中显式应用当前用户范围,或改为受菜单授权的 FormEngine/接口引擎。
|
|
46
|
+
- 第三方数据库结构先通过 `microi_inspect_external_database` 发现;数据源只引用已保存的可信 DbKey,不能把浏览器或普通调用者传入的连接字符串交给 `V8.Dbs.Open`。
|
|
47
|
+
|
|
48
|
+
## V8 与 JSON 数据源
|
|
49
|
+
|
|
50
|
+
- V8 数据源按接口引擎安全标准处理:校验参数、限制返回字段、避免泄露堆栈和密钥。
|
|
51
|
+
- JSON 数据源只存非敏感静态枚举。密钥、连接串和 Token 不得放入 JSON 或返回给浏览器。
|
|
52
|
+
- 数据源 V8 在 `V8TenantContext` 中只能使用当前租户。普通租户伪造 `OsClient` 不会获得跨租户权限。
|
|
53
|
+
- 匿名数据源必须是无身份、无敏感数据、有限结果且可限流的公开能力;不能因为“只读”就默认匿名。
|
|
54
|
+
|
|
55
|
+
## 表单字段配置
|
|
56
|
+
|
|
57
|
+
选择类字段使用数据源引擎时,至少配置:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"DataSource": "DataSource",
|
|
62
|
+
"DataSourceId": "product_options",
|
|
63
|
+
"SelectLabel": "Name",
|
|
64
|
+
"SelectSaveField": "Id",
|
|
65
|
+
"DataSourceSqlRemote": true
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
保存后回读 `diy_field.Component/Data/Config`,刷新字段/菜单缓存,再从真实表单验证显示值、保存值、搜索、清空和权限。
|
|
70
|
+
|
|
71
|
+
## MCP 工作流
|
|
72
|
+
|
|
73
|
+
1. `microi_get_db_schema` 读取 `sys_datasource`、目标表和菜单关系。
|
|
74
|
+
2. 使用 `microi_save_data_source` 保存;写入必须有用户确认。
|
|
75
|
+
3. 回读数据源定义,确认 Key、类型、匿名、角色和代码/SQL。
|
|
76
|
+
4. 用普通角色、无权限角色和管理员分别调用。
|
|
77
|
+
5. 对 SQL 注入、超大分页、跨租户 `OsClient` 和匿名访问做负向测试。
|
|
78
|
+
|
|
79
|
+
## 缓存与分布式
|
|
80
|
+
|
|
81
|
+
结果缓存 Key 至少包含 `OsClient + DataSourceKey + 权限主体/角色版本 + 参数哈希`。权限相关结果不能只按数据源 Key 缓存。缓存是优化,不是授权事实源;配置更新后使用共享版本或发布订阅让所有节点失效,不能依赖单机静态字典。
|
|
82
|
+
|
|
83
|
+
## 验收清单
|
|
84
|
+
|
|
85
|
+
- [ ] 普通用户不能维护 `sys_datasource`
|
|
86
|
+
- [ ] 调用只在当前租户执行,伪造 `OsClient` 失败
|
|
87
|
+
- [ ] SQL 参数化、有列清单、分页和上限
|
|
88
|
+
- [ ] 敏感数据应用真实业务权限/数据范围
|
|
89
|
+
- [ ] 匿名、角色和错误响应不泄露内部配置
|
|
90
|
+
- [ ] 字段显示值与保存值真实回读通过
|
|
91
|
+
- [ ] 多节点配置更新后无需逐节点重启
|
package/skills/dos-orm/SKILL.md
CHANGED
|
@@ -29,6 +29,15 @@ Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
|
|
|
29
29
|
|
|
30
30
|
## 安全规则
|
|
31
31
|
|
|
32
|
+
### 连接生命周期与在线恢复
|
|
33
|
+
|
|
34
|
+
- 创建事务、准备读取器、打开连接、提交/回滚及批处理任一路径抛异常,都必须释放本层拥有的连接;借用外部事务或批处理连接时不能擅自关闭。保留原始异常,不因 Dispose 失败遮盖原始错误。
|
|
35
|
+
- `DbTrans` 提交成功后先归还连接,再执行提交后通知。通知失败不能把已提交事务报告为回滚,也不能自动重放业务 SQL。调用者仍必须使用 `using`,防止业务异常绕过 Commit/Rollback。
|
|
36
|
+
- `DatabasePoolExhausted`、`DatabaseCapacityExceeded`、`DatabaseEndpointUnreachable` 是不同故障;不要把应用池等待、数据库全局连接限制和慢 SQL 混为一谈。
|
|
37
|
+
- 可信 C# 宿主通过 `Database.GetConnectionPoolSnapshot()` 读取脱敏状态,`ResetConnectionPool()` 只轮换准确匹配的 MySQL/SQL Server 池,`ProbeConnectionPoolAsync` 用原池执行固定 `SELECT 1`。不使用 `ClearAllPools`,不杀借出的事务,不重放 SQL。
|
|
38
|
+
- `BeginIsolatedConnections()` 仅用于有并发限制的可信应急鉴权作用域,设置无池连接与 5 秒连接/命令超时;未知驱动拒绝。不能给普通业务或 V8 增加绕过限流的开关,不能在此作用域内执行清池或把无池探测冒充原池恢复。
|
|
39
|
+
- AI 在线恢复使用 `microi_manage_system_observability(action=ResetDatabasePools)` 的预览、确认和回读协议,详细决策见 [系统日志/监控](../system-observability/SKILL.md)。需要升级含 `database-pools/v1` 的后端和 MCP;事故恢复本身不要求重启数据库/API。
|
|
40
|
+
|
|
32
41
|
- 数据值全程参数化;`FromSql` 的动态值用 `AddInParameter`。
|
|
33
42
|
- 表名、字段名、排序名不能来自未经白名单验证的用户输入。
|
|
34
43
|
- 保留 `{0}Name{1}` 标识符延迟绑定机制,不能改成字符串替换。
|
|
@@ -73,6 +82,12 @@ Dispose 幂等,未 Commit 时自动回滚。事务内异步操作串行执行
|
|
|
73
82
|
|
|
74
83
|
## 验收
|
|
75
84
|
|
|
85
|
+
- Oracle 原生 `TO_CHAR(value, format[, nlsparam])` 必须保留参数顺序;Provider 不得用
|
|
86
|
+
字符串扫描交换参数。单参数、嵌套函数、格式串中的逗号、注释与字面量也要原样保留。
|
|
87
|
+
- `ToArray/ToList` 是查询执行与读取边界,堆栈停在这里不能证明对象转换出错。
|
|
88
|
+
遇到 `ORA-01722`,先用同一账号条件拆分计数/列表,核对最终命令文本与参数类型,
|
|
89
|
+
再执行最小原生 SQL 对照;确定性的转换/语法错误不得用盲目重试或更改业务过滤掩盖。
|
|
90
|
+
|
|
76
91
|
- 至少在目标数据库 Provider 运行定向测试,不用 MySQL 结果宣称 Oracle/达梦通过。
|
|
77
92
|
- 覆盖 NULL、DateTime、decimal、Guid、enum、byte[] 和分页边界。
|
|
78
93
|
- 覆盖事务提交/回滚、唯一冲突、超时、取消和连接故障。
|