@microi.net/cli 6.0.4 → 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.
@@ -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),按任务映射实际读取与验收记录。同一会话只复用内容哈希未变且已完整读取的规范;首次、版本变化和读取记录不明时补读。权限、写入前检查和执行后回读不复用旧成功结论。
@@ -45,7 +47,7 @@ description: 每次 Microi 任务开始前必读的基础规范。用于识别
45
47
  工作区保护始终有效:保留他人差异与共享进程,临时产物只放根 `.tmp/`,闭源源码只从独立内部仓提交。修改/提交前读取 [共享工作区与 Git 保障](references/progressive-04-工作区与平台专项保障.md#多对话共享工作区变更归属保护强制);启动构建、测试服务或浏览器前读取同文件资源/OOM规则并检查现有资源。后端/任务/权限变更读取分布式与安全章节;平台源码定位、文档和 Skills 修改读取对应章节。平台能力四项检查仍固定保留在本入口。
46
48
 
47
49
  <!-- microi-progressive:begin -->
48
- <!-- microi-progressive:chunk id=workspace-conventions-000 sha256=aca51a9aec956dd31d4865eeb25b3d33452106b363659970773b40b48d22e346 -->
50
+ <!-- microi-progressive:chunk id=workspace-conventions-000 sha256=0c3f889089f09b9b43f1ae7168f9e20a7aa3e1324b1cf5c94052a78ffb1792b9 -->
49
51
  ## 任务启动前 Skill 读取规则(强制)
50
52
 
51
53
  AI 处理任何 Microi 低代码、V8、MCP、OpenClaw、采集引擎、前端、后端、UniApp、文档、测试或交付任务前,必须先按任务类型读取相关 `microi.skills/**/SKILL.md`。不能等到写代码或出问题后才补读。
@@ -81,7 +83,7 @@ AI 处理任何 Microi 低代码、V8、MCP、OpenClaw、采集引擎、前端
81
83
 
82
84
  - “无需修改”必须逐项有具体理由,例如纯内部优化无元数据变化可不升应用版本,现有 MCP 已支持该配置可不新增工具;不得默认四项都做,也不得默认四项都省略。需要修改的项目应在本次授权范围内完成并验证,受权限、网络或发布渠道阻挡时明确未完成项,不能用本地修改代替线上发布。
83
85
  - 任务若只要求分析、评审或制定规范,仍保持只读或仅修改指定规范;身份标记不授权无关线上写入。客户部署、容器更新和应用自动安装与官方发布是独立动作,服从用户指定的手动/自动边界;用户明确手动更新时不得擅自部署。
84
- - 收尾必须区分“源码/文档已修改、测试通过、应用已发布回读、Skills/插件已打包或已分发、镜像已推送、客户已安装或已部署”。只有实际渠道验收成功才能说其它用户已可获取;不得把文档本地构建或插件本地副本同步称为已上线。
86
+ - 收尾必须区分“源码/文档已修改、测试通过、应用已发布回读、Skills/插件已打包或已分发、镜像已推送、客户已安装或已部署”。npm、NuGet、Docker、Visual Studio Marketplace、Open VSX 等制品渠道以发布命令明确成功作为发布完成依据,默认不做发布后回读、不等待索引或 CDN 传播;不得把本地构建或插件本地副本同步称为已发布。发布成功不等于目标服务已部署,运行与业务验收仍按任务要求执行。
85
87
 
86
88
  ### 平台回归与独立应用测试归属(强制)
87
89
 
@@ -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 重启或删全部编排。
@@ -2,28 +2,28 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=workspace-conventions-038 sha256=5dbfb261596e9c61fcc330adca7a1ff40a3a1508cd89be3c7b10410e591aa557 -->
5
+ <!-- microi-progressive:chunk id=workspace-conventions-038 sha256=1b65652abc8ca096a22d79a62b32c74557e5fc3daa7d81f3c192c4b9e37e4665 -->
6
6
  ## CLI 与 IDE 插件错版共存约定
7
7
 
8
8
  - CLI 与 IDE 插件共用配置、Token、MCP、Skills 或生成文件时,所有持久化协议必须按“新字段可选、旧字段保留、未知字段不删除”设计。不得将 JSON 解析到旧类型后只序列化已知字段。
9
9
  - 共享 JSON/Token 必须失败关闭:解析失败时保留原文件并停止写入;写入使用同目录临时文件原子替换,多进程可写文件还要使用带超时/死锁恢复的文件锁。
10
10
  - MCP 配置要写入工具来源与三段版本;替换同名或同 API/OsClient 的 Microi Server 时实行“较新提供者优先”,同时保留非 Microi MCP。Skills/AI 指令也要记录 bundle/file 版本,旧 bundle 不得覆盖新 bundle 已生成的内容。
11
11
  - 已发布的历史二进制无法被新代码追溯修复。诊断必须把无版本记录标记为 `legacy`,说明更新或用较新一端重新初始化的恢复路径;不得宣称新代码已让任意历史版本绝对共存。
12
- - 多 registry 联合发布没有跨站点原子事务。必须在递增版本前验证本轮必选目标的凭据/权限,对每个产物校验同版本,发布后逐端公开回读。可选目标(例如尚未开通 scope 的 npm CLI)预检或发布失败时,不得阻断已经通过预检的必选目标;必须保留同版本产物、明确报告部分完成并给出精确补发命令。要求全目标成功的发布应提供显式严格模式。补发只能复用完全相同的源码/产物;代码改动后必须发新版本。
12
+ - 多 registry 联合发布没有跨站点原子事务。必须在递增版本前验证本轮必选目标的凭据/权限,对每个产物校验同版本,按各渠道发布命令明确返回成功记录发布完成,默认不追加公开回读。可选目标(例如尚未开通 scope 的 npm CLI)预检或发布失败时,不得阻断已经通过预检的必选目标;必须保留同版本产物、明确报告部分完成并给出精确补发命令。要求全目标成功的发布应提供显式严格模式。补发只能复用完全相同的源码/产物;代码改动后必须发新版本。
13
13
 
14
14
  ### 复盘:可选 npm 目标阻断两个扩展市场发布
15
15
 
16
16
  - 触发场景:联合发布同时包含两个扩展市场和 npm CLI,但 npm 组织 scope 尚未创建,脚本在版本递增前直接退出,导致已经具备权限的两个扩展市场也无法发布。
17
17
  - 根因:发布脚本把三个 registry 都视为同一个全局硬门禁,并把最容易受账号、scope 和 2FA 影响的 npm 放在扩展市场之前,没有区分必选目标、可选目标和严格发布模式。
18
- - 通用规则:默认发布按目标隔离;先完成并回读必选目标,再独立尝试可选目标。可选目标失败应保留同版本不可变产物并输出补发入口;只有显式严格模式才要求所有目标预检通过后继续。
19
- - 自动化检查:模拟 npm 未登录、scope 404 和 npm publish 非零退出,断言两个扩展市场的发布调用与回读仍会执行;另测严格模式在版本递增前停止,补发命令不递增版本且复用同版本产物。
18
+ - 通用规则:默认发布按目标隔离;先完成必选目标发布,再独立尝试可选目标。可选目标失败应保留同版本不可变产物并输出补发入口;只有显式严格模式才要求所有目标预检通过后继续。
19
+ - 自动化检查:模拟 npm 未登录、scope 404 和 npm publish 非零退出,断言两个扩展市场的发布调用仍会执行,成功后不会触发默认回读;另测严格模式在版本递增前停止,补发命令不递增版本且复用同版本产物。
20
20
 
21
21
  ### 复盘:npm 已接收新版本但公共回读短暂 404
22
22
 
23
23
  - 触发场景:`npm publish` 已成功返回,npmjs.com 包页面也已出现新包或新版本,但紧随其后的 `npm view <package>@<version> version` 在数十秒内连续返回 E404,联合发布脚本因此把成功发布误报为失败。
24
24
  - 根因:新 scope/新版本在 npm 网站、写入节点和公共 registry 读取节点之间存在短暂传播窗口;固定少量、短间隔轮询不足以区分“尚未发布”和“已经接收但尚未公开传播”。
25
- - 通用规则:发布命令成功和公共回读确认必须作为两个阶段记录。npm 新版本回读使用 `--prefer-online` 和分钟级有限重试;重试结束仍为 E404 时标记 `pending-propagation`,禁止自动重发同一不可变版本,并提供独立只读验证命令稍后确认。只有发布命令本身失败且公共 registry 也始终不存在时,才进入补发流程。
26
- - 自动化检查:模拟 `npm publish` 成功后前几次 `npm view` 返回 E404、随后返回期望版本,断言不会重复发布;再模拟重试窗口结束仍为 E404,断言输出待传播状态和只读验证命令,而不是提示重新上传同一版本。
25
+ - 通用规则:发布命令明确返回成功即可报告该渠道发布成功,不需要再执行 `npm view`、市场版本查询、制品下载或轮询,不默认添加 `--verify-all` / `--verify-only`,也不以索引传播延迟把成功降为待完成。只有发布结果不明确、报错,或用户明确要求渠道核验时才按需回读;结果未知时先查状态,禁止盲目重复上传。成功发布的不可变版本不得因传播延迟重新上传或升版。用户要求的线上部署、实际页面和业务联调仍独立执行。
26
+ - 自动化检查:模拟发布命令明确成功,断言直接记录该渠道发布成功且不触发回读或重传;模拟结果未知,断言进入状态诊断而非盲目上传;用户显式要求核验时保留只读验证入口。
27
27
  ## Git 大文件推送检查(强制)
28
28
 
29
29
  - 每次 Git 推送前检查暂存内容及全部待推送提交中新引入的 Blob,不能只看工作树、最新提交或首尾文件差异;中间提交加入后又删除的大文件仍会进入历史。以刚核验的远端引用为基线,结合 `git rev-list --objects` 与 `git cat-file --batch-check` 检查真实对象大小;基线或对象不完整时先补齐并复核,不能绕过检查。
@@ -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` 当作每轮修改后的常规检查,禁止因切换需求、修改单个组件或上下文压缩而重复执行全量构建。
@@ -139,7 +141,7 @@ AI 在工作区任意任务中生成的**一次性临时脚本、诊断文件、
139
141
  - 文档改动后执行 `npm run docs:build`;验收时检查本次没有无理由新增 `.md` 页面或导航路由。
140
142
 
141
143
  <!-- /microi-progressive:chunk -->
142
- <!-- microi-progressive:chunk id=workspace-conventions-009 sha256=90d90834a2080c2a2f08bae1092557761b6b23c79274f8d4dc2b115c121f5b51 -->
144
+ <!-- microi-progressive:chunk id=workspace-conventions-009 sha256=4551654837b9b34fc1d4dabcda3147541a61b484a52ad8ddc02ac84c1c822372 -->
143
145
  ## 多对话共享工作区变更归属保护(强制)
144
146
 
145
147
  ### 功能验收后的源码提交与推送(强制)
@@ -147,7 +149,7 @@ AI 在工作区任意任务中生成的**一次性临时脚本、诊断文件、
147
149
  - 每个已完成并通过相应验收的功能、修复或独立里程碑,必须把本任务源码、测试和必要文档按实际 Git 仓库分别提交并推送;不能仅保存在工作区、stash、临时目录或已发布产物中。用户明确要求不提交/不推送、只读任务和未完成的实验除外,不为无改动仓库制造空提交。
148
150
  - 提交前回读工作树、暂存区、上游和远端;按可核验的本任务 hunk 暂存,保留其它对话的改动与既有暂存项。公开根仓只提交公开代码;闭源目录只从各自独立仓库根提交并推送到其已有内部远端,严格执行公开仓闭源路径门禁,不能用 gitlink 或强制添加绕过隔离。
149
151
  - 推送前先获取上游的新提交并安全整合;共享工作区有并行改动时优先在隔离候选中合并,不用整树 stash/reset 覆盖他人成果,不强推共享分支,不绕过仓库 Hook。需要精确回滚时保留独立、说明清楚的功能提交;回滚已推送功能通常使用新的反向提交,不改写共享历史。
150
- - 正式发布的候选必须包含此前已交付功能和本任务已核验的源码,先按仓安全本地提交,再冻结包含闭源源码在内的完整构建输入、提交号和内容哈希;仅更新说明页面时也要核对整个站点候选。Git 远端推送/回读与制品发布是独立交付步骤,默认可并行或在制品之后补推,不能把远端已包含 HEAD、推送成功或 Gitee/GitLab/GitHub 可达作为 NuGet、API/PC Docker、官网 Docker 等合格制品的上传前置条件。保留对应产品的 Full、闭源隔离、DLL 加密、候选/产物一致性、最终冒烟和渠道回读;官网继续执行整站构建与内容/入口验收。隔离工作树干净或持有发布锁,均不能代替源码完整性检查。
152
+ - 正式发布的候选必须包含此前已交付功能和本任务已核验的源码,先按仓安全本地提交,再冻结包含闭源源码在内的完整构建输入、提交号和内容哈希;仅更新说明页面时也要核对整个站点候选。Git 远端推送/回读与制品发布是独立交付步骤,默认可并行或在制品之后补推,不能把远端已包含 HEAD、推送成功或 Gitee/GitLab/GitHub 可达作为 NuGet、API/PC Docker、官网 Docker 等合格制品的上传前置条件。保留对应产品的 Full、闭源隔离、DLL 加密、候选/产物一致性、最终冒烟;渠道发布命令明确成功即完成该渠道发布,默认不回读、不等待传播,异常或结果未知时按需诊断。官网继续执行整站构建与内容/入口验收。隔离工作树干净或持有发布锁,均不能代替源码完整性检查。
151
153
  - 收尾逐仓记录本地提交号、远端分支和独立回读结果,分别报告源码、NuGet、Docker、官网及客户部署。远端网络、认证或容量故障首次失败后最多短重试一次,累计定向排障不超过 5 分钟;保存本地提交、失败原因和待补推清单,已通过全部制品门禁的渠道立即继续发布,不得反复请求同一例外授权。源码冲突、归属不明、保护路径违规、缺少实际构建输入或候选漂移必须先解决,不能当作可忽略的远端故障。后续合并改变源码/构建输入时重新冻结并按新候选验收,禁止将新提交冒充已发布制品来源;缺少远端回执仍标为源码未交付,不得宣称全部完成。
152
154
  - 官方应用发布仅验收 `microi_itdos` 对应主租户 `iTdos` 的更新与回读,不批量升级、不等待线上子租户;子租户升级是独立部署任务。Full 仍保留已登记的隔离主、子测试租户及越权、升级回归,不将测试夹具称为官网子租户部署。
153
155
  - 发布边界必须在 `Microi一键编译发布.sh` 及其调用入口生效,不能只依赖 AI 提示词。普通用户直接运行脚本同样保留适用的 Full、DLL 加密、冒烟和候选校验;运行脚本不授予官方 iTdos 写入权,也不授权升级其全部生产子租户。