@microi.net/cli 6.1.3 → 6.1.5
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 +3 -3
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-skills.meta.json +215 -215
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +1 -1
- package/skills/ai-engine/SKILL.md +8 -1
- package/skills/app-store/SKILL.md +11 -0
- package/skills/job-engine/SKILL.md +3 -0
- package/skills/message-notification/SKILL.md +6 -2
- package/skills/message-notification/references/contracts.md +17 -0
- package/skills/microi-db-schema/SKILL.md +7 -0
- package/skills/microi-deployment/SKILL.md +2 -0
- package/skills/microi-microservice/SKILL.md +354 -354
- package/skills/microi-solution-quotation/SKILL.md +17 -16
- package/skills/v8-mongodb/SKILL.md +57 -1
- package/skills/v8-saas-multi-tenant/SKILL.md +315 -315
- package/skills/workspace-conventions/SKILL.md +40 -40
|
@@ -91,6 +91,7 @@ return { Code: 1, Data: { IdempotencyKey: idempotencyKey } };
|
|
|
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
93
|
- 外部调用设置超时;无法确认对方是否成功时用业务幂等号查询,不盲目重发。
|
|
94
|
+
- SQL Server 业务库可用但商城保存任务时报证书链不受信任时,核对调度节点主数据库连接串和实际后端版本。Dos.ORM 的 `System.Data.SqlClient` 与 Quartz 的 `Microsoft.Data.SqlClient` 缺省加密策略不同;插件仅为缺少 `Encrypt` 的旧串显式保留 ORM 的可选加密语义,普通注册和延迟初始化共用此策略。显式 `Encrypt/TrustServerCertificate` 必须保留,不能全局添加信任证书或吞掉任务保存失败。正式环境优先受信任证书;自签名测试环境仅由管理员显式配置。更新后端或连接配置后重启调度节点,再重装并回读 Quartz 任务及触发器,不能以元数据存在代替。
|
|
94
95
|
- 服务停机先停止接单,再在有限宽限期排空或持久化;重启扫描未完成任务。
|
|
95
96
|
- 若要求 `kill -9` 前也零丢失,业务成功响应前必须获得共享 outbox/MQ/WAL 持久化确认。
|
|
96
97
|
|
|
@@ -121,6 +122,8 @@ if (task.BusinessTable && task.BusinessId) {
|
|
|
121
122
|
|
|
122
123
|
接口通过 `V8.Method.UpdateBackgroundTask({Current,Total,Msg,Log})` 上报已提交的真实工作量,`Log`/`AppendLog` 用于追加任务详情(不得包含密码、Token 或密钥)。平台按实际吞吐计算 `EstimatedEndTime`;总量未知时不传 `Total`,通知中心显示“不定进度/估算中”,禁止用固定 10%、阶段占位或计时器伪造进度。失败和取消停在最后真实进度,不得显示 100%。
|
|
123
124
|
|
|
125
|
+
后台状态、消息和错误的固定中文同样必须通过 SQL 参数绑定,不能把中文写成普通 SQL 字符串字面量;SQL Server 在 Latin1 等代码页下会先将其变为问号,再写入 `nvarchar` 列。修复覆盖入队、领取、分片重排、取消、重试和失败路径,保留原有租约、fencing 和条件更新。历史 `StatusText` 缺失或仅含问号/替换字符时,前端只能为 `Pending/Running/Retrying/Succeeded/Failed/Canceled` 显示已知状态文案;未知状态及自定义文本不能被吞掉,不批量重写历史审计或原始错误。验收需在真实 Latin1 SQL Server 隔离库证明旧字面量会损坏、新状态和消息完整,且过期 fencing 仍拒绝写入;显示兜底不等于安装成功。
|
|
126
|
+
|
|
124
127
|
分片接口在仍有后续工作时返回:
|
|
125
128
|
|
|
126
129
|
```js
|
|
@@ -37,6 +37,8 @@ description: 设计、实现、迁移和验收 Microi 多通道消息通知与
|
|
|
37
37
|
|
|
38
38
|
完整字段、接口和可靠性契约见 [references/contracts.md](references/contracts.md)。
|
|
39
39
|
|
|
40
|
+
旧聊天跨年定位迁移须使用官方 Managed `platform-chat-maintenance`,先升级全部写节点,再执行单租户准入关闭、真实排空、分批扫描、完整校验和条件恢复。不得将“能翻到旧消息”视为“旧消息幂等迁移完成”,也不自动迁移所有租户;参数、冲突和恢复边界见 [历史聊天定位维护](references/contracts.md#历史聊天定位维护)。
|
|
41
|
+
|
|
40
42
|
## 实现流程
|
|
41
43
|
|
|
42
44
|
### 1. 合并结构
|
|
@@ -119,7 +121,9 @@ await V8.Notification.MarkRead({ All: true });
|
|
|
119
121
|
|
|
120
122
|
系统聊天门面 `platform-chat-system-message`(`Managed`)完成平台超级管理员校验后,只转调本应用单一拥有的 `platform-chat-runtime`(`Managed`)。运行时统一编排 `PersistMessage / PersistSystemMessage / PersistAssistantMessage / GetHistoryAndMarkRead / GetUnreadCount / TouchContact / ListContacts / DeleteContact`;Hub/Controller 旧入口只保留 DiyToken 认证、SignalR 投递和 AI 流式协议,不得直连 MongoDB/FormEngine 复制业务。访问密钥会话、空 Token、伪造租户/发送人必须失败关闭。
|
|
121
123
|
|
|
122
|
-
`platform-chat-runtime` 以 `V8.CurrentUser` / `V8.OsClient` 为唯一身份与租户事实源,对“租户 + 稳定 RequestId”生成确定性 Mongo `_id
|
|
124
|
+
`platform-chat-runtime` 以 `V8.CurrentUser` / `V8.OsClient` 为唯一身份与租户事实源,对“租户 + 稳定 RequestId”生成确定性 Mongo `_id`;在当前旧年度集合或持久定位索引能够定位原记录时,只有全部载荷哈希一致才复用旧记录。MongoDB 不参与 `V8.DbTrans`,因此消息/已读/联系人成功后即是已提交事实;SignalR、投影或 After Hook 失败必须保持 `Code=1` 并通过 `DataAppend.HookWarning` / `ProjectionWarnings` 告警,不得伪装未发生而引导盲目重试。调用 `V8.MongoDb.UptFormDataByWhere` / `DelFormDataByWhere` 时必须使用包含当前用户/权威资源边界的非空参数化 `_Where`,规则详见 `../v8-mongodb/SKILL.md`。
|
|
125
|
+
|
|
126
|
+
旧年度重放有独立兼容边界:v1.0.2 只在 `chat_当年` 内检查确定性 `_id`;分区版的新写通过 `chat_message_location` 保留跨年定位,但不会在发送时为全部旧 `chat_yyyy` 回填索引。若旧记录在以前年度且没有定位索引,跨年重放原 `RequestId` 仍可能产生一份新月表正文,冲突正文也可能未被识别。跨月、跨年历史分页兼容不代表旧存量的全生命周期重放已安全迁移;不要把这一边界写成已解决。未知历史请求先核对原消息,不盲目补发;不能用每条发送扫描全部历史或阻断全部正常新消息掩盖迁移缺口。验收应分别统计物理集合记录数,不能只看按 Id 去重的界面或 Map。
|
|
123
127
|
|
|
124
128
|
`platform-chat-runtime` 必须保持 `StopHttp=1`、`AllowAnonymous=0`。SignalR Hub 在 DiyToken 与租户核验后,通过宿主一次性可信协议作用域调用,并携带宿主生成的权威当前用户快照;V8 对 `_InvokeType=Client` 的调用必须先执行 `V8.Method.RequireManagedProtocolContext()` 原子消费。不得为修复 Hub 误报“禁止 HTTP 调用”而开放 `StopHttp`,也不得接受 Param 中的信任布尔值、用户或租户覆盖;接口引擎内部 `Server` 嵌套调用保持原有语义。
|
|
125
129
|
|
|
@@ -153,4 +157,4 @@ await V8.Notification.MarkRead({ All: true });
|
|
|
153
157
|
4. 用户只能查询和标记自己的通知;危险链接、超长正文、跨租户接收人和匿名调用被拒绝。
|
|
154
158
|
5. 公众号/服务号发送主体与小程序跳转目标分别验证,不把 `MiniProgramAppId` 当作模板发送主体。
|
|
155
159
|
6. 源码定向测试、后端编译、远端 MCP 回读、真实浏览器点击和商城安装/校验分别报告;未执行的生产发布不得写成已上线。
|
|
156
|
-
7. 聊天空 Token
|
|
160
|
+
7. 聊天空 Token/访问密钥/伪造租户失败关闭;当前写分区或持久定位命中时,相同 `RequestId` 并发只有一份 Mongo 事实,不同载荷冲突拒绝;旧年度无定位记录的重放限制单独记录;已持久后 SignalR/After Hook 失败仍返回成功并可回读。
|
|
@@ -86,6 +86,23 @@
|
|
|
86
86
|
|
|
87
87
|
`ReceiverUserId/ReceiverUserIds` 必填其一,最多 200 个;`Title` 最长 200 字符;`Content` 与序列化后的 `Payload` 各最多 32 KiB;`LinkUrl` 最长 500 字符且只允许站内路径、锚点、HTTP/HTTPS。事件名固定为 `ReceivePlatformNotification`。
|
|
88
88
|
|
|
89
|
+
## 历史聊天定位维护
|
|
90
|
+
|
|
91
|
+
`platform-chat-runtime` v1.2.0 保留未迁移租户的旧协议;安装包更新不等于历史定位迁移。旧年度无定位消息跨年重放的限制仍存在,不能用历史分页通过代替幂等验收。
|
|
92
|
+
|
|
93
|
+
由已授权当前租户超级管理员通过 `microi_run_engine` 调用固定 `platform-chat-maintenance` v1.0.0,禁止临时引擎、原生 SQL 或跨租户写入替代:
|
|
94
|
+
|
|
95
|
+
1. 核实所有旧写入节点和直接写库者已经退出,新 Core/MongoDB/API 与 Managed 正文已经部署。未满足时不启动维护。
|
|
96
|
+
2. `Begin` 带稳定的 32 位小写十六进制 `OperationId`,保存返回 `Epoch`;关闭本租户整个聊天运行时的新调用(包括读取)。`Drain` 带同一 Epoch,直到真实活动调用归零、`WritersDrained=true`。
|
|
97
|
+
3. `Start` 带 `MaintenanceConfirmed=true` 与 8–100 位字母、数字、下划线或连字符的 `FenceId`;客户端确认只表示维护意图,可信排空由宿主验证。`Step` 每批最多 100 行、8 分区,每批独立稳定 `OperationId`(同 FenceId 格式)及上一迁移 `Revision` 作为 `ExpectedRevision`;未知结果重试同批标识,不能整个扫描重复一个标识。
|
|
98
|
+
4. `Status` 的 `Data.Migration` 必须同时满足 Completed、ScanComplete、零冲突、IndexesReady,FenceEpoch 等于 `Data.Gate.Epoch`;`End` 带同一 Epoch,并由引擎采用刚读取的原生修订号做条件释放。未知响应先 Status 回读。
|
|
99
|
+
|
|
100
|
+
`V8.Method.ManageManagedStorageMaintenance` / `V8.Method.RequireManagedStorageMaintenance` 只允许可信固定 Key、当前租户、真实超级管理员、非访问密钥会话。准入/活动票据在共享 MongoDB 中保存,不能直接通过 V8 CRUD、反射或禁止 ExecutionContext 流动的 API 绕开。Begin/Drain 的状态不能靠 V8.Param 伪造。
|
|
101
|
+
|
|
102
|
+
跨分区同 Id 即冲突,无论正文是否相同;原文全部保留。无时区历史时间、非法 Id、目录变化或未知存储结果都不能算完成。只在无迁移状态、同 Epoch 已 Drain 且无活动持有者时允许 AbortUnstarted;已有状态应恢复原操作,不强制回退旧协议。崩溃票据不自动过期;恢复前须有旧写入者确已退出的运维证据,不能清空控制集合。
|
|
103
|
+
|
|
104
|
+
迁移后历史查询使用权威定位索引与有界原文回查,普通页不 Count;未读计数独立执行。未知未读数保留 null/未知,Hub 不能推送虚假的 0。验收分别记录 VM 行为、真实 MongoDB、真实 HTTP/SignalR、多节点维护及线上部署;单机 Primary/Majority 成功不等于副本集故障切换通过。
|
|
105
|
+
|
|
89
106
|
## 验收矩阵
|
|
90
107
|
|
|
91
108
|
| 场景 | 断言 |
|
|
@@ -72,6 +72,13 @@ description: Microi 吾码数据库结构与字典指南。用于通过实时 MC
|
|
|
72
72
|
- 组合索引遵守最左前缀;重复/被更长索引左前缀完全覆盖的索引应合并。索引过多会增加写放大和锁等待,必须在交付中说明查询依据。
|
|
73
73
|
- 唯一索引是业务约束。创建前必须检查并处理历史重复数据与 `NULL` 语义;不得为了让 DDL 通过而静默删改生产数据。
|
|
74
74
|
|
|
75
|
+
SQL Server 普通唯一索引与 MySQL 可空唯一键的 NULL 语义不同:跨库应用包安装时,应先
|
|
76
|
+
同步声明列,再按真实物理可空性为唯一键中的全部可空列添加 `IS NOT NULL` 过滤(复合键
|
|
77
|
+
使用 `AND`);非空键值仍必须唯一。包显式过滤声明优先,不能机械过滤所有字段或业务值。
|
|
78
|
+
应用商城可原子协调同名同列的历史普通唯一索引缺失的可空过滤,但主键、唯一约束、其它
|
|
79
|
+
定义冲突和真实非空重复数据必须失败并保留原数据。验收回读有序列、唯一性、过滤条件,
|
|
80
|
+
并验证多个 NULL 可保存、非空重复键拒绝、同版本重装不重复建索引;仅 DDL 成功不够。
|
|
81
|
+
|
|
75
82
|
平台核心表的发布变更还必须同步正式升级资源/迁移,确保新租户和旧租户升级一致;但对指定在线租户的实际创建、修复和回读仍必须通过上述 MCP 索引工具完成,不能只提交迁移源码便宣称线上已生效。
|
|
76
83
|
|
|
77
84
|
## diy_table 命名规则
|
|
@@ -24,6 +24,8 @@ description: Microi 安装、部署、升级和本地运行指南。用于吾码
|
|
|
24
24
|
|
|
25
25
|
常规发布按用户指定 MCP 的实际 MySQL、MongoDB 版本、Redis 和生效 MinIO 或 OSS/HDFS 选择测试矩阵;SQL Server 真实服务与兼容专项仅在用户明确指定解决 SQL Server 问题时执行,不作为每轮发布的默认前置条件,也无需反复申请免测。本文中的“Full/重新 Full”均指当前选定矩阵,已选必测项仍须全部通过。
|
|
26
26
|
|
|
27
|
+
搜索标签真实浏览器门禁默认使用 1366px 和 1920px 常规桌面;测试进程显式设置 `MICROI_TEST_BROWSER_4K=1` 时追加 3840px 专项。所选宽度随 Full 矩阵冻结,回读必须包含全部所选用例且零失败、零跳过;该变量不进入生产 API 配置。正式发布与同版本 Docker 热修复均拒绝历史 `--skip-tests` / `SmokeOnly` 入口,候选始终包含完整测试输入。
|
|
28
|
+
|
|
27
29
|
发布测试默认复用上述 MCP 服务。固定夹具库名、端口或归属冲突先修正测试入口的可配置隔离,采用本任务唯一名称并核验所有者;不能因此新建本地数据库、Redis、MongoDB 或存储容器,也不能删除他人的夹具或放宽测试断言。不可复用的例外及清理要求统一见 [本地测试程序与依赖生命周期](../workspace-conventions/references/progressive-02-microi-net-api-本地启动约定.md#本地测试程序与依赖生命周期强制)。
|
|
28
30
|
|
|
29
31
|
选择、旧脚本冲突处理及结果记录统一读取 [发布测试矩阵](../microi-system-delivery/references/progressive-02-自动化测试必须覆盖的坑.md#按指定-mcp-选择发布测试矩阵) 和 `../workspace-conventions/SKILL.md`;实际目标未使用的提供商不能被虚构为已验证。
|