@microi.net/cli 5.8.9 → 5.9.1

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.
Files changed (24) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +4 -4
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/microi-cli.js +23 -23
  10. package/scripts/microi-skills.meta.json +208 -208
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +80 -80
  13. package/skills/microi-codex/SKILL.md +105 -101
  14. package/skills/microi-mobile-app-quality/SKILL.md +20 -8
  15. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +22 -11
  16. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +4 -4
  17. package/skills/microi-system-delivery/SKILL.md +4 -2
  18. package/skills/microi-uniapp-frontend/SKILL.md +18 -12
  19. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +103 -67
  20. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +10 -10
  21. package/skills/workspace-conventions/SKILL.md +283 -273
  22. 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 +209 -209
  23. 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 +217 -217
  24. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +35 -27
@@ -1,217 +1,217 @@
1
- # workspace-conventions 详细参考 2
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=workspace-conventions-024 sha256=92c453b5fafa36d68098b3da5817d0de260a3cf454d8cae63f71a3f65e57bbdc -->
6
- ## Microi.net.Api 本地启动约定
7
-
8
- 默认本地后端项目是 `Microi.Server/Microi.net.Api/Microi.net.Api.csproj`。AI 需要启动后端、验证接口、跑 Playwright、回读接口引擎或排查前后端联调问题时,优先使用下面的 PowerShell 命令:
9
-
10
- ```powershell
11
- Push-Location Microi.Server/Microi.net.Api
12
- dotnet run --launch-profile Microi.net.Api
13
- Pop-Location
14
- ```
15
-
16
- 必须先进入 `Microi.Server/Microi.net.Api` 再启动。`Program.cs` 会在 `WebApplication.CreateBuilder(args)` 之前读取当前目录下的 `.microi-local`,将其中的环境名写入 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,随后加载 `appsettings.{环境名}.json`。如果从仓库根目录直接运行并导致配置读取异常,先改用上面的 `Push-Location` 方式。
17
-
18
- 普通本地启动默认不要额外设置 `ASPNETCORE_ENVIRONMENT` 或 `DOTNET_ENVIRONMENT`;如果这些变量已由 `launchSettings.json`、`launch.json`、终端环境或测试脚本显式设置,`.microi-local` 不会覆盖它们。实际监听地址必须读取 `Microi.Server/Microi.net.Api/Properties/launchSettings.json` 的 `Microi.net.Api` profile;当前标准工作区是后端 `61501`、前端 `61500`,不能继续硬编码历史 `7266/1988`。
19
-
20
- **本地后端自动重启要求(强制)**:本地联调需要启动或重启 `Microi.net.Api` 时,先执行 `node Microi.Server/tools/release-lock.mjs assert api <工作区根>`;API 锁存在时禁止启动或重启后端。PC、官网和 Agent 发布不阻塞 API 服务。无发布时先回读标准端口和 `/api/Diagnostics/liveness`,健康服务默认复用;只有本任务修改了需重载的后端代码、服务不健康或用户明确要求重启时,才可精确停止当前工作区的后端进程,然后在 `Microi.Server/Microi.net.Api` 目录执行 `dotnet run --launch-profile Microi.net.Api`。优先使用用户能在 VS Code 中看到和停止的终端(包含 VS Code 集成终端、VS Code 任务终端、用户明确允许的 VS Code 可追踪隐藏终端);如果当前工具没有 VS Code 终端能力,允许使用本机可见的 `cmd`/PowerShell 窗口启动,禁止使用脱离用户可见窗口的后台服务或守护进程。不要误杀数据库、Redis、Node 前端或其它业务进程。
21
-
22
- <!-- /microi-progressive:chunk -->
23
- <!-- microi-progressive:chunk id=workspace-conventions-025 sha256=4cf40c4ca771f7e04b80279646323a816378b98669f562ff8f4c647d5bf837ca -->
24
- ## 多 AI 对话共享本地服务与发布互斥(强制)
25
-
26
- 同一工作区的 4、5 个 AI 对话共用同一份源码和固定端口时,`61500/61501` 是工作区级单例共享服务,不属于某个对话。端口相同意味着无法让每个对话拥有一套独立进程;正确模型是“复用健康服务 + 需要重载时串行重启 + 同范围发布时独占”,不能让每个对话都无条件先杀再启动。
27
-
28
- - 启动前先检查端口、健康接口、PID、命令行和工作区路径。健康且代码无需重载时直接复用;不得仅为声明“本对话拥有服务”而重启。
29
- - 长期本地后端必须通过项目目录里的 `dotnet run --launch-profile Microi.net.Api` 使用开发输出。禁止把 `bin/Release/net10.0` 或 `bin/Release/publish` 的 `dotnet Microi.net.Api.dll` 当长期 E2E 服务;运行中的 Release DLL 会让后续 `dotnet build` 报 `MSB3021/MSB3027` 文件锁。
30
- - 一键编译发布按所选产品创建 `.tmp/microi-process-state/api-release.lock`、`pc-release.lock`、`website-release.lock` 或 `agent-release.lock`。合并发布按固定顺序取得所需锁;任何一项占用时撤回本次已取得的锁。Windows 的 `PrepareRelease -ReleaseScope api|pc|all` 仅清理所选范围:API 处理本工作区后端与 Release DLL,PC 处理本工作区 Vite;官网不停止二者。身份不匹配时停止,不得按进程名全杀。
31
- - Vite 子进程可能由相对 `node_modules/vite/bin/vite.js` 启动,父 npm/终端退出后命令行不再包含工作区绝对路径。Windows 进程管理器应先匹配命令行绝对路径;无法匹配时只读回读进程 CWD,只有 CWD 精确等于当前工作区 `Microi.Client` 且入口确为 Vite 才可结束。CWD 无法读取、属于其它目录或仅仅“父进程不存在”时必须失败关闭。
32
- - API、PC、官网和 Agent 可以同时发布,同类发布互斥。旧 `platform-release.lock` 与 `release.lock` 仅在真实 PID 命令入口及共享状态目录证明属于 API 热修复或 Agent 时缩小阻塞范围;未知归属继续保守阻塞,禁止删除活跃旧锁。Full 仍是 PC/API 发布硬门禁;其 .NET 输出放入本次结果目录的 `.net-artifacts`,并行 Full 使用独立结果目录、测试服务和隔离租户。共享版本号或跨产品源码必须先准备冻结,再启动并行发布,禁止测试期间改写候选。 macOS/Linux 的 Full apphost 仅允许当前工作区 `.tmp/microi-release-gate/日期-时间-PID/.net-artifacts/bin/Microi.net.Api/debug|release/Microi.net.Api` 的规范路径,且 CWD 必须精确等于 API 项目;任意外部输出、其它工作区或路径归一化差异继续失败关闭。
33
- - 启动或重启 API 前检查 `assert api`,PC 前检查 `assert pc`;只有对应范围发布时等待或退出,官网/Agent 不阻塞共享服务。需要同时启动二者时分别检查两项;正常结束或中断由原进程和唯一令牌释放自身锁。
34
- - Edge/Chrome 主浏览器、VS Code 持有的 Playwright Test Server、语言服务和 MCP Node 进程不属于发布文件锁清理范围。浏览器自动化必须关闭本用例创建的 context/browser;不得通过 `taskkill /IM chrome.exe|msedge.exe|node.exe|dotnet.exe` 清空整机进程。
35
- - 人工盘点使用:`powershell -NoProfile -ExecutionPolicy Bypass -File Microi.Server/tools/Microi.LocalProcessManager.ps1 -Action Status`。需要单独停止当前工作区服务时使用 `-Action StopBackend` 或 `-Action StopFrontend`,不再让用户根据任务管理器猜进程。
36
-
37
- ### 共享前端服务不等于共享浏览器会话
38
-
39
- 多个 AI 对话可以复用同一个 `61500` Vite 进程,但不能复用同一个浏览器存储上下文测试不同
40
- `ApiBase + OsClient`。`Microi.Client` 对 localhost 同源持久化 Token、CurrentUser、ApiBase、
41
- OsClient 等状态;同一 Profile/Context 内切换租户会污染其它窗口。
42
-
43
- - 本地 URL 的最高优先级参数位于 `#` 之前:
44
- `/?OsClient=<tenant>&ApiBase=<encodeURIComponent(apiBase)>#/route`。
45
- - 手工第二个不同租户至少使用无痕窗口;多个无痕窗口可能共享同一临时会话,因此更多并发目标使用
46
- 独立 Profile 或独立 `--user-data-dir`。
47
- - Playwright/Codex 为每组目标创建独立 `browser.newContext()`,一个 context 内不得用多个 Page
48
- 混测不同租户。只关闭本任务创建的 context/browser,不结束用户浏览器。
49
- - 线上目标先在一次性 context 等待页面初始化并读取 `window.__MICROI_RUNTIME_ENDPOINT__`;旧版本
50
- 回退读取 URL、`window.ApiBase/window.OsClient`、`localStorage['microi.net']`,必要时调用域名租户
51
- 解析接口。不能根据站点标题猜 OsClient,也不能把 Token 放入本地 URL。
52
- - 目标 API 还需允许 `http://localhost:61500` 的 CORS。运行目标识别、本地源码验证与线上部署验收
53
- 分层报告。
54
-
55
- <!-- /microi-progressive:chunk -->
56
- <!-- microi-progressive:chunk id=workspace-conventions-026 sha256=73207c0cfcc442a177c47c36503dd6145fc826e23e79df3913861f65d8d16df3 -->
57
- ## 本地租户与测试凭据读取约定
58
-
59
- AI 在本地启动后端、跑 Playwright、做登录态页面截图或调用需要登录的接口前,必须先尝试从本地配置判断租户和测试账号,不要直接以“未登录无法测试”结束:
60
-
61
- 1. 读取 `Microi.Server/Microi.net.Api/.microi-local`,得到当前环境名,例如 `<Environment>`。
62
- 2. 读取 `Microi.Server/Microi.net.Api/appsettings.<Environment>.json`,或测试脚本传入的 `PW_APPSETTINGS_PATH`。
63
- 3. 测试账号密码只从用户本轮明确提供、受保护的测试进程变量 `PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD`、CI Secret 或既有安全登录态取得;不得把凭据写入 `appsettings.*.json`、源码或测试报告。
64
- 4. `MICROI_OSCLIENT`、`PW_OS_CLIENT` 等只属于自动化工具进程,不是 API 生产环境变量;显式设置时可用于选择测试租户。
65
- 5. `.microi-local`、Token、数据库连接串、Redis 密码和测试凭据都视为本地敏感配置。最终回复、日志摘要和测试报告中不得输出真实值,只能写 `<redacted>`、`本地配置账号` 或 `本地配置凭据`。
66
-
67
- <!-- /microi-progressive:chunk -->
68
- <!-- microi-progressive:chunk id=workspace-conventions-027 sha256=84988eac9cf7543a192b3e829b879afb7b35ef92798dc9ea69243f173a8ab674 -->
69
- ## 自动化登录约定
70
-
71
- 本地和远端 E2E 统一传真实 `Account` / `Pwd`。需要跳过图形验证码时,只能在目标租户 `sys_config.AutoTestSkipCaptcha=true` 后传 `_AutomationTestLogin=true`;它只跳过验证码,绝不能绕过密码校验。禁止恢复 `DevLoginBypass`、`X-Microi-Dev-Key`、`_DEV_BYPASS_` 或让脚本自动改写后端 `appsettings`。测试完成后不持久化账号密码。
72
-
73
- <!-- /microi-progressive:chunk -->
74
- <!-- microi-progressive:chunk id=workspace-conventions-028 sha256=6ff58ce80aab2bd47c5af022382159e98e4c4ca5eb955281e61918079d4175a5 -->
75
- ## V8 远端/本地同步收尾约定
76
-
77
- AI 通过 MCP、接口引擎、数据库脚本或平台 API 修改任何远端 V8 代码后,任务结束前必须把远端当前生效代码同步回本地 `Microi-V8-Engine/<server>/<osClient>/` 目录,并做一次同步状态复核。
78
-
79
- 适用范围包括:
80
- - `sys_apiengine.ApiV8Code` 接口引擎
81
- - `diy_table` 表单 V8 事件
82
- - `diy_field` 字段 V8 事件
83
- - `sys_menu` 模块按钮/Tab V8 代码
84
- - `wf_node` 工作流节点 V8 代码
85
- - `sys_datasource` 数据源 V8 代码
86
-
87
- 收尾流程:
88
- - 若远端是通过 MCP 写入的,以远端当前生效代码为准回写本地文件。
89
- - 若本地文件是先手工修改的,先推送到远端,再重新拉取/复核,确保本地与远端一致。
90
- - 优先使用 Microi.Agent 插件的同步/查看同步状态能力;没有可调用插件时,可在 `.tmp/` 写一次性同步脚本,但脚本必须先 dry-run 输出差异摘要,再 apply。
91
- - 复核结果应确认 touched 范围内 `Changed=0`、`Created=0`、`LocalOnly=0` 或说明剩余差异原因。
92
- - 空 V8 代码不生成本地 `.js` 文件;若已有空 `.js` 文件,收尾同步时应删除,避免被误判为本地未推送。
93
- - AI 收尾不能只看自写脚本的 dry-run;只要工作区安装了 Microi.Agent 插件,就必须按插件“查看同步状态”的口径再复核一次。最终回复中要明确说明插件口径是否为 0;若仍有本地未推送/远端差异,必须列出具体资源类型、Key 和本地文件路径,不能只报数量。
94
- - 当远端代码与本地代码完全一致但插件仍提示“本地未推送”时,优先校准 `.microi-meta.json` 的 `updateTime/filePath` 与本地文件 `mtime`,并再次执行插件口径同步检查;不要让时间戳误差遗留给用户。
95
- - AI 通过 MCP/API 直接写远端 V8 后,必须立即回读远端当前生效代码到本地并校准 `.microi-meta.json` 与文件 `mtime`。这不是可选清理动作,而是交付完成条件;否则 VS Code 插件会按时间戳继续提示“本地未推送”。
96
- - 若同步状态非 0,必须先列出具体文件并分类处理:正文一致仅校准 meta/mtime,远端较新则拉回,本地较新则推送,双方都改过则人工合并。生产资金/资产系统不能为清状态盲目覆盖远端。
97
-
98
- <!-- /microi-progressive:chunk -->
99
- <!-- microi-progressive:chunk id=workspace-conventions-029 sha256=e90e532f9448b67f98f28a68fd4ea45b79868cf25fc14c5283b9074e91559f27 -->
100
- ## V8 缓存刷新约定
101
-
102
- 如果 AI 绕过平台表单提交事件,直接通过 MCP、数据库脚本或自写同步工具更新 `sys_apiengine`、`diy_table`、`diy_field`、`sys_menu`、`wf_node` 等远端 V8 代码,收尾时除了同步本地文件,还必须刷新运行中服务的缓存。至少清理当前 `<OsClient>` 下对应资源的 `Microi:<OsClient>:FormData:<table>:<key>`、`Id` 和地址形式缓存;若可用,优先调用平台缓存接口或插件内置同步流程。清缓存后要重新调用受影响接口做一次真实验证,避免本地/远端代码已一致但 API 仍执行旧缓存代码。
103
-
104
- <!-- /microi-progressive:chunk -->
105
- <!-- microi-progressive:chunk id=workspace-conventions-030 sha256=c25d0aaffec64d8a66cda36acd9ec337eda99a4411fddb0e966e45247ba574de -->
106
- ## MCP 元数据更新验收约定
107
-
108
- AI 通过 MCP 修改 `diy_field`、`diy_table`、`sys_menu`、`sys_osclients`、`sys_config` 等平台元数据后,不能只看写入返回成功,必须按前端真实消费方式回读验证:
109
-
110
- 1. 修改 `Select`、`Radio`、`Checkbox`、`MultipleSelect` 等选项组件时,必须回读字段的 `Component`、`Data`、`Config`。已有字段更新时不要假设 `"key|label"` 字符串会被 `microi_update_field` 自动解析;KeyValue 数据源推荐直接把 `Data` 写成 JSON 数组 `[{"Key":"Aliyun","Value":"阿里云机器翻译"}]`,并确保 `Config.DataSource=KeyValue`、`SelectLabel=Value`、`SelectSaveField=Key`。
111
- 2. 修改字段、表、菜单后,必须调用 `microi_get_field_list` / `microi_get_table_data` 回读关键字段,并调用 `microi_refresh_schema_cache` 或对应清缓存接口刷新 Redis。涉及 SaaS 引擎、系统设置、菜单按钮、接口引擎等运行态缓存时,还要调用对应租户清缓存接口并重新请求受影响页面/API。
112
- 3. 最终交付说明必须写清楚:改了哪个表/字段,回读值是什么,刷新了哪些缓存,验证入口是什么。若某个缓存刷新接口失败或只能部分成功,需要把失败消息原样摘要出来,不能把“写入成功”当作“页面一定生效”。
113
-
114
- <!-- /microi-progressive:chunk -->
115
- <!-- microi-progressive:chunk id=workspace-conventions-031 sha256=cea2d1c912ffc31136a859fd10f282c488b5b8d1bf3f2ced7c39084b23e5ccf5 -->
116
- ## MCP 可用性排查约定
117
-
118
- VS Code、Cursor 或 Codex 设置界面显示某个 MCP 服务器“已启用”,不代表当前 AI 会话一定已经成功加载了对应工具。AI 在声称“可以通过 MCP 操作”之前,必须完成一次真实可调用性验证:
119
-
120
- - 先用当前会话可用的工具发现能力查找目标 MCP 工具;若工具发现为 0,不能继续假设 MCP 可用。
121
- - 再用 MCP 资源/模板列表或最小 `initialize` / `tools/list` 探测确认服务器握手成功。若返回 `handshaking with MCP server failed`、`initialize response`、`connection closed` 等错误,要明确说明“配置存在但当前会话不可调用”。
122
- - 同时检查 `.vscode/mcp.json`、`.cursor/mcp.json`、`.mcp.json` 和 `~/.codex/config.toml` 是否能解析,并确认目标服务器名、`MICROI_API_URL`、`MICROI_OS_CLIENT`、`MICROI_TOKEN_FILE` 已写入。
123
- - 如果手动启动 `mcp-server.js` 能响应,而当前 AI 会话仍握手失败,应优先怀疑 MCP stdio 协议兼容、初始化响应格式/大小、服务器进程提前退出或插件生成的 Codex 配置顺序问题,而不是简单归因于“用户没启用”。
124
- - 当 MCP 工具数量较多时,`tools/list` 的前段必须优先返回通用建模和维护工具,例如 `microi_get_db_schema`、`microi_get_field_list`、`microi_add_field`、`microi_update_field`、`microi_refresh_schema_cache`、`microi_create_table`、`microi_create_module`、`microi_get_event_code`、`microi_save_event_code`。部分 AI 客户端或模型上下文只注入前若干个工具,若核心工具排在后面,会误报“缺少 MCP 工具”。
125
- - MCP 的初始化说明必须使用真实 `MICROI_OS_CLIENT` 作为租户边界。中文显示名通过 ASCII 的 `MICROI_LABEL_BASE64` 传输并在 MCP 内解码,旧版 `MICROI_LABEL` 只作兼容;显示名不能当成租户 Key 写入“只能管理某租户”的安全提示。
126
- - 遇到 `ByteString`、`greater than 255` 或“第 N 个字符无法写入 Header”时,必须先检查实际异常索引和所有 HTTP Header 来源。Microi MCP 的设备标识来自 `did` / `MICROI_MCP_DID`;默认值若直接拼接中文 Windows 主机名,会在 `MCP:` 后第 4 个字符报错。`MICROI_LABEL_BASE64` 只用于显示,不会作为业务 HTTP Header 发送,禁止在未核对调用链前把错误归因于中文 Label。插件和 MCP 必须把 DID 规范化为稳定的可打印 ASCII。
127
- - MCP 连接失败时,AI 在完成配置、进程、Header、`initialize`、`tools/list` 和只读状态调用的证据链之前,不得修改 Token、租户、服务器地址或执行远端写入。连接恢复后先完成只读基线盘点,再按用户授权开始写入。
128
- - 修复 Microi.Agent 插件的 MCP 生成逻辑后,必须重新生成配置、重启对应 MCP server,并在当前 AI 会话中再次验证工具发现与一次只读工具调用。
129
-
130
- <!-- /microi-progressive:chunk -->
131
- <!-- microi-progressive:chunk id=workspace-conventions-032 sha256=230c8683389d2b1ee4f5ba88dc4e51cb4dc4eb6a89b76a142b07f479ff5be1c8 -->
132
- ## MCP 写入超时与降级约定
133
-
134
- - 写请求超时后的远端回读必须使用独立的短超时,不能继续沿用普通查询的长超时。否则一次 60 秒写超时后,每次回读还可能等待 120 秒,AI 会长期停留在“等待远端回读”,用户误以为菜单按钮或接口引擎完全写不进去。
135
- - `microi_create_engine` 必须与代码保存、事件保存、菜单更新一样使用写请求超时和远端回读确认。创建响应异常但按 `ApiEngineKey` 回读到相同代码时,返回 `RecoveredAfterTransportError:true`;禁止因超时重复创建同一个接口引擎。
136
- - 后端创建接口引擎时,数据库新增成功后的路由缓存刷新必须设置硬超时。缓存刷新失败或超时不能把已经成功入库的创建结果伪装成失败,更不能让 HTTP 请求无限等待;响应中应通过 `CacheRefresh` 报告缓存状态。
137
-
138
- - 接口引擎代码只用 `microi_save_engine_code`,表单事件只用 `microi_save_event_code`,菜单按钮和 Tab 只用 `microi_update_module`。这些标准工具负责版本、校验、缓存和超时回读。
139
- - 请求超时是“结果不确定”,不是“写入失败”。标准工具返回 `RecoveredAfterTransportError:true` 时,表示已经通过远端回读确认成功,不得再次写入。
140
- - 标准工具明确返回“回读未确认”时,只调用对应 get 工具继续核对一次。没有用户明确授权,不得改走原生 FormEngine HTTP、直接 SQL、表定义增量更新,也不得创建一次性维护接口引擎绕过原端点。
141
- - `MoreBtns`、`FormBtns`、`BatchSelectMoreBtns`、`PageTabs`、`ExportMoreBtns`、`PageBtns` 一律向 MCP 传明文 JSON 数组。租户 `sys_menu` 表单事件中的 Base64 解码属于平台内部兼容逻辑,AI 不得据此手工 Base64 编码。
142
- - AI/终端工具显示的 `…N tokens truncated…`、`Exit code: N`、`Chunk ID:`、`Wall time:` 等是宿主输出标记,不是 V8 源码。禁止复制到本地文件或 MCP 写入参数;读取长源码必须按工具返回的字符范围分段取完,并核对完整源码 SHA-256。标准 MCP 写工具和插件推送检测到这些标记时必须拒绝写入。
143
- - 远端源码不少于 8000 字符,而新源码减少超过 15% 时,应先视为可能只拿到了截断片段并停止写入。只有核对完整源码且确需大幅删减时,才使用写工具提供的显式大幅删减确认参数。
144
- - 发生连续写入超时时,要先停止并发写入,记录具体工具、资源 Key、耗时和回读结果;禁止用“服务器整体不可用”“缓存锁死”等没有日志证据的结论代替诊断。
145
-
146
- <!-- /microi-progressive:chunk -->
147
- <!-- microi-progressive:chunk id=workspace-conventions-033 sha256=b642bb516a42b50e8b459e5237588e85d71c9715970779e155b88d7c0e8c6536 -->
148
- ## Codex MCP 单入口约定
149
-
150
- - Codex 对普通 MCP 大工具集可能无法稳定注入时,使用插件生成的 `microi_codex` 单入口,不要据此判断服务器或帐号不可用。
151
- - `microi_codex` 的 `action="list_tools"` 可按 `params.keyword` 查找工具,`action="describe_tool"` + `params.name` 可读取参数说明;执行时 action 使用原始 `microi_*` 工具名,参数放在 `params`。
152
- - 单入口只负责路由,必须复用原工具的参数 schema、写入确认、审计、超时回读和错误返回。不得因为只暴露一个 Codex 工具而放宽远端写入保护。
153
- - 如果 Codex 仍不注入 `microi_codex`,优先使用它实际提供的资源工具:先 `list_mcp_resources` 并读取 `microi://codex/status` / `microi://codex/tools`;通用调用先 `list_mcp_resource_templates`,再读取 `microi://codex/action/{action}/{params}`,其中 `params` 是 URI 编码后的 JSON 对象。
154
- - 资源模板只是兼容传输层,执行的仍是原始 `microi_*` handler。写操作同样必须携带原工具要求的 `confirmExecution`,不得把 resource read 当成绕过确认的通道。
155
- - VS Code/Copilot、Cursor、Claude Code 仍使用完整 MCP 工具集;不要把 Codex 的 `enabled_tools = ["microi_codex"]` 复制到其他客户端配置。
156
-
157
- <!-- /microi-progressive:chunk -->
158
- <!-- microi-progressive:chunk id=workspace-conventions-034 sha256=073253c786f85fb23b8b09c71418eaaa00f6a36262bf32e9da857340faa3e75f -->
159
- ## .venv Python 环境说明
160
-
161
- 工作区根目录的 `.venv/` 是 Python 虚拟环境,**保留,不要删除**。已安装:
162
- - `playwright` — Playwright E2E 测试
163
- - `openai` — AI 接口调用
164
- - `httpx` — HTTP 客户端
165
- - 其他工具(flake8、pytest 等)
166
-
167
- AI 执行 Python 脚本时应使用 `.venv\Scripts\python.exe`(Windows)而非系统 Python。
168
- <!-- /microi-progressive:chunk -->
169
- <!-- microi-progressive:chunk id=workspace-conventions-035 sha256=c114dffea6978f289601a8f71aa83a0466f3d934e96e45bb871af179d319a1e3 -->
170
- ## 后端代码改动后的重启验收
171
-
172
- AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果的后端源码、配置、控制器、服务、依赖项目或接口行为,任务收尾前必须完成一次“编译 + 重启本地后端 + 健康验证”,不要只用隔离输出目录 build 后结束。
173
-
174
- 强制流程:
175
-
176
- 1. 先执行后端编译验证。若 launch profile 当前端口上的开发服务导致 `bin/Debug/net10.0` DLL 被锁,可以先精确停止当前工作区的 `Microi.net.Api` 进程后重新编译;只有用户明确要求不中断正在运行服务时,才允许用临时输出目录作为补充验证,并必须说明运行服务尚未替换。
177
- 2. 从 `launchSettings.json` 回读实际端口,查找并停止该端口上的本地 `Microi.net.Api` 进程。只停止命令行与当前工作区匹配的 Microi 后端,不要误杀数据库、Redis、Node 前端或其它业务进程。
178
- 3. 必须进入 `Microi.Server/Microi.net.Api` 目录启动:
179
- ```powershell
180
- dotnet run --launch-profile Microi.net.Api
181
- ```
182
- 启动优先发生在用户能在 VS Code 中看到和停止的终端中,方便用户查看日志并手动停止;用户明确允许时,可以使用 VS Code 可追踪的隐藏终端/任务终端。当前工具环境没有 VS Code 终端能力时,允许使用本机可见的 `cmd`/PowerShell 窗口启动;禁止使用脱离用户可见窗口的后台服务或守护进程方式启动。标准端口无法释放时,只有同步更新前端本地 `ApiBase` 和测试变量后才可使用明确的临时端口,并在任务结束时说明。
183
- 4. 启动后轮询验证 launch profile 实际地址可访问;至少确认端口已监听、进程存在、最近日志没有立即崩溃。涉及新增 API 时,再调用新增/受影响接口做一次真实请求。
184
- 5. 最终回复必须明确说明:后端已重新编译、旧进程 PID 是否停止、新进程 PID、实际端口是否监听、验证的 URL 或接口。若因为用户明确要求不中断、端口被非 Microi 进程占用或配置缺失导致无法重启,必须把阻塞原因说具体。
185
-
186
- 这条规则优先于“避免打断正在运行服务”的默认谨慎策略;本地开发联调场景下,用户通常需要 launch profile 当前端口上的后端加载最新代码。
187
-
188
- <!-- /microi-progressive:chunk -->
189
- <!-- microi-progressive:chunk id=workspace-conventions-036 sha256=b91c431950e4c5d268d40c6372e5780b2c7e8b4ca4339871085cda91b7d932bc -->
190
- ## MCP 可调用性诊断补充
191
-
192
- 当用户反馈“Codex/VS Code 设置中能看到 MCP,但当前 AI 会话不能调用对应工具”时,不能只回答“当前会话没有注入”。必须按层排查:
193
-
194
- 1. 先确认 `.vscode/mcp.json`、`.cursor/mcp.json`、工作区根 `.mcp.json` 和 `~/.codex/config.toml` 都能解析,且目标 server key 为稳定 ASCII 格式,例如 `microi_itdos`,不要使用中文名或横杠。
195
- 2. 再用 Microi.Agent 插件的“诊断 MCP 可调用性”命令,或等价脚本直接启动对应 `mcp-server.js` / `mcp-codex-stdio-adapter.js`,执行 `initialize` 和 `tools/list`,确认 `microi_get_db_schema`、`microi_get_field_list`、`microi_add_field`、`microi_update_field`、`microi_refresh_schema_cache` 等核心工具真实返回。
196
- 3. 如果当前 AI 客户端支持工具发现或延迟加载,AI 必须先主动执行工具发现/热加载流程,例如 `tool_search`、客户端 MCP refresh、Microi.Agent 的启动/诊断命令;不要先让用户手动重启、重载或重新生成 MCP。
197
- 4. 如果真实握手成功但 Codex 当前对话仍没有注入 `mcp__...` 工具,AI 仍应优先使用等价的 MCP stdio JSON-RPC 直连 fallback 完成当前任务:读取对应 MCP 配置、启动 adapter/server、执行 `initialize`、`tools/list`、`tools/call`,并严格遵守该 MCP 绑定的 API Server 和 OsClient 边界。直连脚本必须放在 `.tmp/` 或使用一次性 stdin,不得散落到项目目录。
198
- 5. 只有在客户端不支持热加载、直连 fallback 也无法完成任务,或写操作边界无法确认时,才告知用户需要新开对话、重载 Codex 或检查 MCP 配置。说明必须写清楚:MCP 配置和进程是否可用、当前会话为什么没有注入工具、已经尝试过哪些自动恢复动作。
199
- 6. 如果握手失败,要把失败层级说清楚:配置文件解析失败、路径不存在、token 文件缺失、MCP 进程启动失败、`initialize` 失败、`tools/list` 缺核心工具,不能把这些问题混成“用户没启用 MCP”。
200
- 7. Microi.Agent 生成 MCP 配置时应清理旧的中文/横杠 Microi MCP key,只保留 `microi_<osClient>` 或 `microi_<osClient>_<host>` 形式,避免不同 AI 客户端因 namespace 不稳定而无法注入工具。
201
-
202
- <!-- /microi-progressive:chunk -->
203
- <!-- microi-progressive:chunk id=workspace-conventions-037 sha256=287a898ffb90322af12deea949c4bcf43b9ac9a355419561898cde8de2b99ac8 -->
204
- ## Windows MCP 控制台闪窗复盘
205
-
206
- 当用户反馈“打开 Microi.Agent、添加服务器或初始化 MCP 后连续弹出并立即关闭多个 cmd 窗口”时,应按进程风暴排查,不能只给已有 `spawn` 补 `windowsHide`:
207
-
208
- 1. MCP 配置文件是各客户端的事实源。内容未变化时必须使用 write-if-changed,禁止仅为“同步”而反复改写文件并触发监听器重启。
209
- 2. 生成 `~/.codex/config.toml` 后,禁止再隐式循环执行 `codex mcp list/remove/add`;服务器数量越多,这类逐项 CLI 同步越会放大成几十个瞬时控制台进程。
210
- 3. VS Code 已配置 `chat.mcp.autostart` 时,插件后台监测只能检查配置和状态,禁止在侧栏显示、定时轮询、登录、添加连接或初始化流程里再次执行 `workbench.mcp.startServer('*')`。
211
- 4. 握手诊断会真实启动每个 stdio MCP,只能由用户显式点击“诊断 MCP 可调用性”触发;常规配置成功提示不得暗中运行整组诊断。
212
- 5. Windows 的 VS Code/Cursor 配置优先复用 GUI Electron 宿主 `process.execPath` 并设置 `ELECTRON_RUN_AS_NODE=1`,避免把控制台子系统的外部 `node.exe` 持久化为每个 MCP 的启动命令。Trae 若因空格路径兼容必须经过 `cmd.exe`,仍需使用固定 launcher 并隐藏窗口。
213
- 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 进程树。
214
- 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。
215
- 8. 回归测试至少静态断言:Codex CLI 批量注册函数不存在、后台 monitor 不包含 `startServer`、自动配置不包含诊断、Codex 配置内容不变时不改写、Windows GUI 宿主检查早于外部 Node 探测、CLI 与 Codex 路由配置都保留 `ELECTRON_RUN_AS_NODE=1`。再在扩展开发宿主中覆盖打开侧栏、添加连接、初始化 MCP,观察无连续控制台闪窗或脚本文件被自动打开。
216
-
217
- <!-- /microi-progressive:chunk -->
1
+ # workspace-conventions 详细参考 2
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=workspace-conventions-024 sha256=92c453b5fafa36d68098b3da5817d0de260a3cf454d8cae63f71a3f65e57bbdc -->
6
+ ## Microi.net.Api 本地启动约定
7
+
8
+ 默认本地后端项目是 `Microi.Server/Microi.net.Api/Microi.net.Api.csproj`。AI 需要启动后端、验证接口、跑 Playwright、回读接口引擎或排查前后端联调问题时,优先使用下面的 PowerShell 命令:
9
+
10
+ ```powershell
11
+ Push-Location Microi.Server/Microi.net.Api
12
+ dotnet run --launch-profile Microi.net.Api
13
+ Pop-Location
14
+ ```
15
+
16
+ 必须先进入 `Microi.Server/Microi.net.Api` 再启动。`Program.cs` 会在 `WebApplication.CreateBuilder(args)` 之前读取当前目录下的 `.microi-local`,将其中的环境名写入 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,随后加载 `appsettings.{环境名}.json`。如果从仓库根目录直接运行并导致配置读取异常,先改用上面的 `Push-Location` 方式。
17
+
18
+ 普通本地启动默认不要额外设置 `ASPNETCORE_ENVIRONMENT` 或 `DOTNET_ENVIRONMENT`;如果这些变量已由 `launchSettings.json`、`launch.json`、终端环境或测试脚本显式设置,`.microi-local` 不会覆盖它们。实际监听地址必须读取 `Microi.Server/Microi.net.Api/Properties/launchSettings.json` 的 `Microi.net.Api` profile;当前标准工作区是后端 `61501`、前端 `61500`,不能继续硬编码历史 `7266/1988`。
19
+
20
+ **本地后端自动重启要求(强制)**:本地联调需要启动或重启 `Microi.net.Api` 时,先执行 `node Microi.Server/tools/release-lock.mjs assert api <工作区根>`;API 锁存在时禁止启动或重启后端。PC、官网和 Agent 发布不阻塞 API 服务。无发布时先回读标准端口和 `/api/Diagnostics/liveness`,健康服务默认复用;只有本任务修改了需重载的后端代码、服务不健康或用户明确要求重启时,才可精确停止当前工作区的后端进程,然后在 `Microi.Server/Microi.net.Api` 目录执行 `dotnet run --launch-profile Microi.net.Api`。优先使用用户能在 VS Code 中看到和停止的终端(包含 VS Code 集成终端、VS Code 任务终端、用户明确允许的 VS Code 可追踪隐藏终端);如果当前工具没有 VS Code 终端能力,允许使用本机可见的 `cmd`/PowerShell 窗口启动,禁止使用脱离用户可见窗口的后台服务或守护进程。不要误杀数据库、Redis、Node 前端或其它业务进程。
21
+
22
+ <!-- /microi-progressive:chunk -->
23
+ <!-- microi-progressive:chunk id=workspace-conventions-025 sha256=4cf40c4ca771f7e04b80279646323a816378b98669f562ff8f4c647d5bf837ca -->
24
+ ## 多 AI 对话共享本地服务与发布互斥(强制)
25
+
26
+ 同一工作区的 4、5 个 AI 对话共用同一份源码和固定端口时,`61500/61501` 是工作区级单例共享服务,不属于某个对话。端口相同意味着无法让每个对话拥有一套独立进程;正确模型是“复用健康服务 + 需要重载时串行重启 + 同范围发布时独占”,不能让每个对话都无条件先杀再启动。
27
+
28
+ - 启动前先检查端口、健康接口、PID、命令行和工作区路径。健康且代码无需重载时直接复用;不得仅为声明“本对话拥有服务”而重启。
29
+ - 长期本地后端必须通过项目目录里的 `dotnet run --launch-profile Microi.net.Api` 使用开发输出。禁止把 `bin/Release/net10.0` 或 `bin/Release/publish` 的 `dotnet Microi.net.Api.dll` 当长期 E2E 服务;运行中的 Release DLL 会让后续 `dotnet build` 报 `MSB3021/MSB3027` 文件锁。
30
+ - 一键编译发布按所选产品创建 `.tmp/microi-process-state/api-release.lock`、`pc-release.lock`、`website-release.lock` 或 `agent-release.lock`。合并发布按固定顺序取得所需锁;任何一项占用时撤回本次已取得的锁。Windows 的 `PrepareRelease -ReleaseScope api|pc|all` 仅清理所选范围:API 处理本工作区后端与 Release DLL,PC 处理本工作区 Vite;官网不停止二者。身份不匹配时停止,不得按进程名全杀。
31
+ - Vite 子进程可能由相对 `node_modules/vite/bin/vite.js` 启动,父 npm/终端退出后命令行不再包含工作区绝对路径。Windows 进程管理器应先匹配命令行绝对路径;无法匹配时只读回读进程 CWD,只有 CWD 精确等于当前工作区 `Microi.Client` 且入口确为 Vite 才可结束。CWD 无法读取、属于其它目录或仅仅“父进程不存在”时必须失败关闭。
32
+ - API、PC、官网和 Agent 可以同时发布,同类发布互斥。旧 `platform-release.lock` 与 `release.lock` 仅在真实 PID 命令入口及共享状态目录证明属于 API 热修复或 Agent 时缩小阻塞范围;未知归属继续保守阻塞,禁止删除活跃旧锁。Full 仍是 PC/API 发布硬门禁;其 .NET 输出放入本次结果目录的 `.net-artifacts`,并行 Full 使用独立结果目录、测试服务和隔离租户。共享版本号或跨产品源码必须先准备冻结,再启动并行发布,禁止测试期间改写候选。 macOS/Linux 的 Full apphost 仅允许当前工作区 `.tmp/microi-release-gate/日期-时间-PID/.net-artifacts/bin/Microi.net.Api/debug|release/Microi.net.Api` 的规范路径,且 CWD 必须精确等于 API 项目;任意外部输出、其它工作区或路径归一化差异继续失败关闭。
33
+ - 启动或重启 API 前检查 `assert api`,PC 前检查 `assert pc`;只有对应范围发布时等待或退出,官网/Agent 不阻塞共享服务。需要同时启动二者时分别检查两项;正常结束或中断由原进程和唯一令牌释放自身锁。
34
+ - Edge/Chrome 主浏览器、VS Code 持有的 Playwright Test Server、语言服务和 MCP Node 进程不属于发布文件锁清理范围。浏览器自动化必须关闭本用例创建的 context/browser;不得通过 `taskkill /IM chrome.exe|msedge.exe|node.exe|dotnet.exe` 清空整机进程。
35
+ - 人工盘点使用:`powershell -NoProfile -ExecutionPolicy Bypass -File Microi.Server/tools/Microi.LocalProcessManager.ps1 -Action Status`。需要单独停止当前工作区服务时使用 `-Action StopBackend` 或 `-Action StopFrontend`,不再让用户根据任务管理器猜进程。
36
+
37
+ ### 共享前端服务不等于共享浏览器会话
38
+
39
+ 多个 AI 对话可以复用同一个 `61500` Vite 进程,但不能复用同一个浏览器存储上下文测试不同
40
+ `ApiBase + OsClient`。`Microi.Client` 对 localhost 同源持久化 Token、CurrentUser、ApiBase、
41
+ OsClient 等状态;同一 Profile/Context 内切换租户会污染其它窗口。
42
+
43
+ - 本地 URL 的最高优先级参数位于 `#` 之前:
44
+ `/?OsClient=<tenant>&ApiBase=<encodeURIComponent(apiBase)>#/route`。
45
+ - 手工第二个不同租户至少使用无痕窗口;多个无痕窗口可能共享同一临时会话,因此更多并发目标使用
46
+ 独立 Profile 或独立 `--user-data-dir`。
47
+ - Playwright/Codex 为每组目标创建独立 `browser.newContext()`,一个 context 内不得用多个 Page
48
+ 混测不同租户。只关闭本任务创建的 context/browser,不结束用户浏览器。
49
+ - 线上目标先在一次性 context 等待页面初始化并读取 `window.__MICROI_RUNTIME_ENDPOINT__`;旧版本
50
+ 回退读取 URL、`window.ApiBase/window.OsClient`、`localStorage['microi.net']`,必要时调用域名租户
51
+ 解析接口。不能根据站点标题猜 OsClient,也不能把 Token 放入本地 URL。
52
+ - 目标 API 还需允许 `http://localhost:61500` 的 CORS。运行目标识别、本地源码验证与线上部署验收
53
+ 分层报告。
54
+
55
+ <!-- /microi-progressive:chunk -->
56
+ <!-- microi-progressive:chunk id=workspace-conventions-026 sha256=73207c0cfcc442a177c47c36503dd6145fc826e23e79df3913861f65d8d16df3 -->
57
+ ## 本地租户与测试凭据读取约定
58
+
59
+ AI 在本地启动后端、跑 Playwright、做登录态页面截图或调用需要登录的接口前,必须先尝试从本地配置判断租户和测试账号,不要直接以“未登录无法测试”结束:
60
+
61
+ 1. 读取 `Microi.Server/Microi.net.Api/.microi-local`,得到当前环境名,例如 `<Environment>`。
62
+ 2. 读取 `Microi.Server/Microi.net.Api/appsettings.<Environment>.json`,或测试脚本传入的 `PW_APPSETTINGS_PATH`。
63
+ 3. 测试账号密码只从用户本轮明确提供、受保护的测试进程变量 `PW_TEST_ACCOUNT` / `PW_TEST_PASSWORD`、CI Secret 或既有安全登录态取得;不得把凭据写入 `appsettings.*.json`、源码或测试报告。
64
+ 4. `MICROI_OSCLIENT`、`PW_OS_CLIENT` 等只属于自动化工具进程,不是 API 生产环境变量;显式设置时可用于选择测试租户。
65
+ 5. `.microi-local`、Token、数据库连接串、Redis 密码和测试凭据都视为本地敏感配置。最终回复、日志摘要和测试报告中不得输出真实值,只能写 `<redacted>`、`本地配置账号` 或 `本地配置凭据`。
66
+
67
+ <!-- /microi-progressive:chunk -->
68
+ <!-- microi-progressive:chunk id=workspace-conventions-027 sha256=84988eac9cf7543a192b3e829b879afb7b35ef92798dc9ea69243f173a8ab674 -->
69
+ ## 自动化登录约定
70
+
71
+ 本地和远端 E2E 统一传真实 `Account` / `Pwd`。需要跳过图形验证码时,只能在目标租户 `sys_config.AutoTestSkipCaptcha=true` 后传 `_AutomationTestLogin=true`;它只跳过验证码,绝不能绕过密码校验。禁止恢复 `DevLoginBypass`、`X-Microi-Dev-Key`、`_DEV_BYPASS_` 或让脚本自动改写后端 `appsettings`。测试完成后不持久化账号密码。
72
+
73
+ <!-- /microi-progressive:chunk -->
74
+ <!-- microi-progressive:chunk id=workspace-conventions-028 sha256=6ff58ce80aab2bd47c5af022382159e98e4c4ca5eb955281e61918079d4175a5 -->
75
+ ## V8 远端/本地同步收尾约定
76
+
77
+ AI 通过 MCP、接口引擎、数据库脚本或平台 API 修改任何远端 V8 代码后,任务结束前必须把远端当前生效代码同步回本地 `Microi-V8-Engine/<server>/<osClient>/` 目录,并做一次同步状态复核。
78
+
79
+ 适用范围包括:
80
+ - `sys_apiengine.ApiV8Code` 接口引擎
81
+ - `diy_table` 表单 V8 事件
82
+ - `diy_field` 字段 V8 事件
83
+ - `sys_menu` 模块按钮/Tab V8 代码
84
+ - `wf_node` 工作流节点 V8 代码
85
+ - `sys_datasource` 数据源 V8 代码
86
+
87
+ 收尾流程:
88
+ - 若远端是通过 MCP 写入的,以远端当前生效代码为准回写本地文件。
89
+ - 若本地文件是先手工修改的,先推送到远端,再重新拉取/复核,确保本地与远端一致。
90
+ - 优先使用 Microi.Agent 插件的同步/查看同步状态能力;没有可调用插件时,可在 `.tmp/` 写一次性同步脚本,但脚本必须先 dry-run 输出差异摘要,再 apply。
91
+ - 复核结果应确认 touched 范围内 `Changed=0`、`Created=0`、`LocalOnly=0` 或说明剩余差异原因。
92
+ - 空 V8 代码不生成本地 `.js` 文件;若已有空 `.js` 文件,收尾同步时应删除,避免被误判为本地未推送。
93
+ - AI 收尾不能只看自写脚本的 dry-run;只要工作区安装了 Microi.Agent 插件,就必须按插件“查看同步状态”的口径再复核一次。最终回复中要明确说明插件口径是否为 0;若仍有本地未推送/远端差异,必须列出具体资源类型、Key 和本地文件路径,不能只报数量。
94
+ - 当远端代码与本地代码完全一致但插件仍提示“本地未推送”时,优先校准 `.microi-meta.json` 的 `updateTime/filePath` 与本地文件 `mtime`,并再次执行插件口径同步检查;不要让时间戳误差遗留给用户。
95
+ - AI 通过 MCP/API 直接写远端 V8 后,必须立即回读远端当前生效代码到本地并校准 `.microi-meta.json` 与文件 `mtime`。这不是可选清理动作,而是交付完成条件;否则 VS Code 插件会按时间戳继续提示“本地未推送”。
96
+ - 若同步状态非 0,必须先列出具体文件并分类处理:正文一致仅校准 meta/mtime,远端较新则拉回,本地较新则推送,双方都改过则人工合并。生产资金/资产系统不能为清状态盲目覆盖远端。
97
+
98
+ <!-- /microi-progressive:chunk -->
99
+ <!-- microi-progressive:chunk id=workspace-conventions-029 sha256=e90e532f9448b67f98f28a68fd4ea45b79868cf25fc14c5283b9074e91559f27 -->
100
+ ## V8 缓存刷新约定
101
+
102
+ 如果 AI 绕过平台表单提交事件,直接通过 MCP、数据库脚本或自写同步工具更新 `sys_apiengine`、`diy_table`、`diy_field`、`sys_menu`、`wf_node` 等远端 V8 代码,收尾时除了同步本地文件,还必须刷新运行中服务的缓存。至少清理当前 `<OsClient>` 下对应资源的 `Microi:<OsClient>:FormData:<table>:<key>`、`Id` 和地址形式缓存;若可用,优先调用平台缓存接口或插件内置同步流程。清缓存后要重新调用受影响接口做一次真实验证,避免本地/远端代码已一致但 API 仍执行旧缓存代码。
103
+
104
+ <!-- /microi-progressive:chunk -->
105
+ <!-- microi-progressive:chunk id=workspace-conventions-030 sha256=c25d0aaffec64d8a66cda36acd9ec337eda99a4411fddb0e966e45247ba574de -->
106
+ ## MCP 元数据更新验收约定
107
+
108
+ AI 通过 MCP 修改 `diy_field`、`diy_table`、`sys_menu`、`sys_osclients`、`sys_config` 等平台元数据后,不能只看写入返回成功,必须按前端真实消费方式回读验证:
109
+
110
+ 1. 修改 `Select`、`Radio`、`Checkbox`、`MultipleSelect` 等选项组件时,必须回读字段的 `Component`、`Data`、`Config`。已有字段更新时不要假设 `"key|label"` 字符串会被 `microi_update_field` 自动解析;KeyValue 数据源推荐直接把 `Data` 写成 JSON 数组 `[{"Key":"Aliyun","Value":"阿里云机器翻译"}]`,并确保 `Config.DataSource=KeyValue`、`SelectLabel=Value`、`SelectSaveField=Key`。
111
+ 2. 修改字段、表、菜单后,必须调用 `microi_get_field_list` / `microi_get_table_data` 回读关键字段,并调用 `microi_refresh_schema_cache` 或对应清缓存接口刷新 Redis。涉及 SaaS 引擎、系统设置、菜单按钮、接口引擎等运行态缓存时,还要调用对应租户清缓存接口并重新请求受影响页面/API。
112
+ 3. 最终交付说明必须写清楚:改了哪个表/字段,回读值是什么,刷新了哪些缓存,验证入口是什么。若某个缓存刷新接口失败或只能部分成功,需要把失败消息原样摘要出来,不能把“写入成功”当作“页面一定生效”。
113
+
114
+ <!-- /microi-progressive:chunk -->
115
+ <!-- microi-progressive:chunk id=workspace-conventions-031 sha256=cea2d1c912ffc31136a859fd10f282c488b5b8d1bf3f2ced7c39084b23e5ccf5 -->
116
+ ## MCP 可用性排查约定
117
+
118
+ VS Code、Cursor 或 Codex 设置界面显示某个 MCP 服务器“已启用”,不代表当前 AI 会话一定已经成功加载了对应工具。AI 在声称“可以通过 MCP 操作”之前,必须完成一次真实可调用性验证:
119
+
120
+ - 先用当前会话可用的工具发现能力查找目标 MCP 工具;若工具发现为 0,不能继续假设 MCP 可用。
121
+ - 再用 MCP 资源/模板列表或最小 `initialize` / `tools/list` 探测确认服务器握手成功。若返回 `handshaking with MCP server failed`、`initialize response`、`connection closed` 等错误,要明确说明“配置存在但当前会话不可调用”。
122
+ - 同时检查 `.vscode/mcp.json`、`.cursor/mcp.json`、`.mcp.json` 和 `~/.codex/config.toml` 是否能解析,并确认目标服务器名、`MICROI_API_URL`、`MICROI_OS_CLIENT`、`MICROI_TOKEN_FILE` 已写入。
123
+ - 如果手动启动 `mcp-server.js` 能响应,而当前 AI 会话仍握手失败,应优先怀疑 MCP stdio 协议兼容、初始化响应格式/大小、服务器进程提前退出或插件生成的 Codex 配置顺序问题,而不是简单归因于“用户没启用”。
124
+ - 当 MCP 工具数量较多时,`tools/list` 的前段必须优先返回通用建模和维护工具,例如 `microi_get_db_schema`、`microi_get_field_list`、`microi_add_field`、`microi_update_field`、`microi_refresh_schema_cache`、`microi_create_table`、`microi_create_module`、`microi_get_event_code`、`microi_save_event_code`。部分 AI 客户端或模型上下文只注入前若干个工具,若核心工具排在后面,会误报“缺少 MCP 工具”。
125
+ - MCP 的初始化说明必须使用真实 `MICROI_OS_CLIENT` 作为租户边界。中文显示名通过 ASCII 的 `MICROI_LABEL_BASE64` 传输并在 MCP 内解码,旧版 `MICROI_LABEL` 只作兼容;显示名不能当成租户 Key 写入“只能管理某租户”的安全提示。
126
+ - 遇到 `ByteString`、`greater than 255` 或“第 N 个字符无法写入 Header”时,必须先检查实际异常索引和所有 HTTP Header 来源。Microi MCP 的设备标识来自 `did` / `MICROI_MCP_DID`;默认值若直接拼接中文 Windows 主机名,会在 `MCP:` 后第 4 个字符报错。`MICROI_LABEL_BASE64` 只用于显示,不会作为业务 HTTP Header 发送,禁止在未核对调用链前把错误归因于中文 Label。插件和 MCP 必须把 DID 规范化为稳定的可打印 ASCII。
127
+ - MCP 连接失败时,AI 在完成配置、进程、Header、`initialize`、`tools/list` 和只读状态调用的证据链之前,不得修改 Token、租户、服务器地址或执行远端写入。连接恢复后先完成只读基线盘点,再按用户授权开始写入。
128
+ - 修复 Microi.Agent 插件的 MCP 生成逻辑后,必须重新生成配置、重启对应 MCP server,并在当前 AI 会话中再次验证工具发现与一次只读工具调用。
129
+
130
+ <!-- /microi-progressive:chunk -->
131
+ <!-- microi-progressive:chunk id=workspace-conventions-032 sha256=230c8683389d2b1ee4f5ba88dc4e51cb4dc4eb6a89b76a142b07f479ff5be1c8 -->
132
+ ## MCP 写入超时与降级约定
133
+
134
+ - 写请求超时后的远端回读必须使用独立的短超时,不能继续沿用普通查询的长超时。否则一次 60 秒写超时后,每次回读还可能等待 120 秒,AI 会长期停留在“等待远端回读”,用户误以为菜单按钮或接口引擎完全写不进去。
135
+ - `microi_create_engine` 必须与代码保存、事件保存、菜单更新一样使用写请求超时和远端回读确认。创建响应异常但按 `ApiEngineKey` 回读到相同代码时,返回 `RecoveredAfterTransportError:true`;禁止因超时重复创建同一个接口引擎。
136
+ - 后端创建接口引擎时,数据库新增成功后的路由缓存刷新必须设置硬超时。缓存刷新失败或超时不能把已经成功入库的创建结果伪装成失败,更不能让 HTTP 请求无限等待;响应中应通过 `CacheRefresh` 报告缓存状态。
137
+
138
+ - 接口引擎代码只用 `microi_save_engine_code`,表单事件只用 `microi_save_event_code`,菜单按钮和 Tab 只用 `microi_update_module`。这些标准工具负责版本、校验、缓存和超时回读。
139
+ - 请求超时是“结果不确定”,不是“写入失败”。标准工具返回 `RecoveredAfterTransportError:true` 时,表示已经通过远端回读确认成功,不得再次写入。
140
+ - 标准工具明确返回“回读未确认”时,只调用对应 get 工具继续核对一次。没有用户明确授权,不得改走原生 FormEngine HTTP、直接 SQL、表定义增量更新,也不得创建一次性维护接口引擎绕过原端点。
141
+ - `MoreBtns`、`FormBtns`、`BatchSelectMoreBtns`、`PageTabs`、`ExportMoreBtns`、`PageBtns` 一律向 MCP 传明文 JSON 数组。租户 `sys_menu` 表单事件中的 Base64 解码属于平台内部兼容逻辑,AI 不得据此手工 Base64 编码。
142
+ - AI/终端工具显示的 `…N tokens truncated…`、`Exit code: N`、`Chunk ID:`、`Wall time:` 等是宿主输出标记,不是 V8 源码。禁止复制到本地文件或 MCP 写入参数;读取长源码必须按工具返回的字符范围分段取完,并核对完整源码 SHA-256。标准 MCP 写工具和插件推送检测到这些标记时必须拒绝写入。
143
+ - 远端源码不少于 8000 字符,而新源码减少超过 15% 时,应先视为可能只拿到了截断片段并停止写入。只有核对完整源码且确需大幅删减时,才使用写工具提供的显式大幅删减确认参数。
144
+ - 发生连续写入超时时,要先停止并发写入,记录具体工具、资源 Key、耗时和回读结果;禁止用“服务器整体不可用”“缓存锁死”等没有日志证据的结论代替诊断。
145
+
146
+ <!-- /microi-progressive:chunk -->
147
+ <!-- microi-progressive:chunk id=workspace-conventions-033 sha256=b642bb516a42b50e8b459e5237588e85d71c9715970779e155b88d7c0e8c6536 -->
148
+ ## Codex MCP 单入口约定
149
+
150
+ - Codex 对普通 MCP 大工具集可能无法稳定注入时,使用插件生成的 `microi_codex` 单入口,不要据此判断服务器或帐号不可用。
151
+ - `microi_codex` 的 `action="list_tools"` 可按 `params.keyword` 查找工具,`action="describe_tool"` + `params.name` 可读取参数说明;执行时 action 使用原始 `microi_*` 工具名,参数放在 `params`。
152
+ - 单入口只负责路由,必须复用原工具的参数 schema、写入确认、审计、超时回读和错误返回。不得因为只暴露一个 Codex 工具而放宽远端写入保护。
153
+ - 如果 Codex 仍不注入 `microi_codex`,优先使用它实际提供的资源工具:先 `list_mcp_resources` 并读取 `microi://codex/status` / `microi://codex/tools`;通用调用先 `list_mcp_resource_templates`,再读取 `microi://codex/action/{action}/{params}`,其中 `params` 是 URI 编码后的 JSON 对象。
154
+ - 资源模板只是兼容传输层,执行的仍是原始 `microi_*` handler。写操作同样必须携带原工具要求的 `confirmExecution`,不得把 resource read 当成绕过确认的通道。
155
+ - VS Code/Copilot、Cursor、Claude Code 仍使用完整 MCP 工具集;不要把 Codex 的 `enabled_tools = ["microi_codex"]` 复制到其他客户端配置。
156
+
157
+ <!-- /microi-progressive:chunk -->
158
+ <!-- microi-progressive:chunk id=workspace-conventions-034 sha256=073253c786f85fb23b8b09c71418eaaa00f6a36262bf32e9da857340faa3e75f -->
159
+ ## .venv Python 环境说明
160
+
161
+ 工作区根目录的 `.venv/` 是 Python 虚拟环境,**保留,不要删除**。已安装:
162
+ - `playwright` — Playwright E2E 测试
163
+ - `openai` — AI 接口调用
164
+ - `httpx` — HTTP 客户端
165
+ - 其他工具(flake8、pytest 等)
166
+
167
+ AI 执行 Python 脚本时应使用 `.venv\Scripts\python.exe`(Windows)而非系统 Python。
168
+ <!-- /microi-progressive:chunk -->
169
+ <!-- microi-progressive:chunk id=workspace-conventions-035 sha256=c114dffea6978f289601a8f71aa83a0466f3d934e96e45bb871af179d319a1e3 -->
170
+ ## 后端代码改动后的重启验收
171
+
172
+ AI 只要修改了 `Microi.Server/**` 下会影响 `Microi.net.Api` 运行结果的后端源码、配置、控制器、服务、依赖项目或接口行为,任务收尾前必须完成一次“编译 + 重启本地后端 + 健康验证”,不要只用隔离输出目录 build 后结束。
173
+
174
+ 强制流程:
175
+
176
+ 1. 先执行后端编译验证。若 launch profile 当前端口上的开发服务导致 `bin/Debug/net10.0` DLL 被锁,可以先精确停止当前工作区的 `Microi.net.Api` 进程后重新编译;只有用户明确要求不中断正在运行服务时,才允许用临时输出目录作为补充验证,并必须说明运行服务尚未替换。
177
+ 2. 从 `launchSettings.json` 回读实际端口,查找并停止该端口上的本地 `Microi.net.Api` 进程。只停止命令行与当前工作区匹配的 Microi 后端,不要误杀数据库、Redis、Node 前端或其它业务进程。
178
+ 3. 必须进入 `Microi.Server/Microi.net.Api` 目录启动:
179
+ ```powershell
180
+ dotnet run --launch-profile Microi.net.Api
181
+ ```
182
+ 启动优先发生在用户能在 VS Code 中看到和停止的终端中,方便用户查看日志并手动停止;用户明确允许时,可以使用 VS Code 可追踪的隐藏终端/任务终端。当前工具环境没有 VS Code 终端能力时,允许使用本机可见的 `cmd`/PowerShell 窗口启动;禁止使用脱离用户可见窗口的后台服务或守护进程方式启动。标准端口无法释放时,只有同步更新前端本地 `ApiBase` 和测试变量后才可使用明确的临时端口,并在任务结束时说明。
183
+ 4. 启动后轮询验证 launch profile 实际地址可访问;至少确认端口已监听、进程存在、最近日志没有立即崩溃。涉及新增 API 时,再调用新增/受影响接口做一次真实请求。
184
+ 5. 最终回复必须明确说明:后端已重新编译、旧进程 PID 是否停止、新进程 PID、实际端口是否监听、验证的 URL 或接口。若因为用户明确要求不中断、端口被非 Microi 进程占用或配置缺失导致无法重启,必须把阻塞原因说具体。
185
+
186
+ 这条规则优先于“避免打断正在运行服务”的默认谨慎策略;本地开发联调场景下,用户通常需要 launch profile 当前端口上的后端加载最新代码。
187
+
188
+ <!-- /microi-progressive:chunk -->
189
+ <!-- microi-progressive:chunk id=workspace-conventions-036 sha256=b91c431950e4c5d268d40c6372e5780b2c7e8b4ca4339871085cda91b7d932bc -->
190
+ ## MCP 可调用性诊断补充
191
+
192
+ 当用户反馈“Codex/VS Code 设置中能看到 MCP,但当前 AI 会话不能调用对应工具”时,不能只回答“当前会话没有注入”。必须按层排查:
193
+
194
+ 1. 先确认 `.vscode/mcp.json`、`.cursor/mcp.json`、工作区根 `.mcp.json` 和 `~/.codex/config.toml` 都能解析,且目标 server key 为稳定 ASCII 格式,例如 `microi_itdos`,不要使用中文名或横杠。
195
+ 2. 再用 Microi.Agent 插件的“诊断 MCP 可调用性”命令,或等价脚本直接启动对应 `mcp-server.js` / `mcp-codex-stdio-adapter.js`,执行 `initialize` 和 `tools/list`,确认 `microi_get_db_schema`、`microi_get_field_list`、`microi_add_field`、`microi_update_field`、`microi_refresh_schema_cache` 等核心工具真实返回。
196
+ 3. 如果当前 AI 客户端支持工具发现或延迟加载,AI 必须先主动执行工具发现/热加载流程,例如 `tool_search`、客户端 MCP refresh、Microi.Agent 的启动/诊断命令;不要先让用户手动重启、重载或重新生成 MCP。
197
+ 4. 如果真实握手成功但 Codex 当前对话仍没有注入 `mcp__...` 工具,AI 仍应优先使用等价的 MCP stdio JSON-RPC 直连 fallback 完成当前任务:读取对应 MCP 配置、启动 adapter/server、执行 `initialize`、`tools/list`、`tools/call`,并严格遵守该 MCP 绑定的 API Server 和 OsClient 边界。直连脚本必须放在 `.tmp/` 或使用一次性 stdin,不得散落到项目目录。
198
+ 5. 只有在客户端不支持热加载、直连 fallback 也无法完成任务,或写操作边界无法确认时,才告知用户需要新开对话、重载 Codex 或检查 MCP 配置。说明必须写清楚:MCP 配置和进程是否可用、当前会话为什么没有注入工具、已经尝试过哪些自动恢复动作。
199
+ 6. 如果握手失败,要把失败层级说清楚:配置文件解析失败、路径不存在、token 文件缺失、MCP 进程启动失败、`initialize` 失败、`tools/list` 缺核心工具,不能把这些问题混成“用户没启用 MCP”。
200
+ 7. Microi.Agent 生成 MCP 配置时应清理旧的中文/横杠 Microi MCP key,只保留 `microi_<osClient>` 或 `microi_<osClient>_<host>` 形式,避免不同 AI 客户端因 namespace 不稳定而无法注入工具。
201
+
202
+ <!-- /microi-progressive:chunk -->
203
+ <!-- microi-progressive:chunk id=workspace-conventions-037 sha256=287a898ffb90322af12deea949c4bcf43b9ac9a355419561898cde8de2b99ac8 -->
204
+ ## Windows MCP 控制台闪窗复盘
205
+
206
+ 当用户反馈“打开 Microi.Agent、添加服务器或初始化 MCP 后连续弹出并立即关闭多个 cmd 窗口”时,应按进程风暴排查,不能只给已有 `spawn` 补 `windowsHide`:
207
+
208
+ 1. MCP 配置文件是各客户端的事实源。内容未变化时必须使用 write-if-changed,禁止仅为“同步”而反复改写文件并触发监听器重启。
209
+ 2. 生成 `~/.codex/config.toml` 后,禁止再隐式循环执行 `codex mcp list/remove/add`;服务器数量越多,这类逐项 CLI 同步越会放大成几十个瞬时控制台进程。
210
+ 3. VS Code 已配置 `chat.mcp.autostart` 时,插件后台监测只能检查配置和状态,禁止在侧栏显示、定时轮询、登录、添加连接或初始化流程里再次执行 `workbench.mcp.startServer('*')`。
211
+ 4. 握手诊断会真实启动每个 stdio MCP,只能由用户显式点击“诊断 MCP 可调用性”触发;常规配置成功提示不得暗中运行整组诊断。
212
+ 5. Windows 的 VS Code/Cursor 配置优先复用 GUI Electron 宿主 `process.execPath` 并设置 `ELECTRON_RUN_AS_NODE=1`,避免把控制台子系统的外部 `node.exe` 持久化为每个 MCP 的启动命令。Trae 若因空格路径兼容必须经过 `cmd.exe`,仍需使用固定 launcher 并隐藏窗口。
213
+ 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 进程树。
214
+ 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。
215
+ 8. 回归测试至少静态断言:Codex CLI 批量注册函数不存在、后台 monitor 不包含 `startServer`、自动配置不包含诊断、Codex 配置内容不变时不改写、Windows GUI 宿主检查早于外部 Node 探测、CLI 与 Codex 路由配置都保留 `ELECTRON_RUN_AS_NODE=1`。再在扩展开发宿主中覆盖打开侧栏、添加连接、初始化 MCP,观察无连续控制台闪窗或脚本文件被自动打开。
216
+
217
+ <!-- /microi-progressive:chunk -->
@@ -1,27 +1,35 @@
1
- # workspace-conventions 详细参考 3
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=workspace-conventions-038 sha256=57098466d31d0636bf330fde545daff8cb8e4116ac6ea2efff8abc729fdcef77 -->
6
- ## CLI 与 IDE 插件错版共存约定
7
-
8
- - CLI 与 IDE 插件共用配置、Token、MCP、Skills 或生成文件时,所有持久化协议必须按“新字段可选、旧字段保留、未知字段不删除”设计。不得将 JSON 解析到旧类型后只序列化已知字段。
9
- - 共享 JSON/Token 必须失败关闭:解析失败时保留原文件并停止写入;写入使用同目录临时文件原子替换,多进程可写文件还要使用带超时/死锁恢复的文件锁。
10
- - MCP 配置要写入工具来源与三段版本;替换同名或同 API/OsClient 的 Microi Server 时实行“较新提供者优先”,同时保留非 Microi MCP。Skills/AI 指令也要记录 bundle/file 版本,旧 bundle 不得覆盖新 bundle 已生成的内容。
11
- - 已发布的历史二进制无法被新代码追溯修复。诊断必须把无版本记录标记为 `legacy`,说明更新或用较新一端重新初始化的恢复路径;不得宣称新代码已让任意历史版本绝对共存。
12
- - 多 registry 联合发布没有跨站点原子事务。必须在递增版本前验证本轮必选目标的凭据/权限,对每个产物校验同版本,发布后逐端公开回读。可选目标(例如尚未开通 scope 的 npm CLI)预检或发布失败时,不得阻断已经通过预检的必选目标;必须保留同版本产物、明确报告部分完成并给出精确补发命令。要求全目标成功的发布应提供显式严格模式。补发只能复用完全相同的源码/产物;代码改动后必须发新版本。
13
-
14
- ### 复盘:可选 npm 目标阻断两个扩展市场发布
15
-
16
- - 触发场景:联合发布同时包含两个扩展市场和 npm CLI,但 npm 组织 scope 尚未创建,脚本在版本递增前直接退出,导致已经具备权限的两个扩展市场也无法发布。
17
- - 根因:发布脚本把三个 registry 都视为同一个全局硬门禁,并把最容易受账号、scope 和 2FA 影响的 npm 放在扩展市场之前,没有区分必选目标、可选目标和严格发布模式。
18
- - 通用规则:默认发布按目标隔离;先完成并回读必选目标,再独立尝试可选目标。可选目标失败应保留同版本不可变产物并输出补发入口;只有显式严格模式才要求所有目标预检通过后继续。
19
- - 自动化检查:模拟 npm 未登录、scope 404 和 npm publish 非零退出,断言两个扩展市场的发布调用与回读仍会执行;另测严格模式在版本递增前停止,补发命令不递增版本且复用同版本产物。
20
-
21
- ### 复盘:npm 已接收新版本但公共回读短暂 404
22
-
23
- - 触发场景:`npm publish` 已成功返回,npmjs.com 包页面也已出现新包或新版本,但紧随其后的 `npm view <package>@<version> version` 在数十秒内连续返回 E404,联合发布脚本因此把成功发布误报为失败。
24
- - 根因:新 scope/新版本在 npm 网站、写入节点和公共 registry 读取节点之间存在短暂传播窗口;固定少量、短间隔轮询不足以区分“尚未发布”和“已经接收但尚未公开传播”。
25
- - 通用规则:发布命令成功和公共回读确认必须作为两个阶段记录。npm 新版本回读使用 `--prefer-online` 和分钟级有限重试;重试结束仍为 E404 时标记 `pending-propagation`,禁止自动重发同一不可变版本,并提供独立只读验证命令稍后确认。只有发布命令本身失败且公共 registry 也始终不存在时,才进入补发流程。
26
- - 自动化检查:模拟 `npm publish` 成功后前几次 `npm view` 返回 E404、随后返回期望版本,断言不会重复发布;再模拟重试窗口结束仍为 E404,断言输出待传播状态和只读验证命令,而不是提示重新上传同一版本。
27
- <!-- /microi-progressive:chunk -->
1
+ # workspace-conventions 详细参考 3
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=workspace-conventions-038 sha256=97d43d23dc7e50e2806b9ef41c0d5afce73a3dde0ee0b2c6f3fdb468278ee248 -->
6
+ ## CLI 与 IDE 插件错版共存约定
7
+
8
+ - CLI 与 IDE 插件共用配置、Token、MCP、Skills 或生成文件时,所有持久化协议必须按“新字段可选、旧字段保留、未知字段不删除”设计。不得将 JSON 解析到旧类型后只序列化已知字段。
9
+ - 共享 JSON/Token 必须失败关闭:解析失败时保留原文件并停止写入;写入使用同目录临时文件原子替换,多进程可写文件还要使用带超时/死锁恢复的文件锁。
10
+ - MCP 配置要写入工具来源与三段版本;替换同名或同 API/OsClient 的 Microi Server 时实行“较新提供者优先”,同时保留非 Microi MCP。Skills/AI 指令也要记录 bundle/file 版本,旧 bundle 不得覆盖新 bundle 已生成的内容。
11
+ - 已发布的历史二进制无法被新代码追溯修复。诊断必须把无版本记录标记为 `legacy`,说明更新或用较新一端重新初始化的恢复路径;不得宣称新代码已让任意历史版本绝对共存。
12
+ - 多 registry 联合发布没有跨站点原子事务。必须在递增版本前验证本轮必选目标的凭据/权限,对每个产物校验同版本,发布后逐端公开回读。可选目标(例如尚未开通 scope 的 npm CLI)预检或发布失败时,不得阻断已经通过预检的必选目标;必须保留同版本产物、明确报告部分完成并给出精确补发命令。要求全目标成功的发布应提供显式严格模式。补发只能复用完全相同的源码/产物;代码改动后必须发新版本。
13
+
14
+ ### 复盘:可选 npm 目标阻断两个扩展市场发布
15
+
16
+ - 触发场景:联合发布同时包含两个扩展市场和 npm CLI,但 npm 组织 scope 尚未创建,脚本在版本递增前直接退出,导致已经具备权限的两个扩展市场也无法发布。
17
+ - 根因:发布脚本把三个 registry 都视为同一个全局硬门禁,并把最容易受账号、scope 和 2FA 影响的 npm 放在扩展市场之前,没有区分必选目标、可选目标和严格发布模式。
18
+ - 通用规则:默认发布按目标隔离;先完成并回读必选目标,再独立尝试可选目标。可选目标失败应保留同版本不可变产物并输出补发入口;只有显式严格模式才要求所有目标预检通过后继续。
19
+ - 自动化检查:模拟 npm 未登录、scope 404 和 npm publish 非零退出,断言两个扩展市场的发布调用与回读仍会执行;另测严格模式在版本递增前停止,补发命令不递增版本且复用同版本产物。
20
+
21
+ ### 复盘:npm 已接收新版本但公共回读短暂 404
22
+
23
+ - 触发场景:`npm publish` 已成功返回,npmjs.com 包页面也已出现新包或新版本,但紧随其后的 `npm view <package>@<version> version` 在数十秒内连续返回 E404,联合发布脚本因此把成功发布误报为失败。
24
+ - 根因:新 scope/新版本在 npm 网站、写入节点和公共 registry 读取节点之间存在短暂传播窗口;固定少量、短间隔轮询不足以区分“尚未发布”和“已经接收但尚未公开传播”。
25
+ - 通用规则:发布命令成功和公共回读确认必须作为两个阶段记录。npm 新版本回读使用 `--prefer-online` 和分钟级有限重试;重试结束仍为 E404 时标记 `pending-propagation`,禁止自动重发同一不可变版本,并提供独立只读验证命令稍后确认。只有发布命令本身失败且公共 registry 也始终不存在时,才进入补发流程。
26
+ - 自动化检查:模拟 `npm publish` 成功后前几次 `npm view` 返回 E404、随后返回期望版本,断言不会重复发布;再模拟重试窗口结束仍为 E404,断言输出待传播状态和只读验证命令,而不是提示重新上传同一版本。
27
+ ## Git 大文件推送确认(强制)
28
+
29
+ - 每次 Git 推送前检查暂存内容及全部待推送提交中新引入的 Blob,不能只看工作树、最新提交或首尾文件差异;中间提交加入后又删除的大文件仍会进入历史。以刚核验的远端引用为基线,结合 `git rev-list --objects` 与 `git cat-file --batch-check` 检查真实对象大小;基线或对象不完整时先补齐并复核,不能绕过检查。
30
+ - 默认将单个新增 Blob 达到 **10 MiB**,或本次新增 Blob 合计达到 **50 MiB** 视为需要确认的大文件推送。列出具体路径、实际字节数、SHA-256、目标仓库/分支及合计体积,向用户明确询问是否推送,收到答复前暂停受影响的 Git 推送。一般“提交并推送”授权不能代替这份具体大文件清单的确认;用户已明确确认同一清单和内容时可继续,路径、哈希、数量或体积变化后须重新确认。不要因远端已有且本次未增加的历史大文件反复索要授权。
31
+ - PDF、PPT/PPTX、视频、压缩资源、导出报告等交付附件默认通过当前授权租户的 MCP 上传到 CDN,核验实际下载字节数和 SHA-256 后使用 FileServer/CDN 地址引用。源码仓库保留必要源码、引用及可重复生成的说明;不能静默提交导出产物。运行必需的字体、模板和第三方二进制按用途判断,达到上述阈值仍须列入确认,不得擅自删除或转移。
32
+ - 历史瘦身另行确认改写范围,保留同事提交、有效分支、标签和可恢复证据;仅删除当前文件不能释放仍被历史引用的大对象。用户授权瘦身后使用明确引用清单及旧值保护,禁止未经盘点直接执行 `push -f --all` 或 `--mirror`,禁止为解除配额清空、删除或重建仓库。服务端 PR 引用、reflog、恢复记录和配额阻挡应通过管理界面或技术支持处理。
33
+ - 推送失败时保存原生 Git 的完整命令、退出码和 stdout/stderr,隐藏凭据但不删减错误正文,回读远端引用确认实际状态;区分本地 Hook、网络、权限与服务端容量拒绝。同一错误不盲目重跑,向技术支持提供与该次候选绑定的实际压缩体积、引用范围和完整日志,不能把本地精简成功当作远端已瘦身。
34
+
35
+ <!-- /microi-progressive:chunk -->