@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.
@@ -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 当作正式交付物。
@@ -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
  ## 新增文档
@@ -113,6 +114,10 @@ var result = V8.MongoDb.GetFormData({
113
114
  });
114
115
  ```
115
116
 
117
+ `GetFormData` 的原生不存在结果是 `{ Code: 1, Data: null }`;只有 `Code=1` 且 `Data` 是文档时才表示找到记录。不要套用 `V8.FormEngine.GetFormData` 的 `Code=2` 约定。查询失败、异常、空响应或缺失 `Data` 字段不能当作记录不存在并继续新增。兼容旧适配器时,仅接受 `Code=2` 且没有正文的明确不存在结果。
118
+
119
+ 聊天等幂等写入先使用固定业务标识定位分区;首次不存在时才新增。Mongo 写入结果未知时只回读同一 `_id` 并比对完整载荷摘要,禁止换 Id 或月份盲重发。正文已持久化但联系人、实时推送或后置 Hook 失败时保留已提交事实;业务层分别返回投影警告,不能宣称消息没有写入。
120
+
116
121
  ## 查询文档列表
117
122
 
118
123
  ```javascript
@@ -132,8 +137,59 @@ var result = V8.MongoDb.GetTableData({
132
137
 
133
138
  `GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
134
139
 
140
+ ### 原生 `_id` 过滤
141
+
142
+ `_Where: [['_id', 'In', ids]]` 支持原生 ObjectId 的数组或逗号分隔字符串,每次 1–1000 项。`=`、`!=`、范围比较与 `NotIn` 同样使用原生 ObjectId;每项必须是合法的 24 位十六进制标识。无效值返回失败,不能忽略条件后退化成全表查询。普通业务字符串 Id 应使用自有字段,不要伪装成原生 `_id`。
143
+
144
+ ## 跨年跨月游标分页
145
+
146
+ 海量聊天/日志不要只查当前月份,不要逐月 `Count + Skip` 或一次加载全历史。使用 `GetPartitionedTableData` 存储原子,接口引擎继续负责 DiyToken、成员资格、消息双方、业务权限与公开 DTO。平台 SignalR 聊天必须继续调用应用商城拥有的 `platform-chat-runtime`,不能另写业务 Controller。
147
+
148
+ ```javascript
149
+ // 必须先完成业务权限校验;身份来自当前 V8 上下文,前缀来自可信代码。
150
+ var result = V8.MongoDb.GetPartitionedTableData({
151
+ DatabasePrefix: 'audit_log', TablePrefix: 'event',
152
+ _Where: [['UserId', '=', V8.CurrentUser.Id]],
153
+ IndexFields: ['UserId'],
154
+ PageSize: 30, MaxPartitions: 64,
155
+ Cursor: V8.Param.Cursor || ''
156
+ });
157
+ if (result.Code !== 1) return result;
158
+ // result.Data: { Rows, HasMore, NextCursor, ScannedPartitions }
159
+ // 对外返回前显式选择业务字段,不能透传内部 _PartitionDb / _PartitionTable。
160
+ return { Code: 1, Data: {
161
+ Rows: result.Data.Rows.map(function(row) {
162
+ return { Id: row._id, CreateTime: row.CreateTime, Action: row.Action };
163
+ }),
164
+ HasMore: result.Data.HasMore, NextCursor: result.Data.NextCursor
165
+ }};
166
+ ```
167
+
168
+ - 命名:只发现当前租户的 `{DatabasePrefix}_{tenant小写}_{yyyy}` 和兼容旧库 `{DatabasePrefix}_{tenant小写}`;集合为 `{TablePrefix}_{yyyyMM}`、`{TablePrefix}_{yyyy_MM}` 或旧 `{TablePrefix}_{yyyy}`。年度库与集合年份必须一致。不能传任意库/集合列表,不能用普通用户输入控制前缀或索引。
169
+ - `PageSize` 默认 30,范围 1–100(不是 `_PageSize`);`MaxPartitions` 默认 64,范围 1–128。目录最多 200 个租户库、2400 个有效集合。总调用限时 20 秒,单个集合查询限时 10 秒;超限/存储故障返回失败,不能冒充历史结束。
170
+ - `_Where` 必须非空且有效;双向聊天可用 `_WhereAny` 传 1–4 组非空条件,组内 AND、组间 OR。指定 `_WhereAny` 时不再合并 `_Where`,每个分支都必须独立包含权威身份/资源边界。
171
+ - `IndexFields` 可选,最多 3 个互异安全字段;按这些字段升序加 `CreateTime DESC, _id DESC` 创建复合索引。文档必须使用 BSON 日期 `CreateTime` 和原生 ObjectId `_id`。稳定排序按两者倒序,页内旧/新分区重复 `_id` 合并;普通页不执行 Count。
172
+ - `Cursor` 是服务端返回、绑定租户/前缀/过滤条件的 opaque 字符串,最大 2048 字符。它是翻页位置而非鉴权凭据,禁止客户端解析或替换为页码。查询条件改变必须清空游标。即使 `Rows=[]`,只要 `HasMore=true` 仍需用新的 `NextCursor` 继续;跨空月、跨年和旧年度表不能提前截止。
173
+ - `CountOnly:true` 返回 `{ Count }`,仍执行权限条件,扫描范围超过 `MaxPartitions` 直接失败而不返回部分总数。它计数物理行,迁移时不要复制未读事实到多个分区;需要业务去重计数时由权威索引另行维护。
174
+ - 新消息按原始发生时间选择年度库/月度集合。`AddFormData` 的可选顶层 `OccurredAt` 用于可信后端重放保持 `CreateTime`,不得直接信任客户端时间;默认仍使用服务端当前时间。跨月重试必须用稳定业务 Id 和持久分区定位复用原始事实,不能在新月份再写一条。
175
+ - 前端采用滚动异步加载、稳定 Id 合并、请求代际隔离和向前插入锚点补偿。实时消息只增量合并;已读回执读取有界最新页,不能重置旧历史游标或把未展示的全历史标为已读。
176
+
177
+ 该原子需部署相应 Core/MongoDB/API 组件并更新 Managed 应用运行时。源码测试不等于线上 MongoDB、SignalR 或浏览器验收;至少覆盖跨月、跨年、空月、同时间多消息、旧年度集合、重复迁移数据、跨租户拒绝、断线重试和滚动位置。
178
+
135
179
  ## 实战模式
136
180
 
181
+ ### 物理审计与权威索引分页
182
+
183
+ `GetPartitionedTableData` 的高级模式需在可信接口引擎完成业务权限校验后使用,不能把客户端参数直接作为库、集合或索引定义:
184
+
185
+ - `PhysicalRows:true` 保留同 Id 的所有物理副本,按分区和 `_id` 扫描。`PageSize` 默认/上限 100,`MaxPartitions` 默认/上限 8;不接受 `_WhereAny` 或 `CountOnly`。只有省略 `_Where` 的完整扫描才有 `FullPhysicalScope=true`,带条件的扫描不能证明全租户迁移完成。
186
+ - 物理扫描返回 `DirectoryHash/NextCursor/HasMore`,继续时原样带回;目录或集合身份变化、非法 `_id` 必须失败关闭,不得跳过再宣称迁移完成。
187
+ - `CollectionPage:true` 使用可信 `DatabasePrefix/TableName`,`IndexFields` 为 1–4 个字段,`_Where` 必须完整等值匹配这些前缀。`SortField` 是不在前缀内的文本字段,与原生 `_id` 倒序分页。`PageSize` 默认 30、上限 100,普通页不计数。
188
+ - 索引必须在维护阶段用 `EnsureIndex:true` 显式准备;普通读取仅 Hint 已存在的索引。`CountOnly:true` 单独执行索引计数;准备与计数不接受游标。不把首次用户页面加载变成全量索引构建。
189
+ - 两种模式互斥,返回的 `_PartitionDb/_PartitionTable` 仅供可信内部逻辑,公开 DTO 显式选字段。
190
+
191
+ 平台聊天迁移通过固定 Managed `platform-chat-maintenance` 编排。`V8.Method.ManageManagedStorageMaintenance` / `V8.Method.RequireManagedStorageMaintenance` 只接受真实当前租户、固定 Key、超级管理员及非访问密钥会话;普通 V8 MongoDB CRUD 不得读写宿主准入集合。先核实所有写节点升级,再关闭准入、真实排空、分批迁移、完整验证、条件释放;具体流程见 `../message-notification/references/contracts.md`。不能用客户端布尔值、TTL 或清空票据冒充排空。
192
+
137
193
  ### IoT 设备日志存储
138
194
 
139
195
  ```javascript