@microi.net/cli 6.1.1 → 6.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-10-21T10:54:13.509Z",
3
+ "generatedAt": "2026-10-22T10:20:42.568Z",
4
4
  "policy": {
5
5
  "maxEntryLines": 285,
6
6
  "referenceBudgetLines": 245,
@@ -980,11 +980,11 @@
980
980
  ]
981
981
  },
982
982
  "microi-uniapp-frontend": {
983
- "originalSha256": "f3836deef4b4652d5f1df9907a10a573d1c99359ebb712ca86f9e7020f634836",
984
- "originalLines": 558,
983
+ "originalSha256": "6f79c3b5923b5d849dcb45bd774bcb20e618ea1416801ec9bba6d1901a31a03a",
984
+ "originalLines": 561,
985
985
  "prefixSha256": "55f2799d872b4b9682449adf2e554003eb8642c111af262cacf42265b99dd5f5",
986
986
  "prefixBytes": 3040,
987
- "entryLines": 213,
987
+ "entryLines": 216,
988
988
  "chunks": [
989
989
  {
990
990
  "id": "microi-uniapp-frontend-000",
@@ -998,8 +998,8 @@
998
998
  "id": "microi-uniapp-frontend-001",
999
999
  "ordinal": 1,
1000
1000
  "destination": "microi-uniapp-frontend/SKILL.md",
1001
- "sha256": "acfd8dd91195e7930896bd54e6ae7ce3d3982bdeb0d674d98337878eab1a5e82",
1002
- "lines": 31,
1001
+ "sha256": "ad6d719fd27c252c1916c54d65185ecf90846e5f780a81b671a6e0540fbea4a6",
1002
+ "lines": 34,
1003
1003
  "heading": "标准产品、视图协议与租户扩展"
1004
1004
  },
1005
1005
  {
@@ -3241,17 +3241,17 @@
3241
3241
  ]
3242
3242
  },
3243
3243
  "workspace-conventions": {
3244
- "originalSha256": "e59445214f8f9090c34c7ee866b9d976ba6e5004f263097614768af95934bb81",
3245
- "originalLines": 705,
3246
- "prefixSha256": "32051fd66839c199e5ade35d6d6c02f03192346b015e84836fbfbb15c05b5e80",
3247
- "prefixBytes": 13940,
3248
- "entryLines": 169,
3244
+ "originalSha256": "1c4f533e55f0ab695e0998026300de6cce481479b93a3619bfb4e642668802a9",
3245
+ "originalLines": 711,
3246
+ "prefixSha256": "dca80d3ddfca36f1c9a6fbd8bb5681de212255e753a0428aea69f9f21546bb5c",
3247
+ "prefixBytes": 15187,
3248
+ "entryLines": 175,
3249
3249
  "chunks": [
3250
3250
  {
3251
3251
  "id": "workspace-conventions-000",
3252
3252
  "ordinal": 0,
3253
3253
  "destination": "workspace-conventions/SKILL.md",
3254
- "sha256": "fefc18da554473ded99a55c3b2e66d698fcc4b37506622dcd2d17bca09c2fcbc",
3254
+ "sha256": "e3e6f49e83e80b958184a4d281559fd80aa0a3bb7cbcb0893ecc1821c4b2f001",
3255
3255
  "lines": 60,
3256
3256
  "heading": "任务启动前 Skill 读取规则(强制)"
3257
3257
  },
@@ -3259,7 +3259,7 @@
3259
3259
  "id": "workspace-conventions-001",
3260
3260
  "ordinal": 1,
3261
3261
  "destination": "workspace-conventions/SKILL.md",
3262
- "sha256": "c3db79fb5f6f00a6ea619f7129f1e81259efe899256a5100f9c84a5b5dca58f4",
3262
+ "sha256": "8d8dfff420c0cc768bbeb13d94e9f77f52d5002fc61d93dc82d71b3a17f2eaa0",
3263
3263
  "lines": 12,
3264
3264
  "heading": "Microi吾码工作进度播报规范(强制)"
3265
3265
  },
@@ -91,13 +91,20 @@ AI 业务统一实现在 `Microi.Server/Microi.AI`。`Microi.Server/Microi.net.A
91
91
  - AI 的 Qdrant/Ollama/Embedding 配置、Schema 初始化和其它生命周期任务由 `AddMicroiAI()` 在模块内自注册;API 的 `Program.cs` 只负责调用模块注册。
92
92
  - `Microi.Core` 只承载跨模块契约和模型。新增入口时先扩展 AI 领域服务,再添加薄 Controller/Hub 适配,禁止复制业务流程。
93
93
  - AI 账户统一入口是 Managed 接口引擎 `/apiengine/platform-ai-account`;套餐、订阅和订单由 V8 编排。支付宝回调 C# 只做可信租户选择/归一化、该租户配置验签和一次性 Managed 调用;`CompletePayment` 在同一接口引擎事务内完成订单条件认领、金额校验、订阅续期/新建与平台/供应商 API Key 分配。供应商协议、密钥隔离、分布式额度原子、任务句柄和受控媒体落盘仍由绑定原子完成。
94
- - 非流式 `UpdateConversationTitle / RecognizeIntent / Chat / NL2SQL / NL2V8EngineSync` 与精确图片 `ProcessImage` 统一进入 Managed `/apiengine/platform-ai-runtime`,旧 Controller 同名路由只做兼容转发;SSE/流式、Provider Proxy、生成式媒体、文件和策略元数据保持原生。`platform-ai-runtime` 只调用绑定当前租户和当前用户的 `V8.AI` / `V8.Image` 原子,不接收客户端伪造的租户、用户、Endpoint、ApiKey、表白名单或管理员标记。
94
+ - 非流式 `UpdateConversationTitle / RecognizeIntent / Chat / NL2SQL / NL2V8EngineSync` 与精确图片 `ProcessImage` 统一进入 Managed `/apiengine/platform-ai-runtime`,旧 Controller 同名路由只做兼容转发。媒体目录与图片/音乐任务的提交、查询、恢复也使用该 Managed 引擎的同名 `Action`;SSE/流式、Provider Proxy、文件传输和其余未迁移协议继续使用原生入口。`platform-ai-runtime` 只调用绑定当前租户和当前用户的 `V8.AI` / `V8.Image` 原子,不接收客户端伪造的租户、用户、Endpoint、ApiKey、表白名单或管理员标记。
95
95
  - AI 官方应用只有一个应用级租户扩展点 `platform-ai-custom-hook`,策略为 `CreateIfMissing`。`mci_ai_data_assistant` 与 `platform-ai-runtime` 只传 `Stage`、`SourceApiEngineKey`、`Action`;支付动作最多增加 `EventId`、`Provider`,账户其它动作只增加白名单资源元数据。Hook 禁止接收订单号、交易号、金额、标题、SQL、模型、附件、提示词或问题原文及其摘要、回答、供应商/平台密钥、供应商任务号、文件句柄或媒体内容。匿名发现接口不调用 Hook,`/v1/usage` 继续由 C# 凭据网关直接校验,使 `Authorization` 永不进入 V8。
96
96
  - 9 张 `mic_sub_*` 订阅表与 `mci_ai_token_account`、`mci_ai_token_log` 由官方 `app.microi.ai-engine` 应用升级提供,必须同时声明 DDL、PhysicalColumns、DiyTables、DiyFields;`PromptPreview` 属于日志表正式字段。`mci_ai_token_recharge` 当前不在该运行时实体闭包内,禁止根据线上残留自行扩包。运行时发现缺失时失败关闭,禁止在请求路径自动建表、加列或修改业务 Schema。
97
97
  - `Sys_User.AiApiKey` 归官方 `app.microi.sys_user`,由系统账号包同时维护建表 DDL、PhysicalColumns 和隐藏只读 DiyField;AI助手包不得重复声明 `Sys_User`。缺列错误必须提示升级系统账号应用,不能误导用户升级 AI助手。
98
98
 
99
99
  ## 模型与密钥
100
100
 
101
+ ### 媒体目录与图片任务的 Managed 调用
102
+
103
+ - 后端新增 `V8.AI.GetMediaModels()`、`GenerateMiniMaxImage(param)`、`GetMiniMaxImageTask(taskId)`、`RecoverMiniMaxImageTask(taskId)` 四个原子。前端及 Microi Agent 调用 `/apiengine/platform-ai-runtime` 的同名 `Action`,后端 V8 可直接调用原子,不自请求本机 HTTP,不新增第二套媒体编排入口。
104
+ - 当前租户和用户绑定于可信 V8 上下文,匿名拒绝;图片任务提交沿用既有运行时的模型、许可、权限、配额与幂等校验。查询和恢复只访问该租户、该用户拥有的任务。目录仅安全投影,Hook 仍只接收来源、阶段和动作,不接收媒体、提示词、任务号或密钥。
105
+ - 提交持久任务后保存原 `RequestId`、`TaskId` 及服务器/租户/账号归属;`Code=2` 仅表示受理。超时、断连、空响应先复查原任务,不能换 Id 重发。恢复仅复用已经保存的供应商回执与结果,不重新生成;没有回执的未知结果明确失败或保持未知,不能伪造成功。
106
+ - 四个原子、Managed 引擎和消费者需一起验收;应用包或版本号不代表服务器能力已部署。至少验证匿名拒绝、跨租户/跨用户隔离、请求参数白名单、幂等回放、未知结果复查,以及图片持久地址回读。没有线上回执时只报告源码与测试已完成,不声称某一版本已经上线。
107
+
101
108
  存量模型配置的兼容验收组合包括 `GenerateMiniMaxImage + image-01`、`GenerateMiniMaxMusic + music-2.6`。这些组合只适用于服务端已配置且供应商账号仍有权限的旧路由;新路由仍遵循下列实时能力选择规则。验收必须同时检查实际返回的模型标识、媒体类型与 HDFS 读取,不能仅凭兼容接口名称判断底层模型。
102
109
 
103
110
  - 模型 Provider、Endpoint、ApiKey、AuthPrefix 和上游模型 Id 只保存在服务端受保护配置。
@@ -124,6 +124,17 @@ Inspect 和 Publish 使用完全相同的选择、`CommittedProof` 及运行清
124
124
  唯一性和有序列集合,并测试业务重复键拒绝及重复安装不复制索引。母版存在索引、
125
125
  应用页面正常、安装任务成功均不能单独证明目标库的索引完整。
126
126
 
127
+ SQL Server 安装 MySQL 可空唯一键时,必须先同步本包物理列,再按目标库真实
128
+ `IS_NULLABLE` 为每个可空键列生成 `IS NOT NULL`,复合键条件用 `AND` 连接;全部必填的
129
+ 唯一键和普通索引不增加过滤。包显式 `SqlServerFilterColumn` 保持声明语义。目录读取失败、
130
+ 列缺失或元数据歧义必须在索引写入前停止,禁止猜测空值规则。
131
+
132
+ 安装器只可原子修复同名、同有序键、有效的普通非聚集唯一索引缺少或不完整的可空过滤,
133
+ 使用 `DROP_EXISTING` 后立即严格回读;不得改写主键、唯一约束、其它过滤表达式或未知定义。
134
+ 真实非空重复键仍失败,禁止删改业务行、去掉唯一性或吞异常。同版本重装核对定义后复用。
135
+ 回归必须包含旧行为多个 NULL 失败、新行为成功、复合可空键、必填键、历史索引修复、列先行
136
+ 同步、真实重复键拒绝和重装零重复 DDL;真实 SQL 执行与模拟测试分别保留回执。
137
+
127
138
  ### 空库清理与开发期应用
128
139
 
129
140
  安装包应显式登记菜单、表、接口、工作流、任务和微服务的完整归属,供导出、升级和空库制作共同使用。开发期只发布运行资产而尚未制包时,不能假定商城选集已经覆盖新建业务表;应通过现有空库规则接口预览,逐项核对实际物理表、DIY元数据、菜单后代与接口Key。缺失时在责任清理器补充有限、明确的业务归属识别,保留平台核心白名单,读取失败停止制作。只生成SQL与在隔离临时库执行清理是不同动作,禁止在源主库执行脱敏SQL。
@@ -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
@@ -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`;实际目标未使用的提供商不能被虚构为已验证。
@@ -79,6 +79,9 @@ Obfuscar 路径转换只适用于 Git Bash/MSYS/Cygwin。macOS/Linux 的 `/Users
79
79
  后端:
80
80
 
81
81
  - 使用当前仓库规定的 .NET SDK;
82
+ - 公开源码打开 `Microi.Server/Microi.net.sln`,五个闭源库使用同版本 NuGet;创建人完整源码才使用 `Microi.Anderson.sln`。目标 `net10.0` 需要 Visual Studio 2026 18.0 起及与 SDK 功能带匹配的 IDE,不能把 VS 2022 加装 SDK 视为受支持配置。
83
+ - 排查 `NU1105` / `NETSDK1004` 时,分别检查项目文件是否公开交付、是否完整列入方案、是否被卸载以及还原是否成功。CLI 递归 restore 通过不能证明 VS 方案项目图完整;公开闭包回归还必须检查全部传递依赖及 Debug/Release 配置,包含 `ReferenceOutputAssembly=false` 的独立进程夹具。
84
+ - 修复方案后在不含闭源源码的隔离公开候选中还原、构建;可用 `dotnet restore Microi.Server/Microi.net.sln -p:RestoreRecursive=false` 验证方案列出的全部项目均获得还原资产,再执行 `dotnet build Microi.Server/Microi.net.sln -c Debug --no-restore`。该命令行证据不等于真实 Visual Studio 界面验收,不删除引用或关闭功能来掩盖错误。
82
85
  - 配置开发专用数据库/Redis/Mongo/对象存储;
83
86
  - 先跑定向测试,再按资源允许程度执行更大构建;
84
87
  - 不让本地调试连接生产写库。
@@ -127,7 +127,8 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
127
127
  - 创建/更新元数据:`microi_create_microservice`。
128
128
  - 同步私有源码:`microi_sync_microservice_source`;本地工程必须优先传 `directory`,不构造 Base64 文件数组。
129
129
  - 真实编译目录优先 `microi_publish_application_directory_stream` 流式发布。
130
- - v3 提示 `mci_app_stream_gate_transition` 或发布门禁列/索引缺失时,先更新目标租户的应用商城责任包,并通过现有“升级租户数据库”入口核验责任包安装;安装完成后回读物理门禁结构及唯一索引,再重新盘点发布基线。不执行已退役 Upgrade25,不手动 reset 锁、fence、Storage 或 active/committed 指针;缺少结构与真正 CAS 漂移分别诊断。
130
+ - 发布前读取 `microi_get_status`,分开报告服务器在线和 `ApplicationAssetStreamGateReady`。`Actual=0` 表示当前读取没有有效门禁行,不证明用户无权限或主控登记缺失。保持用户指定子租户,不索要主租户账号/SSH,不调用补登记接口,不复制业务库 `sys_osclients`,不降级绕过门禁;提交平台排查后端取数来源和版本。
131
+ - 发布门禁由后端从启动主租户的主控库读取当前子租户 `OsClient + Type + Network` 的唯一有效 `sys_osclients` 行,文件、应用和版本仍在当前子租户。门禁转换审计在同一主控库事务中写入。缺少门禁列/审计结构属于平台侧 SaaS/应用商城责任包问题;缺少子租户的 `sys_microistore/mci_ai_app_version/mci_ai_app_file` 则通过该租户应用商城升级。不能因主控结构故障擅自更换业务连接。不执行已退役 Upgrade25,不手动 reset 锁、fence、Storage 或 active/committed 指针;缺少结构与真正 CAS 漂移分别诊断。
131
132
  - `changeSummary` 是最多 2000 字符的版本说明文本,不能传对象;v3 在首次 stage 创建版本时存入 `mci_ai_app_version.ChangeSummary`,后续同请求重放和恢复保留原说明。历史节点若发布完成但摘要仍为空,应报告后端版本缺口,不得把编译文件验证成功等同于日志验收通过。
132
133
  - 每次创建、修改、升级或重新发布微服务,必须先为目标精确 `AppVersion` 在 `sys_microistore_changelog` 写入完整日志,再同步源码、stage、finalize 或制作商城包。日志必须关联真实 `StoreId`,包含 `Title / ChangeType / Content / ReleaseTime`;流式发布显式传入与日志含义一致的非空 `changeSummary`。发布后同时回读商城日志、`mci_ai_app_version.ChangeSummary` 与包内 `PackageInfo.ChangeLog`;缺失或版本不一致必须失败关闭。
133
134
  - 发布动作必须明确区分两种模式:默认“源码+编译产物”先把完整工程同步到私有桶并逐文件回读 SHA-256,再把 `dist` 流式发布到公有桶;显式“仅编译产物”只更新公有桶,必须在界面中告知其他用户仍会拉取上一次私有源码,禁止暗示源码已同步。
@@ -1,33 +1,34 @@
1
1
  ---
2
2
  name: microi-solution-quotation
3
- description: Create or revise compact professional Microi吾码 system solution and quotation Word documents. Use when a user asks for a Microi吾码 解决方案、项目建议书、技术路线、实施周期、市场预估价、优惠报价或一页式 DOCX 报价,尤其适用于低代码、V8引擎、PC/UniApp/微信小程序、物联网和系统集成项目。
3
+ description: Create or revise professional system solution and quotation Word/PDF documents for Microi吾码 projects, including customer-branded proposals. Use for 解决方案、项目建议书、技术路线、实施周期、总价或优惠报价,适用于低代码、V8引擎、PC/移动端、物联网和系统集成项目。
4
4
  ---
5
5
 
6
6
  > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
7
 
8
8
  # Microi吾码解决方案与报价
9
9
 
10
- 生成客户可直接查看或发送的 `.docx` 方案报价。先基于真实需求和资料确定技术边界,再用紧凑商务版式呈现价值、技术路线、总价、周期和限制条件。
10
+ 生成客户可直接查看或发送的 `.docx` 方案报价,按用户要求同时导出正式 PDF。先基于真实需求和资料确定技术边界,再用清晰、工整的商务版式呈现价值、技术路线、总价、周期和限制条件。用户指定的提案主体、品牌、标题、页数、格式和商务数值优先于本 Skill 的默认模板;允许以合作方或客户品牌交付,仅在必要技术说明中注明所用框架。
11
11
 
12
12
  ## 工作流程
13
13
 
14
14
  1. 读取需求、PDF、截图、现有 Word 和项目资料;不把尚未确认的硬件协议、第三方接口或平台能力写成已具备。
15
15
  2. 提炼项目目标、核心范围、Microi吾码实现方式、关键技术路线、交付物、风险与前置条件。
16
- 3. 确定项目名称、版本、日期、开发周期、市场预估价、优惠报价和报价有效期。用户已给值时必须原样采用。
17
- 4. 使用 `scripts/build_solution_quote.py` 生成 Word;复杂项目可按同一视觉规范扩展。
18
- 5. 把 DOCX 渲染为 PNG,检查页数、字体、表格、换行和溢出;修正后再交付。缺少 LibreOffice/soffice 时做结构检查,并在交付说明中明确未完成视觉渲染。
16
+ 3. 确定提案主体、项目名称、版本、日期、开发与实施周期、报价、优惠和有效期。用户已给值时必须原样采用;核对折扣计算、工期阶段及有效期起止口径,不擅自添加税率、付款比例或服务承诺。
17
+ 4. 简单默认版式可使用 `scripts/build_solution_quote.py`;指定品牌、两页方案或图文布局超出脚本能力时,采用可编辑的 Word 排版实现,不让脚本默认值覆盖用户要求。
18
+ 5. 渲染 DOCX 并逐页实际查看画面,检查字体、表格、换行、图文比例和溢出;需要 PDF 时从定稿 Word 导出并逐页复核 PDF 的页数、分页与内容一致。只有结构检查不能代替视觉验收;缺少可用渲染器时明确说明未完成的检查,不声称已经验证版面。
19
19
 
20
- ## 固定版式
20
+ ## 默认版式与视觉质量
21
21
 
22
22
  - 页面:A4 纵向。
23
23
  - 页边距:Word“窄”,上、下、左、右均为 `0.5 in / 1.27 cm / 720 DXA`。
24
- - 布局:紧凑、商务、可快速扫读。小项目默认一页;不要用缩小到 9pt 以下正文的方式硬塞内容。
25
- - 字体:中文优先 `Microsoft YaHei`,正文 9-10pt;标题 20-22pt;章节标题 10.5-12pt。
26
- - 大标题:`Microi吾码 {系统名称} 解决方案与报价`。
27
- - 副标题必须为:`AI 深度融合 V8引擎 的低代码平台,官网:https://microi.net`。
24
+ - 布局:漂亮、工整、结构清晰,可快速扫读。小项目默认一页;用户明确要求两页或其它页数时按指定页数设计,每页具有完整主题和足够有效内容,不靠堆字、过小字号或大片无意义留白凑页数。
25
+ - 字体:中文优先 `Microsoft YaHei`,正文通常 10-11pt;标题约 20-24pt;章节标题约 12-14pt。根据页幅和实际渲染调整,先精简冗余或重排,不以缩小正文字号解决拥挤。
26
+ - 大标题默认:`Microi吾码 {系统名称} 解决方案与报价`;用户指定提案主体、标题或白标交付时按其要求替换,不强行添加吾码品牌。
27
+ - 默认品牌提案可使用副标题:`AI 深度融合 V8引擎 的低代码平台,官网:https://microi.net`;其它主体按受众采用项目价值副标题或省略。
28
28
  - 标题下方放置版本、日期、开发周期、报价有效期;默认版本 `v1.0.0`,默认有效期 15 天。
29
- - 使用克制的吾码蓝色系;表格必须固定 DXA 宽度并设置单元格内边距,禁止依赖自动调整。
30
- - 页脚可放版本、日期和官网,不重复正文报价。
29
+ - 默认使用克制的蓝色系,用户指定品牌时遵循其配色;统一标题层级、对齐线、间距和强调色。表格固定 DXA 宽度并设置单元格内边距,禁止依赖自动调整。
30
+ - 适当使用架构图、产品场景示意、流程图或时间轴表达关系和价值,配合短段落、信息卡和重点数字,避免整页密集文字或以装饰占据有效内容。AI 配图可选;技术关系和关键文字优先用清晰、可编辑的图形表达。示意图不得冒充已完成产品截图、客户现场或已验证架构。
31
+ - 页脚可放版本、日期、页码和提案主体联系方式;官网按品牌及用户要求决定,不重复正文报价。双页方案可将第一页用于目标与方案,第二页用于实施、报价与交付边界,保持视觉风格统一。
31
32
 
32
33
  ## 内容结构
33
34
 
@@ -70,9 +71,9 @@ JSON 常用字段:`system_name`、`project_goal`、`solution_items`、`technic
70
71
 
71
72
  ## 工作区与交付检查
72
73
 
73
- - 临时脚本、JSON、渲染图和 QA 产物必须写入仓库根目录 `.tmp/`,禁止创建根目录 `tmp/`。
74
+ - 临时脚本、JSON、渲染图和 QA 产物写入仓库根目录 `.tmp/<任务标识>/`,按工作区规则登记并在完成后清理;正式 Word/PDF 保存在用户指定目录。
74
75
  - 用户认为提取结果有长期价值时,将其整理到用户指定的项目目录,不留在临时目录。
75
- - 大标题、副标题、版本、日期、周期、市场预估价和优惠报价全部存在。
76
+ - 标题、提案主体、日期、周期、报价和有效期符合用户要求;副标题、版本、品牌及联系方式按本次约定呈现。
76
77
  - 没有模块明细价格,没有占位符,没有把未确认能力写成已交付。
77
- - 小项目只有一页;无截断、重叠、孤行、超宽表格和过小字体。
78
- - 最终回复仅链接正式 DOCX,不链接临时 JSON、生成脚本、PNG 或 PDF QA 文件。
78
+ - 页数符合本次要求;逐页确认无截断、重叠、孤行、超宽表格、过小字体或过密文字,图示、价格和联系人清晰可读。
79
+ - 最终回复链接正式 DOCX,以及用户要求的正式 PDF;不将临时 JSON、生成脚本、PNG 或仅用于 QA 的中间 PDF 当作正式交付物。
@@ -26,7 +26,7 @@ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` /
26
26
  创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`,并读取其[首版交付与外部服务验收](../microi-mobile-app-quality/references/mobile-first-delivery.md)。手机号快捷登录、会话续签、导航几何、真实地图、页面动效和公开发布回读从首版纳入需求与测试,不能先交静态占位版,再等待用户逐页指出问题。涉及后台与第三方服务时按实际业务范围执行,既有授权和租户策略优先。
27
27
 
28
28
  <!-- /microi-progressive:chunk -->
29
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=acfd8dd91195e7930896bd54e6ae7ce3d3982bdeb0d674d98337878eab1a5e82 -->
29
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=ad6d719fd27c252c1916c54d65185ecf90846e5f780a81b671a6e0540fbea4a6 -->
30
30
  ## 标准产品、视图协议与租户扩展
31
31
 
32
32
  地图提供行政区与附近距离两类筛选时,应复用省市区字典,并允许省、市、区逐级选“全部”;省级“全部”须显式启用,不能改变普通地址录入的默认值。行政区域查询不依赖手机定位、不叠加附近半径,空地区仍可保留既有附近模式。范围筛选必须在原有菜单/租户/行权限内执行,分批读取并丢弃迟到响应;来源列表存在同表不同菜单时,地图入口与查询应保留准确的来源菜单和固定业务条件。验收覆盖全国、全省、全市、区县、直辖市、定位拒绝、旧接口兼容和快速切换。
@@ -52,11 +52,14 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
52
52
  - 原生详情进入编辑后,取消丢弃未保存字段并返回同一详情/Tab,保存成功后回读服务端结果并通知来源列表刷新;直接新增/编辑仍返回来源列表。验收覆盖系统返回、保存/子表失败、迟到响应和权限撤销,不能用重复压入详情页替代原实例恢复。
53
53
  - IoT/关联快照的“记录不存在”应展示业务空状态并隐藏表名/SQL,权限与网络失败仍保留真实错误;未知遥测使用占位值,零值和离线不能被当作缺失。依赖租户 V8 的契约测试从授权同步目录按唯一 ApiEngineKey 定位,测试前核验源码完整性与哈希,不靠旧分类文件夹名定位或跳过缺失依赖。
54
54
  - 小程序不得下载或执行任意前端 V8,不得使用 `eval/new Function`。字段显隐和联动使用白名单声明式规则,按钮使用 ActionSchema,复杂事务和校验进入 ApiEngine 或后端表单事件。
55
+ - 定制详情的按钮锚点必须从完整表单定义定位所属 Tab/分组,不能回退到当前 Tab 的第一个可见分组,否则关联、二维码等基础动作会串栏。后台 Button 只有受控原生适配才能进入小程序;设备控制同时取字段权限与服务端能力交集,较多动作按业务分组、双列和“更多”展开。涉及物理动作时沿用服务端稳定编号的准备/派发/查询协议,超时只查原编号,离页/切换记录取消后续派发;接口受理、设备回执和遥测复核分别展示。回归覆盖 Tab 往返、权限撤销、取消、连点、响应丢失、旧指令混入和迟到响应。
55
56
  - 分片日志的时间筛选复用后台 SearchFieldIds 和统一筛选弹窗,不增加重复的月份、开始日期和结束日期控件。月份从已选时间推导,未筛选时查询当月;虚拟文本时间发送完整边界,缺省精度可按接口能力使用分钟,显式 DateTimeType 优先。草稿确认后生效、关闭取消、重置清空条件;结束包含整个所选精度。服务端在存储层过滤、计数和分页,缓存及迟到响应按已生效条件隔离;接口不支持跨月时在提交前明确提示。
56
57
  - ActionSchema 只能描述文字、图标、颜色、确认提示、参数映射、ApiEngineKey、原生 ActionType 和成功后的刷新/跳转;扫码、定位、拍照、拨号、导航等由受控原生适配器执行。
57
58
 
58
59
  仓库必须提供 AI 与人工协作约束文件、租户脚手架、Profile 构建/同步命令和架构检查。平台层改动至少同时构建标准 Profile 与默认交付 Profile;租户视觉改动还要执行多视口截图回归。这样其他同事使用 Codex、Claude、Copilot、Cursor 等工具继续开发时,会先读取相同规则,而不是依赖某次对话记忆。
59
60
 
61
+ Profile 覆盖层回归必须在独占临时夹具中执行,禁止为了测试临时切换正在被 HBuilderX/Vite 监听的真实源码。即使最终恢复字节,也可能触发增量编译缓存不一致,留下空 WXSS。验收须断言真实文件内容与 mtime 均未变化,覆盖夹具成功/失败退出清理,并检查已编译页面含实际样式规则、与当前模板匹配;不能只检查 JS/WXML 或产物是否存在。
62
+
60
63
  <!-- /microi-progressive:chunk -->
61
64
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-002 sha256=1faa6e553ff61b9043ff7608d02518e815f1dcbe2cc56fefb8adff326c5d1f1f -->
62
65
  ## H5 预览壳与底部导航强制规则
@@ -44,6 +44,9 @@ ApiRoutes: /api/SysMenu/GetSysMenuModel;/api/SysMenu/GetSysMenuStep
44
44
  - 新客户端仍使用 `/apiengine/{ApiEngineKey}` 或主 `ApiAddress`。多路由用于 Controller 迁移、旧移动端和第三方已登记回调的兼容,不得拿它复制多份相同接口代码。
45
45
  - MCP 创建接口时传 `apiRoutes: ['/api/Old/A', '/api/Old/B']`;更新时省略表示保留,传空字符串/空数组表示清空。官方应用包必须同时携带 `ApiRoutes`、醒目 Managed 提示与 `ResourcePolicies.ApiEngines`。
46
46
  - 迁移旧 Controller 不能只迁方法名:同时核对历史 GET/POST、JSON/Form/Query、无需 `Action` 的调用和原始返回结构。按服务端 `_RequestPath` 精确识别兼容动作,历史只读地址不得被请求 `Action` 改为写操作;现代稳定 Key 的其它合法动作仍须可用。
47
+ - 同地址采用“当前租户接口引擎优先 → 确认缺失才回退 Controller → 两者均不存在才 404”。不可按 Controller 前缀跳过接口引擎;停用、StopHttp、鉴权拒绝、执行异常及权威查询失败都不等于缺失,不得降级执行旧逻辑。单请求复用已确认的缺失结果,不能用长效负缓存延迟在线新增接口生效。
48
+ - `/api/License/GetManagementState` 也遵循上述同址优先规则;现有 GET/POST Controller 读取授权管理页状态,要求平台管理员身份并按可信租户范围返回。若用接口引擎承接该地址,必须保留相同的身份与租户边界;路由存储故障返回 503,不能回退绕过。动态路由优先级由后端二进制交付,仅更新应用包不代表宿主已支持。
49
+ - 公开设置等启动接口的参数、读取顺序、错误分类和响应组装应留在可编辑 V8;宿主只保留秘密投影、公钥、可信身份、验签及受限存储原子。禁止新增一个返回完整业务响应的 C# 门面再以单行 V8 包装冒充迁移。必要启动包从官方拥有者包显式投影,不能借核心接口升级默认安装可选平台应用。
47
50
  - 部门树旧地址 `/api/SysDept/GetSysDeptStep` 由 `platform-sys-dept` 的多路由交付,保留 DiyToken、组织范围及 `_Child`。缺引擎兜底仅登记该历史读地址,不能把整个现代引擎地址截获为只读分发器。验收需对比引擎存在、缺失再恢复的同一用户树结构,并验证匿名、伪造身份、停用/StopHttp 不绕过。
48
51
 
49
52
  ### 资源预算与嵌套调用(强制理解)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: v8-mongodb
3
- description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
3
+ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb 文档读写、GetPartitionedTableData 跨年跨月游标分页、对象过滤和原生 ObjectId。
4
4
  ---
5
5
 
6
6
  > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
@@ -28,6 +28,7 @@ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、Up
28
28
  | `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
29
29
  | `V8.MongoDb.GetFormData({...})` | 查询单个文档(按 Id) |
30
30
  | `V8.MongoDb.GetTableData({...})` | 查询文档列表 |
31
+ | `V8.MongoDb.GetPartitionedTableData({...})` | 当前租户年度库、月度集合及旧年度集合的有界游标分页 |
31
32
  | `V8.MongoDb.NewId()` | 生成 MongoDB Id |
32
33
 
33
34
  ## 新增文档
@@ -132,6 +133,45 @@ var result = V8.MongoDb.GetTableData({
132
133
 
133
134
  `GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
134
135
 
136
+ ### 原生 `_id` 过滤
137
+
138
+ `_Where: [['_id', 'In', ids]]` 支持原生 ObjectId 的数组或逗号分隔字符串,每次 1–1000 项。`=`、`!=`、范围比较与 `NotIn` 同样使用原生 ObjectId;每项必须是合法的 24 位十六进制标识。无效值返回失败,不能忽略条件后退化成全表查询。普通业务字符串 Id 应使用自有字段,不要伪装成原生 `_id`。
139
+
140
+ ## 跨年跨月游标分页
141
+
142
+ 海量聊天/日志不要只查当前月份,不要逐月 `Count + Skip` 或一次加载全历史。使用 `GetPartitionedTableData` 存储原子,接口引擎继续负责 DiyToken、成员资格、消息双方、业务权限与公开 DTO。平台 SignalR 聊天必须继续调用应用商城拥有的 `platform-chat-runtime`,不能另写业务 Controller。
143
+
144
+ ```javascript
145
+ // 必须先完成业务权限校验;身份来自当前 V8 上下文,前缀来自可信代码。
146
+ var result = V8.MongoDb.GetPartitionedTableData({
147
+ DatabasePrefix: 'audit_log', TablePrefix: 'event',
148
+ _Where: [['UserId', '=', V8.CurrentUser.Id]],
149
+ IndexFields: ['UserId'],
150
+ PageSize: 30, MaxPartitions: 64,
151
+ Cursor: V8.Param.Cursor || ''
152
+ });
153
+ if (result.Code !== 1) return result;
154
+ // result.Data: { Rows, HasMore, NextCursor, ScannedPartitions }
155
+ // 对外返回前显式选择业务字段,不能透传内部 _PartitionDb / _PartitionTable。
156
+ return { Code: 1, Data: {
157
+ Rows: result.Data.Rows.map(function(row) {
158
+ return { Id: row._id, CreateTime: row.CreateTime, Action: row.Action };
159
+ }),
160
+ HasMore: result.Data.HasMore, NextCursor: result.Data.NextCursor
161
+ }};
162
+ ```
163
+
164
+ - 命名:只发现当前租户的 `{DatabasePrefix}_{tenant小写}_{yyyy}` 和兼容旧库 `{DatabasePrefix}_{tenant小写}`;集合为 `{TablePrefix}_{yyyyMM}`、`{TablePrefix}_{yyyy_MM}` 或旧 `{TablePrefix}_{yyyy}`。年度库与集合年份必须一致。不能传任意库/集合列表,不能用普通用户输入控制前缀或索引。
165
+ - `PageSize` 默认 30,范围 1–100(不是 `_PageSize`);`MaxPartitions` 默认 64,范围 1–128。目录最多 200 个租户库、2400 个有效集合。总调用限时 20 秒,单个集合查询限时 10 秒;超限/存储故障返回失败,不能冒充历史结束。
166
+ - `_Where` 必须非空且有效;双向聊天可用 `_WhereAny` 传 1–4 组非空条件,组内 AND、组间 OR。指定 `_WhereAny` 时不再合并 `_Where`,每个分支都必须独立包含权威身份/资源边界。
167
+ - `IndexFields` 可选,最多 3 个互异安全字段;按这些字段升序加 `CreateTime DESC, _id DESC` 创建复合索引。文档必须使用 BSON 日期 `CreateTime` 和原生 ObjectId `_id`。稳定排序按两者倒序,页内旧/新分区重复 `_id` 合并;普通页不执行 Count。
168
+ - `Cursor` 是服务端返回、绑定租户/前缀/过滤条件的 opaque 字符串,最大 2048 字符。它是翻页位置而非鉴权凭据,禁止客户端解析或替换为页码。查询条件改变必须清空游标。即使 `Rows=[]`,只要 `HasMore=true` 仍需用新的 `NextCursor` 继续;跨空月、跨年和旧年度表不能提前截止。
169
+ - `CountOnly:true` 返回 `{ Count }`,仍执行权限条件,扫描范围超过 `MaxPartitions` 直接失败而不返回部分总数。它计数物理行,迁移时不要复制未读事实到多个分区;需要业务去重计数时由权威索引另行维护。
170
+ - 新消息按原始发生时间选择年度库/月度集合。`AddFormData` 的可选顶层 `OccurredAt` 用于可信后端重放保持 `CreateTime`,不得直接信任客户端时间;默认仍使用服务端当前时间。跨月重试必须用稳定业务 Id 和持久分区定位复用原始事实,不能在新月份再写一条。
171
+ - 前端采用滚动异步加载、稳定 Id 合并、请求代际隔离和向前插入锚点补偿。实时消息只增量合并;已读回执读取有界最新页,不能重置旧历史游标或把未展示的全历史标为已读。
172
+
173
+ 该原子需部署相应 Core/MongoDB/API 组件并更新 Managed 应用运行时。源码测试不等于线上 MongoDB、SignalR 或浏览器验收;至少覆盖跨月、跨年、空月、同时间多消息、旧年度集合、重复迁移数据、跨租户拒绝、断线重试和滚动位置。
174
+
135
175
  ## 实战模式
136
176
 
137
177
  ### IoT 设备日志存储
@@ -307,3 +307,9 @@ SELECT * FROM Contact WHERE OwnerId = $CurrentUser.Id$ AND Spouse = $CurrentUser
307
307
  空库脱敏生成器应只读实际物理列;组织机构旧表缺少可选父级名称列时,只写已有父级 Id,不为制作模板修改主库结构。物理字段发现失败应在输出清理 SQL 前失败关闭。验收同时覆盖有该列、缺少该列及读取失败,最终检查隔离副本和官方空库下载包。
308
308
 
309
309
  应用文件与版本清理不得在 MySQL 5.7 的 DELETE 外连接中用 `Id = AppId OR AppKey = AppId`。先在隔离副本内物化带主键的 Id/AppKey 保留集合,分别覆盖当前商城 Id、历史 AppKey、业务应用、孤立记录与 NULL;验证新旧结果一致,源主库只读。真实 SQL 耗时与 Node 生成器测试需分别记录。
310
+
311
+ ## 子租户应用发布门禁的权威来源
312
+
313
+ 正常子租户管理员使用自己的 MCP 发布,不需要主租户账号。服务端以启动主租户数据库为 SaaS 登记的唯一来源,以当前认证 OsClient 与可信节点 Type/Network 精确查询启用、未删除的登记行;不能查询子租户业务库的同名表,也不能用缓存或父租户自己的门禁行代替。发布提交持有主控门禁行锁,业务事务仍属于子租户;门禁转换与审计在主控库内原子执行,审计幂等键按租户和分区隔离。
314
+
315
+ 新租户登记由开通流程写入主控库;业务库无需复制登记行。新登记使用门禁列的既有默认值 `LegacyOpen / 2 / 0`,禁止复制父租户的模式、最低协议或 Epoch;存量登记不重置。门禁强读不依赖缓存刷新生效。`Actual=0`、重复行、禁用、软删除、坐标不符和配置源不可用继续拒绝发布,并明确返回平台诊断。AI 保持用户指定子租户连接,不把“补运行登记”运维接口的主租户权限要求当成业务发布前提。