@microi.net/cli 5.2.2 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-codex-broker.js +12 -2
- package/scripts/microi-skills.meta.json +191 -191
- package/skills/.microi-skills-version.json +2 -2
- package/skills/app-store/SKILL.md +53 -3
- package/skills/microi-form-engine/SKILL.md +23 -1
- package/skills/microi-form-engine/references/component-catalog.md +74 -3
- 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 +4 -0
- 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 +4 -0
- package/skills/microi-uniapp-frontend/SKILL.md +9 -1
- package/skills/v8-file-upload/SKILL.md +28 -3
- 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 +1 -1
- package/skills/workspace-conventions/SKILL.md +11 -0
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"url": "https://microi.net"
|
|
6
6
|
},
|
|
7
7
|
"description": "Microi吾码官方 AI 插件市场",
|
|
8
|
-
"version": "5.2.
|
|
8
|
+
"version": "5.2.3",
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "microi",
|
|
12
12
|
"source": ".",
|
|
13
13
|
"description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
|
|
14
|
-
"version": "5.2.
|
|
14
|
+
"version": "5.2.3",
|
|
15
15
|
"strict": true
|
|
16
16
|
}
|
|
17
17
|
]
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"url": "https://microi.net"
|
|
6
6
|
},
|
|
7
7
|
"description": "Microi吾码官方 AI 插件市场",
|
|
8
|
-
"version": "5.2.
|
|
8
|
+
"version": "5.2.3",
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "microi",
|
|
12
12
|
"source": ".",
|
|
13
13
|
"description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
|
|
14
|
-
"version": "5.2.
|
|
14
|
+
"version": "5.2.3",
|
|
15
15
|
"strict": true
|
|
16
16
|
}
|
|
17
17
|
]
|
package/assets/build-meta.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"builtAt": "2026-08-
|
|
3
|
-
"version": "5.2.
|
|
2
|
+
"builtAt": "2026-08-22T21:26:21.547Z",
|
|
3
|
+
"version": "5.2.3",
|
|
4
4
|
"sourceProducts": [
|
|
5
5
|
"vscode-extension",
|
|
6
6
|
"microi-cli",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"mcpServer": "54e2746c68c966a38820a1042880288645dc7b10dfc723c5af1500b98c6b0ddb",
|
|
13
13
|
"cli": "c7913339c61a9372d0a4570bfb3429867e9d93bfc50c50e0c43a1112111cc6f1",
|
|
14
14
|
"router": "ffc14787fc2d3d6173b7a779b77139b759eb1d482cea787f71283f4017a4e223",
|
|
15
|
-
"broker": "
|
|
16
|
-
"dshBundle": "
|
|
15
|
+
"broker": "caae2730cc411d11c20f33b367968f7538aae8f5b65a713fcc557deedaefcf70",
|
|
16
|
+
"dshBundle": "6143746dd9acf2bde9cdf2c98d5e540cf3dd955249af70c6ac5de55f30e9c85c"
|
|
17
17
|
}
|
|
18
18
|
}
|
package/cordis.patch.yml
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
serverName: microi
|
|
8
8
|
transport: stdio
|
|
9
9
|
command: !!js process.execPath
|
|
10
|
-
args: ["-e","/*\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst packageName = '@microi.net/cli';\nconst expectedVersion = '5.2.
|
|
10
|
+
args: ["-e","/*\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\n */\nconst fs = require('node:fs');\nconst os = require('node:os');\nconst path = require('node:path');\nconst packageName = '@microi.net/cli';\nconst expectedVersion = '5.2.3';\n\nfunction readJson(filePath) {\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\n catch { return undefined; }\n}\n\nfunction expandHome(value) {\n if (value === '~') return os.homedir();\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\nfunction validRoot(value) {\n const root = path.resolve(value);\n const pkg = readJson(path.join(root, 'package.json'));\n const patch = path.join(root, 'cordis.patch.yml');\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\n}\n\nfunction findPlugin() {\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\n if (explicit) {\n const plugin = validRoot(explicit);\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\n return plugin;\n }\n const configuredHome = String(process.env.DSH_HOME || '').trim();\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\n const profilesRoot = path.join(dshHome, 'profiles');\n const candidates = [];\n if (fs.existsSync(profilesRoot)) {\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\n const plugin = validRoot(root);\n if (plugin) candidates.push(plugin);\n }\n }\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\n return candidates[0];\n}\n\ntry {\n const plugin = findPlugin();\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\n process.env.MICROI_TOOL_SOURCE = 'dsh';\n process.env.MICROI_TOOL_VERSION = expectedVersion;\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\n process.argv[2] = plugin.router;\n require(plugin.adapter);\n} catch (error) {\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n}\n"]
|
|
11
11
|
env:
|
|
12
12
|
MICROI_TOOL_SOURCE: dsh
|
|
13
13
|
cwd: !!js process.cwd()
|
package/package.json
CHANGED
|
@@ -77,8 +77,18 @@ function writeLeaseRecord(record, exclusive = false) {
|
|
|
77
77
|
fs.mkdirSync(path.dirname(leasePath), { recursive: true });
|
|
78
78
|
const text = `${JSON.stringify(record, null, 2)}\n`;
|
|
79
79
|
if (exclusive) {
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
// Publish a complete lease atomically. Creating leasePath first and then
|
|
81
|
+
// writing its JSON leaves a short empty-file window; concurrent brokers can
|
|
82
|
+
// mistake that window for a stale lease, remove it, and leave connected
|
|
83
|
+
// routers without an authentication token. A same-directory hard link is
|
|
84
|
+
// both exclusive (EEXIST wins the race) and immediately complete.
|
|
85
|
+
const staged = `${leasePath}.${process.pid}.${Date.now()}.${ownerToken.slice(0, 8)}.new`;
|
|
86
|
+
try {
|
|
87
|
+
fs.writeFileSync(staged, text, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
88
|
+
fs.linkSync(staged, leasePath);
|
|
89
|
+
} finally {
|
|
90
|
+
try { if (fs.existsSync(staged)) fs.rmSync(staged, { force: true }); } catch { /* harmless */ }
|
|
91
|
+
}
|
|
82
92
|
return;
|
|
83
93
|
}
|
|
84
94
|
const current = readLease();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"builtAt": "2026-08-
|
|
2
|
+
"builtAt": "2026-08-22T21:26:20.289Z",
|
|
3
3
|
"source": "../microi.skills",
|
|
4
4
|
"extension": {
|
|
5
5
|
"name": "v8-engine",
|
|
6
|
-
"version": "5.2.
|
|
6
|
+
"version": "5.2.3",
|
|
7
7
|
"publisher": "Microi"
|
|
8
8
|
},
|
|
9
9
|
"skills": {
|
|
10
|
-
"version": "5.2.
|
|
10
|
+
"version": "5.2.3",
|
|
11
11
|
"versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
|
|
12
12
|
"managedBy": "Microi.VSCode/bump-version.js"
|
|
13
13
|
},
|
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
"dir": "dist/microi.skills",
|
|
16
16
|
"files": 177,
|
|
17
17
|
"skills": 64,
|
|
18
|
-
"bytes":
|
|
18
|
+
"bytes": 2187566
|
|
19
19
|
},
|
|
20
20
|
"fileHashes": {
|
|
21
|
-
".microi-skills-version.json": "
|
|
21
|
+
".microi-skills-version.json": "55abe8861932a9c4b68137b14159adff33181b86fb5ad1586de275d0c5de7b68",
|
|
22
22
|
".progressive-disclosure-manifest.json": "1761c877fb868da0572a40b2b1884a7c17fa4215ac91bbb7c55e2084fefb0deb",
|
|
23
23
|
"README.md": "d39c20a392145fe9aff9929bec11549bdd1fe1640e5af63228ac396b21173046",
|
|
24
24
|
"ai-engine/SKILL.md": "0d91e157454569003b216ee4e6efa8b161dd7409788c4cae9f10f212531badc3",
|
|
25
25
|
"ai-engine/agents/openai.yaml": "40deb07801006a46b9a7f0020d13251955eeadd04c8e591160210479936f8b5b",
|
|
26
26
|
"ai-platform-governance/SKILL.md": "84ca4bcacf15deecd0c04dc1a664b23041a6a5f020d3a5288c5458b5e7da4b8e",
|
|
27
27
|
"ai-platform-governance/references/progressive-01-功能开关.md": "ea46fb02267e9e3ace3d9d72e67b02183c61e5c198f4b2f27e8196d6ee6d0bec",
|
|
28
|
-
"app-store/SKILL.md": "
|
|
28
|
+
"app-store/SKILL.md": "b9b52455f74ae60d77dd3db6c94d8a9162dd3ca87a003a843b3a397e99ff5580",
|
|
29
29
|
"app-store/agents/openai.yaml": "eda8f5cf043e7b8fb0e4fb3acf0625fef95eb49586b43187ced277cd0ae4a2c4",
|
|
30
30
|
"business-blueprint/SKILL.md": "01619a3b6d37b5b67649ee59d2701301222006d3b943882b2802b1721c58f8a9",
|
|
31
31
|
"datasource-engine/SKILL.md": "bed8352f1d43b55145e1c492d1ea0ca1ec8750b5c4d74e1e80cd71aa7b9a2e6f",
|
|
@@ -61,18 +61,18 @@
|
|
|
61
61
|
"microi-docs-coverage/SKILL.md": "44d2e633946af233bdd5a59a9fb74a8613e82031fa2f4635a2664fff0ad6c210",
|
|
62
62
|
"microi-docs-coverage/references/capability-map.md": "7be5142411650c3ad50414324d07240b8d110f98c2bea57eda38da846bfdd516",
|
|
63
63
|
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "ebd57f17f2ebae499bfa59ad17830db458590feb76f7f0f20219ff0987b33af3",
|
|
64
|
-
"microi-form-engine/SKILL.md": "
|
|
65
|
-
"microi-form-engine/references/component-catalog.md": "
|
|
64
|
+
"microi-form-engine/SKILL.md": "b92a7f80cb35ff26b2a1b0b91829fe85329794bb6e92e4b9e95ff706fb5c9ddb",
|
|
65
|
+
"microi-form-engine/references/component-catalog.md": "24ca51a7e0c75ea6b5d98c33685a4d6e8758e699f27278b656c8921c49d3893a",
|
|
66
66
|
"microi-form-engine/references/data-source-events.md": "59a95a36624476b12cdc84e4c23975d074b1f115df19992fd0fd075bb982e7cb",
|
|
67
67
|
"microi-form-layout/SKILL.md": "8a443d18587fc1eb0a9d5ae8082bc730b43ad82ca450af91cd5cfca4515b0392",
|
|
68
68
|
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "b72f79f9cf7635d0add29aa954c9dc0d333a62f45ee1d6113fbd7ee250b26965",
|
|
69
69
|
"microi-frontend-sdk/SKILL.md": "828edf7b6a08cde37e13aeee0f9eb4042dc74e10b62ef80c87649ccb6231139a",
|
|
70
|
-
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "
|
|
70
|
+
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5dea28edec5a31b6e6e5e15fefc03df9d1ad9bd4b583388fc77bd2aa67a19165",
|
|
71
71
|
"microi-left-right-layout/SKILL.md": "e2f051bce91e6b7cd103599ea526d543fd0f8caaa4c92c71e9e5d81b1a90cf7d",
|
|
72
72
|
"microi-microservice/SKILL.md": "4abbe1608a10280f13a11a34c380ca46d76df09c9b35a57f29d5345d21450c59",
|
|
73
73
|
"microi-microservice/references/runtime-delivery.md": "538ae295826892942b365492b11aa4797599ea7047fc69409aae64ed99ecfe9b",
|
|
74
74
|
"microi-mobile-app-quality/SKILL.md": "79cb796df3a486c9a39db10d47df53d9dafb259826067799486def659683144a",
|
|
75
|
-
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "
|
|
75
|
+
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "ec938bd1a64b9896ff5d3165ad217ee5c68a22a51ddb690d8a8a0c7a9365c512",
|
|
76
76
|
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "070ad110ed5a87046b2daf36c899debe2f1d08680148f6ff7549be4432bd3492",
|
|
77
77
|
"microi-solution-quotation/SKILL.md": "d99886d1261dba1c56b8ef70090783ffe9ae8a4915f5ca2c7e1fae6be519567a",
|
|
78
78
|
"microi-solution-quotation/agents/openai.yaml": "9e3f994cc842c927ca25e23216f6ce5e8f8313fc39b1c7142d9b652ca73e7dd1",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "dee8e3f2363548e4c83519f8784f8e8bfafe8dd3058f28c49d525dc93c542753",
|
|
88
88
|
"microi-ui/SKILL.md": "1136593475e94d55799dde302e8e86f1e96dd101e5f4645fd4d8091faa52f5d6",
|
|
89
89
|
"microi-ui/references/progressive-01-移动端场景蓝图.md": "aec5e6a400cec7a4cc4e474ad7033bc69874920ebd554706656034ffb9dc8c00",
|
|
90
|
-
"microi-uniapp-frontend/SKILL.md": "
|
|
90
|
+
"microi-uniapp-frontend/SKILL.md": "b4e7ae93b10a9944197fc1221adab88dcaf168f9ec6d56adbabc210e7665ec4b",
|
|
91
91
|
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "44df3c20120298f6565cf4388eadca70d98d097880c61168ce6d3ac03e80968b",
|
|
92
92
|
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "31a0a12e39ec785df038fb5c73d4978d6dec42d86c52b79e91082c9ac13f29cf",
|
|
93
93
|
"microi.v8.js": "4e5b7bb819255159a3d7a9555af662618162e31ec41cb3b67b3d7cc01635c9ec",
|
|
@@ -151,8 +151,8 @@
|
|
|
151
151
|
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "71ab3c94a6034f2d0c374de594104543770cb1313a6515494a213a1ecdf5baf7",
|
|
152
152
|
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5837905a195be7c38fe37e0abd40eee95a8bc26acdab1f3a9aba01c264a125ae",
|
|
153
153
|
"v8-export-import/references/progressive-03-安全-性能注意.md": "a2acc492740eb693be5a0ad275cabcba7a813aa7378c844e43b04233d03a9d0c",
|
|
154
|
-
"v8-file-upload/SKILL.md": "
|
|
155
|
-
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "
|
|
154
|
+
"v8-file-upload/SKILL.md": "22cdd7392c9bffcfbcbeaf0aa3ce5e40485295e2af55989091fd306994226ad6",
|
|
155
|
+
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "1f6e3e9081b17aab783d63a65aa12c6cb530f930390c76f01b41685845fcecd3",
|
|
156
156
|
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "ab5a0d6f9e0f39a036d48d7f87cfac8aed5575f42dcbabc9f34ad723ade2e1be",
|
|
157
157
|
"v8-formengine-http/SKILL.md": "8338e9087e93bb41ad260863b076db387373c606e481bf49809c447083c761d1",
|
|
158
158
|
"v8-frontend-events/SKILL.md": "ae476d6dde9b8251100f61411e9ff86ce9e885df651eb599015fa2a121b0270e",
|
|
@@ -191,189 +191,189 @@
|
|
|
191
191
|
"v8-utilities/references/server-api-index.md": "a7f8872cb06ef9c145eae3646af25e7c2fb9bf017ea5c3dbd56d25e541f42d0f",
|
|
192
192
|
"v8-workflow/SKILL.md": "f6dc87709362c3f8305a03d0b9b73e16a5ded601a509e8d5191b1141b0a72175",
|
|
193
193
|
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "9b6b01e7ac03c0a11bc837671a30107ff5c5f253029d74fd17713084104d7e99",
|
|
194
|
-
"workspace-conventions/SKILL.md": "
|
|
194
|
+
"workspace-conventions/SKILL.md": "8847ac29c19f2876939d4d7a90c79d0f817385006a9771c56a39bb02b453ea33",
|
|
195
195
|
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "576a781ecc529f7b5c9a824326445b2c90b3172ba0285a73fae4a2e45c9b84f5",
|
|
196
196
|
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "6720c8700972ca2b0b0b4378a137b70763542a280043c75d79d551be1f57b308",
|
|
197
197
|
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "86db1f03700fd54dd824d28c553c678202e8f74b796fd0f9d91f63bf53a530b1"
|
|
198
198
|
},
|
|
199
199
|
"fileVersions": {
|
|
200
|
-
".microi-skills-version.json": "5.2.
|
|
201
|
-
".progressive-disclosure-manifest.json": "5.2.
|
|
202
|
-
"README.md": "5.2.
|
|
203
|
-
"ai-engine/SKILL.md": "5.2.
|
|
204
|
-
"ai-engine/agents/openai.yaml": "5.2.
|
|
205
|
-
"ai-platform-governance/SKILL.md": "5.2.
|
|
206
|
-
"ai-platform-governance/references/progressive-01-功能开关.md": "5.2.
|
|
207
|
-
"app-store/SKILL.md": "5.2.
|
|
208
|
-
"app-store/agents/openai.yaml": "5.2.
|
|
209
|
-
"business-blueprint/SKILL.md": "5.2.
|
|
210
|
-
"datasource-engine/SKILL.md": "5.2.
|
|
211
|
-
"datasource-engine/agents/openai.yaml": "5.2.
|
|
212
|
-
"dos-orm/SKILL.md": "5.2.
|
|
213
|
-
"dos-orm/references/api-reference.md": "5.2.
|
|
214
|
-
"job-engine/SKILL.md": "5.2.
|
|
215
|
-
"job-engine/agents/openai.yaml": "5.2.
|
|
216
|
-
"message-notification/SKILL.md": "5.2.
|
|
217
|
-
"message-notification/agents/openai.yaml": "5.2.
|
|
218
|
-
"message-notification/references/contracts.md": "5.2.
|
|
219
|
-
"microi-ai-app-auth.js": "5.2.
|
|
220
|
-
"microi-ai-application/SKILL.md": "5.2.
|
|
221
|
-
"microi-ai-application/agents/openai.yaml": "5.2.
|
|
222
|
-
"microi-ai-application/references/frontend-baseline.md": "5.2.
|
|
223
|
-
"microi-client-frontend/SKILL.md": "5.2.
|
|
224
|
-
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.2.
|
|
225
|
-
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.2.
|
|
226
|
-
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.2.
|
|
227
|
-
"microi-codex-installer/SKILL.md": "5.2.
|
|
228
|
-
"microi-codex-installer/agents/openai.yaml": "5.2.
|
|
229
|
-
"microi-codex/SKILL.md": "5.2.
|
|
230
|
-
"microi-datasource-mapping/SKILL.md": "5.2.
|
|
231
|
-
"microi-db-schema/SKILL.md": "5.2.
|
|
232
|
-
"microi-db-schema/agents/openai.yaml": "5.2.
|
|
233
|
-
"microi-db-schema/references/core-tables.md": "5.2.
|
|
234
|
-
"microi-db-schema/references/form-component-options.md": "5.2.
|
|
235
|
-
"microi-db-schema/references/schema-overview.md": "5.2.
|
|
236
|
-
"microi-db-schema/references/schema.md": "5.2.
|
|
237
|
-
"microi-db-schema/references/table-catalog.md": "5.2.
|
|
238
|
-
"microi-deployment/SKILL.md": "5.2.
|
|
239
|
-
"microi-deployment/references/deployment-matrix.md": "5.2.
|
|
240
|
-
"microi-docs-coverage/SKILL.md": "5.2.
|
|
241
|
-
"microi-docs-coverage/references/capability-map.md": "5.2.
|
|
242
|
-
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.2.
|
|
243
|
-
"microi-form-engine/SKILL.md": "5.2.
|
|
244
|
-
"microi-form-engine/references/component-catalog.md": "5.2.
|
|
245
|
-
"microi-form-engine/references/data-source-events.md": "5.2.
|
|
246
|
-
"microi-form-layout/SKILL.md": "5.2.
|
|
247
|
-
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.2.
|
|
248
|
-
"microi-frontend-sdk/SKILL.md": "5.2.
|
|
249
|
-
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.2.
|
|
250
|
-
"microi-left-right-layout/SKILL.md": "5.2.
|
|
251
|
-
"microi-microservice/SKILL.md": "5.2.
|
|
252
|
-
"microi-microservice/references/runtime-delivery.md": "5.2.
|
|
253
|
-
"microi-mobile-app-quality/SKILL.md": "5.2.
|
|
254
|
-
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.2.
|
|
255
|
-
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.2.
|
|
256
|
-
"microi-solution-quotation/SKILL.md": "5.2.
|
|
257
|
-
"microi-solution-quotation/agents/openai.yaml": "5.2.
|
|
258
|
-
"microi-solution-quotation/scripts/build_solution_quote.py": "5.2.
|
|
259
|
-
"microi-sso/SKILL.md": "5.2.
|
|
260
|
-
"microi-sso/references/acceptance.md": "5.2.
|
|
261
|
-
"microi-sso/references/configuration-and-security.md": "5.2.
|
|
262
|
-
"microi-sso/references/inbound.md": "5.2.
|
|
263
|
-
"microi-sso/references/outbound.md": "5.2.
|
|
264
|
-
"microi-system-delivery/SKILL.md": "5.2.
|
|
265
|
-
"microi-system-delivery/references/progressive-01-标准工作流.md": "5.2.
|
|
266
|
-
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.2.
|
|
267
|
-
"microi-ui/SKILL.md": "5.2.
|
|
268
|
-
"microi-ui/references/progressive-01-移动端场景蓝图.md": "5.2.
|
|
269
|
-
"microi-uniapp-frontend/SKILL.md": "5.2.
|
|
270
|
-
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.2.
|
|
271
|
-
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.2.
|
|
272
|
-
"microi.v8.js": "5.2.
|
|
273
|
-
"module-engine/SKILL.md": "5.2.
|
|
274
|
-
"module-engine/references/module-config.md": "5.2.
|
|
275
|
-
"ocr-engine/SKILL.md": "5.2.
|
|
276
|
-
"ocr-engine/agents/openai.yaml": "5.2.
|
|
277
|
-
"page-engine/SKILL.md": "5.2.
|
|
278
|
-
"page-engine/references/progressive-01-所有组件类型.md": "5.2.
|
|
279
|
-
"page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.2.
|
|
280
|
-
"performance-testing/SKILL.md": "5.2.
|
|
281
|
-
"playwright-e2e/SKILL.md": "5.2.
|
|
282
|
-
"playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.2.
|
|
283
|
-
"playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.2.
|
|
284
|
-
"playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.2.
|
|
285
|
-
"playwright-e2e/references/progressive-04-ci-建议.md": "5.2.
|
|
286
|
-
"print-engine/SKILL.md": "5.2.
|
|
287
|
-
"production-readonly-audit/SKILL.md": "5.2.
|
|
288
|
-
"report-engine/SKILL.md": "5.2.
|
|
289
|
-
"report-engine/agents/openai.yaml": "5.2.
|
|
290
|
-
"scripts/optimize-progressive-disclosure.mjs": "5.2.
|
|
291
|
-
"scripts/refresh-progressive-disclosure.mjs": "5.2.
|
|
292
|
-
"scripts/validate-progressive-disclosure.mjs": "5.2.
|
|
293
|
-
"search-engine/SKILL.md": "5.2.
|
|
294
|
-
"search-engine/agents/openai.yaml": "5.2.
|
|
295
|
-
"spider-engine/SKILL.md": "5.2.
|
|
296
|
-
"translate-engine/SKILL.md": "5.2.
|
|
297
|
-
"translate-engine/agents/openai.yaml": "5.2.
|
|
298
|
-
"ui-design/SKILL.md": "5.2.
|
|
299
|
-
"ui-design/assets/pattern-showcase/app.js": "5.2.
|
|
300
|
-
"ui-design/assets/pattern-showcase/index.html": "5.2.
|
|
301
|
-
"ui-design/assets/pattern-showcase/styles.css": "5.2.
|
|
302
|
-
"ui-design/assets/templates/MCI-DESIGN.md": "5.2.
|
|
303
|
-
"ui-design/references/design-pattern-library.md": "5.2.
|
|
304
|
-
"ui-design/references/mci-design-contract.md": "5.2.
|
|
305
|
-
"ui-design/references/motion-and-media.md": "5.2.
|
|
306
|
-
"ui-design/references/product-flow-recipes.md": "5.2.
|
|
307
|
-
"ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.2.
|
|
308
|
-
"ui-design/references/progressive-02-字体.md": "5.2.
|
|
309
|
-
"ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.2.
|
|
310
|
-
"ui-design/references/progressive-04-组件风格速查.md": "5.2.
|
|
311
|
-
"ui-design/references/progressive-05-移动端专用规范.md": "5.2.
|
|
312
|
-
"ui-design/references/progressive-06-主题切换实现.md": "5.2.
|
|
313
|
-
"ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.2.
|
|
314
|
-
"ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.2.
|
|
315
|
-
"uniapp-mall-assets/SKILL.md": "5.2.
|
|
316
|
-
"unity-integration/SKILL.md": "5.2.
|
|
317
|
-
"unity-integration/agents/openai.yaml": "5.2.
|
|
318
|
-
"unity-integration/references/ai-app-delivery.md": "5.2.
|
|
319
|
-
"unity-integration/references/sdk-api.md": "5.2.
|
|
320
|
-
"unity-integration/references/toolbox-migration.md": "5.2.
|
|
321
|
-
"unity-integration/references/webgl-hosting.md": "5.2.
|
|
322
|
-
"v8-api-config/SKILL.md": "5.2.
|
|
323
|
-
"v8-cache-pattern/SKILL.md": "5.2.
|
|
324
|
-
"v8-crud-api/SKILL.md": "5.2.
|
|
325
|
-
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5.2.
|
|
326
|
-
"v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.2.
|
|
327
|
-
"v8-debugging/SKILL.md": "5.2.
|
|
328
|
-
"v8-explorer-tree/SKILL.md": "5.2.
|
|
329
|
-
"v8-export-import/SKILL.md": "5.2.
|
|
330
|
-
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.2.
|
|
331
|
-
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5.2.
|
|
332
|
-
"v8-export-import/references/progressive-03-安全-性能注意.md": "5.2.
|
|
333
|
-
"v8-file-upload/SKILL.md": "5.2.
|
|
334
|
-
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.2.
|
|
335
|
-
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.2.
|
|
336
|
-
"v8-formengine-http/SKILL.md": "5.2.
|
|
337
|
-
"v8-frontend-events/SKILL.md": "5.2.
|
|
338
|
-
"v8-frontend-events/references/bluetooth-print-api.md": "5.2.
|
|
339
|
-
"v8-frontend-events/references/bluetooth-print.md": "5.2.
|
|
340
|
-
"v8-frontend-events/references/progressive-01-列表事件.md": "5.2.
|
|
341
|
-
"v8-http-integration/SKILL.md": "5.2.
|
|
342
|
-
"v8-http-integration/references/progressive-01-get-请求.md": "5.2.
|
|
343
|
-
"v8-http-integration/references/progressive-02-错误处理模式.md": "5.2.
|
|
344
|
-
"v8-image-processing/SKILL.md": "5.2.
|
|
345
|
-
"v8-image-processing/agents/openai.yaml": "5.2.
|
|
346
|
-
"v8-image-processing/references/api-reference.md": "5.2.
|
|
347
|
-
"v8-menu-buttons/SKILL.md": "5.2.
|
|
348
|
-
"v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.2.
|
|
349
|
-
"v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.2.
|
|
350
|
-
"v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.2.
|
|
351
|
-
"v8-mongodb/SKILL.md": "5.2.
|
|
352
|
-
"v8-mq-mqtt/SKILL.md": "5.2.
|
|
353
|
-
"v8-mq-mqtt/references/mqtt-production.md": "5.2.
|
|
354
|
-
"v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.2.
|
|
355
|
-
"v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.2.
|
|
356
|
-
"v8-saas-multi-tenant/SKILL.md": "5.2.
|
|
357
|
-
"v8-security/SKILL.md": "5.2.
|
|
358
|
-
"v8-security/references/progressive-01-2-权限校验.md": "5.2.
|
|
359
|
-
"v8-security/references/progressive-02-7-日志记录.md": "5.2.
|
|
360
|
-
"v8-sql-query/SKILL.md": "5.2.
|
|
361
|
-
"v8-table-event/SKILL.md": "5.2.
|
|
362
|
-
"v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.2.
|
|
363
|
-
"v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.2.
|
|
364
|
-
"v8-tcp-integration/SKILL.md": "5.2.
|
|
365
|
-
"v8-tcp-integration/agents/openai.yaml": "5.2.
|
|
366
|
-
"v8-template-engine/SKILL.md": "5.2.
|
|
367
|
-
"v8-utilities/SKILL.md": "5.2.
|
|
368
|
-
"v8-utilities/references/client-api-index.md": "5.2.
|
|
369
|
-
"v8-utilities/references/platform-http-routes.md": "5.2.
|
|
370
|
-
"v8-utilities/references/server-api-index.md": "5.2.
|
|
371
|
-
"v8-workflow/SKILL.md": "5.2.
|
|
372
|
-
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.2.
|
|
373
|
-
"workspace-conventions/SKILL.md": "5.2.
|
|
374
|
-
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.2.
|
|
375
|
-
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.2.
|
|
376
|
-
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.2.
|
|
200
|
+
".microi-skills-version.json": "5.2.3",
|
|
201
|
+
".progressive-disclosure-manifest.json": "5.2.3",
|
|
202
|
+
"README.md": "5.2.3",
|
|
203
|
+
"ai-engine/SKILL.md": "5.2.3",
|
|
204
|
+
"ai-engine/agents/openai.yaml": "5.2.3",
|
|
205
|
+
"ai-platform-governance/SKILL.md": "5.2.3",
|
|
206
|
+
"ai-platform-governance/references/progressive-01-功能开关.md": "5.2.3",
|
|
207
|
+
"app-store/SKILL.md": "5.2.3",
|
|
208
|
+
"app-store/agents/openai.yaml": "5.2.3",
|
|
209
|
+
"business-blueprint/SKILL.md": "5.2.3",
|
|
210
|
+
"datasource-engine/SKILL.md": "5.2.3",
|
|
211
|
+
"datasource-engine/agents/openai.yaml": "5.2.3",
|
|
212
|
+
"dos-orm/SKILL.md": "5.2.3",
|
|
213
|
+
"dos-orm/references/api-reference.md": "5.2.3",
|
|
214
|
+
"job-engine/SKILL.md": "5.2.3",
|
|
215
|
+
"job-engine/agents/openai.yaml": "5.2.3",
|
|
216
|
+
"message-notification/SKILL.md": "5.2.3",
|
|
217
|
+
"message-notification/agents/openai.yaml": "5.2.3",
|
|
218
|
+
"message-notification/references/contracts.md": "5.2.3",
|
|
219
|
+
"microi-ai-app-auth.js": "5.2.3",
|
|
220
|
+
"microi-ai-application/SKILL.md": "5.2.3",
|
|
221
|
+
"microi-ai-application/agents/openai.yaml": "5.2.3",
|
|
222
|
+
"microi-ai-application/references/frontend-baseline.md": "5.2.3",
|
|
223
|
+
"microi-client-frontend/SKILL.md": "5.2.3",
|
|
224
|
+
"microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "5.2.3",
|
|
225
|
+
"microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "5.2.3",
|
|
226
|
+
"microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "5.2.3",
|
|
227
|
+
"microi-codex-installer/SKILL.md": "5.2.3",
|
|
228
|
+
"microi-codex-installer/agents/openai.yaml": "5.2.3",
|
|
229
|
+
"microi-codex/SKILL.md": "5.2.3",
|
|
230
|
+
"microi-datasource-mapping/SKILL.md": "5.2.3",
|
|
231
|
+
"microi-db-schema/SKILL.md": "5.2.3",
|
|
232
|
+
"microi-db-schema/agents/openai.yaml": "5.2.3",
|
|
233
|
+
"microi-db-schema/references/core-tables.md": "5.2.3",
|
|
234
|
+
"microi-db-schema/references/form-component-options.md": "5.2.3",
|
|
235
|
+
"microi-db-schema/references/schema-overview.md": "5.2.3",
|
|
236
|
+
"microi-db-schema/references/schema.md": "5.2.3",
|
|
237
|
+
"microi-db-schema/references/table-catalog.md": "5.2.3",
|
|
238
|
+
"microi-deployment/SKILL.md": "5.2.3",
|
|
239
|
+
"microi-deployment/references/deployment-matrix.md": "5.2.3",
|
|
240
|
+
"microi-docs-coverage/SKILL.md": "5.2.3",
|
|
241
|
+
"microi-docs-coverage/references/capability-map.md": "5.2.3",
|
|
242
|
+
"microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "5.2.3",
|
|
243
|
+
"microi-form-engine/SKILL.md": "5.2.3",
|
|
244
|
+
"microi-form-engine/references/component-catalog.md": "5.2.3",
|
|
245
|
+
"microi-form-engine/references/data-source-events.md": "5.2.3",
|
|
246
|
+
"microi-form-layout/SKILL.md": "5.2.3",
|
|
247
|
+
"microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "5.2.3",
|
|
248
|
+
"microi-frontend-sdk/SKILL.md": "5.2.3",
|
|
249
|
+
"microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "5.2.3",
|
|
250
|
+
"microi-left-right-layout/SKILL.md": "5.2.3",
|
|
251
|
+
"microi-microservice/SKILL.md": "5.2.3",
|
|
252
|
+
"microi-microservice/references/runtime-delivery.md": "5.2.3",
|
|
253
|
+
"microi-mobile-app-quality/SKILL.md": "5.2.3",
|
|
254
|
+
"microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "5.2.3",
|
|
255
|
+
"microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "5.2.3",
|
|
256
|
+
"microi-solution-quotation/SKILL.md": "5.2.3",
|
|
257
|
+
"microi-solution-quotation/agents/openai.yaml": "5.2.3",
|
|
258
|
+
"microi-solution-quotation/scripts/build_solution_quote.py": "5.2.3",
|
|
259
|
+
"microi-sso/SKILL.md": "5.2.3",
|
|
260
|
+
"microi-sso/references/acceptance.md": "5.2.3",
|
|
261
|
+
"microi-sso/references/configuration-and-security.md": "5.2.3",
|
|
262
|
+
"microi-sso/references/inbound.md": "5.2.3",
|
|
263
|
+
"microi-sso/references/outbound.md": "5.2.3",
|
|
264
|
+
"microi-system-delivery/SKILL.md": "5.2.3",
|
|
265
|
+
"microi-system-delivery/references/progressive-01-标准工作流.md": "5.2.3",
|
|
266
|
+
"microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "5.2.3",
|
|
267
|
+
"microi-ui/SKILL.md": "5.2.3",
|
|
268
|
+
"microi-ui/references/progressive-01-移动端场景蓝图.md": "5.2.3",
|
|
269
|
+
"microi-uniapp-frontend/SKILL.md": "5.2.3",
|
|
270
|
+
"microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "5.2.3",
|
|
271
|
+
"microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "5.2.3",
|
|
272
|
+
"microi.v8.js": "5.2.3",
|
|
273
|
+
"module-engine/SKILL.md": "5.2.3",
|
|
274
|
+
"module-engine/references/module-config.md": "5.2.3",
|
|
275
|
+
"ocr-engine/SKILL.md": "5.2.3",
|
|
276
|
+
"ocr-engine/agents/openai.yaml": "5.2.3",
|
|
277
|
+
"page-engine/SKILL.md": "5.2.3",
|
|
278
|
+
"page-engine/references/progressive-01-所有组件类型.md": "5.2.3",
|
|
279
|
+
"page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "5.2.3",
|
|
280
|
+
"performance-testing/SKILL.md": "5.2.3",
|
|
281
|
+
"playwright-e2e/SKILL.md": "5.2.3",
|
|
282
|
+
"playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "5.2.3",
|
|
283
|
+
"playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "5.2.3",
|
|
284
|
+
"playwright-e2e/references/progressive-03-microi-helper-模板.md": "5.2.3",
|
|
285
|
+
"playwright-e2e/references/progressive-04-ci-建议.md": "5.2.3",
|
|
286
|
+
"print-engine/SKILL.md": "5.2.3",
|
|
287
|
+
"production-readonly-audit/SKILL.md": "5.2.3",
|
|
288
|
+
"report-engine/SKILL.md": "5.2.3",
|
|
289
|
+
"report-engine/agents/openai.yaml": "5.2.3",
|
|
290
|
+
"scripts/optimize-progressive-disclosure.mjs": "5.2.3",
|
|
291
|
+
"scripts/refresh-progressive-disclosure.mjs": "5.2.3",
|
|
292
|
+
"scripts/validate-progressive-disclosure.mjs": "5.2.3",
|
|
293
|
+
"search-engine/SKILL.md": "5.2.3",
|
|
294
|
+
"search-engine/agents/openai.yaml": "5.2.3",
|
|
295
|
+
"spider-engine/SKILL.md": "5.2.3",
|
|
296
|
+
"translate-engine/SKILL.md": "5.2.3",
|
|
297
|
+
"translate-engine/agents/openai.yaml": "5.2.3",
|
|
298
|
+
"ui-design/SKILL.md": "5.2.3",
|
|
299
|
+
"ui-design/assets/pattern-showcase/app.js": "5.2.3",
|
|
300
|
+
"ui-design/assets/pattern-showcase/index.html": "5.2.3",
|
|
301
|
+
"ui-design/assets/pattern-showcase/styles.css": "5.2.3",
|
|
302
|
+
"ui-design/assets/templates/MCI-DESIGN.md": "5.2.3",
|
|
303
|
+
"ui-design/references/design-pattern-library.md": "5.2.3",
|
|
304
|
+
"ui-design/references/mci-design-contract.md": "5.2.3",
|
|
305
|
+
"ui-design/references/motion-and-media.md": "5.2.3",
|
|
306
|
+
"ui-design/references/product-flow-recipes.md": "5.2.3",
|
|
307
|
+
"ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "5.2.3",
|
|
308
|
+
"ui-design/references/progressive-02-字体.md": "5.2.3",
|
|
309
|
+
"ui-design/references/progressive-03-动效规范-丰富但不卡.md": "5.2.3",
|
|
310
|
+
"ui-design/references/progressive-04-组件风格速查.md": "5.2.3",
|
|
311
|
+
"ui-design/references/progressive-05-移动端专用规范.md": "5.2.3",
|
|
312
|
+
"ui-design/references/progressive-06-主题切换实现.md": "5.2.3",
|
|
313
|
+
"ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "5.2.3",
|
|
314
|
+
"ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "5.2.3",
|
|
315
|
+
"uniapp-mall-assets/SKILL.md": "5.2.3",
|
|
316
|
+
"unity-integration/SKILL.md": "5.2.3",
|
|
317
|
+
"unity-integration/agents/openai.yaml": "5.2.3",
|
|
318
|
+
"unity-integration/references/ai-app-delivery.md": "5.2.3",
|
|
319
|
+
"unity-integration/references/sdk-api.md": "5.2.3",
|
|
320
|
+
"unity-integration/references/toolbox-migration.md": "5.2.3",
|
|
321
|
+
"unity-integration/references/webgl-hosting.md": "5.2.3",
|
|
322
|
+
"v8-api-config/SKILL.md": "5.2.3",
|
|
323
|
+
"v8-cache-pattern/SKILL.md": "5.2.3",
|
|
324
|
+
"v8-crud-api/SKILL.md": "5.2.3",
|
|
325
|
+
"v8-crud-api/references/progressive-01-查询列表-分页.md": "5.2.3",
|
|
326
|
+
"v8-crud-api/references/progressive-02-where-条件语法速查.md": "5.2.3",
|
|
327
|
+
"v8-debugging/SKILL.md": "5.2.3",
|
|
328
|
+
"v8-explorer-tree/SKILL.md": "5.2.3",
|
|
329
|
+
"v8-export-import/SKILL.md": "5.2.3",
|
|
330
|
+
"v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "5.2.3",
|
|
331
|
+
"v8-export-import/references/progressive-02-powerpoint-导出.md": "5.2.3",
|
|
332
|
+
"v8-export-import/references/progressive-03-安全-性能注意.md": "5.2.3",
|
|
333
|
+
"v8-file-upload/SKILL.md": "5.2.3",
|
|
334
|
+
"v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "5.2.3",
|
|
335
|
+
"v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "5.2.3",
|
|
336
|
+
"v8-formengine-http/SKILL.md": "5.2.3",
|
|
337
|
+
"v8-frontend-events/SKILL.md": "5.2.3",
|
|
338
|
+
"v8-frontend-events/references/bluetooth-print-api.md": "5.2.3",
|
|
339
|
+
"v8-frontend-events/references/bluetooth-print.md": "5.2.3",
|
|
340
|
+
"v8-frontend-events/references/progressive-01-列表事件.md": "5.2.3",
|
|
341
|
+
"v8-http-integration/SKILL.md": "5.2.3",
|
|
342
|
+
"v8-http-integration/references/progressive-01-get-请求.md": "5.2.3",
|
|
343
|
+
"v8-http-integration/references/progressive-02-错误处理模式.md": "5.2.3",
|
|
344
|
+
"v8-image-processing/SKILL.md": "5.2.3",
|
|
345
|
+
"v8-image-processing/agents/openai.yaml": "5.2.3",
|
|
346
|
+
"v8-image-processing/references/api-reference.md": "5.2.3",
|
|
347
|
+
"v8-menu-buttons/SKILL.md": "5.2.3",
|
|
348
|
+
"v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "5.2.3",
|
|
349
|
+
"v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "5.2.3",
|
|
350
|
+
"v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "5.2.3",
|
|
351
|
+
"v8-mongodb/SKILL.md": "5.2.3",
|
|
352
|
+
"v8-mq-mqtt/SKILL.md": "5.2.3",
|
|
353
|
+
"v8-mq-mqtt/references/mqtt-production.md": "5.2.3",
|
|
354
|
+
"v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "5.2.3",
|
|
355
|
+
"v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "5.2.3",
|
|
356
|
+
"v8-saas-multi-tenant/SKILL.md": "5.2.3",
|
|
357
|
+
"v8-security/SKILL.md": "5.2.3",
|
|
358
|
+
"v8-security/references/progressive-01-2-权限校验.md": "5.2.3",
|
|
359
|
+
"v8-security/references/progressive-02-7-日志记录.md": "5.2.3",
|
|
360
|
+
"v8-sql-query/SKILL.md": "5.2.3",
|
|
361
|
+
"v8-table-event/SKILL.md": "5.2.3",
|
|
362
|
+
"v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "5.2.3",
|
|
363
|
+
"v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "5.2.3",
|
|
364
|
+
"v8-tcp-integration/SKILL.md": "5.2.3",
|
|
365
|
+
"v8-tcp-integration/agents/openai.yaml": "5.2.3",
|
|
366
|
+
"v8-template-engine/SKILL.md": "5.2.3",
|
|
367
|
+
"v8-utilities/SKILL.md": "5.2.3",
|
|
368
|
+
"v8-utilities/references/client-api-index.md": "5.2.3",
|
|
369
|
+
"v8-utilities/references/platform-http-routes.md": "5.2.3",
|
|
370
|
+
"v8-utilities/references/server-api-index.md": "5.2.3",
|
|
371
|
+
"v8-workflow/SKILL.md": "5.2.3",
|
|
372
|
+
"v8-workflow/references/progressive-01-节点开始-v8-事件.md": "5.2.3",
|
|
373
|
+
"workspace-conventions/SKILL.md": "5.2.3",
|
|
374
|
+
"workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "5.2.3",
|
|
375
|
+
"workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "5.2.3",
|
|
376
|
+
"workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "5.2.3"
|
|
377
377
|
},
|
|
378
378
|
"files": [
|
|
379
379
|
".microi-skills-version.json",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "5.2.
|
|
2
|
+
"version": "5.2.3",
|
|
3
3
|
"versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
|
|
4
4
|
"managedBy": "Microi.VSCode/bump-version.js",
|
|
5
|
-
"updatedAt": "2026-08-
|
|
5
|
+
"updatedAt": "2026-08-22T21:20:23.605Z"
|
|
6
6
|
}
|
|
@@ -23,6 +23,14 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
|
|
|
23
23
|
- 平台通用缺陷的交付证据必须分开记录:源码修复、官方母版资源、商城包发布后回读、目标租户后台安装任务、目标租户资源回读和真实 UI/接口验收;其中任一步未完成都不能笼统称为“已发布并安装”。
|
|
24
24
|
- 任何计划让全部吾码租户通过“安装/更新官方应用”获得的标准字段、布局、菜单、页面或种子数据,必须先在官方 `microi_itdos` 主租户创建并回读,再从该主租户按精确菜单/表资源导出新版 `AppPakcet`、单调递增应用版本并发布。禁止先只在客户/子租户补字段,再用本地手工 JSON 冒充官方母版;客户验证应发生在官方包发布之后。
|
|
25
25
|
- 同一标准能力若同时属于基础 SaaS 空库包和独立官方应用(例如系统设置、系统账号),两条交付链都要更新:基础包保证新租户初始化完整,独立应用保证存量租户可增量安装。发布后分别核对 `PackageInfo.Version`、物理列、`diy_field` 布局节点和商城行 `AppVersion/AppPakcet`,不能用其中一条替代另一条。
|
|
26
|
+
|
|
27
|
+
## 吾码创建人开发时的强制发布闭环
|
|
28
|
+
|
|
29
|
+
- 每次任务先检查工作区根的 `Microi.Server/Microi.net/`。只有目录存在且 `rg --files Microi.Server/Microi.net` 能找到至少一个真实源码文件时,才确认当前是吾码创建人在官方完整源码工作区开发;空目录不算,且不要求本次修改位于该目录。确认后,对任意目录中的平台基础能力执行修改、构建或交付时,官方应用数据包都不是“以后再补”的附加产物,而是本次实现的组成部分。目录缺失或为空时按普通用户工作区处理;纯审查、解释或诊断仍保持只读。
|
|
30
|
+
- 触发资源包括系统设置、表、字段、Tab、菜单、权限、接口引擎、事件、数据源、页面、打印、工作流、任务、平台内置微服务和可幂等种子数据。开始修改时就确定资源归属:系统设置、登录身份、个人中心等通常归 `app.microi.saas-engine`;表单引擎归 `app.microi.form-engine`;模块引擎归 `app.microi.module-engine`;应用商城归 `app.microi.store`。同一能力跨多个包时逐包更新,禁止只挑一个包。
|
|
31
|
+
- 强制闭环依次包含:①源码和定向测试;②通过绑定 `https://api.itdos.com + OsClient=iTdos` 的 `microi_itdos` 更新并回读官方母版资源;③从母版导出或按受审计发布契约生成本地应用包,单调提升包版本并核对资源数量、版本和 SHA-256;④发布对应官方 Platform 应用;⑤重新读取商城行和完整 `AppPakcet`,核对 `Published/IsApprove`、`AppVersion`、`PackageInfo.Version`、资源正文和内容哈希;⑥立即做一次同输入幂等重跑,确认无重复升版或漂移。任务还指定目标租户时,再安装/更新并等待后台任务 `Succeeded` 后回读真实资源。
|
|
32
|
+
- 本地包文件、生成器成功、单元测试通过、返回 TaskId 或 HTTP 200 都不能代替官方主数据库与商城回读。`.resource-sync-base` 只能在官网发布后逐项哈希一致时由同步器推进,不得与本地候选一起手工修改。若官方身份、MCP 登录或发布门禁失效,必须保留准确的未发布边界并修复链路;不得把本地 JSON 宣称为“其它吾码用户已经可以安装”。
|
|
33
|
+
- 应用包不得携带真实地图 Key、Token、连接串或其它租户秘密。浏览器供应商 Key 等配置只交付字段/设置模板和安全读取能力,实际值由每个目标租户在安装后自行填写。
|
|
26
34
|
|
|
27
35
|
## 包内容
|
|
28
36
|
|
|
@@ -76,7 +84,7 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
|
|
|
76
84
|
- 后端来源代理必须固定已保存的 `ApiBase + OsClient`,拒绝过期 Token、访问密钥会话、非超级管理员、非 HTTPS 外网地址、重定向漂移和超限响应;Token 不得返回浏览器、日志、审计或应用包。退出登录同步删除服务端密文。
|
|
77
85
|
- 商城主页面统一承载应用市场、已安装、我发布的应用、安装离线包和来源管理,不能再通过独立菜单或路由割裂上下文。来源增删改启停逐项自动保存;来源管理、详情和复杂配置使用平台统一 `80%` 可拖动大圆角 Dialog,遮罩服从正向开关 `sys_config.FormMaskBlur`,缺失或 `0/false` 默认关闭毛玻璃。
|
|
78
86
|
- 每张应用卡必须显示预览图、公开范围、分类、最新版本、当前租户已安装版本及状态色。来源卡必须显示其公开数和当前授权可访问总数;平台官方发布节点只显示“平台官方应用源”身份标记,不显示安装、更新或重新安装操作。
|
|
79
|
-
- 安装可明确选择 `sys_microistore` 当前版本或 `mic_data_version`
|
|
87
|
+
- 安装可明确选择 `sys_microistore` 当前版本或 `mic_data_version` 中仍含完整包正文的历史快照;后台任务在首次取包时必须把计划中的 `AppVersion` 解析为匹配且包含完整包正文的不可变 `StoreVersionId`,写入 checkpoint,并在全部后续分片一直传到详情取包。发布方中途升版时继续完成已锁定快照,新版留给下一轮盘点;快照缺失、版本不匹配、身份变化或快照 Id 漂移必须失败关闭,禁止退回易变当前行。实际安装版本写回 `sys_microistoreversion`。回退旧版属于重新安装,不得静默换成最新版。
|
|
80
88
|
- 应用详情的版本选择必须服务端分页和搜索,默认每页不超过 20 条;当前版本固定置顶,历史版本只返回仍包含完整包正文的可安装状态。禁止用 `_PageSize:500` 或一次加载全部版本后在浏览器过滤。翻页、搜索与页大小切换都必须保持已选版本语义并显示总数。
|
|
81
89
|
- 商城详情、来源管理等 Teleport 弹层必须使用宿主级固定遮罩,毛玻璃覆盖完整可视区域;标题栏拖动按弹层真实尺寸限制四边,窗口缩放后重新限制,不能依赖固定像素最大位移或允许内容越出视口。
|
|
82
90
|
- “我发布的应用”只读取当前登录用户拥有的记录,可以包含草稿和构建失败项;普通商城列表只读取已发布项。两者必须在服务端按 Owner 和发布状态过滤,不能依赖浏览器过滤后再分页。
|
|
@@ -184,10 +192,52 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
|
|
|
184
192
|
- 通用规则:当包要求 `NOT NULL`、目标列仍可空且存在历史 `NULL` 时,必须先用包内明确声明的默认值参数化回填,再执行列约束变更;包未声明默认值时失败关闭并报告影响行数,禁止猜测业务值。该步骤必须可重复执行,并允许多节点并发重试后得到同一结果。
|
|
185
193
|
- 自动化检查:构造可空旧列及多条 `NULL` 行,断言导入器按“统计 NULL → 参数化回填 → `MODIFY ... NOT NULL`”顺序执行;覆盖字符串、整数、零行、缺失默认值、重复执行,以及商城包中全部发布协议状态字段。
|
|
186
194
|
|
|
187
|
-
## 复盘:应用新增菜单未自动授予系统管理员完整权限
|
|
195
|
+
## 复盘:应用新增菜单未自动授予系统管理员完整权限
|
|
188
196
|
|
|
189
197
|
- 触发场景:应用首次安装或版本更新新增了 `sys_menu`,菜单数据已经存在,但系统管理员看不到入口或只能执行部分按钮;再次人工到角色管理中勾选后才恢复。
|
|
190
198
|
- 根因:安装器只导入菜单,没有在同一事务内写入 `sys_rolelimit`;历史补丁又把单个管理员角色 Id 和五项旧权限硬编码,只能修复某个菜单,遗漏 `Read`、自定义按钮及其它 `Level >= 9999` 管理员角色。
|
|
191
199
|
- 通用规则:安装器只对本次真正新增或从删除状态重新引入的菜单自动授权,不扩大既有菜单的客户权限策略。目标角色必须从当前租户实时读取全部有效 `sys_role.Level >= 9999` 记录;基础权限固定为 `Read/Add/Edit/Del/Export/Import`,并合并菜单 `MoreBtns/ExportMoreBtns/BatchSelectMoreBtns/PageBtns/PageTabs/FormBtns` 中每个按钮的 `Id + Name`,不得加入 `NoDetail/NoSearch` 这类限制权限。
|
|
192
200
|
- 幂等与失败边界:已有 `sys_rolelimit` 只能合并、不得删除历史自定义权限;新增行使用“租户 + 角色 + 菜单”的确定性 Id,并在并发主键冲突后重新回读合并。找不到系统管理员、查询失败或任一权限写入失败必须让整个安装事务回滚,不能出现“菜单成功但管理员无权”的半成品。通过 FormEngine 写入以触发共享授权缓存失效。
|
|
193
|
-
- 自动化检查:覆盖多个系统管理员、已有部分权限、自定义按钮既有 JSON 字符串也有数组、删除菜单恢复、重复安装零新增、两个节点同时插入后合并,以及既有菜单更新不自动扩权;发布门同时校验独立导入器与商城包内嵌副本都包含该能力。
|
|
201
|
+
- 自动化检查:覆盖多个系统管理员、已有部分权限、自定义按钮既有 JSON 字符串也有数组、删除菜单恢复、重复安装零新增、两个节点同时插入后合并,以及既有菜单更新不自动扩权;发布门同时校验独立导入器与商城包内嵌副本都包含该能力。
|
|
202
|
+
|
|
203
|
+
## 复盘:商城发布升版打断所有后台分片安装
|
|
204
|
+
|
|
205
|
+
- 触发场景:主租户为大量子租户执行“安装/更新全部平台应用”时,某个平台包从 v7.5.17 发布到 v7.5.18;正在执行的任务在下一分片报“检查点版本与当前版本发生变化”,大量子租户同时失败。
|
|
206
|
+
- 根因:版本保护正确阻止两个包混装,但批量计划只持久化 `StoreId + AppVersion`,每个分片仍从 `sys_microistore` 易变当前行重新取包,没有使用已经存在的 `mic_data_version` 完整快照,也没有把 `StoreVersionId` 写进 checkpoint。
|
|
207
|
+
- 通用规则:后台安装首次取包必须按计划 `AppVersion` 锁定匹配的完整历史快照,并在每个分片复用同一 `StoreVersionId`;应用商城自身必须排在平台批量计划首位,先自举最新版导入器。发布中途升版不能改变既有任务的包体,也不能让既有任务自动追新;下一次批量盘点再安装新版本。
|
|
208
|
+
- 自动化检查:构造计划版本 v1.0.0、商城当前版本在分片间升到 v1.0.1,断言首次选择 v1.0.0 快照 Id,恢复分片仍请求同一 Id且成功;覆盖快照尚未生成、显式 Id 与期望版本不符、身份不符均失败关闭,并断言批量计划第一项为 `app.microi.store`。
|
|
209
|
+
|
|
210
|
+
## 复盘:父任务 Monitor 重复自举误判同版本工作器
|
|
211
|
+
|
|
212
|
+
- 触发场景:全部子租户安装任务已经创建并持续执行,父任务在 Monitor 分片中再次调用租户发现/工作器自举;子租户刚从应用包写入的商城工作器与主租户版本相同,仅 BOM 或 CRLF/LF 不同,却被判为“同版本源码不同、疑似租户定制”,父任务失败,而子任务仍在后台运行。
|
|
213
|
+
- 根因:父编排器在解析 checkpoint 阶段前无条件读取租户目录,导致 Monitor 也重复执行只应发生在 Queue 的有副作用自举;服务端源码比较又直接使用 Ordinal 原文比较,没有先消除跨平台文本格式差异。
|
|
214
|
+
- 通用规则:租户发现与商城工作器自举只允许在 Queue 阶段执行;Monitor 必须只汇总 checkpoint 中已经持久化的 `ChildTasks`。同版本源码比较只可规范化 UTF-8 BOM、CRLF/LF 和文件末尾空白;任何其它字符差异仍按租户定制失败关闭,禁止用去注释、压缩空白或模糊标记绕过保护。
|
|
215
|
+
- 自动化检查:覆盖同版本 LF/CRLF/BOM 等价且不刷新、同版本真实代码差异继续拒绝、旧版官方谱系允许升级、新版目标保留;接口引擎资源断言 Monitor 检查点标记存在且 `GetChildTenantPlatformAppMaintenanceTargets` 只位于 Queue 分支。
|
|
216
|
+
|
|
217
|
+
## 复盘:资源数量小但工作量重的应用被合并为单事务
|
|
218
|
+
|
|
219
|
+
- 触发场景:子租户批量安装进度停在“系统设置”或“系统帐号”十多分钟,心跳和 CPU 仍活跃但没有新检查点;重启后同一现象只会转移到下一个租户。
|
|
220
|
+
- 根因:批量工作器请求 `BulkAdaptiveSingleSlice`,导入器仅按表、字段、菜单和数据行数量判断“小包”,没有计入 DDL、实体生成、权限回填和历史数据迁移的真实成本,因而关闭了内部后台分片。
|
|
221
|
+
- 通用规则:后台商城安装必须始终保留有界分片和持久化检查点;旧工作器仍传单片参数时,新导入器必须安全忽略。已排队的跨租户任务在真正运行目标 V8 前,应按进程缓存执行一次官方安装器自愈,使平台修复能从原检查点接管。
|
|
222
|
+
- 自动化检查:断言批量工作器显式关闭单片参数、导入器不存在 `backgroundChunkingEnabled=false` 路径、旧单片参数只记录忽略诊断;后台执行器在子租户工作器运行前调用受信自举,并继续保留同版本真实源码差异的失败关闭保护。
|
|
223
|
+
|
|
224
|
+
## 复盘:旧租户前置物理列逐列重建耗尽首片超时
|
|
225
|
+
|
|
226
|
+
- 触发场景:已启用后台分片后,旧租户首次更新“系统设置”仍长时间没有 `ChildCheckpoint`;心跳与 CPU 正常,接近单片超时后才推进。实时 Schema 回读显示 `sys_apiengine` 与 `diy_table` 同时缺少多项生成实体固定列。
|
|
227
|
+
- 根因:导入器为兼容历史空库,在第一次 FormEngine 调用前逐列执行 `ALTER TABLE ADD`。MySQL 每个语句都可能重新准备或重建同一张元数据表,多个固定列的累计耗时发生在首个可持久化检查点之前。
|
|
228
|
+
- 通用规则:MySQL 同一张表缺少多个受信固定前置列时,必须先完整盘点,再用单条 `ALTER TABLE ... ADD ..., ADD ...` 原子补齐并回读;可信后台任务每个分片最多修改一张前置元数据表,提交 `Prerequisites` 检查点后再继续下一张。没有缺列的现代租户直接进入原 DDL 阶段,不制造空分片。并发节点已完整补齐时按幂等成功,否则保留真实表名、未补齐列和数据库错误并失败关闭。SQL Server 与 Oracle 使用各自已验证语法,不得直接套用 MySQL 批量语句。
|
|
229
|
+
- 自动化检查:独立导入器和商城包内嵌副本都必须携带批量前置列及检查点标记;断言 MySQL 路径先收集 `pendingDefinitions`、每表只拼接一次批量 ALTER、后台每片写表上限为一,且失败后逐项回读所有待补列。真实旧租户验收需证明前置列分片已提交、随后不可变 `StoreVersionId` 与字段阶段检查点继续推进。
|
|
230
|
+
|
|
231
|
+
## 复盘:父级监控遇到数据库死锁被误判为业务失败
|
|
232
|
+
|
|
233
|
+
- 触发场景:父级 Monitor 已持久化全部子任务 Id,子任务仍在正常执行且 checkpoint 中没有业务失败;父任务汇总进度时偶发数据库死锁,却因调用方配置 `MaxAttempts=1` 立即进入 `Failed`,通知中心因此把仍可成功收敛的整批任务标红。
|
|
234
|
+
- 根因:后台任务把数据库死锁、锁等待超时等基础设施瞬态竞争与接口返回失败共用同一业务重试预算。低业务重试次数无法覆盖工作器自身的领取、心跳、检查点或结果持久化竞争,也没有保留父子任务的真实运行语义。
|
|
235
|
+
- 通用规则:后台任务存储层只对已知数据库死锁、锁等待超时、序列化竞争等稳定特征启用独立的有界基础设施重试;即使业务 `MaxAttempts=1`,也允许最多三次基础设施执行机会。重试必须保留原 TaskId、父子关系、checkpoint 和已产生的副作用,不得重新创建子任务;成功后清除瞬态错误,第三次仍竞争才按原业务规则终止。普通业务错误、数据冲突和 `Value cannot be null` 等非竞争错误不得借用该预算。
|
|
236
|
+
- 自动化检查:覆盖嵌套 ProviderException 与外层包装异常、MySQL/SQL Server/PostgreSQL/Oracle 的稳定错误码或消息;断言第一次和第二次竞争回到可领取状态且不消耗业务 AttemptCount,第三次进入原终态,非竞争异常仍按 `MaxAttempts` 立即失败。真实验收必须等待原 8 个子任务全部收敛,再以 `MaxAttempts=1` 连续执行一轮完整汇总和一轮立即无操作重跑,父任务均应得到 `SucceededCount=8、FailedCount=0`。
|
|
237
|
+
|
|
238
|
+
## 复盘:字段分片完成后后台安装卡在缓存失效广播
|
|
239
|
+
|
|
240
|
+
- 触发场景:字段分片的数据库写入和 Schema 回读已经精确完成,但 `ChildCheckpoint` 长时间停在同一字段索引;任务取消也无法及时结束,进程内存、线程数和 CPU 持续增长。
|
|
241
|
+
- 根因证据:两次托管转储的调用链都停在 `V8.ApiEngine.Run -> GetApiEngineModelInternal -> MicroiTwoLevelCache.SetAsync -> PublishInvalidateAsync -> PublishWithRetryAsync`。权威 Redis 写入已经成功,随后用于通知其它节点清理一级缓存的 Pub/Sub 广播没有完成时限,因而把业务调用永久挂住;与此同时,单字段元数据更新即使只变更 Label、Remark、布局或 V8,也会重复执行物理列 DDL,放大旧租户升级成本。
|
|
242
|
+
- 通用规则:Redis 权威值写入成功后,跨节点一级缓存失效广播只能是有界、尽力而为的附属动作。队列等待和实际发布都必须有独立短超时,超时后观察迟到异常并开启短暂熔断冷却,防止悬挂发布任务无界堆积;不得因此回滚已经成功的权威写入。`UptDiyField` 只有列名或物理类型变化时才允许调用 `ChangeColumn`,显示名称、说明、布局和事件代码等纯元数据变化禁止触发 DDL。
|
|
243
|
+
- 自动化与真实验收:缓存测试必须覆盖发布永久不返回时的有界退出、迟到异常观察和冷却期抑制;字段测试必须断言只有 Name/Type 变化才进入物理 DDL。应用商城资源契约测试、后台任务与 SaaS 回归测试通过后,还必须在真实主租户完成 8/8 子租户收敛并立即执行一轮 8/8 无操作重跑。验收期间若官方应用发布了新版本,应以新的不可变 `StoreVersionId` 启动独立追赶批次,禁止混入已经开始的旧版本分片。
|
|
@@ -36,7 +36,29 @@ Config/Data、菜单查询列与缓存保持一致。
|
|
|
36
36
|
`FormWidth=24`,普通字段省略。`CollapseGroup` 属于整行控件,必须显式保存
|
|
37
37
|
`FormWidth=24`,且 `Config.CollapseGroup.ShowFieldCount` 默认补为 `true`。
|
|
38
38
|
6. 绑定菜单后补齐/允许平台推断列表列、搜索列、隐藏列、排序列、移动端列和默认排序。
|
|
39
|
-
7. 回读 `diy_field`、刷新 schema 缓存,再在真实新增/编辑/查看表单中验收。
|
|
39
|
+
7. 回读 `diy_field`、刷新 schema 缓存,再在真实新增/编辑/查看表单中验收。
|
|
40
|
+
|
|
41
|
+
## 上传字段配置(AI 生成时强制)
|
|
42
|
+
|
|
43
|
+
- 图片使用 `Config.ImgUpload`,至少明确 `Limit`、`Multiple`、`MaxCount`、`Preview`、
|
|
44
|
+
`MaxSize` 和 `Crop`;文件使用 `Config.FileUpload`,至少明确 `Limit`、`Multiple`、
|
|
45
|
+
`MaxCount`、`MaxSize`。完整键和值域读取 `references/component-catalog.md`。
|
|
46
|
+
- `ImgUpload.Preview` 未配置时默认开启压缩;普通业务图片优先保持开启。裁剪前的原图无论
|
|
47
|
+
展示图配置为公有或私有、是否压缩,都必须保存在 HDFS 私有桶,业务字段不得保存原图路径。
|
|
48
|
+
- `ImgUpload.Crop.Enabled` 只控制表单打开时是否默认选中裁剪。运行时的裁剪开关、存储范围、
|
|
49
|
+
单/多图数量、压缩状态和最大体积统一显示在紧凑上传面板中;不得把 `Enabled=false` 误解为
|
|
50
|
+
禁止用户裁剪。`Mode` 只允许 `free/fixed/select`。
|
|
51
|
+
- 图片和文件的拖放区都使用同一紧凑配置面板。`Multiple=true` 时必须设置业务合理的
|
|
52
|
+
`MaxCount`;`MaxSize` 单位为 MB,字段限制只能收紧租户/平台上限,不能放大。
|
|
53
|
+
- 富文本使用 `Config.RichText`:必须明确 `Limit`,并按需配置
|
|
54
|
+
`Image.Enabled/MaxSize/MaxCount/Preview/CompressMaxSize/CompressMaxWidth`、
|
|
55
|
+
`Video.Enabled/MaxSize/MaxCount`、`File.Enabled/MaxSize/MaxCount/Accept`。公开公告、商品详情
|
|
56
|
+
等匿名正文显式使用 `Limit=false`;内部正文使用 `true`。旧字段缺失配置时安全默认为私有桶,
|
|
57
|
+
图片默认压缩到约 500 KB、最长边 1920 px。
|
|
58
|
+
- 私有富文本只能持久化稳定对象标识,禁止把 HDFS 签名 URL、审计代理 Ticket 或 DiyToken 写入
|
|
59
|
+
HTML。每次查看/编辑按当前菜单、表、记录和字段权限换取新短效地址;外部匿名页面没有此权限
|
|
60
|
+
上下文,因此不能把私有 RichText 当作公开正文。普通交互式帐号也不能用 `Limit=false` 绕过
|
|
61
|
+
后端强制私有策略。
|
|
40
62
|
|
|
41
63
|
新建表/模块时,除非用户显式指定或表单达到极重阈值(约 36+ 业务字段、2+ 子表或同等
|
|
42
64
|
重型控件密度),默认保存 `diy_table.FormOpenType=Dialog` 与 `FormOpenWidth=80%`。
|
|
@@ -62,12 +62,23 @@
|
|
|
62
62
|
| `JoinTable` | 关联集合展示 | 查询与权限在服务端完成 |
|
|
63
63
|
| `JoinForm` | 嵌入一个独立记录的完整表单 | 主表字段保存一个目标 Id;目标表不能与当前表相同 |
|
|
64
64
|
| `TableChild` | 主表内嵌 0..N 条明细列表 | 独立子表、子表真实外键、隐藏子菜单、回查索引 |
|
|
65
|
-
| `Map` | 点位 |
|
|
66
|
-
| `MapArea` | 区域 | `mediumtext
|
|
65
|
+
| `Map` | 点位 | 高德/百度/腾讯;`Config.MapCompany=System/AMap/Baidu/Tencent`;凭据只进租户“安全与服务接入”,不得写字段配置或公开 SysConfig |
|
|
66
|
+
| `MapArea` | 区域 | 与 `Map` 共用供应商安全配置;`mediumtext` 保存 `Paths`,限制路径、点数和体积 |
|
|
67
67
|
| `Qrcode` | 二维码卡片展示 | 优先 `IsVirtual=1`;扫码原文另存普通 `varchar` 字段 |
|
|
68
68
|
| `FontAwesome` | 图标选择 | `varchar(200)` |
|
|
69
69
|
| `DevComponent` | 主前端定制 Vue 控件 | 仅用于长期复用且标准控件无法满足的场景 |
|
|
70
70
|
|
|
71
|
+
### `Map / MapArea` 运行时与安全边界
|
|
72
|
+
|
|
73
|
+
- 渲染事实源是 `Microi.Client/src/views/form-engine/diy-field-component/diy-map.vue`;公共错误分类与安全配置请求在同目录 `map-runtime.js`。
|
|
74
|
+
- 字段只保存 `Config.MapCompany`,值为 `System / AMap / Baidu / Tencent`。禁止把 Key、securityJsCode、Secret 或代理凭据写入 `diy_field.Config`、V8 前端事件、公开 `sys_config` 投影或前端构建变量。
|
|
75
|
+
- 租户凭据使用 `mci_system_setting` 的 `Map.*` 模板,在“系统设置 → 安全与服务接入”由超级管理员维护。运行时由可信后端按 DiyToken 租户和当前供应商做白名单投影,只返回一家的 `ClientKey`,必须 `no-store` 并拒绝访问密钥会话。
|
|
76
|
+
- 旧 `sys_config.AMapKey / AMapSecret / BaiduAK` 仅在对应新设置未启用时兼容回退。不要为迁移直接重新公开这些字段。
|
|
77
|
+
- 旧字段 `Config` 中的 `MapKey / MapSecret / AMapKey / AMapSecret / BaiduAK / TencentMapKey` 等明文属性不属于运行时配置;设计器保存地图配置时必须清除。迁移顺序固定为“先写入并启用租户 `Map.*` Secret,再清理字段元数据”。
|
|
78
|
+
- 浏览器 JS Key 天然可见,必须配置供应商域名/Referer 白名单;高德生产环境优先配置 `Map.AMap.ServiceHost`,存在代理时不得再返回 `SecurityJsCode`。
|
|
79
|
+
- 加载中、缺少 Key、运行时接口不匹配、SDK 网络/超时/鉴权/域名/WebGL/容器尺寸错误必须在控件区域显示明确原因码和重试入口,禁止只 `console.warn/error` 后留下空白地图。
|
|
80
|
+
- `Map` 保持 `{Name}_Lng / {Name}_Lat / {Name}.{Address,Center,Zoom}`;`MapArea` 保持 `{Name}.{Paths,Center,Zoom}`。三家供应商切换不得改变持久化格式。
|
|
81
|
+
|
|
71
82
|
### `JoinForm` 不是子表
|
|
72
83
|
|
|
73
84
|
- `JoinForm` 渲染 `diy-form`,通过 `Config.JoinForm.JoinFieldName` 从当前表单取出一个
|
|
@@ -132,13 +143,73 @@ if (V8.LoadMode !== 'Design') {
|
|
|
132
143
|
| CodeEditor / JsonTable | `CodeEditor.Height`、`JsonTable.Columns`、`JsonTable.Columns[].Config` |
|
|
133
144
|
| JoinForm | `JoinForm.TableId`、`JoinForm.TableName`、`JoinForm.JoinFieldName`、`JoinForm.FormMode`、`JoinForm.Id`、`JoinForm._SearchEqual` |
|
|
134
145
|
| TableChild | Config 根节点的 `TableChildTableId`、`TableChildSysMenuId`、`TableChildFkFieldName`;`TableChild.PrimaryTableFieldName`(默认 `Id`)及分页/导入选项 |
|
|
135
|
-
| ImgUpload | `ImgUpload.Multiple
|
|
146
|
+
| ImgUpload | `ImgUpload.Limit/Multiple/MaxCount/Tips/Preview/MaxSize/SaveFullPath`;`ImgUpload.Crop.Enabled` 仅表示默认开启,另有 `Mode=free/fixed/select`、`Ratio`、`CustomWidth/CustomHeight`、`AllowZoom/AllowRotate/AllowFlip`;运行时在上传面板内提供裁剪开关,裁剪弹层提供“不裁剪直接上传”;导出时会按最大图片数展开列 |
|
|
147
|
+
| FileUpload | `FileUpload.Limit/Multiple/MaxCount/Tips/MaxSize/SaveFullPath`,以及 Office 预览/编辑/版本配置;文件不使用 `ImgUpload.Preview/Crop` |
|
|
148
|
+
| RichText | `RichText.Limit`;`Image.Enabled/MaxSize/MaxCount/Preview/CompressMaxSize/CompressMaxWidth`;`Video.Enabled/MaxSize/MaxCount`;`File.Enabled/MaxSize/MaxCount/Accept`;私有正文存稳定标识而不是临时 URL |
|
|
136
149
|
| Qrcode | `Qrcode.DisplayWidth`、`Qrcode.ShowDownload`、`Qrcode.DownloadText`;扫码内容使用运行态 `DataAppend.Code` |
|
|
137
150
|
|
|
138
151
|
其余选择、树、上传、关联和布局选项以当前字段设计器和
|
|
139
152
|
`microi-db-schema/references/form-component-options.md` 为事实源;不要凭旧截图
|
|
140
153
|
发明配置键。
|
|
141
154
|
|
|
155
|
+
### `ImgUpload / FileUpload` 生成与运行时规则
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"ImgUpload": {
|
|
160
|
+
"Limit": true,
|
|
161
|
+
"Multiple": true,
|
|
162
|
+
"MaxCount": 6,
|
|
163
|
+
"Tips": "支持 JPG、PNG、WebP",
|
|
164
|
+
"Preview": true,
|
|
165
|
+
"MaxSize": 10,
|
|
166
|
+
"SaveFullPath": false,
|
|
167
|
+
"Crop": {
|
|
168
|
+
"Enabled": true,
|
|
169
|
+
"Mode": "select",
|
|
170
|
+
"Ratio": "16:9",
|
|
171
|
+
"CustomWidth": 1,
|
|
172
|
+
"CustomHeight": 1,
|
|
173
|
+
"AllowZoom": true,
|
|
174
|
+
"AllowRotate": true,
|
|
175
|
+
"AllowFlip": true
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- `Limit=true` 表示字段配置为私有桶,`false` 表示配置为公有桶;最终访问仍服从后端租户权限和上传安全策略。
|
|
182
|
+
- `Multiple=true` 时 `MaxCount` 必须是正整数;`MaxSize` 单位为 MB。`Preview` 未配置时按 `true` 压缩,普通列表、卡片、商品图不要关闭。
|
|
183
|
+
- `Crop.Enabled` 只决定运行时裁剪开关的初始状态;`false` 或缺失时用户仍可在紧凑上传面板主动开启。裁剪前原图始终进入 HDFS 私有桶,业务字段只保存展示图元数据。
|
|
184
|
+
- 图片和文件都把拖放提示、存储范围、单/多文件、最大数量、处理方式和最大体积合并到同一个紧凑面板;不要在字段外再生成重复说明卡片。
|
|
185
|
+
|
|
186
|
+
### `RichText` 生成与运行时规则
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"RichText": {
|
|
191
|
+
"EditorProduct": "WangEditor",
|
|
192
|
+
"Limit": true,
|
|
193
|
+
"Image": {
|
|
194
|
+
"Enabled": true,
|
|
195
|
+
"MaxSize": 20,
|
|
196
|
+
"MaxCount": 10,
|
|
197
|
+
"Preview": true,
|
|
198
|
+
"CompressMaxSize": 500,
|
|
199
|
+
"CompressMaxWidth": 1920
|
|
200
|
+
},
|
|
201
|
+
"Video": { "Enabled": true, "MaxSize": 200, "MaxCount": 3 },
|
|
202
|
+
"File": { "Enabled": true, "MaxSize": 100, "MaxCount": 10, "Accept": "" }
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
- 公开公告、商品详情等匿名网页内容显式用 `Limit=false`;内部公告、合同说明等用 `true`。旧字段缺失时默认私有,不能由 AI 猜成公有。
|
|
208
|
+
- `MaxSize` 单位 MB,`CompressMaxSize` 单位 KB。图片压缩开启时原图仍先进入 HDFS 私有桶,正文只引用展示图。
|
|
209
|
+
- 私有正文只保存 `/__microi_richtext_private__/...` 稳定标识;运行时携带当前菜单、表、记录和字段上下文换取短效代理 URL,禁止把临时 Token/Ticket 回写字段。
|
|
210
|
+
- 普通文件通过富文本工具栏附件入口插入 `a.href`;私有授权只接受真实 `img/video/source.src` 与 `a.href` 的精确路径,不接受正文文字、`data-*` 或脚本标签。
|
|
211
|
+
- RichText 通常使用 `FormWidth=24`,配置摘要保持单行紧凑,不要再生成独立的大说明卡。
|
|
212
|
+
|
|
142
213
|
## 宽度与重字段
|
|
143
214
|
|
|
144
215
|
- 普通 Text、Select、NumberText、DateTime 默认不写 `FormWidth`。
|
|
@@ -169,3 +169,7 @@ if (ctx.token && ctx.token !== appliedHostToken) {
|
|
|
169
169
|
|
|
170
170
|
普通 `request`、浏览器 `fetch(FormData)` 上传和 `uni.uploadFile` 都必须读取响应头的新 Token。验收时必须连续执行至少两个需要登录态的请求(前一个允许发生 Token 轮换),确认后一个仍返回 `Code=1`;不能只看页面首屏渲染成功。
|
|
171
171
|
<!-- /microi-progressive:chunk -->
|
|
172
|
+
|
|
173
|
+
## 运行时 ApiBase / OsClient 切换
|
|
174
|
+
|
|
175
|
+
允许用户切换平台的客户端必须把 `ApiBase + OsClient` 视为完整安全边界,而不是只替换请求 URL。候选端点应先匿名探测,成功后再原子更新配置并清除旧 Token、用户和平台派生缓存;账号、RSA 密文、菜单、表元数据和页面状态不得跨边界复用。SDK 每次修改 `apiBase` 或 `osClient` 都必须推进端点代次,请求记录发起时代次,并在处理响应头 Token、鉴权失效或响应体之前拒绝旧代次的迟到响应。验收至少覆盖“旧平台登录请求未返回 -> 切换平台 -> 旧响应携带 Token 返回”,并确认旧 Token 没有写入、新请求只发送一个新 `osclient`。
|
|
@@ -207,3 +207,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
|
|
|
207
207
|
- 构建 H5 和微信小程序目标。
|
|
208
208
|
|
|
209
209
|
<!-- /microi-progressive:chunk -->
|
|
210
|
+
|
|
211
|
+
## 平台方通用 App 的登录连接器例外
|
|
212
|
+
|
|
213
|
+
“登录页不要展示 ApiBase / OsClient”仍是 H5、小程序与客户专属 App 的默认规则。只有用户明确要求、并由平台方提交一个聚合多租户的通用 `APP-PLUS` 安装包时,才允许把平台连接器作为登录页次级折叠卡片;必须保留清晰的当前连接摘要、固定协议下拉、HTTP 风险提示、带图标的应用按钮、连接 loading/disabled 状态,并在展开后通过滚动和安全区保证小屏设备不裁切登录操作。连接器不能伪装成调试面板,也不能展示 Token、密码或其它秘密。
|
|
@@ -9,7 +9,15 @@ description: Microi 吾码 UniApp/H5 前端通用规范。用于构建或修复
|
|
|
9
9
|
|
|
10
10
|
本 Skill 适用于任何 Microi 吾码 UniApp/H5 项目,包括商城、OA、ERP、MES、CRM、互联网项目、预约项目等。不要把规则写成某一个业务应用专属规范。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## 图片上传默认参数(强制)
|
|
13
|
+
|
|
14
|
+
UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` / `V8.uploadFiles` 上传图片。调用方省略 `options.preview` 时,SDK 必须发送 `Preview=true` 并默认使用 `img` 路径;只有显式 `preview:false` 才允许关闭。服务端仍是最终事实源:即使旧客户端完全不传该字段,也要默认压缩到约 `500 KB`、最长边约 `1920 px`,并在 HDFS 私有桶保留一份 `_origin` 原图。页面不得为了“上传成功”自行改成 `preview:false`,也不得把私有原图或临时签名地址保存进业务字段。
|
|
15
|
+
|
|
16
|
+
## 平台方通用 App 登录连接器(明确例外)
|
|
17
|
+
|
|
18
|
+
登录页默认不得展示 ApiBase、OsClient 或调试配置;但用户明确要求、且安装包由 Microi 平台方作为多租户聚合客户端发布时,允许仅在 `APP-PLUS` 登录页提供通用连接器。协议必须使用固定 `https://` / `http://` 下拉框,地址框禁止重复输入协议,HTTPS 默认,HTTP 显示明文风险并二次确认;H5、小程序和客户专属包不得因此自动开放。候选地址先匿名读取 `GetSysConfig`,验证成功后再持久化。真正切换时必须清除旧 DiyToken、用户、SignalR、菜单/元数据/页面缓存,按 `ApiBase + OsClient` 隔离记住的账号及 RSA 密文,并用端点代次拒绝切换前的迟到响应。支持任意 HTTP 时,最终 IPA 必须显式包含 ATS 例外,Android 安装包必须显式包含 cleartext 例外;不需要任意 HTTP 的正式包应保持平台默认安全策略,iOS ATS 例外还必须在 App Store 审核中说明。
|
|
19
|
+
|
|
20
|
+
<!-- microi-progressive:begin -->
|
|
13
21
|
<!-- microi-progressive:chunk id=microi-uniapp-frontend-000 sha256=ecb0fc85b5c3b15ac79c9049ca86de8c586d4ce3a6c975255464069d89f87ac4 -->
|
|
14
22
|
## 移动端质量门禁必须先读
|
|
15
23
|
|
|
@@ -10,8 +10,33 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
|
|
|
10
10
|
你正在为 Microi 吾码平台编写文件上传/下载/返回相关代码。平台分布式存储(HDFS)支持阿里云OSS、MinIO、亚马逊S3,存储方案由 SaaS 引擎按租户配置。
|
|
11
11
|
|
|
12
12
|
公开入口覆盖 `V8.uploadFile`、多文件 `V8.uploadFiles` 与 MCP `microi_upload_file_base64`。多文件上传必须限制并发、逐文件返回结果;Base64 工具只接受明确文件名、大小和租户内目标范围,写后回读路径、大小与哈希。
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
|
|
14
|
+
## 交互式图片默认压缩(强制)
|
|
15
|
+
|
|
16
|
+
- `ImgUpload`、PC、UniApp/H5/小程序以及 MCP 普通图片上传在未显式传 `Preview` 时,必须按 `Preview=true` 处理;字段设计器新配置默认开启。只有业务明确要求公开原始画质时才允许显式关闭,不能把“客户端漏传”解释为关闭。
|
|
17
|
+
- 默认展示图目标为不超过约 `500 KB`、最长边不超过 `1920 px`;可按真实用途进一步收紧。压缩必须使用 Windows/Linux/容器一致的跨平台实现,并限制输入字节、像素总量与解码并发,避免超大图触发 OOM。
|
|
18
|
+
- 压缩流程固定为“先将原始字节写入当前租户 HDFS 私有桶的 `_origin` 对象 → 生成压缩展示图 → 写入目标公有/私有位置 → 回读大小与格式”。即使展示图是公有资源,原图也只能保存在私有桶。
|
|
19
|
+
- 压缩、解码或编码失败时必须失败关闭,返回可诊断错误;禁止静默把几十 MB 的未压缩原图发布到公有桶。返回字段中的 `Size` 应表示展示图实际字节数,`OriginalSize` 可用于管理员审计,但业务字段不得保存私有桶真实地址或签名 URL。
|
|
20
|
+
- 历史治理只迁移超过目标体积的图片:先为旧对象补齐私有原图副本,再上传压缩展示图、原子更新全部业务引用并逐条回读。确认没有引用后才删除旧公有对象;批量任务要有清单、检查点、幂等映射和失败重试,不能边扫描边不可逆覆盖。
|
|
21
|
+
|
|
22
|
+
## 表单引擎图片裁剪(强制)
|
|
23
|
+
|
|
24
|
+
- `ImgUpload.Crop` 支持 `Enabled`、`Mode=free/fixed/select`、`Ratio`、`CustomWidth/CustomHeight`以及 `AllowZoom/AllowRotate/AllowFlip`。`Enabled` 只表示表单用户的默认状态,不得当作裁剪能力总开关;新增/编辑表单把裁剪开关合并到紧凑上传面板,旁边同时显示公有/私有桶、单/多图与最大数量、压缩状态和最大体积。旧字段未配置时该开关默认关闭,但用户仍可主动开启。
|
|
25
|
+
- 裁剪弹层必须同时提供“取消本次上传”“不裁剪直接上传”“应用裁剪并上传”三个不同动作。多图选择按队列逐张处理;直接上传只跳过当前图片的裁剪,不能取消或阻塞后续图片。
|
|
26
|
+
- 多图模式下后端可能为每个单文件请求返回 `Data: [{...}]`,单图模式返回 `Data: {...}`。PC/移动端必须先归一化对象/数组,再按客户端 `uid` 替换上传占位项并生成预览 URL,禁止把接口成功误显示成空列表。
|
|
27
|
+
- 开启裁剪时,前端必须上传最终裁剪图,并在同一 multipart 请求中以 `MicroiOriginalFile` 附带同名、未改动的原图及 `CropEnabled=true`。不得仅传坐标后由后端重演,否则 EXIF 方向、旋转或镜像可能导致前后端结果不一致。
|
|
28
|
+
- 后端必须校验裁剪图与原图一一同名,两者字节数都计入单次限制和每日配额,但原图不计为第二个业务文件。未宣告裁剪却传原图、宣告裁剪却漏传/错配原图都要失败关闭。
|
|
29
|
+
- HDFS 写入顺序固定为“未改动原图写入私有 `_origin` 对象 → 可选压缩裁剪图 → 写入业务展示图”。裁剪原图写入失败时不得发布展示图;即使 `Preview=false`,裁剪原图仍必须私有保留。不得返回或持久化原图真实路径。
|
|
30
|
+
|
|
31
|
+
## 富文本图片、视频与附件(强制)
|
|
32
|
+
|
|
33
|
+
- `RichText.Limit=false` 只用于需匿名长期访问的官网公告、商品详情等公开正文;内部内容用 `true`。普通交互式帐号即使传 `false`,后端仍可按安全策略强制私有,客户端必须以上传响应的实际 `Limit` 为准。
|
|
34
|
+
- RichText 分别配置 `Image`、`Video`、`File` 的 `Enabled/MaxSize/MaxCount`;图片另传 `Preview/CompressMaxSize/CompressMaxWidth`,并继续遵循“原图私有、展示图公有或私有”的压缩链路。附件类型白名单用 `File.Accept` 进一步收紧,不能放宽服务端白名单。
|
|
35
|
+
- 私有正文持久化 `/__microi_richtext_private__/...` 稳定对象标识,严禁保存对象存储签名 URL、`OpenPrivateFile` Ticket、DiyToken 或其它会过期的凭据。每次打开记录时携带 `FormEngineKey/FormDataId/FieldId/SysMenuId` 批量换取短效审计代理地址。
|
|
36
|
+
- 私有文件后端授权必须重新校验当前租户、菜单、表、行和 RichText 字段,并确认所请求路径精确存在于 `img/video/source.src` 或 `a.href`;正文文字、`data-src/data-href`、脚本标签和前缀相似路径都必须失败关闭。
|
|
37
|
+
- 外部匿名页面没有后台记录权限上下文,不能解析私有标识。公开文章必须由有权发布公有资产的超级管理员显式使用公有桶,不得通过延长私有 URL 有效期模拟公开资源。
|
|
38
|
+
|
|
39
|
+
<!-- microi-progressive:begin -->
|
|
15
40
|
<!-- microi-progressive:chunk id=v8-file-upload-000 sha256=b48ce09f93a43efd30e700af637db3881355e8d2baaf45165ea2bd0bdfda25cf -->
|
|
16
41
|
## 核心 API
|
|
17
42
|
|
|
@@ -87,7 +112,7 @@ Unity `Data`、WASM、Windows 安装包、视频模型等发布资产不得进
|
|
|
87
112
|
1. **租户业务配置**:有效正数/布尔值按 `sys_osclients` 当前租户 → 代码默认值解析。租户可以按业务需要提高或降低默认值,不要求安装者维护额外环境变量或修改 `appsettings`。
|
|
88
113
|
2. **平台绝对上限**:最终业务值再与代码内固定灾难保护上限取较小值,租户和安装参数都不能放大。
|
|
89
114
|
3. **HTTP 解析上限**:Kestrel 请求正文与 Multipart 固定为 2048 MB,普通表单单值固定为 128 MB,是所有租户共享的请求解析硬顶。
|
|
90
|
-
4. **字段级限制**:前端 `FileUpload` / `ImgUpload` 的 `MaxSize`、`MaxCount` 等只能与当前租户有效值取更小值,不能提高后端上限,也不能替代服务端校验。
|
|
115
|
+
4. **字段级限制**:前端 `FileUpload` / `ImgUpload` / `RichText` 的 `MaxSize`、`MaxCount` 等只能与当前租户有效值取更小值,不能提高后端上限,也不能替代服务端校验。
|
|
91
116
|
|
|
92
117
|
业务配置与固定边界:
|
|
93
118
|
|
|
@@ -134,7 +134,7 @@ var url = V8.Method.GetPrivateFileUrl({
|
|
|
134
134
|
```
|
|
135
135
|
|
|
136
136
|
- 普通客户端调用 `/api/HDFS/GetPrivateFileUrl` 时,不能只提交 `FilePathName`,必须同时提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId`。服务端校验菜单、菜单绑定表、记录数据范围、字段归属以及字段值确实引用该路径后,才签发临时票据。
|
|
137
|
-
- `FieldId` 必须属于目标表,且组件为 `FileUpload` 或 `
|
|
137
|
+
- `FieldId` 必须属于目标表,且组件为 `FileUpload`、`ImgUpload` 或 `RichText`;`SysMenuId` 必须是当前用户真实拥有、并绑定目标表的菜单。RichText 还必须在真实 `img/video/source.src` 或 `a.href` 中精确引用请求路径,普通文字、`data-*` 和脚本标签不算授权依据。
|
|
138
138
|
- 普通用户禁止通过该入口直接取得私有文件 `Byte` / `Stream`。签发失败时不能回退裸路径、真实对象存储签名地址或公有 URL。
|
|
139
139
|
- 私有文件访问必须经过后端短期票据代理:签发链接时记录当前登录用户,实际 `GET/HEAD` 打开或下载时再记录一次访问行为;支持 `Range` 流式响应,并对同一次分片请求做短时去重,不能把文件完整读入内存。
|
|
140
140
|
- 审计代理由平台后端回源对象存储,必须使用服务端内网端点生成上游地址,不能先生成公网 MinIO 签名地址再让后端绕公网回源。否则同一对象经内网上传成功后,可能在公网端点表现为 404。
|
|
@@ -119,6 +119,10 @@ AI 在工作区任意任务中生成的**一次性临时脚本、诊断文件、
|
|
|
119
119
|
| 吾码后台系统前端移动端自适应源码 | `Microi.Client/src/views/mobile/` |
|
|
120
120
|
| 吾码低代码后端源码 | `Microi.Server/` |
|
|
121
121
|
| 吾码表单引擎源码 | `Microi.Client/src/views/form-engine/` |
|
|
122
|
+
| 吾码表单设计器源码 | `Microi.Client/src/views/form-engine/diy-design.vue` |
|
|
123
|
+
| 吾码数据表格渲染源码 | `Microi.Client/src/views/form-engine/diy-table.vue` |
|
|
124
|
+
| 吾码表单渲染源码 | `Microi.Client/src/views/form-engine/diy-form.vue` |
|
|
125
|
+
| 吾码地图控件源码 | `Microi.Client/src/views/form-engine/diy-field-component/diy-map.vue` |
|
|
122
126
|
| 吾码界面引擎源码 | `Microi.Client/src/views/page-engine/` |
|
|
123
127
|
| 吾码打印引擎源码 | `Microi.Client/src/views/print-engine/` |
|
|
124
128
|
| 吾码 App 源码 | `microi.app/` |
|
|
@@ -128,6 +132,13 @@ AI 在工作区任意任务中生成的**一次性临时脚本、诊断文件、
|
|
|
128
132
|
|
|
129
133
|
以上路径只作为通用工作区相对路径规范,不写入具体本机盘符。跨仓库、空工作区或普通用户项目中,如果路径不存在,以插件生成的 `AGENTS.md`、MCP 配置和实际文件树为准。
|
|
130
134
|
|
|
135
|
+
### 吾码创建人身份识别(强制)
|
|
136
|
+
|
|
137
|
+
- 每次开始处理吾码任务时,都先检查工作区根的 `Microi.Server/Microi.net/`:目录必须存在,并且 `rg --files Microi.Server/Microi.net` 至少返回一个真实源码文件,空目录不成立。满足条件即确认当前是“吾码创建人在官方完整源码工作区开发”;这是工作区级开发者身份标记,不要求本次代码恰好修改在该目录内。目录缺失或为空时按普通吾码用户工作区处理,不得假设拥有官方主库权限。
|
|
138
|
+
- 确认创建人身份后,处理平台基础能力的修改、构建或交付任务时,必须同时读取 `app-store` Skill,并把官方母版资源、对应平台应用数据包、应用商城发布及发布后回读纳入完成边界;不得只改源码、本地租户或本地 JSON 后结束。
|
|
139
|
+
- 触发表现包括但不限于:新增或修改系统设置、表、字段、Tab、菜单、权限、接口引擎、表单事件、数据源、页面、打印、工作流、任务、平台内置微服务及可幂等种子数据。先判断资源归属的一个或多个官方平台应用,基础空库包与存量租户增量应用都涉及时必须同时更新。
|
|
140
|
+
- 纯审查、解释和诊断任务保持只读;目录识别只决定交付链路和事实源,不授权与当前任务无关的线上写入。当前任务属于平台功能修改/交付且官方 `microi_itdos` 权限可用时,官方应用包发布与版本、状态、内容哈希回读属于正常收尾步骤,不得再次降级成可选建议。
|
|
141
|
+
|
|
131
142
|
每个 `AI应用/{appKey}` 必须只有一个可编辑事实源,统一承载界面、微服务、Manifest、接口引擎、资源策略、测试、构建脚本与商城上传素材。普通应用默认使用当前连接下的 `Microi-V8-Engine` 目录;受审计的官方内置应用若由独立 Git 仓库维护,必须由版本管理的发布契约唯一指向该源码根,并让构建、跨工程测试和发行包共同读取契约。此时同名 `Microi-V8-Engine` 目录只是远端同步镜像,不得回退为构建源。禁止靠目录探测在多份副本之间自动择新,也禁止另建无契约的 `microi.apps/` 平行发行根。
|
|
132
143
|
|
|
133
144
|
<!-- /microi-progressive:chunk -->
|