@microi.net/cli 5.5.9 → 5.6.0
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/.mcp.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/README.md +71 -71
- package/assets/build-meta.json +5 -5
- package/assets/feature-matrix.json +129 -129
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/codex-marketplace.json +20 -20
- package/scripts/mcp-codex-stdio-adapter.js +189 -189
- package/scripts/mcp-trae-windows-launcher.cmd +21 -21
- package/scripts/microi-cli-mcp.js +7 -7
- package/scripts/microi-codex-broker.js +447 -447
- package/scripts/microi-codex-router.js +582 -582
- package/scripts/microi-skills.meta.json +336 -336
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +3 -3
- 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 +177 -177
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +81 -81
- 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 +126 -126
- 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 +43 -43
- 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 +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 +28 -28
- 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 +56 -56
- package/skills/microi-codex/SKILL.md +46 -46
- 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 +123 -123
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +50 -50
- 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 +15 -15
- 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 +85 -85
- 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/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 +20 -20
- 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 +16 -16
- 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 +36 -36
- 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/validate-progressive-disclosure.mjs +52 -52
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +162 -162
- 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 +378 -378
- 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 +154 -154
- 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 +133 -133
- 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 +107 -107
- 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 +25 -25
- 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 +127 -127
- package/skills/v8-table-event/SKILL.md +20 -20
- 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 +18 -18
- 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 +44 -44
- 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 +236 -236
- 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 +208 -208
- 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
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dos-orm
|
|
3
|
-
description: Dos.ORM C# 数据访问指南。用于 Microi.Server 中编写或审查 DbSession、Entity、From、WhereClip、事务、异步查询、BulkInsert、Upsert、SqlFunc、子查询、导航属性、CodeFirst、读写分离和分库分表代码。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
-
|
|
8
|
-
# Dos.ORM
|
|
9
|
-
|
|
10
|
-
Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
|
|
11
|
-
|
|
12
|
-
- C# 服务端源码使用 `DbSession`、实体和 Section API。
|
|
13
|
-
- V8 JavaScript 使用 `V8.FormEngine` 或 `V8.Db.FromSql`。
|
|
14
|
-
- 不能把 C# lambda/事务示例原样放进 V8。
|
|
15
|
-
|
|
16
|
-
完整 API、跨库行为与示例见 `references/api-reference.md`。
|
|
17
|
-
|
|
18
|
-
## 默认选择
|
|
19
|
-
|
|
20
|
-
| 需求 | 首选 |
|
|
21
|
-
|---|---|
|
|
22
|
-
| 普通实体查询 | `dbSession.From<T>().Where(...).ToList/ToListAsync` |
|
|
23
|
-
| 动态条件 | `Where<T>` / `WhereClip` |
|
|
24
|
-
| 复杂 SQL | `FromSql(...).AddInParameter(...)` |
|
|
25
|
-
| 单条/小批写入 | `Insert/Update/Delete` |
|
|
26
|
-
| 大于约 1000 行批量插入 | `BulkInsert/BulkInsertAsync`,先压测批大小 |
|
|
27
|
-
| 按唯一键写入 | `Upsert/UpsertAsync` + 真实唯一索引 |
|
|
28
|
-
| 多步原子写 | `BeginTransaction()`,`using` + Commit/Rollback |
|
|
29
|
-
|
|
30
|
-
## 安全规则
|
|
31
|
-
|
|
32
|
-
- 数据值全程参数化;`FromSql` 的动态值用 `AddInParameter`。
|
|
33
|
-
- 表名、字段名、排序名不能来自未经白名单验证的用户输入。
|
|
34
|
-
- 保留 `{0}Name{1}` 标识符延迟绑定机制,不能改成字符串替换。
|
|
35
|
-
- `OrderByClip` 的校验不是授权;可排序字段仍需业务白名单。
|
|
36
|
-
- Upsert 幂等依赖数据库唯一键,不能只靠“先查再写”。
|
|
37
|
-
- 租户业务表查询/写入必须包含真实 `OsClient` 范围。
|
|
38
|
-
- 已明确需要的索引在 Microi 业务表上通过 Manifest/MCP 管理,不从临时 SQL 创建。
|
|
39
|
-
- MySQL 用户名或密码包含分号时必须用连接字符串引号包裹,例如
|
|
40
|
-
`Password="a;b"`;平台统一兼容层只修复“无等号片段紧跟已明确凭据参数”的
|
|
41
|
-
历史串,其它结构错误继续失败关闭,禁止猜测用户名、密码或默认 `root`。
|
|
42
|
-
|
|
43
|
-
## 事务与异步
|
|
44
|
-
|
|
45
|
-
```csharp
|
|
46
|
-
using (var trans = dbSession.BeginTransaction())
|
|
47
|
-
{
|
|
48
|
-
try
|
|
49
|
-
{
|
|
50
|
-
trans.Insert(entity);
|
|
51
|
-
trans.Update<User>(User._.Status, 1, User._.Id == entity.Id);
|
|
52
|
-
trans.Commit();
|
|
53
|
-
}
|
|
54
|
-
catch
|
|
55
|
-
{
|
|
56
|
-
trans.Rollback();
|
|
57
|
-
throw;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Dispose 幂等,未 Commit 时自动回滚。事务内异步操作串行执行;不要在同一个连接/
|
|
63
|
-
事务上 `Task.WhenAll`。取消、超时和异常必须传播,不能吞掉后继续 Commit。
|
|
64
|
-
|
|
65
|
-
## 性能与跨库
|
|
66
|
-
|
|
67
|
-
- 显式选择字段,分页和流式读取,避免无界 `ToList()`。
|
|
68
|
-
- BulkInsert 会按可用客户端选择原生实现并回退多行 INSERT;不同数据库必须实测。
|
|
69
|
-
- 官网性能数字仅是特定环境参考,不能作为目标环境承诺。
|
|
70
|
-
- 查询缓存 Key 必须包含 SQL 参数值;业务写后考虑失效。
|
|
71
|
-
- 读写分离在“写后立刻读”和事务内强制读主。
|
|
72
|
-
- 分片使用稳定 Hash;不能使用进程随机化的 `string.GetHashCode()`。
|
|
73
|
-
|
|
74
|
-
## 验收
|
|
75
|
-
|
|
76
|
-
- 至少在目标数据库 Provider 运行定向测试,不用 MySQL 结果宣称 Oracle/达梦通过。
|
|
77
|
-
- 覆盖 NULL、DateTime、decimal、Guid、enum、byte[] 和分页边界。
|
|
78
|
-
- 覆盖事务提交/回滚、唯一冲突、超时、取消和连接故障。
|
|
79
|
-
- BulkInsert/Upsert 核对受影响行、Identity 跳过、唯一键和重试副作用。
|
|
80
|
-
- 读写分离覆盖从库故障、写后读主和降级。
|
|
81
|
-
- CodeFirst/索引变更在隔离库验证,不直接对生产执行破坏性重建。
|
|
1
|
+
---
|
|
2
|
+
name: dos-orm
|
|
3
|
+
description: Dos.ORM C# 数据访问指南。用于 Microi.Server 中编写或审查 DbSession、Entity、From、WhereClip、事务、异步查询、BulkInsert、Upsert、SqlFunc、子查询、导航属性、CodeFirst、读写分离和分库分表代码。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
+
|
|
8
|
+
# Dos.ORM
|
|
9
|
+
|
|
10
|
+
Dos.ORM 是 Microi.Server 底层 C# ORM。它不是接口引擎里的 `V8.Db`:
|
|
11
|
+
|
|
12
|
+
- C# 服务端源码使用 `DbSession`、实体和 Section API。
|
|
13
|
+
- V8 JavaScript 使用 `V8.FormEngine` 或 `V8.Db.FromSql`。
|
|
14
|
+
- 不能把 C# lambda/事务示例原样放进 V8。
|
|
15
|
+
|
|
16
|
+
完整 API、跨库行为与示例见 `references/api-reference.md`。
|
|
17
|
+
|
|
18
|
+
## 默认选择
|
|
19
|
+
|
|
20
|
+
| 需求 | 首选 |
|
|
21
|
+
|---|---|
|
|
22
|
+
| 普通实体查询 | `dbSession.From<T>().Where(...).ToList/ToListAsync` |
|
|
23
|
+
| 动态条件 | `Where<T>` / `WhereClip` |
|
|
24
|
+
| 复杂 SQL | `FromSql(...).AddInParameter(...)` |
|
|
25
|
+
| 单条/小批写入 | `Insert/Update/Delete` |
|
|
26
|
+
| 大于约 1000 行批量插入 | `BulkInsert/BulkInsertAsync`,先压测批大小 |
|
|
27
|
+
| 按唯一键写入 | `Upsert/UpsertAsync` + 真实唯一索引 |
|
|
28
|
+
| 多步原子写 | `BeginTransaction()`,`using` + Commit/Rollback |
|
|
29
|
+
|
|
30
|
+
## 安全规则
|
|
31
|
+
|
|
32
|
+
- 数据值全程参数化;`FromSql` 的动态值用 `AddInParameter`。
|
|
33
|
+
- 表名、字段名、排序名不能来自未经白名单验证的用户输入。
|
|
34
|
+
- 保留 `{0}Name{1}` 标识符延迟绑定机制,不能改成字符串替换。
|
|
35
|
+
- `OrderByClip` 的校验不是授权;可排序字段仍需业务白名单。
|
|
36
|
+
- Upsert 幂等依赖数据库唯一键,不能只靠“先查再写”。
|
|
37
|
+
- 租户业务表查询/写入必须包含真实 `OsClient` 范围。
|
|
38
|
+
- 已明确需要的索引在 Microi 业务表上通过 Manifest/MCP 管理,不从临时 SQL 创建。
|
|
39
|
+
- MySQL 用户名或密码包含分号时必须用连接字符串引号包裹,例如
|
|
40
|
+
`Password="a;b"`;平台统一兼容层只修复“无等号片段紧跟已明确凭据参数”的
|
|
41
|
+
历史串,其它结构错误继续失败关闭,禁止猜测用户名、密码或默认 `root`。
|
|
42
|
+
|
|
43
|
+
## 事务与异步
|
|
44
|
+
|
|
45
|
+
```csharp
|
|
46
|
+
using (var trans = dbSession.BeginTransaction())
|
|
47
|
+
{
|
|
48
|
+
try
|
|
49
|
+
{
|
|
50
|
+
trans.Insert(entity);
|
|
51
|
+
trans.Update<User>(User._.Status, 1, User._.Id == entity.Id);
|
|
52
|
+
trans.Commit();
|
|
53
|
+
}
|
|
54
|
+
catch
|
|
55
|
+
{
|
|
56
|
+
trans.Rollback();
|
|
57
|
+
throw;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Dispose 幂等,未 Commit 时自动回滚。事务内异步操作串行执行;不要在同一个连接/
|
|
63
|
+
事务上 `Task.WhenAll`。取消、超时和异常必须传播,不能吞掉后继续 Commit。
|
|
64
|
+
|
|
65
|
+
## 性能与跨库
|
|
66
|
+
|
|
67
|
+
- 显式选择字段,分页和流式读取,避免无界 `ToList()`。
|
|
68
|
+
- BulkInsert 会按可用客户端选择原生实现并回退多行 INSERT;不同数据库必须实测。
|
|
69
|
+
- 官网性能数字仅是特定环境参考,不能作为目标环境承诺。
|
|
70
|
+
- 查询缓存 Key 必须包含 SQL 参数值;业务写后考虑失效。
|
|
71
|
+
- 读写分离在“写后立刻读”和事务内强制读主。
|
|
72
|
+
- 分片使用稳定 Hash;不能使用进程随机化的 `string.GetHashCode()`。
|
|
73
|
+
|
|
74
|
+
## 验收
|
|
75
|
+
|
|
76
|
+
- 至少在目标数据库 Provider 运行定向测试,不用 MySQL 结果宣称 Oracle/达梦通过。
|
|
77
|
+
- 覆盖 NULL、DateTime、decimal、Guid、enum、byte[] 和分页边界。
|
|
78
|
+
- 覆盖事务提交/回滚、唯一冲突、超时、取消和连接故障。
|
|
79
|
+
- BulkInsert/Upsert 核对受影响行、Identity 跳过、唯一键和重试副作用。
|
|
80
|
+
- 读写分离覆盖从库故障、写后读主和降级。
|
|
81
|
+
- CodeFirst/索引变更在隔离库验证,不直接对生产执行破坏性重建。
|