@microi.net/cli 5.0.6 → 5.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-cli.js +50 -50
- package/scripts/microi-skills.meta.json +186 -186
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +16 -16
- package/skills/microi-ai-application/SKILL.md +2 -1
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +13 -4
- package/skills/ui-design/SKILL.md +3 -2
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +28 -19
- package/skills/unity-integration/references/ai-app-delivery.md +2 -0
- package/skills/v8-saas-multi-tenant/SKILL.md +8 -8
- package/skills/v8-security/SKILL.md +7 -6
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +1 -1
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +4 -2
|
@@ -16,7 +16,7 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
<!-- microi-progressive:begin -->
|
|
19
|
-
<!-- microi-progressive:chunk id=ui-design-000 sha256=
|
|
19
|
+
<!-- microi-progressive:chunk id=ui-design-000 sha256=4b6409ab265eb741b2f4b28b51b7de12cde79ff4a19c8a6e8acf80ac867444be -->
|
|
20
20
|
## 整体风格定义
|
|
21
21
|
|
|
22
22
|
- **风格关键词**:高级、通透、科技感、品牌化、轻量精致、视觉张力。
|
|
@@ -28,7 +28,8 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
|
|
|
28
28
|
|
|
29
29
|
- 当需求只描述“高级、主流、好看”而没有明确视觉方向时,先从 Microi 内置模式中确定一种主结构:品牌叙事、真实产品流程、趋势构图、沉浸互动、动态首屏或数据工作台;再选择至多两种辅助能力。禁止把多套视觉语言堆成拼盘。
|
|
30
30
|
- 设计结果必须被拆成可执行规则:首屏目标、信息层级、栅格与最大宽度、字体层级、语义颜色、间距、圆角/阴影、组件状态、动效时间线、响应式重排、低性能降级和 `prefers-reduced-motion`。
|
|
31
|
-
- 先完成默认、加载、空、错误、成功、权限、禁用等真实业务状态,再增加装饰和动效;任何看起来可点击的元素都必须有真实结果。
|
|
31
|
+
- 先完成默认、加载、空、错误、成功、权限、禁用等真实业务状态,再增加装饰和动效;任何看起来可点击的元素都必须有真实结果。
|
|
32
|
+
- 所有异步内容加载统一使用贴合最终几何的主题骨架;菜单切换、首页、表格、表单/详情、弹窗和远程媒体都不得退回半透明黑色遮罩。具体实现、主题令牌与状态边界读取 [references/progressive-02-字体.md](references/progressive-02-字体.md)。
|
|
32
33
|
- 所有成品只使用 Microi 自有内容、`--mci-*` token、`mci-*` 组件/类名和项目合法资产。禁止复制第三方页面、源码、图片、字体、3D 模型、商标或原始设计 token。
|
|
33
34
|
- 设计前必须读取 [references/design-pattern-library.md](references/design-pattern-library.md);涉及登录、订阅、支付、权限、搜索、设置等流程时再读 [references/product-flow-recipes.md](references/product-flow-recipes.md);涉及滚动、3D、Canvas/WebGL 或动态 Hero 时再读 [references/motion-and-media.md](references/motion-and-media.md);生成整站或交给 AI 延续设计时使用 [references/mci-design-contract.md](references/mci-design-contract.md)。
|
|
34
35
|
- 可运行原创案例位于 [assets/pattern-showcase/index.html](assets/pattern-showcase/index.html),用于理解结构和状态,不作为需要逐像素复制的模板。
|
|
@@ -119,35 +119,44 @@
|
|
|
119
119
|
---
|
|
120
120
|
|
|
121
121
|
<!-- /microi-progressive:chunk -->
|
|
122
|
-
<!-- microi-progressive:chunk id=ui-design-011 sha256=
|
|
122
|
+
<!-- microi-progressive:chunk id=ui-design-011 sha256=fba089e9a092efca57bfad2a34a4b9bada857c1072b09488e29b3cf28eefaba1 -->
|
|
123
123
|
## 骨架屏 Loading 设计规范
|
|
124
124
|
|
|
125
|
-
所有依赖接口、数据库、远程资源或异步计算的数据区域,首屏加载态必须使用骨架屏(Skeleton Screen),不能只显示 spinner、进度圈、空图标或“数据加载中...”文案。骨架屏属于基础体验规范,适用于 PC、移动端 H5、uni-app、小程序和 WebView。
|
|
126
|
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
-
|
|
132
|
-
-
|
|
125
|
+
所有依赖接口、数据库、远程资源或异步计算的数据区域,首屏加载态必须使用骨架屏(Skeleton Screen),不能只显示 spinner、进度圈、空图标或“数据加载中...”文案。骨架屏属于基础体验规范,适用于 PC、移动端 H5、uni-app、小程序和 WebView。
|
|
126
|
+
|
|
127
|
+
- 覆盖范围包括菜单/路由切换、首页工作台、表格、卡片、表单与详情首开、右侧面板、弹窗、树、文件/文档/3D 等远程内容容器;不能只改某一个 `diy-table` 页面。
|
|
128
|
+
- 骨架屏形态必须接近最终内容版式:列表用行骨架,表格用表头+行骨架,卡片/商品用网格骨架,详情页用大图区+标题/段落骨架,仪表盘用指标卡骨架。
|
|
129
|
+
- 加载期间不能提前显示“暂无数据/暂无明细/空空如也”;空态只能在请求完成且确认无数据后出现。
|
|
130
|
+
- 骨架表面必须不透明,禁止复用 `.el-loading-mask` 的半透明黑/灰遮罩。颜色只引用语义令牌:`--mci-skeleton-surface/card/header/base/highlight/accent/border`;运行时从当前 `--mci-*` 表面与主题色低饱和派生,必须同时兼容 `data-theme="light|dark"`、`html.dark`、租户自定义主题色和系统主题切换。
|
|
131
|
+
- 主色只允许作为低占比边缘/高光染色,不能把高饱和主题色铺满骨架;切换亮色、暗色或任意自定义主题后,骨架层级要可辨认且不闪白、不变黑幕。
|
|
132
|
+
- 动画只允许使用 `background-position`、`opacity` 或 `transform`,节奏控制在 1.0s 到 1.4s;必须支持 `prefers-reduced-motion` 关闭或弱化动画。
|
|
133
|
+
- 分页加载下一页时,只在列表底部追加紧凑骨架,不覆盖已有内容;切换筛选/分类重载第一页时才显示首屏骨架。
|
|
134
|
+
- 骨架块必须有稳定尺寸、圆角和间距,加载前后不能造成明显布局跳动。
|
|
135
|
+
- 内容加载与操作反馈必须区分:查询/渲染内容使用骨架;保存、提交、删除、登录验证等短操作继续使用按钮内 `loading`;文件上传、后台任务、Unity/WebGL 等已有可信百分比时继续显示真实进度。禁止用骨架伪装可量化进度,也禁止用按钮 spinner 代替内容骨架。
|
|
136
|
+
- Microi.Client 内容区优先使用全局 `v-mci-loading:<table|cards|form|detail|page|stats|list|tree|compact>`;全屏内容切换使用 `openMciLoading()`。不得新增内容型 `v-loading` / `ElLoading.service`。第三方遗留 Loading 必须由主题骨架兜底,不能恢复暗色遮罩。
|
|
137
|
+
- 头像、验证码、私有图片/文件缩略图等局部远程资源使用消费同一主题令牌的圆形或媒体骨架;历史 `./static/img/loading.gif` 只能作为内部兼容哨兵,必须在渲染层拦截,禁止传给 `<img>`、`<el-image>` 或 CSS `url()` 发起真实请求。
|
|
138
|
+
- 自动验收至少扫描 `v-loading`、`ElLoading.service`、硬编码 `.el-loading-mask rgba(...)` 和加载期空态文案;浏览器截图覆盖 1440/1920 桌面、390 移动、亮色、暗色、至少一种非默认自定义主题,以及菜单切换、表格、表单详情、首页。检查控制台、404/5xx、`aria-busy` 和 reduced-motion。
|
|
133
139
|
|
|
134
140
|
参考样式:
|
|
135
141
|
|
|
136
142
|
```scss
|
|
137
|
-
.mci-skeleton {
|
|
138
|
-
position: relative;
|
|
139
|
-
overflow: hidden;
|
|
140
|
-
background:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
143
|
+
.mci-skeleton {
|
|
144
|
+
position: relative;
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
background: var(--mci-skeleton-surface);
|
|
147
|
+
}
|
|
148
|
+
.mci-skeleton__block {
|
|
149
|
+
background: linear-gradient(90deg, var(--mci-skeleton-base), var(--mci-skeleton-highlight), var(--mci-skeleton-base));
|
|
150
|
+
background-size: 240% 100%;
|
|
151
|
+
animation: mciSkeleton 1.15s ease-in-out infinite;
|
|
152
|
+
}
|
|
144
153
|
@keyframes mciSkeleton {
|
|
145
154
|
0% { background-position: 120% 0; }
|
|
146
155
|
100% { background-position: -120% 0; }
|
|
147
156
|
}
|
|
148
|
-
@media (prefers-reduced-motion: reduce) {
|
|
149
|
-
.mci-
|
|
150
|
-
}
|
|
157
|
+
@media (prefers-reduced-motion: reduce) {
|
|
158
|
+
.mci-skeleton__block { animation: none; }
|
|
159
|
+
}
|
|
151
160
|
```
|
|
152
161
|
|
|
153
162
|
---
|
|
@@ -84,6 +84,8 @@ tests/
|
|
|
84
84
|
3. 本地完成类型检查、测试、真实 Unity 构建和 dist 完整性校验。
|
|
85
85
|
4. 先同步私有源码;生成的 Unity、安装包与构建证据目录不得混入源码清单。任何期望版本不一致都停止重基线。
|
|
86
86
|
5. 发布不可变 Web 运行版本,回读入口、文件数、哈希、状态与公开 URL。
|
|
87
|
+
- 官网、二维码、分享与商城“立即体验”必须指向不带版本号的固定当前入口,且游戏加载完成后地址栏仍保持该入口;不能把 `SharedPublicRuntime.EntryUrl`、`/releases/{Version}/requests/...` 或 `/versions/{Version}/` 当作当前体验地址,也不能用 30x、`meta refresh`、`location.replace` 伪装稳定入口。
|
|
88
|
+
- 不可变版本 URL 只写入历史版本记录、回滚和审计。固定入口可以使用同源全屏加载壳承载当前不可变产物,并必须透传 `autoplay`、`fullscreen` 与 `gamepad` 权限。
|
|
87
89
|
6. 若同时交付 Windows,从稳定公网地址下载完整安装包并核对大小、SHA-256 和版本;在线入口还要加载真实 WASM/Data。
|
|
88
90
|
7. 调用官方 `ai_app_publish_store` 生成并发布精确版本的应用商城包。超时属于结果不确定,必须回读包正文和 ZIP 后才能决定是否重试。
|
|
89
91
|
8. 回读 `sys_microistore` 的 AppKey、版本、状态、预览图、包摘要与资源策略,断言 `AppVersion == PackageInfo.Version == PreparedAssets.PackageVersion`。
|
|
@@ -29,11 +29,10 @@ V8.OsClientType // 'Normal' / 'App' / 'Wechat'
|
|
|
29
29
|
V8.OsClientNetwork // 'Intranet' / 'Outernet'
|
|
30
30
|
V8.OsClientModel // 当前租户 SaaS 配置的脱敏副本
|
|
31
31
|
V8.ClientModel // OsClientModel 的兼容别名,同样是脱敏副本
|
|
32
|
-
V8.SysConfig //
|
|
33
|
-
V8.SysConfig.PublicSettings // 当前租户 mci_system_setting 的动态公开投影
|
|
32
|
+
V8.SysConfig // 当前租户系统配置根对象;不存在 PublicSettings 属性
|
|
34
33
|
```
|
|
35
34
|
|
|
36
|
-
`V8.SysConfig`
|
|
35
|
+
前端 V8 的 `V8.SysConfig` 是匿名 `GetSysConfig` 的独立脱敏副本,`mci_system_setting` 中允许公开的普通值直接平铺到根对象;不会暴露 `ClientSecrets`、`GlobalServerV8Code` 或疑似凭据字段。后端接口引擎与后端 V8 事件的 `V8.SysConfig` 是当前租户完整、独立的 `sys_config`,并把全部启用的租户设置(含后端解密后的 Secret)平铺到根对象。两端都不存在 `PublicSettings` 包装层。后端可使用 Secret,但严禁返回前端、写日志或写审计。子租户显式传其它 `OsClient` 仍会被强制改回当前租户。
|
|
37
36
|
|
|
38
37
|
### V8.OsClientModel 常用字段
|
|
39
38
|
|
|
@@ -148,14 +147,15 @@ var erpUrl = (V8.OsClientNetwork === 'Intranet')
|
|
|
148
147
|
// ❌ 危险:密钥写在代码里,所有租户共用,无法独立轮换
|
|
149
148
|
var ak = 'AKIDxxxxxxxx';
|
|
150
149
|
|
|
151
|
-
// ✅
|
|
152
|
-
var loginName = V8.SysConfig
|
|
150
|
+
// ✅ 普通业务值:每个租户在 mci_system_setting 动态维护
|
|
151
|
+
var loginName = V8.SysConfig['Login.Gitee.Name'];
|
|
153
152
|
|
|
154
|
-
// ✅ Secret
|
|
155
|
-
|
|
153
|
+
// ✅ 后端 V8 可读取当前租户 Secret 并直接调用供应商
|
|
154
|
+
var secret = V8.SysConfig['Login.Gitee.ClientSecret'];
|
|
155
|
+
// 禁止 return secret、console.log(secret) 或写入前端可读字段。
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
> `mci_system_setting`
|
|
158
|
+
> `mci_system_setting` 位于每个租户自己的数据库。普通设置可逐条动态公开并直接平铺到前端 `V8.SysConfig`;Secret 保存认证密文,只在后端 V8 的当前租户 `V8.SysConfig` 中解密使用。前端 V8、普通 FormEngine HTTP、匿名/访问密钥会话不能读取 Secret,后端 V8 也不能获得通用解密器。`sys_osclients` 自定义业务字段只保留存量兼容;共享基础设施字段由服务端强制移除,不能用自定义同义字段绕过安全代理。
|
|
159
159
|
|
|
160
160
|
## 用户扩展字段访问(同理)
|
|
161
161
|
|
|
@@ -18,11 +18,12 @@ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆
|
|
|
18
18
|
第三方密钥(微信、支付宝、OpenAI、阿里云、ERP、SMTP)**禁止**硬编码在 V8 代码或前端。新增租户业务配置使用当前租户数据库的 `mci_system_setting`;数据库、Redis、MongoDB、MinIO、MQ 等部署控制面仍由主库 `sys_osclients` 托管,子租户不能修改。
|
|
19
19
|
|
|
20
20
|
```javascript
|
|
21
|
-
// ✅ 浏览器/前端 V8
|
|
22
|
-
var loginName = V8.SysConfig
|
|
21
|
+
// ✅ 浏览器/前端 V8 只能读取管理员明确公开的普通设置,直接位于根对象
|
|
22
|
+
var loginName = V8.SysConfig['Login.Gitee.Name'];
|
|
23
23
|
|
|
24
|
-
// ✅ Secret
|
|
25
|
-
|
|
24
|
+
// ✅ 后端接口引擎/后端 V8 事件可读取当前租户完整配置(包括 Secret)
|
|
25
|
+
var clientSecret = V8.SysConfig['Login.Gitee.ClientSecret'];
|
|
26
|
+
// 只能在后端使用,禁止 return、日志、审计或写入前端可读数据。
|
|
26
27
|
|
|
27
28
|
// ❌ 危险:密钥泄漏 / 跨租户串号
|
|
28
29
|
var openaiKey = 'sk-xxxxxxxxxx';
|
|
@@ -30,9 +31,9 @@ var openaiKey = 'sk-xxxxxxxxxx';
|
|
|
30
31
|
|
|
31
32
|
`V8.OsClientModel` 与兼容别名 `V8.ClientModel` 均为独立脱敏副本:数据库连接、AuthSecret、Redis、对象存储、MQ、MQTT、Search 的地址与凭据不会注入脚本。存量租户业务字段只作兼容,新增 Secret 不得继续依赖 `V8.OsClientModel`。
|
|
32
33
|
|
|
33
|
-
`V8.SysConfig`
|
|
34
|
+
`V8.SysConfig` 按运行端采用不同权限投影,且任何运行端都不存在 `PublicSettings` 属性。浏览器/前端 V8 只得到匿名 `GetSysConfig` 的独立脱敏副本;当前租户 `mci_system_setting` 中 `IsPublic=1` 的普通设置直接平铺到根对象,Secret 或 Key 命中 Password、Secret、Token、Credential、PrivateKey、AccessKey、ApiKey、ConnectionString、DbConn、Redis、MinIO、ClientSecret 等敏感片段时永远失败关闭。后端接口引擎和后端 V8 事件得到当前租户完整、独立的 `sys_config`,并在根对象中获得全部启用的 `mci_system_setting`,Secret 由可信后端按租户解密。子租户调用 `V8.FormEngine.GetSysConfig(...)` 时仍强制使用当前 `OsClient`,不能借缓存命中读取其它租户配置。
|
|
34
35
|
|
|
35
|
-
Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30
|
|
36
|
+
Secret 只通过租户管理员专用端点写入租户绑定的认证密文。列表不返回密文或原文;临时显示必须消费 Passkey/TOTP/严格人脸一次性票据,设置 `no-store`,30 秒清除,审计不含原文。前端 V8、普通 FormEngine HTTP、匿名请求和访问密钥会话不得读取 `SecretCipher` 或 Secret 原文;后端 V8 只能通过当前租户 `V8.SysConfig[ConfigKey]` 使用已解密值,不获得通用解密器,也不得返回或记录原文。
|
|
36
37
|
|
|
37
38
|
共享基础设施只能通过受控能力访问:`V8.Cache` 自动绑定 `Microi:{OsClient}:*`,文件路径绑定 `/{OsClient}/...`,RabbitMQ 队列绑定 `microi.{OsClient}.*`,MQTT Topic 绑定 `tenant/{OsClient}/...`,Search 索引绑定 `{OsClient}_*`。V8 不得获得 Redis `IDatabase`、HDFS `ClientModel` 或原始基础设施配置。
|
|
38
39
|
|
|
@@ -39,7 +39,7 @@ AI 新增或修改 Microi 配置文件时,凡是面向开发者、部署人员
|
|
|
39
39
|
- DES 是现有兼容格式,不得宣称能抵抗服务器所有者或代码执行者。新高价值秘密优先使用带版本的现代认证加密与集中密钥管理;基础设施密钥仍不得进入可编辑 V8。
|
|
40
40
|
- 登录后的敏感操作优先用 `V8.Identity.Verify` 申请 Passkey、Authenticator TOTP 或严格人脸一次性票据,接口引擎从权威数据重算 `ActionHash` 后调用 `V8.Method.ConsumeIdentityVerificationTicket` 原子消费。票据不能代替菜单/表/行权限、状态机、幂等、事务或审计。
|
|
41
41
|
- Windows Hello、Touch ID、Face ID 和 Android 设备验证优先采用 WebAuthn/Passkey;Microsoft/Google Authenticator 采用标准 TOTP,两者都不增加模型服务。只有服务端严格人脸与活体检测才接入独立 `Microi Face Gateway v1` 云服务或 Docker/集群。完整规范读取 `microi.skills/v8-security/SKILL.md` 与 `microi.doc/docs/doc/more/identity-verification.md`。
|
|
42
|
-
- 外部登录统一在登录页【登录方式】中展示;Gitee、微信、GitHub 等 Provider 只登录个人中心已绑定的吾码用户,最终签发 DiyToken。Provider 固定协议端点,租户自己的 ClientId/ClientSecret 放 `mci_system_setting
|
|
42
|
+
- 外部登录统一在登录页【登录方式】中展示;Gitee、微信、GitHub 等 Provider 只登录个人中心已绑定的吾码用户,最终签发 DiyToken。Provider 固定协议端点,租户自己的 ClientId/ClientSecret 放 `mci_system_setting`;Secret 不进入浏览器/前端 `V8.SysConfig`,但后端接口引擎和后端 V8 事件可从当前租户根级 `V8.SysConfig[ConfigKey]` 使用,禁止回传或记录原文。
|
|
43
43
|
- 一键安装恢复客户旧库时只允许定位精确主租户三元组;缺失则幂等创建,重复则停止,不能批量重写其它子租户。新主租户行不得持久化数据库、MongoDB 或 Redis 连接,安装器对 MinIO/OCR 等业务配置的后续更新也必须带同一三元组、活动状态条件并做唯一回读。
|
|
44
44
|
|
|
45
45
|
<!-- /microi-progressive:chunk -->
|
|
@@ -199,7 +199,7 @@ AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果
|
|
|
199
199
|
7. Microi.VSCode 生成 MCP 配置时应清理旧的中文/横杠 Microi MCP key,只保留 `microi_<osClient>` 或 `microi_<osClient>_<host>` 形式,避免不同 AI 客户端因 namespace 不稳定而无法注入工具。
|
|
200
200
|
|
|
201
201
|
<!-- /microi-progressive:chunk -->
|
|
202
|
-
<!-- microi-progressive:chunk id=workspace-conventions-037 sha256=
|
|
202
|
+
<!-- microi-progressive:chunk id=workspace-conventions-037 sha256=e8ddd5ad53787087f8e50a13618ee5626686cc72b0b21c1b12b0dc60ea515713 -->
|
|
203
203
|
## Windows MCP 控制台闪窗复盘
|
|
204
204
|
|
|
205
205
|
当用户反馈“打开 Microi.VSCode、添加服务器或初始化 MCP 后连续弹出并立即关闭多个 cmd 窗口”时,应按进程风暴排查,不能只给已有 `spawn` 补 `windowsHide`:
|
|
@@ -209,6 +209,8 @@ AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果
|
|
|
209
209
|
3. VS Code 已配置 `chat.mcp.autostart` 时,插件后台监测只能检查配置和状态,禁止在侧栏显示、定时轮询、登录、添加连接或初始化流程里再次执行 `workbench.mcp.startServer('*')`。
|
|
210
210
|
4. 握手诊断会真实启动每个 stdio MCP,只能由用户显式点击“诊断 MCP 可调用性”触发;常规配置成功提示不得暗中运行整组诊断。
|
|
211
211
|
5. Windows 的 VS Code/Cursor 配置优先复用 GUI Electron 宿主 `process.execPath` 并设置 `ELECTRON_RUN_AS_NODE=1`,避免把控制台子系统的外部 `node.exe` 持久化为每个 MCP 的启动命令。Trae 若因空格路径兼容必须经过 `cmd.exe`,仍需使用固定 launcher 并隐藏窗口。
|
|
212
|
-
6.
|
|
212
|
+
6. CLI 或初始化器运行在 VS Code/Cursor Electron 宿主内时,必须通过 `process.versions.electron` 或等价事实识别宿主,并把 `ELECTRON_RUN_AS_NODE=1` 同步写入 `.vscode/mcp.json`、`.cursor/mcp.json`、根 `.mcp.json` 以及 `.codex/config.toml` 的对应 stdio 配置。禁止只把 `Code.exe`/`Cursor.exe` 写成 `command` 却遗漏 Node 模式;否则 Windows 会把 `mcp-codex-stdio-adapter.js` 当普通文件交给编辑器打开,每次启动或切换 AI 对话都可能新增一棵 GUI 进程树。
|
|
213
|
+
7. Codex 仍只能生成一个 `microi_codex` 路由块,禁止按 Profile 注册多个 Codex MCP。验收必须同时回读配置和进程:凡 `Code.exe`/`Cursor.exe` 命令都带 Node 模式,且不得存在以 `mcp-codex-stdio-adapter.js`、`microi-codex-router.js` 为普通文件参数的可见编辑器根进程;多个对话的 Router 应复用共享 Broker,而不是各自再拉起全部真实 Profile MCP。
|
|
214
|
+
8. 回归测试至少静态断言:Codex CLI 批量注册函数不存在、后台 monitor 不包含 `startServer`、自动配置不包含诊断、Codex 配置内容不变时不改写、Windows GUI 宿主检查早于外部 Node 探测、CLI 与 Codex 路由配置都保留 `ELECTRON_RUN_AS_NODE=1`。再在扩展开发宿主中覆盖打开侧栏、添加连接、初始化 MCP,观察无连续控制台闪窗或脚本文件被自动打开。
|
|
213
215
|
|
|
214
216
|
<!-- /microi-progressive:chunk -->
|