@microi.net/cli 6.0.5 → 6.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "6.0.5",
8
+ "version": "6.0.6",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "6.0.5",
14
+ "version": "6.0.6",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.0.5",
3
+ "version": "6.0.6",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.0.5",
3
+ "version": "6.0.6",
4
4
  "description": "Microi吾码低代码平台的 Codex 开发插件,共享 VS Code/CLI 的连接、同步、MCP、V8 与交付能力。",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -5,13 +5,13 @@
5
5
  "url": "https://microi.net"
6
6
  },
7
7
  "description": "Microi吾码官方 AI 插件市场",
8
- "version": "6.0.5",
8
+ "version": "6.0.6",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "microi",
12
12
  "source": ".",
13
13
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
14
- "version": "6.0.5",
14
+ "version": "6.0.6",
15
15
  "strict": true
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microi",
3
- "version": "6.0.5",
3
+ "version": "6.0.6",
4
4
  "description": "Microi吾码 AI 开发插件:服务器连接、Skills、MCP、V8 全量同步与低代码交付",
5
5
  "author": {
6
6
  "name": "Microi.Net",
@@ -1,6 +1,6 @@
1
1
  {
2
- "builtAt": "2026-10-19T11:47:57.446Z",
3
- "version": "6.0.5",
2
+ "builtAt": "2026-10-19T12:07:39.370Z",
3
+ "version": "6.0.6",
4
4
  "sourceProducts": [
5
5
  "vscode-extension",
6
6
  "microi-cli",
@@ -14,6 +14,6 @@
14
14
  "cli": "57c0f273f38740675e705d796107d61eaa5080b411060567eb19f17e1677a87b",
15
15
  "router": "a65a0a9466c4bcfc1cee2a7182c77e4e73ae3221198abd0a0670f1d847fa2938",
16
16
  "broker": "ed04bbcc5bc7d62e447d82946889d1f72af653a9016675f81a01ef6cd88051b0",
17
- "dshBundle": "02b4d55f8792e4e8deb3b22f6005e797b9cfd6cdee7d11ab74de3d60a2382e64"
17
+ "dshBundle": "08a14ee7c53c792d68e12e1fbffa962924272bdcc76b5a105c43796295713acb"
18
18
  }
19
19
  }
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","/*\r\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\r\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\r\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\r\n */\r\nconst fs = require('node:fs');\r\nconst os = require('node:os');\r\nconst path = require('node:path');\r\nconst packageName = '@microi.net/cli';\r\nconst expectedVersion = '6.0.5';\r\n\r\nfunction readJson(filePath) {\r\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\r\n catch { return undefined; }\r\n}\r\n\r\nfunction expandHome(value) {\r\n if (value === '~') return os.homedir();\r\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\r\n return value;\r\n}\r\n\r\nfunction validRoot(value) {\r\n const root = path.resolve(value);\r\n const pkg = readJson(path.join(root, 'package.json'));\r\n const patch = path.join(root, 'cordis.patch.yml');\r\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\r\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\r\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\r\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\r\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\r\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\r\n}\r\n\r\nfunction findPlugin() {\r\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\r\n if (explicit) {\r\n const plugin = validRoot(explicit);\r\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\r\n return plugin;\r\n }\r\n const configuredHome = String(process.env.DSH_HOME || '').trim();\r\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\r\n const profilesRoot = path.join(dshHome, 'profiles');\r\n const candidates = [];\r\n if (fs.existsSync(profilesRoot)) {\r\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\r\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\r\n const plugin = validRoot(root);\r\n if (plugin) candidates.push(plugin);\r\n }\r\n }\r\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\r\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\r\n return candidates[0];\r\n}\r\n\r\ntry {\r\n const plugin = findPlugin();\r\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_TOOL_SOURCE = 'dsh';\r\n process.env.MICROI_TOOL_VERSION = expectedVersion;\r\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\r\n process.argv[2] = plugin.router;\r\n require(plugin.adapter);\r\n} catch (error) {\r\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\r\n process.exit(1);\r\n}\r\n"]
10
+ args: ["-e","/*\r\n * DeepSeek Harness 通过 profile bundle 加载此 `node -e` 引导脚本。\r\n * DSH 不保证 MCP 子进程 cwd 位于 npm 包根,因此按 DSH_HOME/profile 定位\r\n * 当前版本的 @microi.net/cli,再复用 Codex 同源适配器与多连接路由器。\r\n */\r\nconst fs = require('node:fs');\r\nconst os = require('node:os');\r\nconst path = require('node:path');\r\nconst packageName = '@microi.net/cli';\r\nconst expectedVersion = '6.0.6';\r\n\r\nfunction readJson(filePath) {\r\n try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }\r\n catch { return undefined; }\r\n}\r\n\r\nfunction expandHome(value) {\r\n if (value === '~') return os.homedir();\r\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\r\n return value;\r\n}\r\n\r\nfunction validRoot(value) {\r\n const root = path.resolve(value);\r\n const pkg = readJson(path.join(root, 'package.json'));\r\n const patch = path.join(root, 'cordis.patch.yml');\r\n const adapter = path.join(root, 'scripts', 'mcp-codex-stdio-adapter.js');\r\n const router = path.join(root, 'scripts', 'microi-codex-router.js');\r\n if (pkg?.name !== packageName || pkg?.version !== expectedVersion) return undefined;\r\n if (pkg?.dsh?.bundle?.patch !== './cordis.patch.yml') return undefined;\r\n if (![patch, adapter, router].every(filePath => fs.existsSync(filePath))) return undefined;\r\n return { root: fs.realpathSync(root), adapter, router, modifiedAt: fs.statSync(router).mtimeMs };\r\n}\r\n\r\nfunction findPlugin() {\r\n const explicit = String(process.env.MICROI_DSH_PLUGIN_ROOT || '').trim();\r\n if (explicit) {\r\n const plugin = validRoot(explicit);\r\n if (!plugin) throw new Error(`MICROI_DSH_PLUGIN_ROOT 不是版本 ${expectedVersion} 的有效 Microi DSH bundle:${explicit}`);\r\n return plugin;\r\n }\r\n const configuredHome = String(process.env.DSH_HOME || '').trim();\r\n const dshHome = path.resolve(expandHome(configuredHome || path.join(os.homedir(), '.dsh')));\r\n const profilesRoot = path.join(dshHome, 'profiles');\r\n const candidates = [];\r\n if (fs.existsSync(profilesRoot)) {\r\n for (const entry of fs.readdirSync(profilesRoot, { withFileTypes: true })) {\r\n if (!entry.isDirectory() || entry.name === 'node_modules') continue;\r\n const root = path.join(profilesRoot, entry.name, 'node_modules', '@microi.net', 'cli');\r\n const plugin = validRoot(root);\r\n if (plugin) candidates.push(plugin);\r\n }\r\n }\r\n candidates.sort((left, right) => right.modifiedAt - left.modifiedAt);\r\n if (!candidates[0]) throw new Error(`未在 ${profilesRoot} 找到版本 ${expectedVersion} 的 ${packageName}`);\r\n return candidates[0];\r\n}\r\n\r\ntry {\r\n const plugin = findPlugin();\r\n process.env.MICROI_DSH_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_CODEX_PLUGIN_ROOT = plugin.root;\r\n process.env.MICROI_TOOL_SOURCE = 'dsh';\r\n process.env.MICROI_TOOL_VERSION = expectedVersion;\r\n process.env.MICROI_WORKSPACE_ROOT = process.env.MICROI_WORKSPACE_ROOT || process.cwd();\r\n process.argv[2] = plugin.router;\r\n require(plugin.adapter);\r\n} catch (error) {\r\n console.error(`[microi-dsh-bootstrap] ${error instanceof Error ? error.message : String(error)}`);\r\n process.exit(1);\r\n}\r\n"]
11
11
  env:
12
12
  MICROI_TOOL_SOURCE: dsh
13
13
  cwd: !!js process.cwd()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microi.net/cli",
3
- "version": "6.0.5",
3
+ "version": "6.0.6",
4
4
  "description": "Microi吾码 AI 开发 CLI 与多宿主 Plugin:服务器连接、Skills、MCP、V8 同步和低代码交付",
5
5
  "license": "MIT",
6
6
  "homepage": "https://microi.net/doc/v8-engine/vs-code-plugin.html",
@@ -1,13 +1,13 @@
1
1
  {
2
- "builtAt": "2026-10-19T11:47:56.399Z",
2
+ "builtAt": "2026-10-19T12:07:36.317Z",
3
3
  "source": "../microi.skills",
4
4
  "extension": {
5
5
  "name": "v8-engine",
6
- "version": "6.0.5",
6
+ "version": "6.0.6",
7
7
  "publisher": "Microi"
8
8
  },
9
9
  "skills": {
10
- "version": "6.0.5",
10
+ "version": "6.0.6",
11
11
  "versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
12
12
  "managedBy": "Microi.Agent/bump-version.js"
13
13
  },
@@ -15,11 +15,11 @@
15
15
  "dir": "dist/microi.skills",
16
16
  "files": 197,
17
17
  "skills": 68,
18
- "bytes": 2885450
18
+ "bytes": 2888134
19
19
  },
20
20
  "fileHashes": {
21
- ".microi-skills-version.json": "4446f17ee881f286ee78df84a94f6b06742b6bcd8c3b8f8bc39b37562713b72f",
22
- ".progressive-disclosure-manifest.json": "540f8d236f0cb9ac6e198fba962ac48aa4a5b87f9a711252e466cb7d32736a64",
21
+ ".microi-skills-version.json": "9a7570cfd8d1cb70e7745d551f1a682f93c8435f11dbeb1e4022684d3fcd5c77",
22
+ ".progressive-disclosure-manifest.json": "043351d0b9ed7ba8850c3afd6e646dfcd9950b9a1b22b16212c26b94251dd831",
23
23
  "README.md": "d50588345f5d2a81d3c8faaea5362c4a9ef4cfaef97b7bc4d2dbee4ef6f0906f",
24
24
  "ai-engine/SKILL.md": "a353efd86513c74985b3825570913ef99ab9b60eed5d9268e13f1b10ffac3e6a",
25
25
  "ai-engine/agents/openai.yaml": "40deb07801006a46b9a7f0020d13251955eeadd04c8e591160210479936f8b5b",
@@ -60,7 +60,7 @@
60
60
  "microi-db-schema/references/schema-overview.md": "4a27624ad23000b8e66d4f42d4419b82e46cd6d0249ac8ceba9566e8031cd75b",
61
61
  "microi-db-schema/references/schema.md": "25dcf80e2b43b2e5635520004227c4f684913cb59f1f56e08d1359443f149564",
62
62
  "microi-db-schema/references/table-catalog.md": "f51e34ce402c28822a8b68f8ad5a67fdb94efaec559d5f07bb1f765a7f73c928",
63
- "microi-deployment/SKILL.md": "e0744e457a9100befe4dfdc3a31cad44cf0fc657fa3c48d660bc750dfe7ce182",
63
+ "microi-deployment/SKILL.md": "9ca25a518d87372781fe13d4ef9516e0ff5b9968aa06c21045f85c21fdb8cadf",
64
64
  "microi-deployment/references/deployment-matrix.md": "d9d453842b5fa9ff932e285336cd8f40d45a306f0948f4ab2b9cdf3d19ba9182",
65
65
  "microi-docs-coverage/SKILL.md": "be4465f10baa340e1d544326a1ffd062560234965902dcc4f4d923013b26b46c",
66
66
  "microi-docs-coverage/references/capability-map.md": "122fe9dd02806ba8188c4816d98afc8976857712bf490057d710f0e4a20f92c8",
@@ -108,7 +108,7 @@
108
108
  "page-engine/references/progressive-01-所有组件类型.md": "086c764dda3dffe5ca4fc563af2d7a3a2b82b67edb7947271c2b3145c9995e57",
109
109
  "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "55843def83278e889b944a0b4e8cf74cf8b702010b62dd834a0273484e48c2c0",
110
110
  "performance-testing/SKILL.md": "be3b79cbc2bec7a0d28b67fe4dba3dea0a1c17486f96548900a8b5e9760d4317",
111
- "playwright-e2e/SKILL.md": "99ad3167400d4abd57302ff49bfc4fbd8d0ce0cf97d7412deb4d6324dcf92c1f",
111
+ "playwright-e2e/SKILL.md": "996f33bbbad3c5553a46f5f77ee963ec26f2753cd4e72fc677aea499cc63a561",
112
112
  "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "553538c8b9b4fe05efb98e4c0b4090d2f73d5d09ed4d7968660fe435254fcd37",
113
113
  "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "f637eee77e26fe792a22cc2646e2ed4519e32d19bd577509fa8857ceaa6b59c3",
114
114
  "playwright-e2e/references/progressive-03-microi-helper-模板.md": "5b95e215ab927835e2290df4425a879c6e54d5e1fc11d0759d6dc3cd6c754315",
@@ -210,210 +210,210 @@
210
210
  "vision-engine/SKILL.md": "54d36d3e0dcfe9077a760fa41a3caf8d68fb5c9e0a7b4421b8d40d5ae085b226",
211
211
  "vision-engine/agents/openai.yaml": "df86e872fb640346958114aa6dc78bba70ed1b26a30948976109b1f194e7da21",
212
212
  "vision-engine/references/architecture-and-acceptance.md": "8209a91c2d2958ddf0036f861732483c15ca868931152280b79e95f407df2ccd",
213
- "workspace-conventions/SKILL.md": "95b226901685eae605080ba711201585d23d3e097fa0969fa0f9b82c06befd5f",
213
+ "workspace-conventions/SKILL.md": "546e3ca15210b74d819b1a3c6aa0d7e3122cb7ea6d159cdef6598c3eb817a28e",
214
214
  "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "4edd25be859262bcdea83bbb5c608722bf281c06658c11939156d180def3dcf2",
215
- "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "faeeb49953af7c66395c54e36c81d7fe1d2de616ac6e60a71ca77d9a1313d5a4",
215
+ "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "3a19827298211b2ed3897c4e8e9006698613669bfd97053ce3a634016d80ffb8",
216
216
  "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "89c7ee0fe75fae711bf887d2f123365d02f9b65f73e002098bdae97a63417d0a",
217
- "workspace-conventions/references/progressive-04-工作区与平台专项保障.md": "41aaa6314c5c84749f4e70a9fc339e441dbf053ee6f4ac92498915cfe2473191"
217
+ "workspace-conventions/references/progressive-04-工作区与平台专项保障.md": "d0cca4351847f0e6402225ee57f344ffa6ee847a912be2c3a652d0dcc6516743"
218
218
  },
219
219
  "fileVersions": {
220
- ".microi-skills-version.json": "6.0.5",
221
- ".progressive-disclosure-manifest.json": "6.0.5",
222
- "README.md": "6.0.5",
223
- "ai-engine/SKILL.md": "6.0.5",
224
- "ai-engine/agents/openai.yaml": "6.0.5",
225
- "ai-engine/references/ai-employees.md": "6.0.5",
226
- "ai-engine/references/self-hosted-digital-human.md": "6.0.5",
227
- "ai-platform-governance/SKILL.md": "6.0.5",
228
- "ai-platform-governance/references/progressive-01-功能开关.md": "6.0.5",
229
- "app-store/SKILL.md": "6.0.5",
230
- "app-store/agents/openai.yaml": "6.0.5",
231
- "business-blueprint/SKILL.md": "6.0.5",
232
- "datasource-engine/SKILL.md": "6.0.5",
233
- "datasource-engine/agents/openai.yaml": "6.0.5",
234
- "dos-orm/SKILL.md": "6.0.5",
235
- "dos-orm/references/api-reference.md": "6.0.5",
236
- "email-engine/SKILL.md": "6.0.5",
237
- "email-engine/references/v8-email.md": "6.0.5",
238
- "job-engine/SKILL.md": "6.0.5",
239
- "job-engine/agents/openai.yaml": "6.0.5",
240
- "message-notification/SKILL.md": "6.0.5",
241
- "message-notification/agents/openai.yaml": "6.0.5",
242
- "message-notification/references/contracts.md": "6.0.5",
243
- "microi-ai-app-auth.js": "6.0.5",
244
- "microi-ai-application/SKILL.md": "6.0.5",
245
- "microi-ai-application/agents/openai.yaml": "6.0.5",
246
- "microi-ai-application/references/frontend-baseline.md": "6.0.5",
247
- "microi-client-frontend/SKILL.md": "6.0.5",
248
- "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "6.0.5",
249
- "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "6.0.5",
250
- "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "6.0.5",
251
- "microi-codex-installer/SKILL.md": "6.0.5",
252
- "microi-codex-installer/agents/openai.yaml": "6.0.5",
253
- "microi-codex/SKILL.md": "6.0.5",
254
- "microi-datasource-mapping/SKILL.md": "6.0.5",
255
- "microi-db-schema/SKILL.md": "6.0.5",
256
- "microi-db-schema/agents/openai.yaml": "6.0.5",
257
- "microi-db-schema/references/core-tables.md": "6.0.5",
258
- "microi-db-schema/references/form-component-options.md": "6.0.5",
259
- "microi-db-schema/references/schema-overview.md": "6.0.5",
260
- "microi-db-schema/references/schema.md": "6.0.5",
261
- "microi-db-schema/references/table-catalog.md": "6.0.5",
262
- "microi-deployment/SKILL.md": "6.0.5",
263
- "microi-deployment/references/deployment-matrix.md": "6.0.5",
264
- "microi-docs-coverage/SKILL.md": "6.0.5",
265
- "microi-docs-coverage/references/capability-map.md": "6.0.5",
266
- "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "6.0.5",
267
- "microi-form-engine/SKILL.md": "6.0.5",
268
- "microi-form-engine/references/component-catalog.md": "6.0.5",
269
- "microi-form-engine/references/data-source-events.md": "6.0.5",
270
- "microi-form-layout/SKILL.md": "6.0.5",
271
- "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "6.0.5",
272
- "microi-frontend-sdk/SKILL.md": "6.0.5",
273
- "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "6.0.5",
274
- "microi-left-right-layout/SKILL.md": "6.0.5",
275
- "microi-microservice/SKILL.md": "6.0.5",
276
- "microi-microservice/references/runtime-delivery.md": "6.0.5",
277
- "microi-mobile-app-quality/SKILL.md": "6.0.5",
278
- "microi-mobile-app-quality/references/mobile-first-delivery.md": "6.0.5",
279
- "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "6.0.5",
280
- "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "6.0.5",
281
- "microi-solution-quotation/SKILL.md": "6.0.5",
282
- "microi-solution-quotation/agents/openai.yaml": "6.0.5",
283
- "microi-solution-quotation/scripts/build_solution_quote.py": "6.0.5",
284
- "microi-sso/SKILL.md": "6.0.5",
285
- "microi-sso/references/acceptance.md": "6.0.5",
286
- "microi-sso/references/configuration-and-security.md": "6.0.5",
287
- "microi-sso/references/inbound.md": "6.0.5",
288
- "microi-sso/references/outbound.md": "6.0.5",
289
- "microi-system-delivery/SKILL.md": "6.0.5",
290
- "microi-system-delivery/references/context-quality.md": "6.0.5",
291
- "microi-system-delivery/references/progressive-01-标准工作流.md": "6.0.5",
292
- "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "6.0.5",
293
- "microi-system-delivery/references/progressive-03-安全与跨端验收.md": "6.0.5",
294
- "microi-ui/SKILL.md": "6.0.5",
295
- "microi-ui/references/progressive-01-移动端场景蓝图.md": "6.0.5",
296
- "microi-uniapp-frontend/SKILL.md": "6.0.5",
297
- "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "6.0.5",
298
- "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "6.0.5",
299
- "microi.v8.js": "6.0.5",
300
- "microi/SKILL.md": "6.0.5",
301
- "module-engine/SKILL.md": "6.0.5",
302
- "module-engine/references/module-config.md": "6.0.5",
303
- "ocr-engine/SKILL.md": "6.0.5",
304
- "ocr-engine/agents/openai.yaml": "6.0.5",
305
- "page-engine/SKILL.md": "6.0.5",
306
- "page-engine/examples/compact-dashboard.json": "6.0.5",
307
- "page-engine/references/progressive-01-所有组件类型.md": "6.0.5",
308
- "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "6.0.5",
309
- "performance-testing/SKILL.md": "6.0.5",
310
- "playwright-e2e/SKILL.md": "6.0.5",
311
- "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "6.0.5",
312
- "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "6.0.5",
313
- "playwright-e2e/references/progressive-03-microi-helper-模板.md": "6.0.5",
314
- "playwright-e2e/references/progressive-04-ci-建议.md": "6.0.5",
315
- "print-engine/SKILL.md": "6.0.5",
316
- "production-readonly-audit/SKILL.md": "6.0.5",
317
- "report-engine/SKILL.md": "6.0.5",
318
- "report-engine/agents/openai.yaml": "6.0.5",
319
- "scripts/optimize-progressive-disclosure.mjs": "6.0.5",
320
- "scripts/refresh-progressive-disclosure.mjs": "6.0.5",
321
- "scripts/sync-embedded-skills.mjs": "6.0.5",
322
- "scripts/validate-progressive-disclosure.mjs": "6.0.5",
323
- "scripts/validate-progressive-disclosure.test.mjs": "6.0.5",
324
- "search-engine/SKILL.md": "6.0.5",
325
- "search-engine/agents/openai.yaml": "6.0.5",
326
- "spider-engine/SKILL.md": "6.0.5",
327
- "system-observability/SKILL.md": "6.0.5",
328
- "system-observability/references/memory-incident-triage.md": "6.0.5",
329
- "translate-engine/SKILL.md": "6.0.5",
330
- "translate-engine/agents/openai.yaml": "6.0.5",
331
- "ui-design/SKILL.md": "6.0.5",
332
- "ui-design/assets/pattern-showcase/app.js": "6.0.5",
333
- "ui-design/assets/pattern-showcase/index.html": "6.0.5",
334
- "ui-design/assets/pattern-showcase/styles.css": "6.0.5",
335
- "ui-design/assets/templates/MCI-DESIGN.md": "6.0.5",
336
- "ui-design/references/design-pattern-library.md": "6.0.5",
337
- "ui-design/references/mci-design-contract.md": "6.0.5",
338
- "ui-design/references/motion-and-media.md": "6.0.5",
339
- "ui-design/references/product-flow-recipes.md": "6.0.5",
340
- "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "6.0.5",
341
- "ui-design/references/progressive-02-字体.md": "6.0.5",
342
- "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "6.0.5",
343
- "ui-design/references/progressive-04-组件风格速查.md": "6.0.5",
344
- "ui-design/references/progressive-05-移动端专用规范.md": "6.0.5",
345
- "ui-design/references/progressive-06-主题切换实现.md": "6.0.5",
346
- "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "6.0.5",
347
- "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "6.0.5",
348
- "uniapp-mall-assets/SKILL.md": "6.0.5",
349
- "unity-integration/SKILL.md": "6.0.5",
350
- "unity-integration/agents/openai.yaml": "6.0.5",
351
- "unity-integration/references/ai-app-delivery.md": "6.0.5",
352
- "unity-integration/references/sdk-api.md": "6.0.5",
353
- "unity-integration/references/toolbox-migration.md": "6.0.5",
354
- "unity-integration/references/webgl-hosting.md": "6.0.5",
355
- "v8-api-config/SKILL.md": "6.0.5",
356
- "v8-cache-pattern/SKILL.md": "6.0.5",
357
- "v8-crud-api/SKILL.md": "6.0.5",
358
- "v8-crud-api/references/progressive-01-查询列表-分页.md": "6.0.5",
359
- "v8-crud-api/references/progressive-02-where-条件语法速查.md": "6.0.5",
360
- "v8-debugging/SKILL.md": "6.0.5",
361
- "v8-explorer-tree/SKILL.md": "6.0.5",
362
- "v8-export-import/SKILL.md": "6.0.5",
363
- "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "6.0.5",
364
- "v8-export-import/references/progressive-02-powerpoint-导出.md": "6.0.5",
365
- "v8-export-import/references/progressive-03-安全-性能注意.md": "6.0.5",
366
- "v8-file-upload/SKILL.md": "6.0.5",
367
- "v8-file-upload/references/cdn-alias-repair.md": "6.0.5",
368
- "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "6.0.5",
369
- "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "6.0.5",
370
- "v8-file-upload/references/progressive-03-空目录标记与远程下载.md": "6.0.5",
371
- "v8-formengine-http/SKILL.md": "6.0.5",
372
- "v8-frontend-events/SKILL.md": "6.0.5",
373
- "v8-frontend-events/references/bluetooth-print-api.md": "6.0.5",
374
- "v8-frontend-events/references/bluetooth-print.md": "6.0.5",
375
- "v8-frontend-events/references/progressive-01-列表事件.md": "6.0.5",
376
- "v8-http-integration/SKILL.md": "6.0.5",
377
- "v8-http-integration/references/progressive-01-get-请求.md": "6.0.5",
378
- "v8-http-integration/references/progressive-02-错误处理模式.md": "6.0.5",
379
- "v8-image-processing/SKILL.md": "6.0.5",
380
- "v8-image-processing/agents/openai.yaml": "6.0.5",
381
- "v8-image-processing/references/api-reference.md": "6.0.5",
382
- "v8-menu-buttons/SKILL.md": "6.0.5",
383
- "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "6.0.5",
384
- "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "6.0.5",
385
- "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "6.0.5",
386
- "v8-mongodb/SKILL.md": "6.0.5",
387
- "v8-mq-mqtt/SKILL.md": "6.0.5",
388
- "v8-mq-mqtt/references/mqtt-production.md": "6.0.5",
389
- "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "6.0.5",
390
- "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "6.0.5",
391
- "v8-saas-multi-tenant/SKILL.md": "6.0.5",
392
- "v8-security/SKILL.md": "6.0.5",
393
- "v8-security/references/progressive-01-2-权限校验.md": "6.0.5",
394
- "v8-security/references/progressive-02-7-日志记录.md": "6.0.5",
395
- "v8-sql-query/SKILL.md": "6.0.5",
396
- "v8-table-event/SKILL.md": "6.0.5",
397
- "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "6.0.5",
398
- "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "6.0.5",
399
- "v8-tcp-integration/SKILL.md": "6.0.5",
400
- "v8-tcp-integration/agents/openai.yaml": "6.0.5",
401
- "v8-template-engine/SKILL.md": "6.0.5",
402
- "v8-utilities/SKILL.md": "6.0.5",
403
- "v8-utilities/references/client-api-index.md": "6.0.5",
404
- "v8-utilities/references/platform-http-routes.md": "6.0.5",
405
- "v8-utilities/references/server-api-index.md": "6.0.5",
406
- "v8-workflow/SKILL.md": "6.0.5",
407
- "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "6.0.5",
408
- "v8-workflow/references/workflow-configuration.md": "6.0.5",
409
- "vision-engine/SKILL.md": "6.0.5",
410
- "vision-engine/agents/openai.yaml": "6.0.5",
411
- "vision-engine/references/architecture-and-acceptance.md": "6.0.5",
412
- "workspace-conventions/SKILL.md": "6.0.5",
413
- "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "6.0.5",
414
- "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "6.0.5",
415
- "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "6.0.5",
416
- "workspace-conventions/references/progressive-04-工作区与平台专项保障.md": "6.0.5"
220
+ ".microi-skills-version.json": "6.0.6",
221
+ ".progressive-disclosure-manifest.json": "6.0.6",
222
+ "README.md": "6.0.6",
223
+ "ai-engine/SKILL.md": "6.0.6",
224
+ "ai-engine/agents/openai.yaml": "6.0.6",
225
+ "ai-engine/references/ai-employees.md": "6.0.6",
226
+ "ai-engine/references/self-hosted-digital-human.md": "6.0.6",
227
+ "ai-platform-governance/SKILL.md": "6.0.6",
228
+ "ai-platform-governance/references/progressive-01-功能开关.md": "6.0.6",
229
+ "app-store/SKILL.md": "6.0.6",
230
+ "app-store/agents/openai.yaml": "6.0.6",
231
+ "business-blueprint/SKILL.md": "6.0.6",
232
+ "datasource-engine/SKILL.md": "6.0.6",
233
+ "datasource-engine/agents/openai.yaml": "6.0.6",
234
+ "dos-orm/SKILL.md": "6.0.6",
235
+ "dos-orm/references/api-reference.md": "6.0.6",
236
+ "email-engine/SKILL.md": "6.0.6",
237
+ "email-engine/references/v8-email.md": "6.0.6",
238
+ "job-engine/SKILL.md": "6.0.6",
239
+ "job-engine/agents/openai.yaml": "6.0.6",
240
+ "message-notification/SKILL.md": "6.0.6",
241
+ "message-notification/agents/openai.yaml": "6.0.6",
242
+ "message-notification/references/contracts.md": "6.0.6",
243
+ "microi-ai-app-auth.js": "6.0.6",
244
+ "microi-ai-application/SKILL.md": "6.0.6",
245
+ "microi-ai-application/agents/openai.yaml": "6.0.6",
246
+ "microi-ai-application/references/frontend-baseline.md": "6.0.6",
247
+ "microi-client-frontend/SKILL.md": "6.0.6",
248
+ "microi-client-frontend/references/progressive-01-3-动态按钮系统.md": "6.0.6",
249
+ "microi-client-frontend/references/progressive-02-8-运行时高频坑复盘.md": "6.0.6",
250
+ "microi-client-frontend/references/progressive-03-vue3-前端微服务宿主规则.md": "6.0.6",
251
+ "microi-codex-installer/SKILL.md": "6.0.6",
252
+ "microi-codex-installer/agents/openai.yaml": "6.0.6",
253
+ "microi-codex/SKILL.md": "6.0.6",
254
+ "microi-datasource-mapping/SKILL.md": "6.0.6",
255
+ "microi-db-schema/SKILL.md": "6.0.6",
256
+ "microi-db-schema/agents/openai.yaml": "6.0.6",
257
+ "microi-db-schema/references/core-tables.md": "6.0.6",
258
+ "microi-db-schema/references/form-component-options.md": "6.0.6",
259
+ "microi-db-schema/references/schema-overview.md": "6.0.6",
260
+ "microi-db-schema/references/schema.md": "6.0.6",
261
+ "microi-db-schema/references/table-catalog.md": "6.0.6",
262
+ "microi-deployment/SKILL.md": "6.0.6",
263
+ "microi-deployment/references/deployment-matrix.md": "6.0.6",
264
+ "microi-docs-coverage/SKILL.md": "6.0.6",
265
+ "microi-docs-coverage/references/capability-map.md": "6.0.6",
266
+ "microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs": "6.0.6",
267
+ "microi-form-engine/SKILL.md": "6.0.6",
268
+ "microi-form-engine/references/component-catalog.md": "6.0.6",
269
+ "microi-form-engine/references/data-source-events.md": "6.0.6",
270
+ "microi-form-layout/SKILL.md": "6.0.6",
271
+ "microi-form-layout/references/progressive-01-3-三种分组的存储与配置.md": "6.0.6",
272
+ "microi-frontend-sdk/SKILL.md": "6.0.6",
273
+ "microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md": "6.0.6",
274
+ "microi-left-right-layout/SKILL.md": "6.0.6",
275
+ "microi-microservice/SKILL.md": "6.0.6",
276
+ "microi-microservice/references/runtime-delivery.md": "6.0.6",
277
+ "microi-mobile-app-quality/SKILL.md": "6.0.6",
278
+ "microi-mobile-app-quality/references/mobile-first-delivery.md": "6.0.6",
279
+ "microi-mobile-app-quality/references/progressive-01-4-重要按钮必须带图标.md": "6.0.6",
280
+ "microi-mobile-app-quality/references/progressive-02-9-主题切换必须真实且全局生效.md": "6.0.6",
281
+ "microi-solution-quotation/SKILL.md": "6.0.6",
282
+ "microi-solution-quotation/agents/openai.yaml": "6.0.6",
283
+ "microi-solution-quotation/scripts/build_solution_quote.py": "6.0.6",
284
+ "microi-sso/SKILL.md": "6.0.6",
285
+ "microi-sso/references/acceptance.md": "6.0.6",
286
+ "microi-sso/references/configuration-and-security.md": "6.0.6",
287
+ "microi-sso/references/inbound.md": "6.0.6",
288
+ "microi-sso/references/outbound.md": "6.0.6",
289
+ "microi-system-delivery/SKILL.md": "6.0.6",
290
+ "microi-system-delivery/references/context-quality.md": "6.0.6",
291
+ "microi-system-delivery/references/progressive-01-标准工作流.md": "6.0.6",
292
+ "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md": "6.0.6",
293
+ "microi-system-delivery/references/progressive-03-安全与跨端验收.md": "6.0.6",
294
+ "microi-ui/SKILL.md": "6.0.6",
295
+ "microi-ui/references/progressive-01-移动端场景蓝图.md": "6.0.6",
296
+ "microi-uniapp-frontend/SKILL.md": "6.0.6",
297
+ "microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md": "6.0.6",
298
+ "microi-uniapp-frontend/references/progressive-02-关键业务资产不得默认选中.md": "6.0.6",
299
+ "microi.v8.js": "6.0.6",
300
+ "microi/SKILL.md": "6.0.6",
301
+ "module-engine/SKILL.md": "6.0.6",
302
+ "module-engine/references/module-config.md": "6.0.6",
303
+ "ocr-engine/SKILL.md": "6.0.6",
304
+ "ocr-engine/agents/openai.yaml": "6.0.6",
305
+ "page-engine/SKILL.md": "6.0.6",
306
+ "page-engine/examples/compact-dashboard.json": "6.0.6",
307
+ "page-engine/references/progressive-01-所有组件类型.md": "6.0.6",
308
+ "page-engine/references/progressive-02-版本历史-并发保存与回滚.md": "6.0.6",
309
+ "performance-testing/SKILL.md": "6.0.6",
310
+ "playwright-e2e/SKILL.md": "6.0.6",
311
+ "playwright-e2e/references/progressive-01-全自动登录-免验证码-但不免密码-必读.md": "6.0.6",
312
+ "playwright-e2e/references/progressive-02-文字对比度与可读性自动化检查-必做.md": "6.0.6",
313
+ "playwright-e2e/references/progressive-03-microi-helper-模板.md": "6.0.6",
314
+ "playwright-e2e/references/progressive-04-ci-建议.md": "6.0.6",
315
+ "print-engine/SKILL.md": "6.0.6",
316
+ "production-readonly-audit/SKILL.md": "6.0.6",
317
+ "report-engine/SKILL.md": "6.0.6",
318
+ "report-engine/agents/openai.yaml": "6.0.6",
319
+ "scripts/optimize-progressive-disclosure.mjs": "6.0.6",
320
+ "scripts/refresh-progressive-disclosure.mjs": "6.0.6",
321
+ "scripts/sync-embedded-skills.mjs": "6.0.6",
322
+ "scripts/validate-progressive-disclosure.mjs": "6.0.6",
323
+ "scripts/validate-progressive-disclosure.test.mjs": "6.0.6",
324
+ "search-engine/SKILL.md": "6.0.6",
325
+ "search-engine/agents/openai.yaml": "6.0.6",
326
+ "spider-engine/SKILL.md": "6.0.6",
327
+ "system-observability/SKILL.md": "6.0.6",
328
+ "system-observability/references/memory-incident-triage.md": "6.0.6",
329
+ "translate-engine/SKILL.md": "6.0.6",
330
+ "translate-engine/agents/openai.yaml": "6.0.6",
331
+ "ui-design/SKILL.md": "6.0.6",
332
+ "ui-design/assets/pattern-showcase/app.js": "6.0.6",
333
+ "ui-design/assets/pattern-showcase/index.html": "6.0.6",
334
+ "ui-design/assets/pattern-showcase/styles.css": "6.0.6",
335
+ "ui-design/assets/templates/MCI-DESIGN.md": "6.0.6",
336
+ "ui-design/references/design-pattern-library.md": "6.0.6",
337
+ "ui-design/references/mci-design-contract.md": "6.0.6",
338
+ "ui-design/references/motion-and-media.md": "6.0.6",
339
+ "ui-design/references/product-flow-recipes.md": "6.0.6",
340
+ "ui-design/references/progressive-01-颜色体系-css-variables-支持主题切换.md": "6.0.6",
341
+ "ui-design/references/progressive-02-字体.md": "6.0.6",
342
+ "ui-design/references/progressive-03-动效规范-丰富但不卡.md": "6.0.6",
343
+ "ui-design/references/progressive-04-组件风格速查.md": "6.0.6",
344
+ "ui-design/references/progressive-05-移动端专用规范.md": "6.0.6",
345
+ "ui-design/references/progressive-06-主题切换实现.md": "6.0.6",
346
+ "ui-design/references/progressive-07-速查-从头搭建一个移动端页面.md": "6.0.6",
347
+ "ui-design/references/progressive-08-表单分组规范-tabs-vs-collapsegroup-强制.md": "6.0.6",
348
+ "uniapp-mall-assets/SKILL.md": "6.0.6",
349
+ "unity-integration/SKILL.md": "6.0.6",
350
+ "unity-integration/agents/openai.yaml": "6.0.6",
351
+ "unity-integration/references/ai-app-delivery.md": "6.0.6",
352
+ "unity-integration/references/sdk-api.md": "6.0.6",
353
+ "unity-integration/references/toolbox-migration.md": "6.0.6",
354
+ "unity-integration/references/webgl-hosting.md": "6.0.6",
355
+ "v8-api-config/SKILL.md": "6.0.6",
356
+ "v8-cache-pattern/SKILL.md": "6.0.6",
357
+ "v8-crud-api/SKILL.md": "6.0.6",
358
+ "v8-crud-api/references/progressive-01-查询列表-分页.md": "6.0.6",
359
+ "v8-crud-api/references/progressive-02-where-条件语法速查.md": "6.0.6",
360
+ "v8-debugging/SKILL.md": "6.0.6",
361
+ "v8-explorer-tree/SKILL.md": "6.0.6",
362
+ "v8-export-import/SKILL.md": "6.0.6",
363
+ "v8-export-import/references/progressive-01-excellayout-高级自由布局.md": "6.0.6",
364
+ "v8-export-import/references/progressive-02-powerpoint-导出.md": "6.0.6",
365
+ "v8-export-import/references/progressive-03-安全-性能注意.md": "6.0.6",
366
+ "v8-file-upload/SKILL.md": "6.0.6",
367
+ "v8-file-upload/references/cdn-alias-repair.md": "6.0.6",
368
+ "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md": "6.0.6",
369
+ "v8-file-upload/references/progressive-02-office-文件在线编辑版本号规则.md": "6.0.6",
370
+ "v8-file-upload/references/progressive-03-空目录标记与远程下载.md": "6.0.6",
371
+ "v8-formengine-http/SKILL.md": "6.0.6",
372
+ "v8-frontend-events/SKILL.md": "6.0.6",
373
+ "v8-frontend-events/references/bluetooth-print-api.md": "6.0.6",
374
+ "v8-frontend-events/references/bluetooth-print.md": "6.0.6",
375
+ "v8-frontend-events/references/progressive-01-列表事件.md": "6.0.6",
376
+ "v8-http-integration/SKILL.md": "6.0.6",
377
+ "v8-http-integration/references/progressive-01-get-请求.md": "6.0.6",
378
+ "v8-http-integration/references/progressive-02-错误处理模式.md": "6.0.6",
379
+ "v8-image-processing/SKILL.md": "6.0.6",
380
+ "v8-image-processing/agents/openai.yaml": "6.0.6",
381
+ "v8-image-processing/references/api-reference.md": "6.0.6",
382
+ "v8-menu-buttons/SKILL.md": "6.0.6",
383
+ "v8-menu-buttons/references/progressive-01-2-按钮对象-schema.md": "6.0.6",
384
+ "v8-menu-buttons/references/progressive-02-8-模式-f-后台任务按钮-长任务.md": "6.0.6",
385
+ "v8-menu-buttons/references/progressive-03-10-反模式-避免.md": "6.0.6",
386
+ "v8-mongodb/SKILL.md": "6.0.6",
387
+ "v8-mq-mqtt/SKILL.md": "6.0.6",
388
+ "v8-mq-mqtt/references/mqtt-production.md": "6.0.6",
389
+ "v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-物联网.md": "6.0.6",
390
+ "v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs": "6.0.6",
391
+ "v8-saas-multi-tenant/SKILL.md": "6.0.6",
392
+ "v8-security/SKILL.md": "6.0.6",
393
+ "v8-security/references/progressive-01-2-权限校验.md": "6.0.6",
394
+ "v8-security/references/progressive-02-7-日志记录.md": "6.0.6",
395
+ "v8-sql-query/SKILL.md": "6.0.6",
396
+ "v8-table-event/SKILL.md": "6.0.6",
397
+ "v8-table-event/references/progressive-01-informv8-js-表单打开事件.md": "6.0.6",
398
+ "v8-table-event/references/progressive-02-前端事件名-v8-eventname-可能的值.md": "6.0.6",
399
+ "v8-tcp-integration/SKILL.md": "6.0.6",
400
+ "v8-tcp-integration/agents/openai.yaml": "6.0.6",
401
+ "v8-template-engine/SKILL.md": "6.0.6",
402
+ "v8-utilities/SKILL.md": "6.0.6",
403
+ "v8-utilities/references/client-api-index.md": "6.0.6",
404
+ "v8-utilities/references/platform-http-routes.md": "6.0.6",
405
+ "v8-utilities/references/server-api-index.md": "6.0.6",
406
+ "v8-workflow/SKILL.md": "6.0.6",
407
+ "v8-workflow/references/progressive-01-节点开始-v8-事件.md": "6.0.6",
408
+ "v8-workflow/references/workflow-configuration.md": "6.0.6",
409
+ "vision-engine/SKILL.md": "6.0.6",
410
+ "vision-engine/agents/openai.yaml": "6.0.6",
411
+ "vision-engine/references/architecture-and-acceptance.md": "6.0.6",
412
+ "workspace-conventions/SKILL.md": "6.0.6",
413
+ "workspace-conventions/references/progressive-01-版本更新日志保护规则-强制.md": "6.0.6",
414
+ "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md": "6.0.6",
415
+ "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md": "6.0.6",
416
+ "workspace-conventions/references/progressive-04-工作区与平台专项保障.md": "6.0.6"
417
417
  },
418
418
  "files": [
419
419
  ".microi-skills-version.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "6.0.5",
2
+ "version": "6.0.6",
3
3
  "versionRule": "Microi version uses three numeric parts. Each publish increments the last part; when a part exceeds 9 it carries to the previous part: 1.0.9 -> 1.1.0, 1.9.9 -> 2.0.0.",
4
4
  "managedBy": "Microi.Agent/bump-version.js",
5
- "updatedAt": "2026-10-19T11:47:51.205Z"
5
+ "updatedAt": "2026-10-19T12:07:30.199Z"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-10-19T11:47:12.751Z",
3
+ "generatedAt": "2026-10-19T12:05:07.180Z",
4
4
  "policy": {
5
5
  "maxEntryLines": 285,
6
6
  "referenceBudgetLines": 245,
@@ -1382,17 +1382,17 @@
1382
1382
  ]
1383
1383
  },
1384
1384
  "playwright-e2e": {
1385
- "originalSha256": "4d2bdb53447bf8bfca376f2861dd6828b4c07b3511503d5ab2bdb7eb1934f83e",
1386
- "originalLines": 813,
1387
- "prefixSha256": "f691ccb80a94c5e34216ed442e750c814cbc3c2f860d6ad69dc4349ec286e8e5",
1388
- "prefixBytes": 3679,
1389
- "entryLines": 205,
1385
+ "originalSha256": "a70cd402df73041f886f64ebd7eb315e23cae0ae1347a4806b533a63b30b2193",
1386
+ "originalLines": 815,
1387
+ "prefixSha256": "7a2f83e469bfc176ff5fccc556acff13ebc157cc820e5b5f1e776269f227653b",
1388
+ "prefixBytes": 3656,
1389
+ "entryLines": 207,
1390
1390
  "chunks": [
1391
1391
  {
1392
1392
  "id": "playwright-e2e-000",
1393
1393
  "ordinal": 0,
1394
1394
  "destination": "playwright-e2e/SKILL.md",
1395
- "sha256": "f04614f276c139cfa50b9e46e89857675c6dc5e7cf0cfbfde76d6e6dbe9746c9",
1395
+ "sha256": "a6ef528a2a940fd0f58efaee6b73eb5dbc159db93d95afedf41c7b8642536d18",
1396
1396
  "lines": 9,
1397
1397
  "heading": "是否需要 `-e2e` 后缀"
1398
1398
  },
@@ -1400,7 +1400,7 @@
1400
1400
  "id": "playwright-e2e-001",
1401
1401
  "ordinal": 1,
1402
1402
  "destination": "playwright-e2e/SKILL.md",
1403
- "sha256": "703786ae7a5a52cb39664f1c82de7fb7aa7dfece511046d3757da64918c23063",
1403
+ "sha256": "b3970a9a4603447651520667c05ab4ecfae01b65b3f752e9f318007c5e2699c1",
1404
1404
  "lines": 11,
1405
1405
  "heading": "适用范围"
1406
1406
  },
@@ -1408,7 +1408,7 @@
1408
1408
  "id": "playwright-e2e-002",
1409
1409
  "ordinal": 2,
1410
1410
  "destination": "playwright-e2e/SKILL.md",
1411
- "sha256": "acef3e589cf11f3c197ee0b0ccf56d96b3f286263d54161b3c260e07c2090ed0",
1411
+ "sha256": "5874137c92e16fd5cc729fd9c23d051caa3e64438fc7bee1d717ae9c5a0f2a90",
1412
1412
  "lines": 20,
1413
1413
  "heading": "临时文件与产物放置规则(必须遵守)"
1414
1414
  },
@@ -1416,7 +1416,7 @@
1416
1416
  "id": "playwright-e2e-003",
1417
1417
  "ordinal": 3,
1418
1418
  "destination": "playwright-e2e/SKILL.md",
1419
- "sha256": "69b8842a221a0de60f8605c5059deee391be0f16f0b6cbc5ddfb3cfd210268db",
1419
+ "sha256": "247ddb9017c174f0daa88d1f6e4220c5530b79c5ac976e61e128ed8bd0aa1fea",
1420
1420
  "lines": 20,
1421
1421
  "heading": "标准目录"
1422
1422
  },
@@ -1424,7 +1424,7 @@
1424
1424
  "id": "playwright-e2e-004",
1425
1425
  "ordinal": 4,
1426
1426
  "destination": "playwright-e2e/SKILL.md",
1427
- "sha256": "4f5e11baf4651c11b5f9819a0b4f33ce2590db1733d4db72814bd1a25daf56ff",
1427
+ "sha256": "f71fe44f7d5753b93804dac958ea8205cddcaee25188a8417b33770e305c46ed",
1428
1428
  "lines": 21,
1429
1429
  "heading": "必备环境变量"
1430
1430
  },
@@ -1432,7 +1432,7 @@
1432
1432
  "id": "playwright-e2e-005",
1433
1433
  "ordinal": 5,
1434
1434
  "destination": "playwright-e2e/SKILL.md",
1435
- "sha256": "51567cea5fca434f9b031fef0871454100cf4715dfb65695dc1722bd275399be",
1435
+ "sha256": "a66696c3263f060d0b7be309a527fca6a9bad95dd534eabbe84f1b6539770d8e",
1436
1436
  "lines": 24,
1437
1437
  "heading": "本地测试账号自动发现"
1438
1438
  },
@@ -1440,7 +1440,7 @@
1440
1440
  "id": "playwright-e2e-006",
1441
1441
  "ordinal": 6,
1442
1442
  "destination": "playwright-e2e/SKILL.md",
1443
- "sha256": "88e1002cae934acd2de5af2f77f371a9ea152a525eecf11b49fe182b16a56044",
1443
+ "sha256": "6aeefebda3a9e598564c53c2f8028a4ccefe2291c4c7c7ae4781ca15fb5d0697",
1444
1444
  "lines": 12,
1445
1445
  "heading": "后端改动后的 E2E 前置动作"
1446
1446
  },
@@ -1448,8 +1448,8 @@
1448
1448
  "id": "playwright-e2e-007",
1449
1449
  "ordinal": 8,
1450
1450
  "destination": "playwright-e2e/SKILL.md",
1451
- "sha256": "948194cce3a29cfec216546acab77314ccaa1c0afad3cbcfd6b426a94f36d4ac",
1452
- "lines": 42,
1451
+ "sha256": "f866625ae131442e50ccee9faacc98672daa138154dd4a0e5deb054271b688b2",
1452
+ "lines": 44,
1453
1453
  "heading": "服务自启动纪律(必做)"
1454
1454
  },
1455
1455
  {
@@ -3241,11 +3241,11 @@
3241
3241
  ]
3242
3242
  },
3243
3243
  "workspace-conventions": {
3244
- "originalSha256": "b936d246598dc89af7e59ecf425e3810b81be89cf11c2e87f862973ab087bc96",
3245
- "originalLines": 685,
3246
- "prefixSha256": "f2d5f1c288602fb264a0171b755bec68a56e7d496ab93cce69f33b70f9ffc315",
3247
- "prefixBytes": 11204,
3248
- "entryLines": 151,
3244
+ "originalSha256": "91a0efdb55bfdc38a4b6736405ef208063da2696d494feff7b0b69c5dcc382ea",
3245
+ "originalLines": 691,
3246
+ "prefixSha256": "c8087b7ca3fe82246cf95fe6e062b9f1987053ca8a1f04fe518f8db5c1c2453b",
3247
+ "prefixBytes": 11967,
3248
+ "entryLines": 153,
3249
3249
  "chunks": [
3250
3250
  {
3251
3251
  "id": "workspace-conventions-000",
@@ -3275,8 +3275,8 @@
3275
3275
  "id": "workspace-conventions-003",
3276
3276
  "ordinal": 3,
3277
3277
  "destination": "workspace-conventions/references/progressive-04-工作区与平台专项保障.md",
3278
- "sha256": "fd7e446aa87c7d8fecac6a258dab354bfa81415a2ed60c11f5b3069557dfa049",
3279
- "lines": 19,
3278
+ "sha256": "e2b353a4b8b4c11b4c22d7fa6d60056002f9efc94605f1732079c7940b13a464",
3279
+ "lines": 21,
3280
3280
  "heading": "本地资源与 OOM 保护规范(强制)"
3281
3281
  },
3282
3282
  {
@@ -3563,8 +3563,8 @@
3563
3563
  "id": "workspace-conventions-039",
3564
3564
  "ordinal": 39,
3565
3565
  "destination": "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md",
3566
- "sha256": "6a24718aa7e8b1b34cc6ff212d5a8331976d338bb60d99401c256c469e522a67",
3567
- "lines": 13,
3566
+ "sha256": "ff09cc6c76c9c6d13280f1d0fe45db19775863bca06eae8dadd1c4b2358183d3",
3567
+ "lines": 15,
3568
3568
  "heading": "本地测试程序与依赖生命周期(强制)"
3569
3569
  }
3570
3570
  ],
@@ -24,6 +24,8 @@ description: Microi 安装、部署、升级和本地运行指南。用于吾码
24
24
 
25
25
  常规发布按用户指定 MCP 的实际 MySQL、MongoDB 版本、Redis 和生效 MinIO 或 OSS/HDFS 选择测试矩阵;SQL Server 真实服务与兼容专项仅在用户明确指定解决 SQL Server 问题时执行,不作为每轮发布的默认前置条件,也无需反复申请免测。本文中的“Full/重新 Full”均指当前选定矩阵,已选必测项仍须全部通过。
26
26
 
27
+ 发布测试默认复用上述 MCP 服务。固定夹具库名、端口或归属冲突先修正测试入口的可配置隔离,采用本任务唯一名称并核验所有者;不能因此新建本地数据库、Redis、MongoDB 或存储容器,也不能删除他人的夹具或放宽测试断言。不可复用的例外及清理要求统一见 [本地测试程序与依赖生命周期](../workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
28
+
27
29
  选择、旧脚本冲突处理及结果记录统一读取 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 和 `../workspace-conventions/SKILL.md`;实际目标未使用的提供商不能被虚构为已验证。
28
30
 
29
31
  ## 先确认部署类型
@@ -1,193 +1,195 @@
1
- ---
2
- name: playwright-e2e
3
- description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化、全面测试。用于测试 PC Vue、本地多 ApiBase/OsClient 独立浏览器上下文、远端运行目标识别、前端微服务菜单切换与 keep-alive/LRU、uni-app H5、网站、界面引擎、移动商城、ApiEngine/FormEngine 契约、登录流程、写入闭环、网络防护、截图、报告和 Playwright Test for VSCode 集成。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi 吾码 Playwright E2E 自动化测试
9
-
10
- 桌面人工补充或新建浏览器验收默认只选一个常规 CSS 视口:优先复现用户实际浏览器尺寸,未知时用 1920×1080。截图文件像素还受设备缩放影响,不能据此强制 4K;仅用户明确要求或问题涉及超宽屏时追加 4K,移动端或响应式改动按需补充相关窄屏。沿用已有有效验收,不为截图分辨率重复整套用例;正式脚本既有 Full 不在运行中删减。核心发布已冻结后,新增规范文案独立交付,不因此重启合格候选的构建、测试或上传。
11
-
12
- 每轮测试成功、失败、取消或中断退出时,在 `finally` / teardown 中关闭本任务 browser/context 和临时写入进程,再按 [测试临时文件随任务清理](../workspace-conventions/SKILL.md#测试临时文件必须随任务清理强制) 删除本任务 `.tmp` 下的一次性脚本、夹具及无用途的截图、trace、video、日志和编译副本。交付必需证据先最小归档并回读,失败排查只暂留有明确归属和清理时机的最小集合;报告和截图路径规则不构成永久保留许可,结束后必须单独验收清理结果。
13
-
14
- > **2026-05 更新(重要)**:Microi.Agent 插件生成的E2E 配置、用例和帮助器保留在 `<projectRoot>/.microi-e2e/`;运行产物统一输出到 `<gitRoot>/.tmp/microi-e2e/<项目相对路径>/`,**不再**写入 `tests/e2e/`、根目录 `playwright.config.js` 或 `.env.e2e.example`。
15
- > - `playwright.config.js` 位于 `.microi-e2e/playwright.config.js`,`testDir` 为 `./` (即 `.microi-e2e/specs/`)
16
- > - 报告、截图、trace、video 和 test-results 放在对应 `.tmp/microi-e2e/` 项目子目录
17
- > - 上下文 `.microi-e2e/.microi-playwright-context.json`
18
- > - 本文档下方仍有大量 `tests/e2e/...` 写法,均为历史风格示意,**实际生成路径以 `.microi-e2e/` 为准**。手写测试(如 `tests/blueprint-e2e.spec.mjs`)不受影响。
19
-
20
- `E2E` 是 `End-to-End`,中文通常叫"端到端测试"。它强调从用户入口开始,穿过前端页面、接口引擎、表单引擎、权限、缓存、数据库等真实链路,验证一条业务路径是否真的可交付。
21
-
22
- 真实依赖与发布范围沿用 `../workspace-conventions/SKILL.md` 的“平台回归与独立应用测试归属”:常规验证指定 MCP 实际使用的 MySQL、MongoDB、Redis 和 MinIO 或 OSS/HDFS,不要求额外 SQL Server 环境;仅用户明确指定 SQL Server 问题时才做其专项。按 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 记录实际覆盖,保留正常登录、业务闭环与资源收尾,不以连接成功代替真实读写验收。
23
-
1
+ ---
2
+ name: playwright-e2e
3
+ description: 按 Microi 系统真实业务逻辑进行 Playwright 全自动化、全面测试。用于测试 PC Vue、本地多 ApiBase/OsClient 独立浏览器上下文、远端运行目标识别、前端微服务菜单切换与 keep-alive/LRU、uni-app H5、网站、界面引擎、移动商城、ApiEngine/FormEngine 契约、登录流程、写入闭环、网络防护、截图、报告和 Playwright Test for VSCode 集成。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi 吾码 Playwright E2E 自动化测试
9
+
10
+ 桌面人工补充或新建浏览器验收默认只选一个常规 CSS 视口:优先复现用户实际浏览器尺寸,未知时用 1920×1080。截图文件像素还受设备缩放影响,不能据此强制 4K;仅用户明确要求或问题涉及超宽屏时追加 4K,移动端或响应式改动按需补充相关窄屏。沿用已有有效验收,不为截图分辨率重复整套用例;正式脚本既有 Full 不在运行中删减。核心发布已冻结后,新增规范文案独立交付,不因此重启合格候选的构建、测试或上传。
11
+
12
+ 每轮测试成功、失败、取消或中断退出时,在 `finally` / teardown 中关闭本任务 browser/context 和临时写入进程,再按 [测试临时文件随任务清理](../workspace-conventions/SKILL.md#测试临时文件必须随任务清理强制) 删除本任务 `.tmp` 下的一次性脚本、夹具及无用途的截图、trace、video、日志和编译副本。交付必需证据先最小归档并回读,失败排查只暂留有明确归属和清理时机的最小集合;报告和截图路径规则不构成永久保留许可,结束后必须单独验收清理结果。
13
+
14
+ > **2026-05 更新(重要)**:Microi.Agent 插件生成的E2E 配置、用例和帮助器保留在 `<projectRoot>/.microi-e2e/`;运行产物统一输出到 `<gitRoot>/.tmp/microi-e2e/<项目相对路径>/`,**不再**写入 `tests/e2e/`、根目录 `playwright.config.js` 或 `.env.e2e.example`。
15
+ > - `playwright.config.js` 位于 `.microi-e2e/playwright.config.js`,`testDir` 为 `./` (即 `.microi-e2e/specs/`)
16
+ > - 报告、截图、trace、video 和 test-results 放在对应 `.tmp/microi-e2e/` 项目子目录
17
+ > - 上下文 `.microi-e2e/.microi-playwright-context.json`
18
+ > - 本文档下方仍有大量 `tests/e2e/...` 写法,均为历史风格示意,**实际生成路径以 `.microi-e2e/` 为准**。手写测试(如 `tests/blueprint-e2e.spec.mjs`)不受影响。
19
+
20
+ `E2E` 是 `End-to-End`,中文通常叫"端到端测试"。它强调从用户入口开始,穿过前端页面、接口引擎、表单引擎、权限、缓存、数据库等真实链路,验证一条业务路径是否真的可交付。
21
+
22
+ 真实依赖与发布范围沿用 `../workspace-conventions/SKILL.md` 的“平台回归与独立应用测试归属”:常规验证指定 MCP 实际使用的 MySQL、MongoDB、Redis 和 MinIO 或 OSS/HDFS,不要求额外 SQL Server 环境;仅用户明确指定 SQL Server 问题时才做其专项。按 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 记录实际覆盖,保留正常登录、业务闭环与资源收尾,不以连接成功代替真实读写验收。
23
+
24
24
  <!-- microi-progressive:begin -->
25
- <!-- microi-progressive:chunk id=playwright-e2e-000 sha256=f04614f276c139cfa50b9e46e89857675c6dc5e7cf0cfbfde76d6e6dbe9746c9 -->
26
- ## 是否需要 `-e2e` 后缀
27
-
28
- 建议保留 `playwright-e2e` 这个 skill 名称。
29
-
30
- - Playwright 也能做接口测试、组件测试和截图巡检,但在 Microi 中最关键的价值是“像真实用户一样跑通低代码系统”。
31
- - `-e2e` 能让 AI 明确区分它和 `v8-debugging`、`v8-crud-api`、`playwright-ct` 等其他能力。
32
- - 如果未来要补更细的能力,可以新增 `playwright-api` 或 `visual-regression`,不要把当前 skill 改成泛泛的 `playwright`。
33
-
25
+ <!-- microi-progressive:chunk id=playwright-e2e-000 sha256=a6ef528a2a940fd0f58efaee6b73eb5dbc159db93d95afedf41c7b8642536d18 -->
26
+ ## 是否需要 `-e2e` 后缀
27
+
28
+ 建议保留 `playwright-e2e` 这个 skill 名称。
29
+
30
+ - Playwright 也能做接口测试、组件测试和截图巡检,但在 Microi 中最关键的价值是“像真实用户一样跑通低代码系统”。
31
+ - `-e2e` 能让 AI 明确区分它和 `v8-debugging`、`v8-crud-api`、`playwright-ct` 等其他能力。
32
+ - 如果未来要补更细的能力,可以新增 `playwright-api` 或 `visual-regression`,不要把当前 skill 改成泛泛的 `playwright`。
33
+
34
34
  <!-- /microi-progressive:chunk -->
35
- <!-- microi-progressive:chunk id=playwright-e2e-001 sha256=703786ae7a5a52cb39664f1c82de7fb7aa7dfece511046d3757da64918c23063 -->
36
- ## 适用范围
37
-
38
- - PC 管理端:`Microi.Client`、租户后台、运营后台。
39
- - uni-app H5:移动商城、会员中心、H5 工作台。
40
- - Page Engine 页面:大屏、仪表盘、官网页面。
41
- - 接口引擎验收:直接用 Playwright `request` 调 `/apiengine/{ApiEngineKey}`。
42
- - 交付冒烟:登录、主导航、核心业务流、退出登录、关键页面截图。
43
-
44
- 不适合把 Playwright 用来替代 V8 单函数调试。单个接口引擎的入参输出优先用 VS Code 插件远程执行、MCP `microi_run_engine` 或后端单元测试。
45
-
35
+ <!-- microi-progressive:chunk id=playwright-e2e-001 sha256=b3970a9a4603447651520667c05ab4ecfae01b65b3f752e9f318007c5e2699c1 -->
36
+ ## 适用范围
37
+
38
+ - PC 管理端:`Microi.Client`、租户后台、运营后台。
39
+ - uni-app H5:移动商城、会员中心、H5 工作台。
40
+ - Page Engine 页面:大屏、仪表盘、官网页面。
41
+ - 接口引擎验收:直接用 Playwright `request` 调 `/apiengine/{ApiEngineKey}`。
42
+ - 交付冒烟:登录、主导航、核心业务流、退出登录、关键页面截图。
43
+
44
+ 不适合把 Playwright 用来替代 V8 单函数调试。单个接口引擎的入参输出优先用 VS Code 插件远程执行、MCP `microi_run_engine` 或后端单元测试。
45
+
46
46
  <!-- /microi-progressive:chunk -->
47
- <!-- microi-progressive:chunk id=playwright-e2e-002 sha256=acef3e589cf11f3c197ee0b0ccf56d96b3f286263d54161b3c260e07c2090ed0 -->
48
- ## 临时文件与产物放置规则(必须遵守)
49
-
50
- AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测试报告**等,**绝对不能放在工作区根目录**,必须放在以下指定位置:
51
-
52
- | 类型 | 放置位置 |
53
- |------|---------|
54
- | 一次性 Python/JS/PS1 脚本 | `<workspace-root>/.tmp/` |
55
- | 诊断截图、调试输出 | `<workspace-root>/.tmp/screenshots/` 或子目录 |
56
- | E2E 配置、用例、帮助器 | `<projectRoot>/.microi-e2e/` |
57
- | E2E 截图、报告、trace、video、test-results | `<gitRoot>/.tmp/microi-e2e/<项目相对路径>/` |
58
- | AI 一次性 Playwright 脚本、截图、日志、报告 | `<workspace-root>/.tmp/`、`<workspace-root>/.tmp/screenshots/`、`<workspace-root>/.tmp/reports/` |
59
- | 性能测试报告 | `<workspace-root>/.microi-performance/`(仅限此目录) |
60
-
61
- **禁止在根目录创建的文件类型**:`*.mjs`、`*.py`、`*.ps1`、`*.sh`(一次性脚本)、`*.png`、`screenshots/`、`node_modules/`(无 package.json 时)、`obj/`(非 .NET 项目文件)、`dark-mode-*/`、`test-*/` 等临时目录。
62
-
63
- `.tmp/` 目录已在 `.gitignore` 中排除,AI 可以在此创建临时文件。收尾清理只允许针对已确认归属的本任务子目录;删除前核对解析后的绝对路径、所有权和保留价值,不得整体删除共享 `.tmp/` 或其它任务的产物。临时文件保留不等于允许保留测试进程或容器。
64
-
65
- **2026-06 强制补充**:AI 手写的一次性 Playwright 验证脚本、运行日志、截图和报告只能写到工作区根目录 `.tmp/`。不要写到 `Microi.Client/`、`Microi.Server/`、`microi.doc/` 或其它子项目目录,即使这些目录已有 `tests/` 目录也不例外。只有 Microi.Agent 插件正式初始化的可复用 E2E 工程,才使用 `.microi-e2e/`。
66
-
47
+ <!-- microi-progressive:chunk id=playwright-e2e-002 sha256=5874137c92e16fd5cc729fd9c23d051caa3e64438fc7bee1d717ae9c5a0f2a90 -->
48
+ ## 临时文件与产物放置规则(必须遵守)
49
+
50
+ AI 在工作区内生成的**一次性临时脚本、诊断文件、截图、测试报告**等,**绝对不能放在工作区根目录**,必须放在以下指定位置:
51
+
52
+ | 类型 | 放置位置 |
53
+ |------|---------|
54
+ | 一次性 Python/JS/PS1 脚本 | `<workspace-root>/.tmp/` |
55
+ | 诊断截图、调试输出 | `<workspace-root>/.tmp/screenshots/` 或子目录 |
56
+ | E2E 配置、用例、帮助器 | `<projectRoot>/.microi-e2e/` |
57
+ | E2E 截图、报告、trace、video、test-results | `<gitRoot>/.tmp/microi-e2e/<项目相对路径>/` |
58
+ | AI 一次性 Playwright 脚本、截图、日志、报告 | `<workspace-root>/.tmp/`、`<workspace-root>/.tmp/screenshots/`、`<workspace-root>/.tmp/reports/` |
59
+ | 性能测试报告 | `<workspace-root>/.microi-performance/`(仅限此目录) |
60
+
61
+ **禁止在根目录创建的文件类型**:`*.mjs`、`*.py`、`*.ps1`、`*.sh`(一次性脚本)、`*.png`、`screenshots/`、`node_modules/`(无 package.json 时)、`obj/`(非 .NET 项目文件)、`dark-mode-*/`、`test-*/` 等临时目录。
62
+
63
+ `.tmp/` 目录已在 `.gitignore` 中排除,AI 可以在此创建临时文件。收尾清理只允许针对已确认归属的本任务子目录;删除前核对解析后的绝对路径、所有权和保留价值,不得整体删除共享 `.tmp/` 或其它任务的产物。临时文件保留不等于允许保留测试进程或容器。
64
+
65
+ **2026-06 强制补充**:AI 手写的一次性 Playwright 验证脚本、运行日志、截图和报告只能写到工作区根目录 `.tmp/`。不要写到 `Microi.Client/`、`Microi.Server/`、`microi.doc/` 或其它子项目目录,即使这些目录已有 `tests/` 目录也不例外。只有 Microi.Agent 插件正式初始化的可复用 E2E 工程,才使用 `.microi-e2e/`。
66
+
67
67
  <!-- /microi-progressive:chunk -->
68
- <!-- microi-progressive:chunk id=playwright-e2e-003 sha256=69b8842a221a0de60f8605c5059deee391be0f16f0b6cbc5ddfb3cfd210268db -->
69
- ## 标准目录
70
-
71
- 前端项目中推荐使用 `tests/e2e`,而不是根目录 `e2e`,这样能和单元测试、组件测试并列。
72
-
73
- ```text
74
- <frontend-project>/
75
- playwright.config.js
76
- tests/
77
- e2e/
78
- helpers/
79
- microi.js
80
- specs/
81
- auth.spec.js
82
- smoke.spec.js
83
- <business-flow>.spec.js
84
- screenshots/
85
- report/
86
- ```
87
-
68
+ <!-- microi-progressive:chunk id=playwright-e2e-003 sha256=247ddb9017c174f0daa88d1f6e4220c5530b79c5ac976e61e128ed8bd0aa1fea -->
69
+ ## 标准目录
70
+
71
+ 前端项目中推荐使用 `tests/e2e`,而不是根目录 `e2e`,这样能和单元测试、组件测试并列。
72
+
73
+ ```text
74
+ <frontend-project>/
75
+ playwright.config.js
76
+ tests/
77
+ e2e/
78
+ helpers/
79
+ microi.js
80
+ specs/
81
+ auth.spec.js
82
+ smoke.spec.js
83
+ <business-flow>.spec.js
84
+ screenshots/
85
+ report/
86
+ ```
87
+
88
88
  <!-- /microi-progressive:chunk -->
89
- <!-- microi-progressive:chunk id=playwright-e2e-004 sha256=4f5e11baf4651c11b5f9819a0b4f33ce2590db1733d4db72814bd1a25daf56ff -->
90
- ## 必备环境变量
91
-
92
- ```bash
93
- PW_BASE_URL=http://127.0.0.1:5180
94
- PW_API_BASE=https://api.example.com
95
- PW_OS_CLIENT=demo
96
- PW_WEB_SERVER_COMMAND="npm run dev:h5 -- --host 0.0.0.0 --port 5180"
97
- PW_WEB_SERVER_URL=http://127.0.0.1:5180
98
- PW_BROWSER_CHANNEL=msedge
99
- ```
100
-
101
- 常用业务变量:
102
-
103
- ```bash
104
- PW_LOGIN_ENGINE=member_login
105
- PW_TEST_ACCOUNT=<从本地配置读取或用环境变量覆盖>
106
- PW_TEST_PASSWORD=<从本地配置读取或用环境变量覆盖>
107
- PW_HOME_PATH=/#/pages/index/index
108
- ```
109
-
89
+ <!-- microi-progressive:chunk id=playwright-e2e-004 sha256=f71fe44f7d5753b93804dac958ea8205cddcaee25188a8417b33770e305c46ed -->
90
+ ## 必备环境变量
91
+
92
+ ```bash
93
+ PW_BASE_URL=http://127.0.0.1:5180
94
+ PW_API_BASE=https://api.example.com
95
+ PW_OS_CLIENT=demo
96
+ PW_WEB_SERVER_COMMAND="npm run dev:h5 -- --host 0.0.0.0 --port 5180"
97
+ PW_WEB_SERVER_URL=http://127.0.0.1:5180
98
+ PW_BROWSER_CHANNEL=msedge
99
+ ```
100
+
101
+ 常用业务变量:
102
+
103
+ ```bash
104
+ PW_LOGIN_ENGINE=member_login
105
+ PW_TEST_ACCOUNT=<从本地配置读取或用环境变量覆盖>
106
+ PW_TEST_PASSWORD=<从本地配置读取或用环境变量覆盖>
107
+ PW_HOME_PATH=/#/pages/index/index
108
+ ```
109
+
110
110
  <!-- /microi-progressive:chunk -->
111
- <!-- microi-progressive:chunk id=playwright-e2e-005 sha256=51567cea5fca434f9b031fef0871454100cf4715dfb65695dc1722bd275399be -->
112
- ## 本地测试账号自动发现
113
-
114
- 当没有显式传入 `PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD` / `MICROI_OSCLIENT` 时,AI 不要把账号密码写入后端配置来制造旁路:
115
-
116
- 1. 读取 `Microi.Server/Microi.net.Api/.microi-local`,取得当前环境名。
117
- 2. 账号密码只从用户本轮明确提供、`PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD`、CI Secret 或既有受保护登录态取得;`appsettings.*.json` 不再保存测试账号密码。
118
- 3. 这些值只作为自动化进程的登录输入或接口请求参数使用。日志、最终回复、截图说明、报告和异常消息中必须写成 `<redacted>` 或“本地配置凭据”,不要展开真实账号密码、Token、连接串或 Redis 密码。
119
- 4. 如果凭据不存在或登录失败,再报告具体阻塞点,例如“未提供受保护测试凭据”“本地后端未启动”“登录接口返回 Code=0”,不要泛泛说无法测试。
120
-
121
- ### 跨 ApiBase / OsClient 本地自动化(强制)
122
-
123
- 1. 复用工作区唯一的 `61500` Vite 服务,但每组 `ApiBase + OsClient` 创建独立
124
- `browser.newContext()`;禁止在同一个 context 的多个 Page 中混测不同租户。
125
- 2. 本地入口固定把参数放在 `#` 前:
126
- `http://localhost:61500/?OsClient=${encodeURIComponent(osClient)}&ApiBase=${encodeURIComponent(apiBase)}#/route`。
127
- URL 参数应覆盖 `index.html`、`src/config.json`、Pinia 和 localStorage。
128
- 3. 页面初始化后读取 `window.__MICROI_RUNTIME_ENDPOINT__`,断言实际 ApiBase/OsClient 与测试目标
129
- 完全一致再登录或点击业务。该对象不得包含 Token。
130
- 4. 从线上地址复现时,先在一次性独立 context 读取上述对象;旧版回退到页面全局值、
131
- `localStorage['microi.net']` 和域名租户解析。不能根据标题猜租户,也不能复用线上 context 跑本地。
132
- 5. 人工第二租户至少使用无痕窗口;多个无痕窗口可能共享同一临时会话,更多并行目标使用独立
133
- Profile/`--user-data-dir`。自动化收尾只关闭自己创建的 context/browser。
134
-
111
+ <!-- microi-progressive:chunk id=playwright-e2e-005 sha256=a66696c3263f060d0b7be309a527fca6a9bad95dd534eabbe84f1b6539770d8e -->
112
+ ## 本地测试账号自动发现
113
+
114
+ 当没有显式传入 `PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD` / `MICROI_OSCLIENT` 时,AI 不要把账号密码写入后端配置来制造旁路:
115
+
116
+ 1. 读取 `Microi.Server/Microi.net.Api/.microi-local`,取得当前环境名。
117
+ 2. 账号密码只从用户本轮明确提供、`PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD`、CI Secret 或既有受保护登录态取得;`appsettings.*.json` 不再保存测试账号密码。
118
+ 3. 这些值只作为自动化进程的登录输入或接口请求参数使用。日志、最终回复、截图说明、报告和异常消息中必须写成 `<redacted>` 或“本地配置凭据”,不要展开真实账号密码、Token、连接串或 Redis 密码。
119
+ 4. 如果凭据不存在或登录失败,再报告具体阻塞点,例如“未提供受保护测试凭据”“本地后端未启动”“登录接口返回 Code=0”,不要泛泛说无法测试。
120
+
121
+ ### 跨 ApiBase / OsClient 本地自动化(强制)
122
+
123
+ 1. 复用工作区唯一的 `61500` Vite 服务,但每组 `ApiBase + OsClient` 创建独立
124
+ `browser.newContext()`;禁止在同一个 context 的多个 Page 中混测不同租户。
125
+ 2. 本地入口固定把参数放在 `#` 前:
126
+ `http://localhost:61500/?OsClient=${encodeURIComponent(osClient)}&ApiBase=${encodeURIComponent(apiBase)}#/route`。
127
+ URL 参数应覆盖 `index.html`、`src/config.json`、Pinia 和 localStorage。
128
+ 3. 页面初始化后读取 `window.__MICROI_RUNTIME_ENDPOINT__`,断言实际 ApiBase/OsClient 与测试目标
129
+ 完全一致再登录或点击业务。该对象不得包含 Token。
130
+ 4. 从线上地址复现时,先在一次性独立 context 读取上述对象;旧版回退到页面全局值、
131
+ `localStorage['microi.net']` 和域名租户解析。不能根据标题猜租户,也不能复用线上 context 跑本地。
132
+ 5. 人工第二租户至少使用无痕窗口;多个无痕窗口可能共享同一临时会话,更多并行目标使用独立
133
+ Profile/`--user-data-dir`。自动化收尾只关闭自己创建的 context/browser。
134
+
135
135
  <!-- /microi-progressive:chunk -->
136
- <!-- microi-progressive:chunk id=playwright-e2e-006 sha256=88e1002cae934acd2de5af2f77f371a9ea152a525eecf11b49fe182b16a56044 -->
137
- ## 后端改动后的 E2E 前置动作
138
-
139
- 如果本轮任务修改过 `Microi.Server/**` 后端源码、配置、控制器、服务、依赖项目或接口行为,跑 Playwright、页面截图、接口验收或前后端联调前,必须先按 `workspace-conventions` 的“后端代码改动后的重启验收”完成:
140
-
141
- 1. 编译后端。
142
- 2. 停止旧的本地 `Microi.net.Api` 进程。
143
- 3. 在 `Microi.Server/Microi.net.Api` 目录用 `dotnet run --launch-profile Microi.net.Api` 重新启动。
144
- 4. 从 launch profile 回读实际地址(当前标准工作区为 `https://localhost:61501`),验证端口已监听并且进程未立即崩溃。
145
-
146
- 不要只说“代码已编译”或“需要用户自己重启后端”;除非用户明确要求不要中断当前服务,否则 AI 要主动完成重启。
147
-
136
+ <!-- microi-progressive:chunk id=playwright-e2e-006 sha256=6aeefebda3a9e598564c53c2f8028a4ccefe2291c4c7c7ae4781ca15fb5d0697 -->
137
+ ## 后端改动后的 E2E 前置动作
138
+
139
+ 如果本轮任务修改过 `Microi.Server/**` 后端源码、配置、控制器、服务、依赖项目或接口行为,跑 Playwright、页面截图、接口验收或前后端联调前,必须先按 `workspace-conventions` 的“后端代码改动后的重启验收”完成:
140
+
141
+ 1. 编译后端。
142
+ 2. 停止旧的本地 `Microi.net.Api` 进程。
143
+ 3. 在 `Microi.Server/Microi.net.Api` 目录用 `dotnet run --launch-profile Microi.net.Api` 重新启动。
144
+ 4. 从 launch profile 回读实际地址(当前标准工作区为 `https://localhost:61501`),验证端口已监听并且进程未立即崩溃。
145
+
146
+ 不要只说“代码已编译”或“需要用户自己重启后端”;除非用户明确要求不要中断当前服务,否则 AI 要主动完成重启。
147
+
148
148
  <!-- /microi-progressive:chunk -->
149
- <!-- microi-progressive:chunk id=playwright-e2e-007 sha256=948194cce3a29cfec216546acab77314ccaa1c0afad3cbcfd6b426a94f36d4ac -->
150
- ## 服务自启动纪律(必做)
151
-
152
- 执行自动化测试、截图巡检、接口引擎回读、`/apiengine/{key}` 验收时,如果本地后端或前端不可达,不能把 `fetch failed`、`ECONNREFUSED`、`000 Failed to connect`、端口无人监听当作任务终点。必须先自动启动所需服务,再继续完整验证。
153
-
154
- 同一工作区有多个 AI 对话时,服务自启动还必须遵守共享生命周期:
155
-
156
- - 先执行 `../workspace-conventions/SKILL.md` 的“本地测试程序与依赖生命周期”统一规则:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS,以及健康本地源码程序或隔离目录的编译产物;不按测试任务重复创建 Docker/Compose,不例行询问临时容器许可。需要双节点时启动两个本机程序进程连接同组依赖,不等于建立两套 Docker 环境。不得已创建的临时容器和纯测试资源每轮必须精确删除并回读。
157
- - API 服务启动前执行 `node Microi.Server/tools/release-lock.mjs assert api <工作区根>`,PC 服务使用 `assert pc`。Playwright `webServer`、自愈脚本或 AI 只在对应范围发布时等待;官网/Agent 发布不阻塞 `61500/61501`。同时启动前后端时分别检查两项。旧锁仅在真实进程证明所属范围后缩小阻塞范围,未知锁继续保护,不得删除活跃锁。
158
- - 端口健康且 PID/命令行属于当前工作区时直接复用,不得每个对话都无条件“先杀再启动”。
159
- 必须重载源码时才串行重启,并在状态播报中说明旧/新 PID。
160
- - 本地长期后端使用项目目录中的 `dotnet run --launch-profile Microi.net.Api`,禁止把
161
- `bin/Release/net10.0` 或 `bin/Release/publish` 的 DLL 作为长期测试服务,否则会锁住
162
- 一键发布的 Release 输出。
163
- - 每次测试成功、失败、取消或因资源不足暂停时,都必须结束本次创建的 browser/context、临时 webServer 及其它自有测试进程;按统一规则收回新建临时容器,并独立回读进程、监听端口和容器状态确认无残留。复用的既有共享服务保持原状。VS Code 持有的
164
- `playwright test-server` 与用户 Edge/Chrome 不属于孤儿清理;禁止按进程名结束所有
165
- `node/dotnet/chrome/msedge`。
166
- - 只读盘点或精确停止使用 `Microi.Server/tools/Microi.LocalProcessManager.ps1` 的
167
- `Status`、`StopBackend`、`StopFrontend`,不能让用户在任务管理器里猜 PID。
168
-
169
- 默认本地后端:
170
-
171
- ```powershell
172
- Push-Location Microi.Server/Microi.net.Api
173
- dotnet run --launch-profile Microi.net.Api
174
- Pop-Location
175
- ```
176
-
177
- 普通本地启动不要手动设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`;后端会读取 `Microi.Server/Microi.net.Api/.microi-local`,再加载对应的 `appsettings.{Env}.json`。如果测试脚本显式注入环境变量,则以脚本注入为准。
178
-
179
- 默认 PC 前端:
180
-
181
- ```powershell
182
- Push-Location Microi.Client
183
- npm run dev -- --host 0.0.0.0 --port 61500
184
- Pop-Location
185
- ```
186
-
187
- uni-app H5 或移动端前端按项目自身命令启动,例如 `npm run dev:h5 -- --host 0.0.0.0 --port 5192` 或测试配置里的 `PW_WEB_SERVER_COMMAND`。如果目标测试同时依赖 PC 管理端和移动 H5,需要分别启动对应前端;不要用一个前端服务替代另一个业务入口。
188
-
189
- 执行顺序:先检查端口/健康接口是否可达;不可达则用后台终端启动;等待服务输出监听地址;再重试接口同步、页面打开、Playwright 截图和断言。只有启动命令失败、缺少依赖、数据库连接失败、端口冲突无法自动换端口且无替代配置时,才算真正阻塞,并且要报告具体失败命令和错误。
190
-
149
+ <!-- microi-progressive:chunk id=playwright-e2e-007 sha256=f866625ae131442e50ccee9faacc98672daa138154dd4a0e5deb054271b688b2 -->
150
+ ## 服务自启动纪律(必做)
151
+
152
+ 服务自启动只解决本次应用程序的可用性,不授权新建依赖容器。测试连接当前 MCP 对应的 MySQL、Redis、MongoDB、HDFS/OSS/MinIO;固定库名、端口或归属冲突先配置独立命名并核验所有者,不能以“夹具隔离”作为另建本地 Docker 的理由。例外判断统一遵循 [依赖生命周期](../workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
153
+
154
+ 执行自动化测试、截图巡检、接口引擎回读、`/apiengine/{key}` 验收时,如果本地后端或前端不可达,不能把 `fetch failed`、`ECONNREFUSED`、`000 Failed to connect`、端口无人监听当作任务终点。必须先自动启动所需服务,再继续完整验证。
155
+
156
+ 同一工作区有多个 AI 对话时,服务自启动还必须遵守共享生命周期:
157
+
158
+ - 先执行 `../workspace-conventions/SKILL.md` 的“本地测试程序与依赖生命周期”统一规则:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS,以及健康本地源码程序或隔离目录的编译产物;不按测试任务重复创建 Docker/Compose,不例行询问临时容器许可。需要双节点时启动两个本机程序进程连接同组依赖,不等于建立两套 Docker 环境。不得已创建的临时容器和纯测试资源每轮必须精确删除并回读。
159
+ - API 服务启动前执行 `node Microi.Server/tools/release-lock.mjs assert api <工作区根>`,PC 服务使用 `assert pc`。Playwright `webServer`、自愈脚本或 AI 只在对应范围发布时等待;官网/Agent 发布不阻塞 `61500/61501`。同时启动前后端时分别检查两项。旧锁仅在真实进程证明所属范围后缩小阻塞范围,未知锁继续保护,不得删除活跃锁。
160
+ - 端口健康且 PID/命令行属于当前工作区时直接复用,不得每个对话都无条件“先杀再启动”。
161
+ 必须重载源码时才串行重启,并在状态播报中说明旧/新 PID。
162
+ - 本地长期后端使用项目目录中的 `dotnet run --launch-profile Microi.net.Api`,禁止把
163
+ `bin/Release/net10.0` 或 `bin/Release/publish` 的 DLL 作为长期测试服务,否则会锁住
164
+ 一键发布的 Release 输出。
165
+ - 每次测试成功、失败、取消或因资源不足暂停时,都必须结束本次创建的 browser/context、临时 webServer 及其它自有测试进程;按统一规则收回新建临时容器,并独立回读进程、监听端口和容器状态确认无残留。复用的既有共享服务保持原状。VS Code 持有的
166
+ `playwright test-server` 与用户 Edge/Chrome 不属于孤儿清理;禁止按进程名结束所有
167
+ `node/dotnet/chrome/msedge`。
168
+ - 只读盘点或精确停止使用 `Microi.Server/tools/Microi.LocalProcessManager.ps1` 的
169
+ `Status`、`StopBackend`、`StopFrontend`,不能让用户在任务管理器里猜 PID。
170
+
171
+ 默认本地后端:
172
+
173
+ ```powershell
174
+ Push-Location Microi.Server/Microi.net.Api
175
+ dotnet run --launch-profile Microi.net.Api
176
+ Pop-Location
177
+ ```
178
+
179
+ 普通本地启动不要手动设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`;后端会读取 `Microi.Server/Microi.net.Api/.microi-local`,再加载对应的 `appsettings.{Env}.json`。如果测试脚本显式注入环境变量,则以脚本注入为准。
180
+
181
+ 默认 PC 前端:
182
+
183
+ ```powershell
184
+ Push-Location Microi.Client
185
+ npm run dev -- --host 0.0.0.0 --port 61500
186
+ Pop-Location
187
+ ```
188
+
189
+ uni-app H5 或移动端前端按项目自身命令启动,例如 `npm run dev:h5 -- --host 0.0.0.0 --port 5192` 或测试配置里的 `PW_WEB_SERVER_COMMAND`。如果目标测试同时依赖 PC 管理端和移动 H5,需要分别启动对应前端;不要用一个前端服务替代另一个业务入口。
190
+
191
+ 执行顺序:先检查端口/健康接口是否可达;不可达则用后台终端启动;等待服务输出监听地址;再重试接口同步、页面打开、Playwright 截图和断言。只有启动命令失败、缺少依赖、数据库连接失败、端口冲突无法自动换端口且无替代配置时,才算真正阻塞,并且要报告具体失败命令和错误。
192
+
191
193
  <!-- /microi-progressive:chunk -->
192
194
  ## 详细参考路由(渐进披露)
193
195
 
@@ -38,6 +38,8 @@ description: 每次 Microi 任务开始前必读的基础规范。用于识别
38
38
 
39
39
  ## 质量优先与适用范围
40
40
 
41
+ **测试依赖默认复用 MCP(强制)**:普通联调、Full 和发布测试使用当前已核验 MCP 对应的 MySQL、Redis、MongoDB、HDFS/OSS/MinIO 服务,并在已授权范围以独立测试库、租户、Key/对象前缀隔离。固定夹具库名被占用、归属标记冲突、端口冲突、本机无容器或旧夹具被清理,都不是“迫不得已”另建本地测试容器的理由;先修正测试入口的可配置隔离和归属校验,不能覆盖他人的夹具或放宽保护。不能复用时按[依赖生命周期](references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)核实具体限制;用户明确禁止的本地容器不会因测试或发布授权自动解禁。
42
+
41
43
  准确性、业务完整性、安全和真实验收优先于 token 与回复长度。先确定完整系统、局部修改或只读分析;新建系统意图按完整交付,不能因短提示词或预算缩小八项清单及菜单/报表增补。局部修改定位真实目标和依赖,信息不足、动态关系或影响不明时扩大读取,不凭摘要猜测或写入。
42
44
 
43
45
  必须读取总控的 [质量与增量开发规范](../microi-system-delivery/references/context-quality.md),按任务映射实际读取与验收记录。同一会话只复用内容哈希未变且已完整读取的规范;首次、版本变化和读取记录不明时补读。权限、写入前检查和执行后回读不复用旧成功结论。
@@ -2,13 +2,15 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=workspace-conventions-039 sha256=6a24718aa7e8b1b34cc6ff212d5a8331976d338bb60d99401c256c469e522a67 -->
5
+ <!-- microi-progressive:chunk id=workspace-conventions-039 sha256=ff09cc6c76c9c6d13280f1d0fe45db19775863bca06eae8dadd1c4b2358183d3 -->
6
6
  ## 本地测试程序与依赖生命周期(强制)
7
7
 
8
8
  - 启动前盘点当前源码/Vite/API、数据库、Redis、MongoDB、MinIO、端口及其归属。健康且适用的开发/测试服务优先复用;已有服务不满足时,优先直接启动本地源码,或把本轮编译产物复制到任务隔离目录启动,避免锁住共享构建输出。登记实际源码、配置来源、PID、创建时间、工作目录和监听端口;不能启动另一份旧 DLL 冒充当前候选。
9
9
  - 多节点 HTTP、并发和租户隔离测试优先使用多个本机吾码程序进程,连接同组已授权依赖;库、租户、Schema、Redis DB/Key 前缀和存储命名空间负责测试隔离。`fixture`、独立候选目录和 Full 不等于每个 AI 对话或节点都要创建一整套 Docker。复用仅限已授权开发/测试资源,不向生产业务库注入测试数据,也不对共享服务进行破坏性故障测试。
10
10
  - 普通联调、登录、表单、V8、Full 和镜像发布默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS 等实际依赖,包括已配置的远端依赖;本机没有容器不等于缺少测试环境。先核实连接归属、实际版本、可用性和安全隔离范围,通过独立测试库、租户、Redis Key 前缀或专用 DB、对象前缀隔离,不能向生产业务库写测试数据,也不能清空共享 Redis、Bucket 或其它任务的数据。
11
- - 不要把“是否允许临时创建测试容器”作为常规确认步骤,也不要因为旧夹具已删除就改为新建一套服务。只有已经验证现有 MCP 依赖、既有测试服务及本地程序均无法满足本次具体协议/版本验收时,才记录不能复用的证据,采用最小必要替代方案;确需临时容器时限定资源、仅监听回环地址、登记归属和清理器,按本次用户明确边界执行。一般可逆测试实施细节不重复索取许可;涉及真实数据处置、额外费用或用户禁止的操作时仍遵守相应边界。
11
+ - 固定夹具库名、Schema、Redis DB/Key、对象前缀或端口被其它任务占用时,先保持原资源不变,为本任务分配唯一名称并修正测试入口的配置传递。测试保护必须同时核验精确目标、任务归属标记及允许的操作范围;不能只删除固定名称断言、伪造归属或借用他人的标记来通过测试。共享服务上没有已授权的安全隔离范围时,记录具体缺口,不能向业务库写测试数据。
12
+ - 不要把“是否允许临时创建测试容器”作为常规确认步骤。固定名称/端口冲突、归属不一致、旧夹具已删除、脚本硬编码、本机无容器、Full 要求独立夹具或为了更方便清理,均不构成新建本地 MySQL、Redis、MongoDB、MinIO/HDFS 等容器的必要性。先修复可配置隔离、连接映射和清理能力,普通测试不另建 Docker/Compose 环境。
13
+ - “迫不得已”仅指已验证现有 MCP 依赖、既有测试服务和本地程序确实无法满足本次具体验收,例如必要协议/版本不兼容,或必须执行无法在共享服务安全完成的服务级故障测试。记录目标 Profile、实际服务版本、不能复用的证据、已尝试的隔离方案及替代资源范围;用户明确禁止的操作仍不得执行。确需且已在授权范围内的临时容器,限定资源、仅监听回环地址、登记归属和清理器;一般可逆实施细节不重复索取许可。
12
14
  - 创建或借用前建立资源台账,区分既有、借用和本轮新建;容器登记完整 Id、任务标签、数据挂载及消费者,进程登记 PID、创建时间、命令入口、工作目录和后代。共享依赖有唯一协调者,消费者退出不删除其它任务仍在使用的服务,也不能把他人资源仅凭名称认领为本任务资源。既有共享开发服务必要重启后的替换进程继承共享身份,收尾时保持健康;任务专用实例仍须结束,不能改称“共享服务”来免除清理。
13
15
  - 每轮验证成功、失败、超时、取消、异常或资源门限不足退出时,都立即执行收尾,不等整个功能交付完成。脚本用 `finally` 并处理可捕获的中断;启动到一半失败也回收已创建资源,外层监督程序退出时由已登记归属的清理器兜底。停止本轮自建 API/Vite/测试程序、watcher、浏览器及其子进程,以及获准新建的临时容器;不因“待续”长期保留运行资源。确需继续后台运行时,记录用户要求、负责人和有效期限。
14
16
  - 清理前重验精确身份,正常停止后独立回读进程及后代已退出、监听/连接已消失、容器已停止或移除;只输出白名单状态,不回显口令、Env 或连接串。既有或借用的共享实例保持原状态,不按进程名全杀,不执行全局 Docker prune、WSL/Docker 重启或删全部编排。
@@ -19,7 +19,7 @@ Microi 平台后端功能必须默认按多节点部署设计:多个 API/Worke
19
19
  - 若要求宿主机掉电或 `kill -9` 窗口内也绝对零丢失,必须在返回业务成功前取得外部持久消息队列、共享 outbox 或同步 WAL 的持久化确认;“内存队列随后异步落盘”不能宣称覆盖尚未持久化的强杀窗口。
20
20
 
21
21
  <!-- /microi-progressive:chunk -->
22
- <!-- microi-progressive:chunk id=workspace-conventions-003 sha256=fd7e446aa87c7d8fecac6a258dab354bfa81415a2ed60c11f5b3069557dfa049 -->
22
+ <!-- microi-progressive:chunk id=workspace-conventions-003 sha256=e2b353a4b8b4c11b4c22d7fa6d60056002f9efc94605f1732079c7940b13a464 -->
23
23
  ## 本地资源与 OOM 保护规范(强制)
24
24
 
25
25
  AI 在用户本机启动 Node.js、Vite、Webpack、dotnet build、Java、Docker build、浏览器自动化、压力测试或其他可能长时间占用 CPU/内存的进程前,必须先评估资源,不得为了“让构建跑过”无限抬高堆内存或 Worker 数。
@@ -32,6 +32,8 @@ AI 在用户本机启动 Node.js、Vite、Webpack、dotnet build、Java、Docker
32
32
  - 全量构建无法在上述阈值内完成时,先停止并改用定向 lint、类型检查、按模块构建或按测试文件验证。如仍必须进行全量验收,应明确报告资源瓶颈,交由 CI/专用构建机或经用户明确同意的独占时段执行,禁止在用户正在使用的 VS Code 会话里硬跑。
33
33
  - **本地测试程序与依赖生命周期(强制)**:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS 等实际依赖,以及健康源码/Vite;用独立测试库、租户和命名空间隔离,不按 AI 任务或节点创建整套 Docker/Compose。本机无容器、旧夹具被清理或执行 Full 都不是新建服务的理由,不再把临时测试容器许可作为常规问题。只有现有依赖确实无法满足具体验收且有证据时才采用最小必要替代方案。每轮成功、失败、取消及资源阻塞退出均精确删除自建临时容器与纯测试资源、收回自有进程和浏览器,并独立回读;既有共享服务保持原状。报告内存不足前先收回本任务遗留占用。详见[本地测试程序与依赖生命周期](progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
34
34
 
35
+ 固定测试库名、端口或归属标记冲突,应按上述生命周期规则改用本任务唯一命名并保留精确归属保护,不能以“隔离 Full”为由创建新的本地依赖容器。
36
+
35
37
  ### `Microi.Client` 框架前端构建频率(强制)
36
38
 
37
39
  - 修改吾码低代码平台框架前端 `Microi.Client/` 时,开发阶段必须优先复用已运行的 Vite 开发服务,通过热模块更新(HMR)、定向静态测试和浏览器回归验证改动。禁止把 `npm run build` 当作每轮修改后的常规检查,禁止因切换需求、修改单个组件或上下文压缩而重复执行全量构建。