@microi.net/cli 6.1.5 → 6.1.7

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 (41) 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/mcp-server.js +198 -164
  10. package/scripts/microi-skills.meta.json +232 -232
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +47 -47
  13. package/skills/ai-engine/SKILL.md +18 -5
  14. package/skills/app-store/SKILL.md +9 -1
  15. package/skills/business-blueprint/SKILL.md +1 -1
  16. package/skills/job-engine/SKILL.md +3 -0
  17. package/skills/microi-codex/SKILL.md +1 -1
  18. package/skills/microi-deployment/SKILL.md +42 -18
  19. package/skills/microi-deployment/references/deployment-matrix.md +7 -1
  20. package/skills/microi-docs-coverage/SKILL.md +11 -1
  21. package/skills/microi-microservice/SKILL.md +11 -0
  22. package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +2 -1
  23. package/skills/microi-system-delivery/SKILL.md +1 -0
  24. package/skills/microi-system-delivery/references/context-quality.md +56 -54
  25. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +9 -5
  26. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +65 -65
  27. package/skills/module-engine/SKILL.md +13 -0
  28. package/skills/module-engine/references/module-config.md +17 -0
  29. package/skills/ocr-engine/SKILL.md +1 -0
  30. package/skills/playwright-e2e/SKILL.md +2 -0
  31. package/skills/system-observability/SKILL.md +12 -5
  32. package/skills/translate-engine/SKILL.md +2 -0
  33. package/skills/v8-api-config/SKILL.md +1 -1
  34. package/skills/v8-file-upload/SKILL.md +18 -1
  35. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +2 -2
  36. package/skills/v8-security/SKILL.md +4 -0
  37. package/skills/v8-sql-query/SKILL.md +2 -2
  38. package/skills/workspace-conventions/SKILL.md +154 -136
  39. 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 +8 -5
  40. 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 +2 -2
  41. package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +4 -4
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "6.1.5",
2
+ "version": "6.1.7",
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-22T22:12:57.135Z"
5
+ "updatedAt": "2026-10-26T05:18:23.200Z"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-10-22T16:19:35.837Z",
3
+ "generatedAt": "2026-10-26T05:25:50.625Z",
4
4
  "policy": {
5
5
  "maxEntryLines": 285,
6
6
  "referenceBudgetLines": 245,
@@ -534,8 +534,8 @@
534
534
  ]
535
535
  },
536
536
  "microi-mobile-app-quality": {
537
- "originalSha256": "64b7711929b8a7610fe0b528302e576a31839297ac7b3b798b62f5788d04c33a",
538
- "originalLines": 562,
537
+ "originalSha256": "1ff50c437e189d1d4aa40e53e716c0356f13cd24c054d4ea7ce2e0227f8c3452",
538
+ "originalLines": 563,
539
539
  "prefixSha256": "a176be940d146b3651c3940757c256cb845941e102102b7adcd35c1f737f8c12",
540
540
  "prefixBytes": 1562,
541
541
  "entryLines": 204,
@@ -720,8 +720,8 @@
720
720
  "id": "microi-mobile-app-quality-022",
721
721
  "ordinal": 22,
722
722
  "destination": "microi-mobile-app-quality/references/mobile-first-delivery.md",
723
- "sha256": "748fc4a802457bab760ae24281c3bb27cb70841fe72b61b86f088439236867aa",
724
- "lines": 68,
723
+ "sha256": "33bf185e007fab2c8316f090b1f608143deca2e3ff4b010e7577c7f88d751008",
724
+ "lines": 69,
725
725
  "heading": "开发前固定事实源和首版范围"
726
726
  }
727
727
  ],
@@ -763,11 +763,11 @@
763
763
  ]
764
764
  },
765
765
  "microi-system-delivery": {
766
- "originalSha256": "5f525ce40bc074b4e6d0e19909e4420f8d76247b5dc0c8bca2ac7ef801b267c5",
767
- "originalLines": 711,
768
- "prefixSha256": "4b609f39cb11459d3cace78e0da3f848b963b2ec2ff9c5fa07b35f3f1114ea96",
769
- "prefixBytes": 6016,
770
- "entryLines": 116,
766
+ "originalSha256": "9db37be1921e828867a3d1878f42b72fbfd346d7d11b42d0203f0b48c891b83a",
767
+ "originalLines": 718,
768
+ "prefixSha256": "b6b97e8df68678ea61b8d67ad14057c0deb0c09a3834e8b77994d20aaeb92e7e",
769
+ "prefixBytes": 6666,
770
+ "entryLines": 117,
771
771
  "chunks": [
772
772
  {
773
773
  "id": "microi-system-delivery-000",
@@ -789,7 +789,7 @@
789
789
  "id": "microi-system-delivery-002",
790
790
  "ordinal": 3,
791
791
  "destination": "microi-system-delivery/references/progressive-03-安全与跨端验收.md",
792
- "sha256": "b4cd10b169b54235314d170c8e74f17bf6bcb5f658d0d4d2e10c73dc8aa37ef7",
792
+ "sha256": "1cf73c1365e3f8245b2069f5f2e24bcbfdc7f6e67c0f13524998b16f7bbf029b",
793
793
  "lines": 52,
794
794
  "heading": "平台安全与存量兼容验收(强制)"
795
795
  },
@@ -797,7 +797,7 @@
797
797
  "id": "microi-system-delivery-003",
798
798
  "ordinal": 5,
799
799
  "destination": "microi-system-delivery/references/progressive-03-安全与跨端验收.md",
800
- "sha256": "479ccdb65450c7741b052a30d8e4a11917bc19d80bf9b4ac89ea00092b4aaa73",
800
+ "sha256": "8e2891f2a149d6828b653b9f0735ea39a4df5ba60178c79f0e5b0065ce72ee84",
801
801
  "lines": 13,
802
802
  "heading": "前端交付检查清单"
803
803
  },
@@ -821,8 +821,8 @@
821
821
  "id": "microi-system-delivery-006",
822
822
  "ordinal": 4,
823
823
  "destination": "microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md",
824
- "sha256": "dee4ef7027b49b46a92f4b2bbd88d82997f9c992351e5d599ba6d38a03267258",
825
- "lines": 149,
824
+ "sha256": "30d24447c0ee767e09df1fb2ecb91b146da5afc0a100dcb2c5ba310b27bd9f7d",
825
+ "lines": 153,
826
826
  "heading": "自动化测试必须覆盖的坑"
827
827
  },
828
828
  {
@@ -837,8 +837,8 @@
837
837
  "id": "microi-system-delivery-008",
838
838
  "ordinal": 8,
839
839
  "destination": "microi-system-delivery/references/context-quality.md",
840
- "sha256": "beffc0924e9b36dca7a57da12a4cecb65ab05e938cb776c295c7fc5d7f736553",
841
- "lines": 54,
840
+ "sha256": "7d4c1226d529de92a79f6dcb277178f3d274738f51ed4b0fa609bb6f39ae9cb0",
841
+ "lines": 56,
842
842
  "heading": "质量优先的上下文与增量开发"
843
843
  }
844
844
  ],
@@ -1382,11 +1382,11 @@
1382
1382
  ]
1383
1383
  },
1384
1384
  "playwright-e2e": {
1385
- "originalSha256": "19bfaf779ced81fabca3069774756c3835674e87f2931718d1f7724ea09d58ac",
1386
- "originalLines": 817,
1387
- "prefixSha256": "67bf36437cf205f8d5a5e99120964c9da05b65807dba45beb9da1cba967645f2",
1388
- "prefixBytes": 4223,
1389
- "entryLines": 209,
1385
+ "originalSha256": "3f38f36f2d0a0f1287276948a9fdc7419c871dc4ab30902c162d2f29828bb22c",
1386
+ "originalLines": 819,
1387
+ "prefixSha256": "7193a78f9c53122f8df47bf1058ea9147741558c9a132eefa51583ecf1f21807",
1388
+ "prefixBytes": 4679,
1389
+ "entryLines": 211,
1390
1390
  "chunks": [
1391
1391
  {
1392
1392
  "id": "playwright-e2e-000",
@@ -2259,11 +2259,11 @@
2259
2259
  ]
2260
2260
  },
2261
2261
  "v8-file-upload": {
2262
- "originalSha256": "91be8ba859256e92cde4d9f0e3c4ff63f99042291a9d731449225ceb622b4698",
2263
- "originalLines": 683,
2264
- "prefixSha256": "0b5f03c40107295faaff1291c80ad2b60fec35ffdd480048f29bcd9c7275e32b",
2265
- "prefixBytes": 18007,
2266
- "entryLines": 262,
2262
+ "originalSha256": "fd6861d3cb03da6b637a9ba121d5747d96ea35a63de9c45e0e108f4161ec39aa",
2263
+ "originalLines": 700,
2264
+ "prefixSha256": "f48498030cbd3737919132045f906096cc118c04342ea4630c633f36acbd916b",
2265
+ "prefixBytes": 20644,
2266
+ "entryLines": 279,
2267
2267
  "chunks": [
2268
2268
  {
2269
2269
  "id": "v8-file-upload-000",
@@ -2293,8 +2293,8 @@
2293
2293
  "id": "v8-file-upload-003",
2294
2294
  "ordinal": 5,
2295
2295
  "destination": "v8-file-upload/SKILL.md",
2296
- "sha256": "d02dfde4abd2349cd92de1daee129bc08ba42142b5f6229736588cb3e0dbf43c",
2297
- "lines": 13,
2296
+ "sha256": "9d8f1e54ec058d9624a051cc55270019fa1b4a88dadc20f03b2cfa1b856a5bc3",
2297
+ "lines": 20,
2298
2298
  "heading": "跨平台文件同步登录会话"
2299
2299
  },
2300
2300
  {
@@ -2317,7 +2317,7 @@
2317
2317
  "id": "v8-file-upload-006",
2318
2318
  "ordinal": 4,
2319
2319
  "destination": "v8-file-upload/references/progressive-01-公有桶-vs-私有桶.md",
2320
- "sha256": "2dcf2dd7a571cc4757e9015cf213191be2dc3f041d91b0de51ed8ee00b0b86e7",
2320
+ "sha256": "405f2dc31677040e3b81ae5f2e84820680b13d4384477ec7c4bf9186e3b3abef",
2321
2321
  "lines": 50,
2322
2322
  "heading": "接口直接响应文件(下载/导出)"
2323
2323
  },
@@ -2831,11 +2831,11 @@
2831
2831
  ]
2832
2832
  },
2833
2833
  "v8-security": {
2834
- "originalSha256": "5cb7ae6c184c89b2eb4a6a2309a0f0c6d24e03d3b737d342071b71b614e5b2a9",
2835
- "originalLines": 566,
2836
- "prefixSha256": "52262abdb901d909adf460efdd98fbfb715b53536c081816ff0d37f7cfe2d81e",
2837
- "prefixBytes": 6943,
2838
- "entryLines": 236,
2834
+ "originalSha256": "8b4b792f4b835835b261f10c8038c8f860fe6776f34c4b65f3aa35d03d4fa2e0",
2835
+ "originalLines": 570,
2836
+ "prefixSha256": "1371b6ca81fcf1b9cf12f30ed08624fef44a1f06650b986fd8b4d98c1f5475ba",
2837
+ "prefixBytes": 8303,
2838
+ "entryLines": 240,
2839
2839
  "chunks": [
2840
2840
  {
2841
2841
  "id": "v8-security-000",
@@ -3241,25 +3241,25 @@
3241
3241
  ]
3242
3242
  },
3243
3243
  "workspace-conventions": {
3244
- "originalSha256": "1c4f533e55f0ab695e0998026300de6cce481479b93a3619bfb4e642668802a9",
3245
- "originalLines": 711,
3246
- "prefixSha256": "dca80d3ddfca36f1c9a6fbd8bb5681de212255e753a0428aea69f9f21546bb5c",
3247
- "prefixBytes": 15187,
3248
- "entryLines": 175,
3244
+ "originalSha256": "f38521daa43ae0d1b017f8a1e9cc13b22f3a5aec31e4f01482f2db0acbc35542",
3245
+ "originalLines": 732,
3246
+ "prefixSha256": "f42cd32cfd8ff7bbe7ac8892aeba19f0806657f9fe9e6f45ecc95831071e6a60",
3247
+ "prefixBytes": 19369,
3248
+ "entryLines": 193,
3249
3249
  "chunks": [
3250
3250
  {
3251
3251
  "id": "workspace-conventions-000",
3252
3252
  "ordinal": 0,
3253
3253
  "destination": "workspace-conventions/SKILL.md",
3254
- "sha256": "e3e6f49e83e80b958184a4d281559fd80aa0a3bb7cbcb0893ecc1821c4b2f001",
3255
- "lines": 60,
3254
+ "sha256": "31990746b27d29d6f3a471dc800c843f1ddcc08b09a8444efdbf5c04cbde5503",
3255
+ "lines": 62,
3256
3256
  "heading": "任务启动前 Skill 读取规则(强制)"
3257
3257
  },
3258
3258
  {
3259
3259
  "id": "workspace-conventions-001",
3260
3260
  "ordinal": 1,
3261
3261
  "destination": "workspace-conventions/SKILL.md",
3262
- "sha256": "8d8dfff420c0cc768bbeb13d94e9f77f52d5002fc61d93dc82d71b3a17f2eaa0",
3262
+ "sha256": "c3db79fb5f6f00a6ea619f7129f1e81259efe899256a5100f9c84a5b5dca58f4",
3263
3263
  "lines": 12,
3264
3264
  "heading": "Microi吾码工作进度播报规范(强制)"
3265
3265
  },
@@ -3323,7 +3323,7 @@
3323
3323
  "id": "workspace-conventions-009",
3324
3324
  "ordinal": 9,
3325
3325
  "destination": "workspace-conventions/references/progressive-04-工作区与平台专项保障.md",
3326
- "sha256": "da44c7edb8923a1c4a7a5da87bfe1e6ec87323096ed2b71a2b27abf4a46d188e",
3326
+ "sha256": "9056add84ccdd3ee8d75883aa9b19bd271bc4fc179de1b4c142b8c5f3531e6e2",
3327
3327
  "lines": 44,
3328
3328
  "heading": "多对话共享工作区变更归属保护(强制)"
3329
3329
  },
@@ -3451,7 +3451,7 @@
3451
3451
  "id": "workspace-conventions-025",
3452
3452
  "ordinal": 25,
3453
3453
  "destination": "workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md",
3454
- "sha256": "4cf40c4ca771f7e04b80279646323a816378b98669f562ff8f4c647d5bf837ca",
3454
+ "sha256": "8a7a3437fbd43fa31d038d8f8c583e6145d4b68dce42faa290f142b5ff390a0b",
3455
3455
  "lines": 32,
3456
3456
  "heading": "多 AI 对话共享本地服务与发布互斥(强制)"
3457
3457
  },
@@ -3555,7 +3555,7 @@
3555
3555
  "id": "workspace-conventions-038",
3556
3556
  "ordinal": 38,
3557
3557
  "destination": "workspace-conventions/references/progressive-03-cli-与-ide-插件错版共存约定.md",
3558
- "sha256": "1b65652abc8ca096a22d79a62b32c74557e5fc3daa7d81f3c192c4b9e37e4665",
3558
+ "sha256": "8c9a110528e81ace24313833ab2085efa9a69705566be5c2f700b76dbc91f207",
3559
3559
  "lines": 30,
3560
3560
  "heading": "CLI 与 IDE 插件错版共存约定"
3561
3561
  },
@@ -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": "ff09cc6c76c9c6d13280f1d0fe45db19775863bca06eae8dadd1c4b2358183d3",
3567
- "lines": 15,
3566
+ "sha256": "4a24e3f7bd0244debb6efa82ea164265ab5841ccf97372af67ca16e0211bfe9c",
3567
+ "lines": 18,
3568
3568
  "heading": "本地测试程序与依赖生命周期(强制)"
3569
3569
  }
3570
3570
  ],
@@ -55,6 +55,8 @@ description: Microi AI 引擎、MiniMax 图片/音乐/视频生成与预览、
55
55
 
56
56
  MCP 可信写前校验分支确认未执行时标记 `notExecuted`,保留安全的参数位置和错误码,同一动作最多允许模型修正一次参数;不能仅凭未看到 HTTP 请求就推断未写入。发出写请求后断线或工具报错保留 `uncertain`,停止后续写入。已知表、字段和 Manifest 使用精确只读工具核对;回读返回不等于原写入成功,也不授权重放。普通 POST 网络失败不得通过另一 HTTP 传输自动重发;已有稳定 RequestId 的专用资产协议按自身契约执行。浏览器提前断流、取消或错误时保留已收到的文本、步骤与失败回执,不能把正在执行的工具保存为成功。
57
57
 
58
+ Manifest 原始声明必须在兼容归一化前整体预检:资源集合只能为非空对象组成的数组,省略可选集合时删除属性;非法成员不得静默过滤。冲突的大小写集合别名、大小写不敏感的重复表名/接口 Key/数据源 Key,以及同表重复字段名/显式索引名须在任何资源调用前拒绝。合法局部更新、相同别名和不同表的同名字段继续兼容。通过 `microi_get_manifest_schema.declarationPreflight.version=1` 发现能力;源码、离线处理器测试和已加载工具分别核对。此门禁不代表跨资源事务,也不能代替服务端权限和写后回读。
59
+
58
60
  建表和新增字段的 DDL 来自已鉴权 MCP 端点开启的内部 ORM observer,在真实 DbCommand 执行前、返回或失败时记录安全语句,不从模型计划推测。字面量、默认值、注释及含歧义的双引号段隐藏,只返回有界 TABLE/INDEX DDL,不返回 DML 值。`submitted/executed/failed` 与 `TransactionPending` 是数据库执行阶段,不等于最终事务提交;截断必须标明。局部 HTTPS 联调只使用系统证书链与 localhost 名称验证通过的公开链,专属 Node 临时 CA 文件严格限权并在退出后清理;不关闭 TLS、不导出服务端私钥。
59
61
 
60
62
  在线工具网关仅转发当前请求的真实 DiyToken 与租户到同版 MCP,不创建服务账号或提权 Token;不继承宿主其它凭据。每次调用前复核当前管理员权限,模型只能提出调用建议,MCP 继续负责参数 Schema、写操作确认、幂等、审计和权威回读。对浏览器本地文件,先通过受控上传取得服务器可读内容,不能把客户端路径当作 API 节点路径。
@@ -80,10 +82,15 @@ MCP 可信写前校验分支确认未执行时标记 `notExecuted`,保留安
80
82
 
81
83
  `Chat/ChatStream` 虽声明 GET/POST,含问题、附件和会话上下文的业务调用默认使用 POST,避免敏感内容进入 URL 日志。Controller 和 `V8.AI` 必须从可信执行上下文覆盖当前用户和 `OsClient`,并清除客户端提交的 `ApiKey/Endpoint`。所谓打字机效果必须来自真实 SSE 增量块;`microi_chat` 只返回最终结果,不能被描述成逐 token MCP 流。
82
84
 
85
+ 普通聊天与 NL2V8 流式运行时通过可选 `IAiCancellableStream` 接口接收 HTTP `RequestAborted`,联结模型超时并传入 SDK;既有二参数接口兼容保留。支持该接口的 Core、AI 与 API 必须一起交付,旧 AI 模块回退路径不能声称具有取消传播。`DataAppend.CompletionStatus` 区分 `Completed/Cancelled/TimedOut/Truncated/Filtered/Incomplete/Failed`,只有明确正常结束且非空输出返回 `Code=1`;部分结果保留在 Data/增量回调中,不能自动保存为成功。HTTP `done` 只表示传输结束。取消/断流不撤销已完成工具写入或供应商费用,不自动重试;普通聊天空流不再隐式追加第二次模型请求。NL2V8 关键词扩词接收同一取消信号;数据库/可选向量查询仍有独立超时,当前仅在查询前后检查取消,不能宣称所有外部查询已即时中断。
86
+
83
87
  安全数据分析的新客户端调用 `/apiengine/platform-ai-runtime` 并固定 `Action=NL2SQL`;旧 `/api/Ai/NL2SQL` 只保留兼容转发。最终都由租户/用户绑定的 `V8.AI.NL2SQL` 从当前用户权限生成表白名单;任何通用包装接口都不得接受客户端自报的表名作为授权。
84
88
 
85
89
  ## 代码分层
86
90
 
91
+ - OpenAI 兼容代理按完整 SSE 事件判断模型终态;只在全部请求候选都有显式已知 `finish_reason`、有文本/工具调用载荷且无错误时,给正常 EOF 补单个 `[DONE]`。已有终止帧即为传输边界,忽略其后数据;纯 EOF、取消、空答案、错误和冲突终态不能变成功。`length/content_filter` 保留原值,传输结束不等于业务答案完整;原有计量来源与记录继续生效。正常及错误 body 读取须传取消信号,并沿用代理总超时。需部署包含该修复的新 AI 后端,不能以商城/MCP 更新冒充上线。
92
+ - 固定 JSON 基准须显式记录思考设置。`microi.benchmarks/ai-quality` 协议 1.1.0 对 MiniMax-M3 的两个条件同样固定 `reasoning_split:true`、`thinking:{type:'disabled'}`;其它模型不发送未经确认的参数。保留 1.0.0 失败结果;不剥离任意回答或取消终止帧验收来制造通过,不把不同思考配置比较成效率收益。供应商能力以官方文档和当前实际回执为准。
93
+
87
94
  AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.Api` 只是 HTTP、SSE 与 SignalR 传输层,可以做路由、请求绑定、读取认证中间件产生的可信用户/租户、传递取消信号和写响应,但不能承载模型选择、Schema/Skill 检索、NL2SQL 授权与执行、提示词编排、代理路由、供应商密钥、额度计量、订阅支付状态或 AI 工作流。
88
95
 
89
96
  - Controller、Hub 只调用 `IMicroiAI`、`AiProxyService`、`SubscriptionService`、`AiWorkflowService` 等 `Microi.AI` 门面,不直接查询 `mic_ai` / `mic_sub_order`,不接触上游密钥和向量基础设施。
@@ -100,7 +107,7 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
100
107
 
101
108
  ### 媒体目录与图片任务的 Managed 调用
102
109
 
103
- - 后端新增 `V8.AI.GetMediaModels()`、`GenerateMiniMaxImage(param)`、`GetMiniMaxImageTask(taskId)`、`RecoverMiniMaxImageTask(taskId)` 四个原子。前端及 Microi Agent 调用 `/apiengine/platform-ai-runtime` 的同名 `Action`,后端 V8 可直接调用原子,不自请求本机 HTTP,不新增第二套媒体编排入口。
110
+ - 后端新增 `V8.AI.GetMediaModels()`、`V8.AI.GenerateMiniMaxImage(param)`、`V8.AI.GetMiniMaxImageTask(taskId)`、`V8.AI.RecoverMiniMaxImageTask(taskId)` 四个原子。前端及 Microi Agent 调用 `/apiengine/platform-ai-runtime` 的同名 `Action`,后端 V8 可直接调用原子,不自请求本机 HTTP,不新增第二套媒体编排入口。
104
111
  - 当前租户和用户绑定于可信 V8 上下文,匿名拒绝;图片任务提交沿用既有运行时的模型、许可、权限、配额与幂等校验。查询和恢复只访问该租户、该用户拥有的任务。目录仅安全投影,Hook 仍只接收来源、阶段和动作,不接收媒体、提示词、任务号或密钥。
105
112
  - 提交持久任务后保存原 `RequestId`、`TaskId` 及服务器/租户/账号归属;`Code=2` 仅表示受理。超时、断连、空响应先复查原任务,不能换 Id 重发。恢复仅复用已经保存的供应商回执与结果,不重新生成;没有回执的未知结果明确失败或保持未知,不能伪造成功。
106
113
  - 四个原子、Managed 引擎和消费者需一起验收;应用包或版本号不代表服务器能力已部署。至少验证匿名拒绝、跨租户/跨用户隔离、请求参数白名单、幂等回放、未知结果复查,以及图片持久地址回读。没有线上回执时只报告源码与测试已完成,不声称某一版本已经上线。
@@ -130,14 +137,20 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
130
137
  - 管理端【AI视频】应按 `TaskHandle` 轮询任务,成功后优先转存 HDFS,并用 `<video controls preload="metadata">` 原页预览和明确下载按钮消费同一个已校验地址。临时 URL、生成完成、HDFS 转存、媒体可播放和外部平台发布是五个不同事实,必须分别验收。
131
138
  - 使用 Microi.AI 中转站时,租户侧 AI Bootstrap 通过官方 `official_ai_relay_models` 发现可用运行模型。该接口是跨租户只读公共契约,必须保持启用、允许匿名 HTTP 调用,并且只返回模型标识、展示名等公开白名单字段,绝不能返回中转密钥或上游 Endpoint。消费者不得把 `NoAuth` 静默伪装为“没有配置模型”;应返回可诊断错误,同时前端显示明确空态。
132
139
  - PC、UniApp 和其它客户端通过 `POST /apiengine/{key}` 发送的 JSON Body 必须完整进入 `V8.Param`;兼容入口 `/api/ApiEngine/Run` 的 JSON Body 还必须包含 `ApiEngineKey`。API 层只负责请求绑定和清除客户端伪造的可信字段,模型选择、权限策略与对话逻辑仍全部位于 `Microi.AI` 或受控 AI 接口引擎中。
133
- - 当前计量记录除问题摘要外还可能持久化完整 `Question`、`Answer`,部分诊断日志也会输出问题或摘要。处理现有版本时必须把这些字段视为敏感业务数据,限制查询权限和留存;不要声称已经全面脱敏。
134
- - 发布目标是日志只记录 trace id、模型、耗时、token 计数和状态,Prompt/Answer 按租户策略脱敏,密码、Token、连接串和完整业务数据不落日志。该目标必须用源码和真实数据回读证明。
135
- - OpenAI 代理流式接口会传递 HTTP 请求取消信号;普通 `ChatStream` 与 `NL2V8` 当前主要使用内部超时 Token。不要声称浏览器断开一定立即终止上游调用或计费。
140
+ - 本轮源码的两条中转计量写入路径将 `PromptPreview/Question/Answer` 绑定为空字符串;用量查询只投影计量与关联字段,不返回旧正文预览。旧物理列保留兼容,不批量删除历史数据,不改变数值计量事务或用户主动保存的会话历史。正式运行以目标版本发布和实际读回为准;部署旧版本时这些字段仍可能保存正文。
141
+ - 普通聊天/NL2V8 诊断仅记录长度、状态、异常类型;NL2V8 异常响应也不回显异常正文。历史日志、旧账本、会话存储、其它 AI 分支及外部供应商留存需单独审计;不能据此声称全平台全面脱敏或统一留存策略已完成。
142
+ - 流式回执 `UsageSource=Provider` 仅用于 SDK 实际返回的用量,缺失为 `Unavailable`;存量中转计量估算保留且另标 `RelayUsageSource=Estimated`,不得当作供应商实际 token 或费用。公开实测可用 `microi.benchmarks/ai-quality` 固定合成任务协议,模拟夹具必须标 `harness-test`,真实供应商回执标 `real-provider`;结构化 JSON 校验不能替代端到端数据库/界面/权限验收。
143
+ - OpenAI 代理、普通 `/api/Ai/ChatStream` 与 `/api/Ai/NL2V8Engine` 将 HTTP 取消信号传递到对应模型流读取,并与模型超时组合;`IAiCancellableStream` 为普通聊天提供可取消契约。取消/超时/长度截断/上游失败不能标为完整成功。取消不撤销供应商已经发生的用量,也不能承诺网络断开瞬间停止上游计费。
144
+ - 中转无限额度使用 `mci_ai_token_account.IsUnlimited=1` 的独立权益,不能把负数或极大余额当作无限。赠送余额保持有限数值,无限期间按该调用既有的计量来源继续累计 `UsedTokens` 与脱敏用量账本而不减 `RemainingTokens`,供应商用量缺失时仍可能为估算;各余额预检与扣量 SQL 均读取服务端当前权益,撤销后恢复有限余额规则。该权益不代替服务器 License、登录/API Key、付费订阅、供应商配额或并发保护。
145
+ - 管理中转权益复用 Managed `platform-ai-account`:先 `GetRelayTokenAccount({TargetUserId})`,再 `SetRelayTokenLimit({TargetUserId,IsUnlimited,ExpectedUnlimited})`。后两参数必须为布尔值,ExpectedUnlimited 必须来自刚回读状态;仅当前配置主租户、数据库仍有效的平台管理员可调用,访问密钥与子租户均拒绝。无账户的读取不开户;设置可受控初始化默认赠送账户,多条有效账户立即失败。写后回读 `AccountExists/IsUnlimited/GiftTokens/UsedTokens/RemainingTokens/UnlimitedUpdatedBy/UnlimitedUpdatedAt`,不能只看 Code。
146
+ - MCP 使用既有 `microi_run_engine` 调用同一 Managed 动作,`V8.Method.ManageAiPlatform` 负责可信身份、并发条件更新与计量原子。普通客户端 FormEngine 无权直改账户/用量表;获授权可编辑后端代码仍属于可信开发执行权,不能宣称任意服务端脚本被账本表分类隔离。字段由官方 AI 应用升级,旧库缺列按有限额度兼容,管理设置要求先完成宿主与应用包同步升级;不得临时维护引擎、SQL 绕过 MCP 或清空消费历史。
147
+ - 在途请求若在预检后被撤销权益,或有限余额被其它请求消耗,扣量时按数据库当前状态拒绝不足余额,不沿用旧无限快照、不自动补扣。供应商已经发生的用量可能未进入本地成功账本,应另查供应商回执;不能宣称所有失败用量均已完整入账。
148
+ - 无限权益能力要求 Core/AI 宿主至少 `8.7.0`、官方 AI 应用至少 `7.7.8`、`platform-ai-account` 至少 `1.1.1`;MCP `6.1.5` 的通用 `microi_run_engine` 可调用。当前用户的官方中转摘要/用量同样只在可信主租户上下文访问,子租户不能以相同用户 Id 读取主租户账户。
136
149
 
137
150
  ## 跨端 AI 助手与商城交付
138
151
 
139
152
  - PC 与移动端复用 `mci_ai_data_assistant`。`Bootstrap` 返回的 `Enabled`、`Models`、`AllowedDomains` 和 `Prompts` 是跨端共同事实源;快捷问题来自启用的 `mci_ai_data_domain.PromptExamples`,前端不能维护另一套固定文案。
140
- - 官方 AI助手应用归 `app.microi.ai-engine`。v6.3.6 的接口引擎必须严格只有 Managed `mci_ai_data_assistant`、Managed `platform-ai-account`、Managed `platform-ai-runtime` 和 CreateIfMissing `platform-ai-custom-hook` 四项,并声明 `V8.Method.ManageAiPlatform`、`V8.Method.RequireManagedProtocolContext` 与所需 `V8.AI` 能力;后端缺少任一能力时安装预检失败关闭。
153
+ - 官方 AI助手应用归 `app.microi.ai-engine`,接口引擎保留 Managed `mci_ai_data_assistant`、Managed `platform-ai-account`、Managed `platform-ai-runtime` 和 CreateIfMissing `platform-ai-custom-hook` 四项,并声明 `V8.Method.ManageAiPlatform`、`V8.Method.RequireManagedProtocolContext` 与所需 `V8.AI` 能力。`RequiredPlatformCapabilities` 是发布与 CI 校验的包声明,不能声称安装器逐项探测运行能力。安装器 v3.1.1 或更新版本按 `ServerMinVersion` 读取真实 Core 版本并在写入前校验;AI 应用 v7.7.8 最低为平台 8.7.0。版本校验不能识别混装旧 AI 程序集,仍需部署匹配的 Core/AI/API,并实际调用管理动作和回读结构。
141
154
  - `ai_app_list`、`ai_app_detail`、`ai_app_get_file`、`ai_app_save_file`、`ai_app_create`、`ai_app_build`、`ai_app_preview`、`ai_app_download_source_zip`、`ai_app_download_build_zip`、`ai_app_moveobject_probe`、`ai_app_moveobject_exec_probe`、`ai_app_publish_store` 这 12 个 `ai_app_*` 归 `app.microi.store` 维护。AI助手包移除它们的资源选择和所有权声明,但不会删除目标租户既有运行时接口记录;既有记录继续由应用商城包升级。
142
155
  - v6.3.6 还必须保持 AI助手包的 DDL、PhysicalColumns、DiyTables、DiyFields、DataSets 全层不再包含重复的 `mci_ai_app_version`、`mci_ai_app_file`、`sys_microistore`,这些表交回 Store/SaaS 既有平台包维护;当前仅 AI助手包拥有的 `app_mic_aiapp`、`mci_ai_app` 继续保留。
143
156
  - 普通角色读取业务数据必须匹配启用的 `mci_ai_role_policy`,这不是常规对话的前置条件。只有后端可信的 `V8.CurrentUser.Level >= 9999` 可以在新安装租户缺少角色策略时获得数据分析安全兜底:从目标租户动态读取已启用业务域和模型,范围为 `All`,仍保持 `AllowRawSql=false`、敏感字段默认关闭。不得相信客户端提交的 Level、角色名或账号名。
@@ -15,6 +15,13 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
15
15
 
16
16
  应用包是声明式资源的权威交付边界:当前包标记为 `Managed` 的表单元数据、菜单、字段、接口引擎等资源按包覆盖;当前包标记为 `CreateIfMissing` 或 `InsertIfMissing` 的租户扩展/配置只补缺。覆盖安装不等于整表清空,仍禁止把发布方租户业务数据、密钥或连接配置原样复制到目标租户。
17
17
 
18
+ ## 最低运行版本与只读预检
19
+
20
+ - 从安装器 v3.1.1 开始,`PackageInfo.ServerMinVersion/ClientMinVersion` 接受可选 `v` 前缀的三段或四段非负整数版本;不接受范围、预发布后缀、非字符串或不合法数字。省略、空白或 null 保留旧包兼容,返回 `NotDeclared`,不得宣称已经核验。
21
+ - 后端只信任当前节点 `V8.Method.GetBackendVersion()`,低于要求返回 `PACKAGE_RUNTIME_VERSION_TOO_LOW`;有声明但能力缺失、异常或运行版本无法解析返回 `PACKAGE_RUNTIME_VERSION_UNAVAILABLE`。格式错误返回 `PACKAGE_RUNTIME_VERSION_INVALID`。直接包、下载包、Managed 同版本重装和每个后台续跑分片都在任何安装写入前核验,不采信请求参数或历史检查点里的版本。
22
+ - 服务端无法可信获取浏览器实际部署版本,前端声明仅返回 `PendingClientVerification` 和警告;不得从 `V8.Param.ClientVersion` 冒充检查通过,也不能据此宣称前端已部署或验收。
23
+ - 使用现有 MCP `microi_run_engine` 调用 `import-microi-store-package`,传 `ValidateOnly:true`(或 `Action:"validate"`)检查结构及 `Data.Compatibility`。只读预检不得运行物理引导 DDL、更新后台进度或写包正文缓存;它不替代正式安装任务和资源回读。无需新增工具或绕过 MCP;升级应用商城交付安装器,目标后端没有可信版本原子时先升级后端。
24
+
18
25
  ## 平台升级的应用商城边界(强制)
19
26
 
20
27
  - 默认启动只恢复表单、模块、系统设置的核心结构与普通账号登录、权限、导航、商城安装所需资源;由一个 `app.microi.bootstrap` 投影包交付,不等于完整安装其来源应用。SSO、AI、通知、备份、OCR、翻译、工作流及 SaaS 管理界面等按需从商城安装。新增平台包、配置字段或微服务页面不能自动加入启动恢复范围。本文历史复盘中提到的九包/106 接口方案已经收缩,不再作为默认启动要求。
@@ -278,7 +285,8 @@ staged 行、请求参数、`StableFilePathName` 或外部 CDN URL 推断版本
278
285
  - 每个主租户和子租户都可以发布自己的应用;应用行用 `IsPublic` 表达公开范围,缺省/历史空值按公开兼容。公开应用允许未登录来源读取和安装,私有应用只允许来源登录成功后的授权身份读取,列表、详情、版本接口都必须重复执行这一权限判断。
279
286
  - 组合包的 `ApplicationBundles[].Application` 必须由发布器从源应用实际记录携带 `IsPublic/IsApprove`,不接受请求参数替代。安装器只接受 `0/1`、`"0"/"1"` 和布尔值,显式源标记优先;未审批的源不能因 Build 成功变成已审批。历史包无公开标记时,已有目标保持原值(含历史空值),首次新增运行应用显式 `IsPublic=0`,不能继承目标 Switch 默认1。无效声明在直接包入口任何 I/O 前失败;下载包在读取正文后、该包资源/文件写入前失败,旧库既有物理前置兼容检查不因此重排。父商品 AppId/公开范围、目标拥有者和源码下载独立鉴权不得随运行标记改变;验收必须覆盖新私有、已有私有/公开、显式公开、旧包新建/重装、非法类型零包写入和即时撤权。
280
287
  - 新版安装包正文不得长期内联在 `sys_microistore.AppPakcet`,也不得随 `mic_data_version.Data` 重复复制。公开应用写入 HDFS 公有桶并记录 `HdfsPublic`,私有应用写入私有桶并记录 `HdfsPrivate`;数据库只保存 `PackageId/PackageHdfsPath/PackageSha256/PackageSize/PackageContentType/PackageFormatVersion/PackageUploadedAt`。`IsPublic` 历史空值按公开兼容,但所有新建应用必须显式落为 `1/0`。
281
- - 发布顺序必须是“UTF-8 JSON 上传 → HDFS 回读 → 字节数和 SHA-256 一致 → 写入不可变包索引及商城指针 → 以原值 CAS 清空 `AppPakcet`”。普通发布不得仅凭 Redis 命中跳过 HDFS 回读;只有受控历史压缩可复用内容寻址缓存,安装端仍必须独立下载并校验。公开包可通过 FileServer/CDN 公有地址读取;私有包只能由来源后端在当前授权身份下签发短期下载地址,Token、签名 URL 和包正文不得进入浏览器配置、日志或后台任务参数。
288
+ - 发布顺序必须是“UTF-8 JSON 上传 → HDFS 回读 → 字节数和 SHA-256 一致 → 写入不可变包索引及商城指针 → 以原值 CAS 清空 `AppPakcet`”。普通发布不得仅凭 Redis 命中跳过 HDFS 回读;只有受控历史压缩可复用内容寻址缓存,安装端首次下载与后续缓存命中均必须独立核对正文大小与 SHA-256。公开包可通过 FileServer/CDN 公有地址读取;私有包只能由来源后端在当前授权身份下签发短期下载地址,Token、签名 URL 和包正文不得进入浏览器配置、日志或后台任务参数。
289
+ - `MARKETPLACE_VERIFIED_PACKAGE_CACHE_V1` 用于详情摘要与安装分片的重复整包下载治理。每租户每用途一个固定槽,原文上限64 MiB、序列化上限96 MiB、TTL900秒且命中不续期;不能按应用/版本无限增键。缓存只写入已校验正文,绑定来源ApiBase/OsClient、当前租户、Id、StoreVersionId、PackageHdfsPath、存储范围、SHA与大小,不存签名URL或凭据;每片仍先重新读取来源权限与权威指针,命中重新校验实际字节与SHA。缓存损坏/故障/超限回退完整下载,不能为了减少下载取消后台分片或把包正文塞进checkpoint。详情`PackageContentRead`及导入诊断`marketplace_package_read`只报告包下载字节,测试覆盖撤权、来源/快照/路径变化、污染、不可用与固定槽有界;真实同包两次读取须有`VerifiedDownload → VerifiedCache / NetworkBytes=0`回执。官方发布源禁止运行安装器,客户安装与包发布分别验收。
282
290
  - `mic_data_version` 历史快照保留不可变 `StoreVersionId` 和同一组包指针,因此旧版本仍可精确安装,不再要求 `Data` 内含完整 JSON。导入器先校验快照版本/应用身份,再按指针下载并在解析前核对大小与哈希;指针缺失时才回退旧版内联字段,禁止快照不匹配时退回当前版本。
283
291
  - 旧库容量治理使用 `compact-microi-store-packages` 超级管理员持久后台任务:先幂等补齐物理列,再用有界 `Id` 游标逐批处理;每个包都先上传回读,随后 CAS 清理当前行或历史快照。禁止对数 GB `mic_data_version.Data` 执行全表 `LIKE`/包正文计数。逻辑大字段清空后,MySQL 表空间文件是否立即缩小取决于存储引擎;`OPTIMIZE TABLE` 只能在备份完成的维护窗口由管理员另行执行,不能由应用安装或压缩任务自动触发。
284
292
  - 商城来源以 `ApiBase + OsClient` 唯一定位。添加来源先只读发现系统标题、验证码策略和公开应用数;需要私有应用时再登录。帐号、密码、Token 不能写浏览器配置或商城来源 JSON;密码只用于本次登录,长会话 Token 以 `MCP/Mobile` 非 PC 客户端签发,并由当前租户后端加密保存到 `mci_system_setting`,浏览器只持有不具备取密能力的凭据 Key。
@@ -9,7 +9,7 @@ description: Microi 业务架构蓝图(System Blueprint)— 设计期系统
9
9
 
10
10
  ## 这是什么
11
11
 
12
- 业务架构蓝图是 Microi 吾码的 **设计期系统总图**,不是 n8n / Dify / ComfyUI 那种运行时工作流。它一次同时承担三个职责:
12
+ 业务架构蓝图是 Microi 吾码的 **设计期系统总图**,用于描述系统组成、业务关系和治理约束。它一次同时承担三个职责:
13
13
 
14
14
  1. **可视化总图** — 用户在前端 X6 画布拖拽节点,完整描述一个业务系统的组成
15
15
  2. **AI 事实源** — AI 生成代码、表、接口引擎、菜单前必读的"宪法",防止幻觉
@@ -90,6 +90,9 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
90
90
  - 先证明任务真的在执行:读 `Scheduler.IsStarted`、`Scheduler.NumberOfJobsExecuted` 和 `Acquisition.LastAcquisitionError`,参考 `microi.doc/docs/doc/system-engine/job.md` 的“任务不执行”。`diy_schedule_job.Status=正常`、`diy_schedule_job.NextTime` 和“插件启动成功”都不能证明触发成功;列表/详情页的 `LastTime/NextTime` 来自运行时,直接查表看到的是库内快照。
91
91
  - 领取错误含 `Key 'IDX_microi_job_T_NFT_ST' doesn't exist` 时,是 Quartz 3.19 MySQL 方言依赖 `USE INDEX (IDX_{tablePrefix}T_NFT_ST)` 与 `IDX_{tablePrefix}T_NFT_ST_MISFIRE`,而触发器表缺少这两个索引(常见于历史租户库仍是旧 `QRTZ_` 前缀索引名)。平台调度器初始化会按前缀幂等补齐;人工抢修可直接执行文档中的两条 `CREATE INDEX`,索引名大小写不敏感,补完后无需重建任务或 Cron。
92
92
  - 失败记录错误分类、重试次数和 `NextRetryTime`,采用有上限退避;永久错误进入人工处理。
93
+ - 大应用包安装返回 Id 后长期 `Pending/AttemptCount=0`,先回读原任务和 `WorkerClaimFailed` 持久栈。旧版完整 `ParamJson` 共用 2 秒候选扫描时限,数据库慢读可能触发驱动超时处理中的空引用;不得凭异常文案归因业务脚本或重复提交。新版候选仅含领取必需字段,完整参数在已领取的执行槽中以任务 Id、租户、owner/fence 和有效租约约束读取,独立上限 30 秒,读后再验租约;读取失败不执行正文,仅释放本次仍拥有的租约。验收覆盖大参数慢读、读失败、读取期间租约变化和原任务成功终态;需要更新后端,MCP/CLI 升级不能代替。
94
+ - 已领取的后台任务执行失败时,先按原任务 Id 回读真实状态,再查系统日志 `Source=BackgroundTask`、`Action=ExecutionFailed`。脱敏诊断用 `Stage` 区分接口引擎执行(`ApiEngineExecution`,也包括执行前的权威引擎读取)、分片进度写入(`ContinuationProgress`)、分片重新入队(`ContinuationPersist`)和终态写入(`TerminalPersist`);后者表示 `Complete` 本身失败,不能据此认定业务脚本失败。结合 `OwnerOsClient/ExecutionOsClient`、运行环境、`TaskId/Fence` 关联原任务;安全异常链最多 4 个节点,保留类型、`HResult`、可读取的提供商 `Number/SqlState/SocketErrorCode` 及每节点最多 4 个 CLR 方法名,不包含源码路径、行号或实参。
95
+ - 此诊断不记录异常消息正文、SQL、参数或连接串。`MessageSha256` 仅用于关联相同消息前缀:最多取前 65,536 个 UTF-16 字符后编码为 UTF-8 计算摘要,并同时记录 `MessageLength/MessageHashChars/MessageHashTruncated`;不能把截断摘要当作完整消息或根因证据。诊断走既有 `QueueSystemLog`,接受入队不等于已经持久化,必须实际查询到日志才算取得诊断证据;日志拒绝或异常不改变原任务的重试、事务、租约和失败结果,也不能触发重复提交。
93
96
  - 外部调用设置超时;无法确认对方是否成功时用业务幂等号查询,不盲目重发。
94
97
  - SQL Server 业务库可用但商城保存任务时报证书链不受信任时,核对调度节点主数据库连接串和实际后端版本。Dos.ORM 的 `System.Data.SqlClient` 与 Quartz 的 `Microsoft.Data.SqlClient` 缺省加密策略不同;插件仅为缺少 `Encrypt` 的旧串显式保留 ORM 的可选加密语义,普通注册和延迟初始化共用此策略。显式 `Encrypt/TrustServerCertificate` 必须保留,不能全局添加信任证书或吞掉任务保存失败。正式环境优先受信任证书;自签名测试环境仅由管理员显式配置。更新后端或连接配置后重启调度节点,再重装并回读 Quartz 任务及触发器,不能以元数据存在代替。
95
98
  - 服务停机先停止接单,再在有限宽限期排空或持久化;重启扫描未完成任务。
@@ -119,7 +119,7 @@ Codex Router 启动后会异步调用 bundled CLI 的 `microi update --backgroun
119
119
 
120
120
  ## 同步与安全边界
121
121
 
122
- - 发布扩展与 CLI/AI Plugin 前检查实际 VSIX:完整清单、字节数、SHA-256 和敏感文件扫描回执保存在 `.tmp/development-tools-releases/<版本>/`;逐字节核对 MCP 输出/构建输入与 Skills 全部文件同源。归档超过 64 MiB 或混入签名资料、凭据、桌面安装包、工具链、apps、upstream、同步目录或 node_modules 时停止,修复误包后复测;断点补发使用同一门禁,不用 `vsce ls` 替代归档检查。npm Token 只绑定官方 HTTPS registry,私有 npmrc 仅引用 `${NPM_TOKEN}`;同时固定 `npm_config_userconfig` / `NPM_CONFIG_USERCONFIG` 与 registry 两种大小写变量,避免外层 `npm run` 的配置遮蔽有效 Token。不输出凭据,不因继承错误重复要求登录;已发布正确制品保留,发行内容变化使用新不可变版本。npm、Visual Studio Marketplace、Open VSX 的发布命令明确提示成功即可报告对应渠道发布成功;默认不追加 `--verify-all` / `--verify-only`、版本轮询或下载回读,不因传播延迟重复发布。只有命令报错、结果未知或用户明确要求核验时才查询渠道状态。
122
+ - 发布扩展与 CLI/AI Plugin 前检查实际 VSIX:完整清单、字节数、SHA-256 和敏感文件扫描回执保存在 `.tmp/development-tools-releases/<版本>/`;逐字节核对 MCP 输出/构建输入与 Skills 全部文件同源。归档超过 64 MiB 或混入签名资料、凭据、桌面安装包、工具链、apps、upstream、同步目录或 node_modules 时停止,修复误包后复测;断点补发使用同一门禁,不用 `vsce ls` 替代归档检查。npm Token 只绑定官方 HTTPS registry,私有 npmrc 仅引用 `${NPM_TOKEN}`;同时固定 `npm_config_userconfig` / `NPM_CONFIG_USERCONFIG` 与 registry 两种大小写变量,避免外层 `npm run` 的配置遮蔽有效 Token。不输出凭据,不因继承错误重复要求登录;已发布正确制品保留,发行内容变化使用新不可变版本。npm、Visual Studio Marketplace、Open VSX 的发布命令明确提示成功即可报告对应渠道发布成功;默认不追加 `--verify-all` / `--verify-only`、版本轮询或下载回读,不因传播延迟重复发布。用户明确确认其本机终端已发布成功,也作为该渠道的完成依据;不得再要求确认结果行、提供回执或等待 npm/市场公开可见。只有发布命令确实报错、结果未知且用户也未确认成功,或用户明确要求核验时,才按需查询渠道状态。
123
123
 
124
124
  - `Microi-V8-Engine/.microi-config.json` 是三端连接配置事实源;未知字段必须保留。
125
125
  - CLI、VS Code、Codex 与 DeepSeek Harness 插件可以在同一工作区并存;各端必须复用同一配置/Token/MCP 协议,带版本写入实行较新 provider 优先,禁止旧入口回写降级。`doctor.coexistence` 未通过时准确报告兼容风险并后台修复,但不得因此停止无关工作。
@@ -22,14 +22,38 @@ description: Microi 安装、部署、升级和本地运行指南。用于吾码
22
22
 
23
23
  ## 发布测试范围
24
24
 
25
- 常规发布按用户指定 MCP 的实际 MySQL、MongoDB 版本、Redis 和生效 MinIO 或 OSS/HDFS 选择测试矩阵;SQL Server 真实服务与兼容专项仅在用户明确指定解决 SQL Server 问题时执行,不作为每轮发布的默认前置条件,也无需反复申请免测。本文中的“Full/重新 Full”均指当前选定矩阵,已选必测项仍须全部通过。
25
+ ### 普通吾码发布固定流程(30 分钟)
26
26
 
27
- 搜索标签真实浏览器门禁默认使用 1366px 和 1920px 常规桌面;测试进程显式设置 `MICROI_TEST_BROWSER_4K=1` 时追加 3840px 专项。所选宽度随 Full 矩阵冻结,回读必须包含全部所选用例且零失败、零跳过;该变量不进入生产 API 配置。正式发布与同版本 Docker 热修复均拒绝历史 `--skip-tests` / `SmokeOnly` 入口,候选始终包含完整测试输入。
27
+ 收到“发布吾码”“完整正式发布”“一键发布”时,默认执行根目录 `Microi一键编译发布.sh --platform-release`(默认完整选项):新版本号按原规则 +1 一次,NuGet、API Docker、PC Docker、官方网站文档及其 Docker 全部发布。官网不再是可选追加项;只有用户明确要求“仅前端/仅后端/仅官网”等局部发布时才缩小范围。完整入口使用 `PlatformRelease` 执行常规 Microi.Tests(平台单元/组件,不自动追加 Full 专项)、吾码前端通用 Node 测试、真实接口检查与最终加密产物启动/运行冒烟;扩展浏览器验收仅在显式传入 `--platform-frontend-tests` 时追加。真实付费 AI、鸿地/JUNCHI、XJY 等指定客户数据专项和 SQL Server 等独立提供商专项默认不纳入,不再逐次询问;只有用户另行明确要求专项时才执行,回执逐项列为“不适用/未执行”,不能冒充通过。独立商城应用、OpenClaw 等应用源码专项由各自入口执行,不作为平台发布前置;平台 SDK、商城协议、安装器、SaaS 与工作流通用回归继续保留。Microi Code/Agent 是独立产品,不混入吾码平台测试与发行。
28
28
 
29
- 发布测试默认复用上述 MCP 服务。固定夹具库名、端口或归属冲突先修正测试入口的可配置隔离,采用本任务唯一名称并核验所有者;不能因此新建本地数据库、Redis、MongoDB 或存储容器,也不能删除他人的夹具或放宽测试断言。不可复用的例外及清理要求统一见 [本地测试程序与依赖生命周期](../workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
29
+ 1. 默认确认 NuGet、API/PC 和官网完整渠道及版本;记录开始时间,每次新完整发布从当前版本 +1 一次。确认续发同一有效候选时显式使用 `--release-version=x.y.z` 沿用该版本,不重复升版;不能仅凭版本文件未提交就推断为续发。
30
+ 2. 取得对应产品锁并冻结源码、依赖与官网构建输入;执行本次基础范围全部 C#/Node 测试,核对接口及启动/运行回执;扩展浏览器测试仅显式追加 --platform-frontend-tests 时执行。禁止把缺少授权/夹具、零用例、失败、取消或跳过写成成功;不能因测试需要依赖就自动新建租户、安装应用或创建 Docker。保留既有测试数据写入保护。
31
+ 3. 以 `.microi-local` 选定配置复用 MySQL、Redis、MongoDB 和 SaaS 生效的 MinIO/OSS;生成平台正式产物,执行完整 DLL 加密和一致性校验,在本机进程运行最终产物冒烟。PC 执行自身正式构建与产物检查,官网执行原完整构建与页面验收,不使用临时运行容器替代本机程序。
32
+ 4. 完成 NuGet 与全部选中 API/PC/官网 Docker 推送,逐标签回读远端不可变 digest;新推送和断点复用都必须验证,并回读官网关键页面。任一渠道缺凭据、未执行、失败或未知,不能报告全部发布成功。
33
+ 5. 输出各渠道、候选标识、常规测试数量与结果及独立专项未执行清单、各阶段和总耗时、镜像 digest 及官网回读;回收本次进程/临时文件并释放锁。客户部署独立,不以镜像推送代替。
34
+
35
+ 交互选项确认完毕后,本轮共用一个 **1800 秒耗时目标,而非强制截止时间**,覆盖锁/资源准备、测试、编译、加密、冒烟、Docker 检查、推送与回读。超过目标时告警并记录当前阶段、实际耗时和瓶颈,继续推进至发布成功;不能仅因达到 30 分钟杀进程、停止后续步骤或将成功退出改为失败。真实命令失败、用户取消、单操作超时及安全门禁仍保持原有失败语义,定位修复后按候选与回执安全续发。阶段切换或重试不能隐瞒累计耗时,重启续发须保留前次及累计耗时;不能通过跳过测试、吞掉错误或重复盲跑来追求时长。
36
+
37
+ 用户要求同时完成源码交付时,先记录各仓原分支与上游,安全拉取合并并解决冲突,再冻结候选;按归属提交、推送原分支并独立回读。源码同步清单可以包含独立工具仓,但不因此触发其测试、打包或发布。分别记录 Git 准备、脚本执行和任务总耗时,整体仍争取 30 分钟;官网已属于完整发布默认渠道,开发工具和独立应用不因“有变更”自动追加。远端推送问题可以与合格制品发布并行解决,未补齐时如实标为未完成。
38
+
39
+ 普通发布的“完整”指全部发行渠道,不自动扩展测试深度。默认只运行基础平台 C#、平台/前端 Node 与最终产物冒烟。发布前一次完成版本、凭据、资源与官网基础预检;完成代码合并后冻结候选,避免边发布边追加其它任务。后续阶段失败时先保存候选、原始测试和已发布渠道回执,重新核验相同源码、配置、工具与实际产物后复用有效结果,只续做未完成范围;结果不匹配或缺少必要证据时按原门禁复验,不能把通过截图当作缓存。npm、NuGet 等渠道的正式发布命令明确成功,即记录对应渠道发布完成;用户已明确确认其本机终端发布成功时,同样直接按成功继续,不再要求提供最终输出或回执。默认不查版本索引、包页面或下载地址,不等待公共索引/CDN 传播,不因即时 404 重传、升版、降为未完成或再次追问。公共可见状态仅在用户另外要求时核验。
40
+
41
+ **普通发布禁止混入**:新建/准入主子租户、安装消息通知或聊天应用、Microi Code/Agent 的 Vitest/E2E/桌面打包、全提供商兼容专项。隔离测试数据与新建租户不是同一件事,不得借“准备权限夹具”触发安装。平台已有的通用消息/权限离线回归仍保留,不能为缩短耗时删掉已选断言。
42
+
43
+ `--full-only` 仅供用户明确要求的独立深度测试;它不推送镜像,也不作为普通发布的隐含前置。`--microi-agent` / `--microi-code` 仅供独立产品显式发布。发布流程自身的修改只执行对应定向回归;没有新的发版要求时,不为验证规范再发一轮镜像。
44
+
45
+ 普通吾码 PC/API 发布使用 PlatformRelease,包含平台自动化、编译、闭源 DLL 加密、最终产物冒烟、Docker 推送和远端摘要回读;完整发布以 30 分钟为可度量预算,记录各阶段耗时,超时如实记未达标,不承诺未知网络下必然成功。普通发布不运行 Microi Code/Agent 测试,不新建租户、不安装聊天应用。Full 保留为显式独立深度测试;本次修复需要真实依赖时复用指定 MCP 的已授权环境,SQL Server 等兼容专项只在明确指定时执行。已选必测项仍须全部通过。
46
+
47
+ 搜索标签真实浏览器门禁默认使用 1366px 和 1920px 常规桌面;测试进程显式设置 `MICROI_TEST_BROWSER_4K=1` 时追加 3840px 专项。所选宽度随显式 Full 或浏览器专项矩阵冻结,回读必须包含全部所选用例且零失败、零跳过;该变量不进入生产 API 配置。正式发布与同版本 Docker 热修复均拒绝历史 `--skip-tests` / `SmokeOnly` 入口,候选始终包含完整测试输入。
48
+
49
+ 本地发布测试默认复用 `.microi-local` 选定配置对应的已有服务,HDFS 使用该租户 SaaS 的实际 MinIO/OSS。固定夹具库名、端口或归属冲突先修正配置传递和可配置隔离,采用本任务唯一记录/Key/对象前缀并核验所有者;不能因此新建本地依赖容器、切换到其它 MCP 租户、删除他人夹具或放宽断言。清理与专项例外统一见 [本地测试程序与依赖生命周期](../workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
30
50
 
31
51
  选择、旧脚本冲突处理及结果记录统一读取 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 和 `../workspace-conventions/SKILL.md`;实际目标未使用的提供商不能被虚构为已验证。
32
52
 
53
+ 完整入口自动读取当前工作区已忽略且仅当前用户/系统可访问的 `.microi-e2e/platform-release/profile.json`,也可由发行进程变量 `MICROI_PLATFORM_RELEASE_PROFILE` 指向既有授权配置。配置记录项目 `.microi-local` 对应依赖、明确的测试写入范围、归属及独立端口;必须保留所有者与目标校验,不存旧 Token,不依赖历史 `.tmp`。缺配置或授权不匹配时明确失败,不能自动创建租户、数据库、容器或安装应用。
54
+
55
+ 该入口在同一轮计时中启动受管原生依赖转发,待本轮构建完成后启动对应 API/Vite,并向测试子进程传递私有环境;测试完成先停止自有 API/Vite,转发保留到最终加密产物冒烟完成,脚本成功、失败或取消退出均精确收尾。显式已有 `MICROI_PLATFORM_RUNTIME_CONTROL` 时复用其监督进程,不重复启动;局部前端/仅官网入口不强制加载完整发布配置。只读检查可执行 `node Microi.Server/tools/platform-release-runtime.mjs dry-preflight <工作区绝对路径> [profile绝对路径]`,它不启动服务、不创建测试资源。
56
+
33
57
  ## 先确认部署类型
34
58
 
35
59
  默认安装与升级只恢复登录、权限、导航和应用商城所需的最小基础,表单、模块和系统设置
@@ -55,34 +79,34 @@ description: Microi 安装、部署、升级和本地运行指南。用于吾码
55
79
  - 联网发行机执行 `Microi一键编译发布.sh --mirror-dependencies`,由 `dependency-images.mjs` 读取同一配置的账号密码并用 stdin 登录;禁止将凭据写进命令、日志、镜像或仓库。完成后用 `verify` 回读摘要和多架构清单。
56
80
  - 上游固定 SHA-256;国内加速只能作为传输通道,不能修改版本、替换不明镜像或丢失 CPU 架构。上游和阿里云目标摘要不一致立即停止。Oracle/达梦/金仓等受许可限制的镜像只在具备再分发权后镜像,不用无授权镜像代替。
57
81
 
58
- 用户明确要求同版本仅发布 Docker 热修复时,运行 `Microi一键编译发布.sh --docker-only-hotfix` 并选择后端镜像方案。该入口保持当前版本,禁止 NuGet、文档和官方资源数据库发布,同时保留 Full、候选源码一致性、混淆后冒烟和镜像门禁。修复应进入本地源码及捆绑资源,由目标程序启动升级;不得通过直接改生产表结构代替源码修复。
82
+ 用户明确要求同版本仅发布 Docker 热修复时,运行 `Microi一键编译发布.sh --docker-only-hotfix` 并选择后端镜像方案。该入口保持当前版本,禁止 NuGet、文档和官方资源数据库发布,同时保留 PlatformRelease、候选源码一致性、混淆后冒烟和镜像门禁。修复应进入本地源码及捆绑资源,由目标程序启动升级;不得通过直接改生产表结构代替源码修复。
59
83
 
60
- 共享源码持续变化时,可在独立目录保存完整候选源码和依赖,以该目录运行同一 Full 与发布脚本。专用测试服务使用独立端口,通过发布脚本变量 `MICROI_RELEASE_BACKEND_PORT`、`MICROI_RELEASE_FRONTEND_PORT` 指定收尾端口(默认仍为 61501、61500);进程管理器仍必须核验 PID、命令行和工作区归属,不得结束原工作区服务。变量仅供发布脚本使用,不进入生产 API 配置。
84
+ 共享源码持续变化时,可在独立目录保存完整候选源码和依赖,以该目录运行同一 PlatformRelease 与发布脚本。专用测试服务使用独立端口,通过发布脚本变量 `MICROI_RELEASE_BACKEND_PORT`、`MICROI_RELEASE_FRONTEND_PORT` 指定收尾端口(默认仍为 61501、61500);进程管理器仍必须核验 PID、命令行和工作区归属,不得结束原工作区服务。变量仅供发布脚本使用,不进入生产 API 配置。
61
85
 
62
- 私有原生规则的静态后端组合必须设置构建专用 `MICROI_RELEASE_COMPOSITION_FILE`,不能把根仓忽略的应用源码当作已经进入 Full 候选。工作区内契约 `schema:1` 固定 `properties/files/directories/artifacts`;四个文件属性 `CustomAfterMicrosoftCommonTargets`、`PrivateRulesProject`、`ApprovedRulesBootstrapSource`、`MicroiCoreProject` 必须与当前 MSBuild 环境属性一致并进入源清单。契约、规则目录、静态审批及项目文件的新增/修改/删除均绑定候选,链接和越界路径拒绝。API 最终 `publish/<规则DLL>.dll` 必须与 `artifacts` 中后台审批的实际 SHA256 一致;不重新签名另一份 DLL 来通过门禁。普通无组合发布与 PC 制品保持兼容,镜像发布以推送命令明确成功为准,默认不追加渠道回读;目标部署和运行验收仍独立执行。详细契约见官网 `getting-started/local-run.md`;这是发行进程参数,不是生产 AppSettings、V8 或 MCP 代码上传入口。
86
+ 私有原生规则的静态后端组合必须设置构建专用 `MICROI_RELEASE_COMPOSITION_FILE`,不能把根仓忽略的应用源码当作已经进入发布候选。工作区内契约 `schema:1` 固定 `properties/files/directories/artifacts`;四个文件属性 `CustomAfterMicrosoftCommonTargets`、`PrivateRulesProject`、`ApprovedRulesBootstrapSource`、`MicroiCoreProject` 必须与当前 MSBuild 环境属性一致并进入源清单。契约、规则目录、静态审批及项目文件的新增/修改/删除均绑定候选,链接和越界路径拒绝。API 最终 `publish/<规则DLL>.dll` 必须与 `artifacts` 中后台审批的实际 SHA256 一致;不重新签名另一份 DLL 来通过门禁。普通无组合发布与 PC 制品保持兼容,镜像发布须推送命令明确成功并回读目标不可变摘要;目标部署和运行验收仍独立执行。详细契约见官网 `getting-started/local-run.md`;这是发行进程参数,不是生产 AppSettings、V8 或 MCP 代码上传入口。
63
87
 
64
- Windows Git Bash 发布锁必须把当前 Shell 的 MSYS PID 经真实 `ps` 的 `WINPID` 映射成 Windows 原生 PID,再以原生 PID 和唯一令牌登记、释放;映射失败或持有者退出立即停止,不借用其它进程。中文旧热修复入口通过 PowerShell UTF-8 命令行与精确工作区路径核验,不能只看标签或因大小写规范化误拒绝已核验入口。API、PC、官网和 Agent 仍各自互斥,实际 Bash 与原生宿主回归必须通过后重新 Full。
88
+ Windows Git Bash 发布锁必须把当前 Shell 的 MSYS PID 经真实 `ps` 的 `WINPID` 映射成 Windows 原生 PID,再以原生 PID 和唯一令牌登记、释放;映射失败或持有者退出立即停止,不借用其它进程。中文旧热修复入口通过 PowerShell UTF-8 命令行与精确工作区路径核验,不能只看标签或因大小写规范化误拒绝已核验入口。API、PC、官网和 Agent 仍各自互斥,实际 Bash 与原生宿主回归必须通过后重新执行所选发布门禁。
65
89
 
66
90
  PowerShell 5/7 进程管理入口同时固定 UTF-8 控制台与管道输出;脚本有 UTF-8 BOM
67
91
  不代表错误流编码正确。用真实子进程强制继承旧代码页,核对非零拒绝状态、完整中文
68
- 诊断和无非法 UTF-8;保留原锁与进程归属断言,再重新 Full。
92
+ 诊断和无非法 UTF-8;保留原锁与进程归属断言,再重新执行所选发布门禁。
69
93
 
70
- macOS 前端构建使用有界 `vm_stat` 探针,根据真实页大小读取空闲页与可回收文件页;匿名非活动页、压缩页和已包含的预读页不叠加。探针失败时回退原生空闲内存,Windows/Linux 保持既有方式;启动余量、95% 暂停与90%恢复及五秒稳定门禁均保留。统计错误应修正探针,正式发布保留内存门禁及共享进程;修复发布逻辑后重新 Full。
94
+ macOS 前端构建使用有界 `vm_stat` 探针,根据真实页大小读取空闲页与可回收文件页;匿名非活动页、压缩页和已包含的预读页不叠加。探针失败时回退原生空闲内存,Windows/Linux 保持既有方式;启动余量、95% 暂停与90%恢复及五秒稳定门禁均保留。统计错误应修正探针,正式发布保留内存门禁及共享进程;修复发布逻辑后重新执行所选发布门禁。
71
95
 
72
- DLL 加密脚本只在 Git Bash、MSYS 或 Cygwin 中转换 Windows 路径,优先使用 `cygpath`;macOS/Linux 必须保留原生绝对路径,不能把 `/Users` 或 `/usr` 误认为盘符。修复时先对隔离的构建副本执行原加密器,核对五个目标 DLL 的实际哈希变化及加密指纹,再由一键脚本重新执行 Full、加密和最终产物冒烟;不得以专项测试替代发布门禁。
96
+ DLL 加密脚本只在 Git Bash、MSYS 或 Cygwin 中转换 Windows 路径,优先使用 `cygpath`;macOS/Linux 必须保留原生绝对路径,不能把 `/Users` 或 `/usr` 误认为盘符。修复时先对隔离的构建副本执行原加密器,核对五个目标 DLL 的实际哈希变化及加密指纹,再由一键脚本重新执行 PlatformRelease、加密和最终产物冒烟;不得以专项测试替代发布门禁。
73
97
 
74
98
  加密脚本被 `source` 引入时只提供函数,不执行发行入口。SQLite 回归使用真实解释器及隔离标准库,Windows 选择 `python`,其它宿主使用 `python3`;不能用假解释器或跳过 SQL 断言。字节契约下的包投影、内联源码以及官方资源目录的全部 JavaScript 接口、表事件和 Hook 模板均按 Git 的 LF 规则检出,不能忽略原始字节差异来通过测试。缺少发行运行产物时,可按同版本包正文的大小与 SHA-256 恢复;明确标记为制品恢复,不能报告为新的源码构建。
75
99
 
76
- 只要检测到闭源项目源码,就必须具备完整的五项目加密链;源码不完整、加密脚本缺失都要硬失败,不能降级为 `HAS_ENCRYPT=false` 的开源模式。一键脚本由 `release-encryption.mjs` 保存五个实际 DLL 的加密前后 SHA-256,并要求每个 DLL 字节改变且匹配原加密器指纹。上传 NuGet 前检查真实 ZIP 中所有闭源 DLL;上传后端 Docker 前从不启动、不联网的临时容器读取实际镜像内五个 DLL,与加密回执逐字节哈希核对。缺回执、明文重编译覆盖、包或镜像中的旧 DLL 均阻止上传;NuGet、Docker 等渠道发布命令明确成功即可报告发布完成,默认不再回读渠道或等待传播;本地检查不能替代实际发布命令,目标部署和业务验收仍独立执行。
100
+ 只要检测到闭源项目源码,就必须具备完整的五项目加密链;源码不完整、加密脚本缺失都要硬失败,不能降级为 `HAS_ENCRYPT=false` 的开源模式。一键脚本由 `release-encryption.mjs` 保存五个实际 DLL 的加密前后 SHA-256,并要求每个 DLL 字节改变且匹配原加密器指纹。上传 NuGet 前检查真实 ZIP 中所有闭源 DLL;上传后端 Docker 前通过 `docker image save` 静态读取镜像层中的五个 DLL,不创建或启动容器,与加密回执逐字节哈希核对。缺回执、明文重编译覆盖、包或镜像中的旧 DLL 均阻止上传;NuGet 等渠道发布命令明确成功可报告该渠道发布完成,不等待传播;Docker 还须回读目标不可变摘要;本地检查不能替代实际发布命令,目标部署和业务验收仍独立执行。
77
101
 
78
- 在线 AI 的 MCP 运行目录必须由已锁定依赖干净安装、编译和裁剪后完整复制。生产命令的符号链接应解析为真实文件并保留执行权限,不能依赖即将清理的临时目录;损坏、越界或循环链接在替换旧运行目录前失败,重新打包清除旧依赖残留。保留制品门禁对符号链接的拒绝规则,专项验证使用同一复制逻辑并核对清理临时目录后命令仍可运行;修复打包逻辑后重新 Full。
102
+ 在线 AI 的 MCP 运行目录必须由已锁定依赖干净安装、编译和裁剪后完整复制。生产命令的符号链接应解析为真实文件并保留执行权限,不能依赖即将清理的临时目录;损坏、越界或循环链接在替换旧运行目录前失败,重新打包清除旧依赖残留。保留制品门禁对符号链接的拒绝规则,专项验证使用同一复制逻辑并核对清理临时目录后命令仍可运行;修复打包逻辑后重新执行所选发布门禁。
79
103
 
80
104
 
81
- 私有原生规则的静态后端组合必须设置构建专用 `MICROI_RELEASE_COMPOSITION_FILE`,不能把根仓忽略的应用源码当作已经进入 Full 候选。工作区内契约 `schema:1` 固定 `properties/files/directories/artifacts`;四个文件属性 `CustomAfterMicrosoftCommonTargets`、`PrivateRulesProject`、`ApprovedRulesBootstrapSource`、`MicroiCoreProject` 必须与当前 MSBuild 环境属性一致并进入源清单。契约、规则目录、静态审批及项目文件的新增/修改/删除均绑定候选,链接和越界路径拒绝。API 最终 `publish/<规则DLL>.dll` 必须与 `artifacts` 中后台审批的实际 SHA256 一致;不重新签名另一份 DLL 来通过门禁。普通无组合发布与 PC 制品保持兼容,镜像发布以推送命令明确成功为准,默认不追加渠道回读;目标部署和运行验收仍独立执行。详细契约见官网 `getting-started/local-run.md`;这是发行进程参数,不是生产 AppSettings、V8 或 MCP 代码上传入口。
105
+ 私有原生规则的静态后端组合必须设置构建专用 `MICROI_RELEASE_COMPOSITION_FILE`,不能把根仓忽略的应用源码当作已经进入发布候选。工作区内契约 `schema:1` 固定 `properties/files/directories/artifacts`;四个文件属性 `CustomAfterMicrosoftCommonTargets`、`PrivateRulesProject`、`ApprovedRulesBootstrapSource`、`MicroiCoreProject` 必须与当前 MSBuild 环境属性一致并进入源清单。契约、规则目录、静态审批及项目文件的新增/修改/删除均绑定候选,链接和越界路径拒绝。API 最终 `publish/<规则DLL>.dll` 必须与 `artifacts` 中后台审批的实际 SHA256 一致;不重新签名另一份 DLL 来通过门禁。普通无组合发布与 PC 制品保持兼容,镜像发布须推送命令明确成功并回读目标不可变摘要;目标部署和运行验收仍独立执行。详细契约见官网 `getting-started/local-run.md`;这是发行进程参数,不是生产 AppSettings、V8 或 MCP 代码上传入口。
82
106
 
83
107
  组合环境只属于发行工具所在工作区;临时测试仓库和其它源码根显式传递自己的环境。不得把主发行环境传入隔离夹具,也不得吞掉显式错误组合;实际 CLI 继续严格验证全部四项属性。
84
108
 
85
- 原生依赖审批在目标 Linux CLR 中验证完整程序集引用链及实际字节哈希。驱动扩展也属于交付依赖:Oracle Core 23.26.300 同时交付同版本 Azure、Kerberos、OCI、ConfigFile、AWS、GCP 六个官方扩展及传递依赖,以 `ProviderDependencyDeliveryTests` 验证真实装载,不连接云服务。缺文件、身份冲突和哈希变化继续失败关闭;先复现并修复包装,再重新 Full 和镜像发布,禁止跳过未执行的依赖或开放 V8/MCP 任意装载。
109
+ 原生依赖审批在目标 Linux CLR 中验证完整程序集引用链及实际字节哈希。驱动扩展也属于交付依赖:Oracle Core 23.26.300 同时交付同版本 Azure、Kerberos、OCI、ConfigFile、AWS、GCP 六个官方扩展及传递依赖,以 `ProviderDependencyDeliveryTests` 验证真实装载,不连接云服务。缺文件、身份冲突和哈希变化继续失败关闭;先复现并修复包装,再重新执行所选发布门禁 和镜像发布,禁止跳过未执行的依赖或开放 V8/MCP 任意装载。
86
110
 
87
111
  包清单不能代替真实程序集引用:Oracle AWS 扩展还引用清单未声明的 AWSSDK.SQS,Dos.ORM 显式交付官方 4.0.100.15 包,并由 NuGet 统一 AWS Core。回归递归检查扩展引用链,仍保留 512 个程序集预算;诊断集中列出缺失项,正式验证继续拒绝缺失和身份冲突。
88
112
 
@@ -94,7 +118,7 @@ System.Drawing.Common 的 .NET 10 支持库引用 System.Formats.Nrbf,Dos.Comm
94
118
  | Windows 传统环境 | IIS + .NET Hosting Bundle + 独立依赖 |
95
119
  | 开发/调试 | 复用健康服务,或启动后端源码/隔离目录中的编译产物 + 前端 Vite;优先共用已授权开发/测试依赖 |
96
120
 
97
- 本地测试遵循 `../workspace-conventions/SKILL.md` 的“本地测试程序与依赖生命周期”:默认复用当前 MCP 对应的 MySQL、Redis、MongoDB、MinIO/OSS;不能按 AI 任务、Full 或双节点测试新建整套 Docker/Compose,也不把临时容器许可作为常规确认问题。确实无法复用时才记录证据并采用最小替代方案。每轮结束精确删除本次自建临时容器和纯测试资源,回读清理结果,既有共享服务保持原状态。
121
+ 本地测试遵循 `../workspace-conventions/SKILL.md` 的依赖生命周期:默认复用 `.microi-local` 选定项目配置对应的 MySQL、Redis、MongoDB 和 SaaS 生效的 MinIO/OSS,启动本机源码或最终产物进程。不能按 AI 任务、完整测试或双节点测试创建 Docker/Compose,也不运行临时 API/官网测试容器。无法复用时先记录具体缺口并修复,普通发布不授予新建容器例外。结束后精确回收自有进程及纯测试资源,回读清理结果,既有共享服务保持原状态。
98
122
 
99
123
  本地 `Microi.Client` 默认读取 `src/config.json` 的 `ApiBaseDev`,也允许在 `#` 前通过 URL 参数
100
124
  临时指定运行目标:
@@ -187,7 +211,7 @@ Microi API 安装时,`AppSettings` 与同名容器环境变量只允许以下
187
211
  - API、PC、官网、Agent 分别使用 `api-release.lock`、`pc-release.lock`、`website-release.lock`、`agent-release.lock`,可并行发布;同类发布互斥。合并发布只取得所选产品的锁,部分取得失败时释放本次已取得的锁。
188
212
  - API 启动前执行 `node Microi.Server/tools/release-lock.mjs assert api <工作区根>`,PC 使用 `assert pc`;官网/Agent 不阻塞二者。旧全局锁仅在真实命令入口和状态目录证明 API 热修复或 Agent 归属后缩小阻塞范围,未知锁仍阻塞,不能删除活跃锁。
189
213
  - Windows 发布前调用 `Microi.Server/tools/Microi.LocalProcessManager.ps1 -Action PrepareRelease -ReleaseScope api|pc|all`。API 仅处理匹配工作区的后端与 Release DLL;PC 仅处理匹配的 Vite;官网不清理二者。禁止按进程名全机清理。
190
- - PC/API 各自保留完整 Full 门禁;Full 的 restore/build/test/package audit 输出统一隔离到本次结果目录 `.net-artifacts`。并行验收使用独立结果目录、测试服务/端口及隔离租户;共享版本与跨产品源码先冻结,测试期间不得修改。资源排队依据为当前并行阶段预算之和与系统余量,不使用单一全局发布窗口。
214
+ - PC/API 普通发布执行 PlatformRelease,Full 仅为显式深度测试;restore/build/test/package audit 输出统一隔离到本次结果目录 `.net-artifacts`。并行验收使用独立结果目录及所需测试服务/端口,普通发布不创建租户;共享版本与跨产品源码先冻结,测试期间不得修改。资源排队依据为当前并行阶段预算之和与系统余量,不使用单一全局发布窗口。
191
215
  - 测试进程的 `MICROI_TEST_REPOSITORY_ROOT` 必须绑定本轮源码工作区;源码定位核对真实项目文件,不能把 SDK 产物中的同名目录当成源码。内存诊断保留子进程隔离,只使用当前 Configuration 和当前输出布局对应的夹具 DLL,缺失即失败,禁止借用旧 Debug 产物。诊断守护器的调用参数与报告路径必须属于同一次尝试,历史报告不可用于本轮放行。
192
216
  - Vite 以相对 `node_modules/vite/bin/vite.js` 启动且父进程退出时,命令行可能没有绝对工作区路径。
193
217
  进程管理器只能把只读回读到的 CWD 精确等于当前 `Microi.Client` 作为补充证据;读取失败、
@@ -228,8 +252,8 @@ Microi API 安装时,`AppSettings` 与同名容器环境变量只允许以下
228
252
 
229
253
  - 触发场景:发布产物已经输出 `Now listening` / `Application started` 并可访问,但发布脚本因为等待某句历史中文启动文案而持续到超时,期间运行态日志或 spool 不断写入 `publish/logs`。
230
254
  - 根因:把易变化的日志文本当成服务可用事实源;超时/异常路径没有对临时进程和运行态目录做完整的有界收尾。
231
- - 通用规则:发布冒烟必须启动最终混淆/签名后的产物,确认本次进程仍存活,再以 `/api/Diagnostics/liveness` HTTP 200 判定启动成功;使用专用空闲端口,成功、超时、异常和中断路径都要在有限时间内结束本次进程并清理 publish 内的临时 logs/PDB。版本号已经更新但尚未提交时,重跑默认继续工作区当前版本,不能再次自动递增;当前版本进入 Git HEAD 后才计算下一版本。
232
- - 自动化检查:构造不再输出旧中文文案但 liveness 返回 200 的版本,断言冒烟成功;另覆盖端口占用、进程提前退出和 liveness 超时,断言脚本失败原因准确、进程无残留、`publish/logs` 不存在。再把工作区版本设为高于 HEAD,验证重跑默认版本保持不变。
255
+ - 通用规则:发布冒烟必须启动最终混淆/签名后的产物,确认本次进程仍存活,再以 `/api/Diagnostics/liveness` HTTP 200 判定启动成功;使用专用空闲端口,成功、超时、异常和中断路径都要在有限时间内结束本次进程并清理 publish 内的临时 logs/PDB。新完整发布默认从当前版本递增一次;确认续发同一候选时显式传 `--release-version=x.y.z`,不能依据未提交版本隐式复用。
256
+ - 自动化检查:构造不再输出旧中文文案但 liveness 返回 200 的版本,断言冒烟成功;另覆盖端口占用、进程提前退出和 liveness 超时,断言脚本失败原因准确、进程无残留、`publish/logs` 不存在。再把工作区版本设为高于 HEAD,验证新完整发布仍递增一次、显式续发版本保持不变。
233
257
 
234
258
  ### 复盘:旧租户启动闭包把应用包展示字段当成物理列并反复重启
235
259
 
@@ -39,6 +39,12 @@
39
39
 
40
40
  ## Docker/Compose
41
41
 
42
+ 恢复库在 API/Worker 启动前必须暂停业务任务与 Quartz 触发器并强回读。MySQL 5.7 的无表 `SELECT` 带 `WHERE` 时显式使用 `FROM DUAL`,兼容 8.0 和空任务表;校验命令非零退出、无标记或仅错误文本包含标记时均停止,区分 SQL 执行失败与状态不一致。中断的新安装先备份编排和数据库,保留原数据目录后恢复,不通过跳过任务暂停门禁续装。
43
+
44
+ 小规格宿主部署翻译与 OCR 时必须实际执行推理并同时检查 SSH/API 响应、线程数和可用内存。LibreTranslate 1.9.6 的容器入口使用 `LT_THREADS` 作为 Gunicorn worker 数,`LT_WORKERS` 不生效;使用 `LT_THREADS=1`、`ARGOS_INTER_THREADS=1`、`ARGOS_INTRA_THREADS=1` 并约束 OMP/OpenBLAS/MKL/NumExpr 原生线程。OCR 同样约束原生数学库线程。容器 Running、模型列表和健康 GET 不能代替首次真实推理验收;这些是附加服务配置,不进入吾码 API 十项启动环境变量。
45
+
46
+ 一键新安装在 Docker 可用后、每个模型启动前检查真实内存:物理低于 7680MiB 或可用低于 2048MiB 时,本次安装固定停用 OCR/LibreTranslate,精确停止已有同名安装容器并将 restart 设为 no,回读必须为 stopped;不删除模型或数据库。唯一活动主租户在核心升级完成后设置 OcrEnabled=0、TranslateProvider=None,保留 URL/Key,写后回读成功才刷新 API。空 Provider 会根据保留 URL 自动回退,不代表禁用。内存充足时模型分别限制 1024/768MiB RAM、1536/1280MiB RAM+Swap、0.75CPU,并保留单线程。小规格新建 MySQL buffer pool 上限 384MiB;无 Swap 时在文件系统、磁盘及备份前提满足后尝试 2GiB Swap,不能覆盖既存文件,也不能将 Swap 计入模型物理内存准入。内存保护已触发时禁止继续做 OCR/翻译真实推理验收;改为验收停止状态、租户开关与核心登录,待资源调整后单独启用和实测。
47
+
42
48
  执行前:
43
49
 
44
50
  1. 固定目标目录和 compose 文件,解析所有 volume 的绝对宿主路径。
@@ -70,7 +76,7 @@ IIS 进程启动不代表 API 可用,仍要检查 readiness 和真实登录路
70
76
 
71
77
  macOS 的一键发布探针通过 `run_with_timeout` 使用 GNU `timeout`、`gtimeout` 或仓库 Node 工具 `Microi.Server/tools/run-with-timeout.mjs`。缺少 GNU 命令不能据此判定 Docker 不健康;超时工具只停止自身创建的探针进程。官网专用选项 6 不发布 DLL/NuGet,后端发布的加密门禁保持有效。
72
78
 
73
- Obfuscar 路径转换只适用于 Git Bash/MSYS/Cygwin。macOS/Linux 的 `/Users`、`/usr` 等绝对路径直接传给工具;Windows 优先 `cygpath`,无该命令时只转换完整盘符根路径。修复后使用隔离副本验证五个 DLL 和指纹,再重新执行一键脚本的 Full 与最终加密产物冒烟。
79
+ Obfuscar 路径转换只适用于 Git Bash/MSYS/Cygwin。macOS/Linux 的 `/Users`、`/usr` 等绝对路径直接传给工具;Windows 优先 `cygpath`,无该命令时只转换完整盘符根路径。修复后使用隔离副本验证五个 DLL 和指纹,再重新执行一键脚本的 PlatformRelease 与最终加密产物冒烟。
74
80
 
75
81
  在线 AI MCP 的生产依赖和命令复制为完整、自足的运行快照,生产命令链接解析为真实文件,保留执行权限;损坏、越界及目录循环链接提前拒绝。临时构建目录清理后命令必须仍能运行,旧依赖不得残留;不放宽原制品门禁。
76
82