@microi.net/cli 6.0.1 → 6.0.2

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 +43 -43
  4. package/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +7 -7
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +82 -82
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-server.js +81 -81
  17. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  18. package/scripts/microi-cli-mcp.js +7 -7
  19. package/scripts/microi-cli.js +60 -59
  20. package/scripts/microi-codex-broker.js +466 -466
  21. package/scripts/microi-codex-router.js +635 -635
  22. package/scripts/microi-skills.meta.json +220 -220
  23. package/skills/.microi-skills-version.json +6 -6
  24. package/skills/.progressive-disclosure-manifest.json +64 -64
  25. package/skills/microi-client-frontend/SKILL.md +266 -258
  26. package/skills/microi-codex/SKILL.md +130 -116
  27. package/skills/microi-codex-installer/SKILL.md +4 -2
  28. package/skills/microi-deployment/SKILL.md +1 -1
  29. package/skills/microi-microservice/SKILL.md +348 -344
  30. package/skills/microi-system-delivery/SKILL.md +100 -98
  31. 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 +2 -2
  32. package/skills/page-engine/SKILL.md +231 -227
  33. package/skills/playwright-e2e/SKILL.md +33 -31
  34. package/skills/v8-cache-pattern/SKILL.md +8 -4
  35. package/skills/v8-export-import/SKILL.md +5 -0
  36. package/skills/v8-file-upload/SKILL.md +4 -0
  37. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +10 -2
  38. package/skills/workspace-conventions/SKILL.md +111 -102
  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 +4 -3
  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 +4 -4
  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 +6 -4
@@ -1,227 +1,231 @@
1
- ---
2
- name: page-engine
3
- description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi 界面引擎(Page Engine)页面 JSON 生成
9
-
10
- MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_page_design`;版本治理入口见下文。保存工具写入后仍需回读 `mic_page`,不能把生成成功当作持久化成功。
11
-
12
- ## 完整 AI 开发默认报表(强制)
13
-
14
- 完整系统开发必须按需求主动设计基于界面引擎的业务统计、老板经营与领导管理报表,
15
- 先把相应入口纳入菜单骨架,再接通真实数据并验收。详细范围与菜单切换流程读取
16
- [菜单先行与经营报表增补要求](../microi-system-delivery/references/progressive-01-标准工作流.md#菜单先行与经营报表增补要求强制)。
17
- 局部修改只覆盖相关页面/指标,只读分析不创建页面。用户明确的范围优先。
18
-
19
- - 每个报表服务明确角色与决策任务;业务运营覆盖状态、趋势、效率与异常,经营视角覆盖
20
- 有真实来源的规模、收支/利润、回款及风险,管理视角覆盖部门/人员、任务进展、待办/逾期、
21
- 利用与达成。不存在数据来源的指标标为不适用并说明,不能编造成本、利润或业绩。
22
- - 每个指标定义来源、公式、单位/精度、状态、时间字段/时区/边界、比较基期、维度与角色。
23
- 当前租户真实数据通过服务端批量聚合,时间/维度筛选和用户数据权限必须在接口中生效。
24
- 禁止演示值、本页合计冒充全量或前端拉取全量明细再统计。
25
- - 页面包含周期/维度筛选、加载、零/空、无权限和失败状态;请求失败不能显示为正常零值。
26
- 指标/图表穿透到同一口径的授权明细并对账。界面引擎负责看板和图表,分页查询/导出明细
27
- 配合 `report-engine`;列表汇总、Hero 和角标不能替代决策报表。
28
- - 保存后回读 `mic_page`、菜单绑定、数据源/接口;以管理员、经营/管理角色、普通与无权限
29
- 角色验证时间边界、筛选、隔离、零/空/失败和明细对账,完成电脑/移动、明暗主题截图。
30
- 先从已授权候选入口独立预验收,再以回读后的真实页面 Id 切换同一菜单并按打开方式设置标记,
31
- 保留菜单身份与权限;从原 URL 最终验收,失败精确恢复本菜单原绑定并记录未完成。
32
-
33
- ## 紧凑报表与平台主题
34
-
35
- 需要“主指标 + 多行次指标 + 图表 + 排行表 + 资讯”布局时,可读取 [examples/compact-dashboard.json](examples/compact-dashboard.json) 作为原生组件示例。示例数值仅用于视觉排版,交付业务报表前必须替换为当前租户的真实数据源。
36
-
37
- 默认使用 `formConfig.themeMode="system"`、`density="compact"`,卡片背景使用 `var(--el-bg-color)`、页面背景使用 `var(--el-bg-color-page)`,正文使用平台文字变量。不要因为“驾驶舱/大屏”字样就强制深色。显式指定浅色或深色时才使用 `light/dark`。
38
-
39
- 运行容器默认 `wrapperOption.heightMode="content"`,`height` 只保留设计器布局尺寸。仅需固定图形画布时设为 `fixed`;图表自身可以设置 240–320px 高度。不要为一行指标、标题、三行表格预留 200–400px 空容器。紧凑布局的卡片间距建议 10–16px,面板内边距 8–16px;统计组件 `widgetParams[24].value` 支持 `summary`(图标和大数字)、`detail`(多行小指标)及兼容的 `cards`。
40
-
41
- 用户提供参考截图时,先拆出面板行列比例、指标主次、图表与表格高度、标题/筛选位置,再用原生 pannel/statistic/chart/tabel/list 组合配置。不能把所有指标替换成一排大色块,也不能用模板假数据声称已接通客户业务。必须用同一视口截图检查浅色和平台深色,检查页面缩放后的断行与纵向空白;布局接近度和真实数据绑定分别验收。
42
-
43
- ### 平台智能工作首页
44
-
45
- 保留 `aiengine` 原生 AI 创作中心,与 `homeoverview` 工作概览组成桌面首行 14/10 栅格;任务、月历与公告放在下一行,移动端自动切为 24 栅格。不能把任务的完整 15 行列表或未配置日程的大空白块直接堆在首屏。
46
-
47
- - `homeoverview.widgetParams[0]` 为真实个人统计接口 `platform-home-overview`,`[1].value="compact"` 启用紧凑指标、常用应用与趋势;所有数据仍受当前用户权限过滤。
48
- - `workcenter.widgetParams` 按索引依次为视图、工作菜单、流程菜单、公告菜单、日历菜单、分页条数;`[5].value=5` 用于首页任务,范围 5–20,不能影响独立“我的工作”页面。
49
- - `diycalendar.widgetParams[0].value` 应绑定当前账号可访问、关联 `microi_calendar` 的真实模块 Id;`[1].value="compact"` 只压缩月历密度,仍须支持点击日期新增及事件编辑、删除。备注字段为 `Remark`。隐藏菜单也可以是授权入口,旧模块可能没有 `DiyTableName`,此时必须显式绑定实际模块,不把只读日期回退当作日程验收成功。无模块时展示本月日期并明确提示未配置,不伪造任务。
50
- - `diytable.widgetParams[4].value="NoticeList"` 以只读公告列表展示真实授权公告;表、菜单仍在 `[0]/[1]`,模块缺失时使用 `referencePolicy.onMissing="RemoveWidget"` 移除可选组件及空容器。
51
- - 修改已有首页前通过 MCP 读取页面及历史 `CurrentHash`,保存传 `expectedCurrentHash`,再回读 JSON 和历史,保留可恢复版本。
52
-
53
- 你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
54
-
55
- <!-- microi-progressive:begin -->
56
- <!-- microi-progressive:chunk id=page-engine-000 sha256=5b79a31a8484bf0a618c2810e66c0ab542fd86ceeb76e7a5cd07a86284c4f6ac -->
57
- ## 设计器源码事件
58
-
59
- 只有在扩展界面引擎设计器源码时才使用全局事件总线。用
60
- `EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
61
- 组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
62
- 触发多次;普通页面 JSON 生成不需要注册事件总线。
63
-
64
- <!-- /microi-progressive:chunk -->
65
- <!-- microi-progressive:chunk id=page-engine-001 sha256=53cf1992d4adcf8126f4d0a04d373d685d539b38c5d74840ba07905e9cbe4589 -->
66
- ## 核心数据结构
67
-
68
- ```
69
- formData(页面)
70
- ├── Id: string // 页面唯一ID(GUID)
71
- ├── Title: string // 页面标题
72
- ├── Number: string // 页面编号(如 PAGE1)
73
- ├── Desc: string // 页面描述
74
- └── JsonObj
75
- ├── formConfig // 页面全局配置
76
- └── wrapperList[] // 容器列表
77
- ├── wrapperOption // 容器配置
78
- └── widgetList[] // 组件列表
79
- ├── widgetOption // 组件通用配置
80
- └── widgetParams[] // 组件私有参数
81
- ```
82
-
83
- <!-- /microi-progressive:chunk -->
84
- <!-- microi-progressive:chunk id=page-engine-002 sha256=227ecf87086231eee28a9d91fde6a178a437e9196dd8f2ef1d14d53e5c5858df -->
85
- ## formConfig 页面全局配置
86
-
87
- ```json
88
- {
89
- "gutter": 0, "mask": true, "drag": true, "left": true,
90
- "hover": true, "shadow": true, "link": false, "watermark": false,
91
- "mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
92
- "watermarkStyle": {
93
- "content": "Microi吾码",
94
- "font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
95
- "rotate": -22
96
- },
97
- "dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
98
- }
99
- ```
100
-
101
- <!-- /microi-progressive:chunk -->
102
- <!-- microi-progressive:chunk id=page-engine-003 sha256=7bb7cb860f9330002f60748e93de3c639b157cddfd77b63ac8b19f0535306e65 -->
103
- ## 容器类型
104
-
105
- | type | label | 说明 |
106
- |------|-------|------|
107
- | `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
108
- | `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
109
-
110
- ### 卡片容器(pannel)关键字段
111
-
112
- ```json
113
- {
114
- "type": "pannel",
115
- "label": "卡片",
116
- "hidden": false,
117
- "wrapperOption": {
118
- "number": 10001, // 随机5位整数,页面内唯一
119
- "span": 12, // 栅格宽度(1-24,24=满宽)
120
- "height": 300, // 容器高度(px)
121
- "margin": "0px 10px 10px 0px",
122
- "dynamicStyle": { "padding": "10px", "backgroundColor": "" },
123
- "titleOption": {
124
- "hidden": true, // true=隐藏标题
125
- "title": "未命名",
126
- "dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
127
- "moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
128
- }
129
- },
130
- "widgetList": []
131
- }
132
- ```
133
-
134
- ### 选项卡容器(tabs)
135
-
136
- 组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
137
-
138
- ```json
139
- {
140
- "type": "tabs",
141
- "wrapperOption": {
142
- "number": 10002, "span": 24, "height": 400,
143
- "tabType": "", // '' | 'card' | 'border-card'
144
- "tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
145
- "tabs": [
146
- { "key": "tab_1", "label": "标签页1" },
147
- { "key": "tab_2", "label": "标签页2" }
148
- ],
149
- "activeTab": "tab_1"
150
- },
151
- "tabWidgetMap": { "tab_1": [], "tab_2": [] },
152
- "widgetList": []
153
- }
154
- ```
155
-
156
- <!-- /microi-progressive:chunk -->
157
- <!-- microi-progressive:chunk id=page-engine-004 sha256=66261254d94455648441bf3519a5c810ede60c64f341dce035f931e284f762ba -->
158
- ## 组件通用结构
159
-
160
- ```json
161
- {
162
- "type": "bar",
163
- "label": "柱状图",
164
- "category": 0,
165
- "show": 1,
166
- "widgetOption": {
167
- "number": 20001, // 随机5位整数,页面内唯一
168
- "wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
169
- "span": 24,
170
- "height": 280,
171
- "dynamicStyle": { "padding": "8px", "backgroundColor": "" }
172
- },
173
- "widgetParams": []
174
- }
175
- ```
176
-
177
- <!-- /microi-progressive:chunk -->
178
- <!-- microi-progressive:chunk id=page-engine-005 sha256=e9667b97462c9089a72d2a407cfde00e873afe7d64593bf33ad49a523255b38d -->
179
- ## widgetParams 参数类型
180
-
181
- | type | 说明 | value 类型 |
182
- |------|------|-----------|
183
- | `textarea` | 多行文本(数据来源) | `string` |
184
- | `input` | 单行文本 | `string` |
185
- | `number` | 数字 | `number` |
186
- | `switch` | 开关 | `boolean` |
187
- | `slider` | 滑块 | `number` |
188
- | `color` | 颜色选择 | `string` |
189
- | `select` | 下拉选择 | `string` |
190
- | `radio` | 单选组 | `string` |
191
-
192
- <!-- /microi-progressive:chunk -->
193
- <!-- microi-progressive:chunk id=page-engine-006 sha256=7347b2b4290db41ae8c3ef128acc9854a5e17290268b8e274e771de47b8f752a -->
194
- ## 数据来源(widgetParams[0])
195
-
196
- 大多数组件的第一个参数(sort=0)是"数据来源":
197
- - **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
198
- - **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
199
-
200
- **接口引擎地址格式:**
201
- ```
202
- $ApiBase$/apiengine/{ApiEngineKey}
203
- ```
204
-
205
- <!-- /microi-progressive:chunk -->
206
- <!-- microi-progressive:chunk id=page-engine-007 sha256=5f2ed06aa1e0abbc5f968f026602d92f22f01836d76fdf502fd91ca0f945509b -->
207
- ## 运行态布局与滚动规范
208
-
209
- - 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
210
- - 经典桌面主滚动容器为路由内容区,导航与 Tab 留在视口内;移动端继续保留外层文档滚动。图表在异步挂载后绑定尺寸观察器,切换导航、收缩侧栏及改变窗口宽度都应重新测量,禁止仅隐藏溢出而保留错误画布宽度。真实回归覆盖两种导航、两种桌面宽度,以及日程创建后刷新、备注编辑和删除。
211
- - 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
212
- - 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
213
- - 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
214
- - 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
215
- - 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
216
- - 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
217
- - `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
218
- - 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
219
-
220
- <!-- /microi-progressive:chunk -->
221
- ## 详细参考路由(渐进披露)
222
-
223
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
224
-
225
- - [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
226
- - [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
227
- <!-- microi-progressive:end -->
1
+ ---
2
+ name: page-engine
3
+ description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi 界面引擎(Page Engine)页面 JSON 生成
9
+
10
+ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_page_design`;版本治理入口见下文。保存工具写入后仍需回读 `mic_page`,不能把生成成功当作持久化成功。
11
+
12
+ ## 完整 AI 开发默认报表(强制)
13
+
14
+ 完整系统开发必须按需求主动设计基于界面引擎的业务统计、老板经营与领导管理报表,
15
+ 先把相应入口纳入菜单骨架,再接通真实数据并验收。详细范围与菜单切换流程读取
16
+ [菜单先行与经营报表增补要求](../microi-system-delivery/references/progressive-01-标准工作流.md#菜单先行与经营报表增补要求强制)。
17
+ 局部修改只覆盖相关页面/指标,只读分析不创建页面。用户明确的范围优先。
18
+
19
+ - 每个报表服务明确角色与决策任务;业务运营覆盖状态、趋势、效率与异常,经营视角覆盖
20
+ 有真实来源的规模、收支/利润、回款及风险,管理视角覆盖部门/人员、任务进展、待办/逾期、
21
+ 利用与达成。不存在数据来源的指标标为不适用并说明,不能编造成本、利润或业绩。
22
+ - 每个指标定义来源、公式、单位/精度、状态、时间字段/时区/边界、比较基期、维度与角色。
23
+ 当前租户真实数据通过服务端批量聚合,时间/维度筛选和用户数据权限必须在接口中生效。
24
+ 禁止演示值、本页合计冒充全量或前端拉取全量明细再统计。
25
+ - 页面包含周期/维度筛选、加载、零/空、无权限和失败状态;请求失败不能显示为正常零值。
26
+ 指标/图表穿透到同一口径的授权明细并对账。界面引擎负责看板和图表,分页查询/导出明细
27
+ 配合 `report-engine`;列表汇总、Hero 和角标不能替代决策报表。
28
+ - 保存后回读 `mic_page`、菜单绑定、数据源/接口;以管理员、经营/管理角色、普通与无权限
29
+ 角色验证时间边界、筛选、隔离、零/空/失败和明细对账,完成电脑/移动、明暗主题截图。
30
+ 先从已授权候选入口独立预验收,再以回读后的真实页面 Id 切换同一菜单并按打开方式设置标记,
31
+ 保留菜单身份与权限;从原 URL 最终验收,失败精确恢复本菜单原绑定并记录未完成。
32
+
33
+ ## 紧凑报表与平台主题
34
+
35
+ 需要“主指标 + 多行次指标 + 图表 + 排行表 + 资讯”布局时,可读取 [examples/compact-dashboard.json](examples/compact-dashboard.json) 作为原生组件示例。示例数值仅用于视觉排版,交付业务报表前必须替换为当前租户的真实数据源。
36
+
37
+ 默认使用 `formConfig.themeMode="system"`、`density="compact"`,卡片背景使用 `var(--el-bg-color)`、页面背景使用 `var(--el-bg-color-page)`,正文使用平台文字变量。不要因为“驾驶舱/大屏”字样就强制深色。显式指定浅色或深色时才使用 `light/dark`。
38
+
39
+ 运行容器默认 `wrapperOption.heightMode="content"`,`height` 只保留设计器布局尺寸。仅需固定图形画布时设为 `fixed`;图表自身可以设置 240–320px 高度。不要为一行指标、标题、三行表格预留 200–400px 空容器。紧凑布局的卡片间距建议 10–16px,面板内边距 8–16px;统计组件 `widgetParams[24].value` 支持 `summary`(图标和大数字)、`detail`(多行小指标)及兼容的 `cards`。
40
+
41
+ 用户提供参考截图时,先拆出面板行列比例、指标主次、图表与表格高度、标题/筛选位置,再用原生 pannel/statistic/chart/tabel/list 组合配置。不能把所有指标替换成一排大色块,也不能用模板假数据声称已接通客户业务。必须用同一视口截图检查浅色和平台深色,检查页面缩放后的断行与纵向空白;布局接近度和真实数据绑定分别验收。
42
+
43
+ ### 平台智能工作首页
44
+
45
+ 保留 `aiengine` 原生 AI 创作中心,与 `homeoverview` 工作概览组成桌面首行 14/10 栅格;任务、月历与公告放在下一行,移动端自动切为 24 栅格。不能把任务的完整 15 行列表或未配置日程的大空白块直接堆在首屏。
46
+
47
+ - `homeoverview.widgetParams[0]` 为真实个人统计接口 `platform-home-overview`,`[1].value="compact"` 启用紧凑指标、常用应用与趋势;所有数据仍受当前用户权限过滤。
48
+ - `workcenter.widgetParams` 按索引依次为视图、工作菜单、流程菜单、公告菜单、日历菜单、分页条数;`[5].value=5` 用于首页任务,范围 5–20,不能影响独立“我的工作”页面。
49
+ - `diycalendar.widgetParams[0].value` 应绑定当前账号可访问、关联 `microi_calendar` 的真实模块 Id;`[1].value="compact"` 只压缩月历密度,仍须支持点击日期新增及事件编辑、删除。备注字段为 `Remark`。隐藏菜单也可以是授权入口,旧模块可能没有 `DiyTableName`,此时必须显式绑定实际模块,不把只读日期回退当作日程验收成功。无模块时展示本月日期并明确提示未配置,不伪造任务。
50
+ - `diytable.widgetParams[4].value="NoticeList"` 以只读公告列表展示真实授权公告;表、菜单仍在 `[0]/[1]`,模块缺失时使用 `referencePolicy.onMissing="RemoveWidget"` 移除可选组件及空容器。
51
+ - 修改已有首页前通过 MCP 读取页面及历史 `CurrentHash`,保存传 `expectedCurrentHash`,再回读 JSON 和历史,保留可恢复版本。
52
+
53
+ 你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
54
+
55
+ <!-- microi-progressive:begin -->
56
+ <!-- microi-progressive:chunk id=page-engine-000 sha256=44233416e71cc6ff3712347308dadd26e55b14938b81b8a2401478c6bc14921b -->
57
+ ## 设计器源码事件
58
+
59
+ 设计器选中事件只能在 `isDesignMode` 为真时执行 `preventDefault/stopPropagation` 和选中状态写入。运行和预览页面必须保留 HTML 链接、按钮与键盘激活的浏览器默认行为。链接使用实际授权菜单路由,保存后逐一点击验证,不以 JSON 中存在 href 代替跳转验收;回归入口为 `Microi.Client/tests/page-engine-runtime-click.spec.mjs`。
60
+
61
+ 每个顶层运行路由必须创建并 provide 独立的 `PAGE_ENGINE_STORE_KEY`,其子组件通过 `usePageEngineStore` 使用当前渲染树的状态。不能让多个 KeepAlive 页面共用应用级 `formData`,否则迟到响应和页面激活会导致错页;验收需覆盖地图与看板往返、迟到响应、移动布局和主题隔离。
62
+
63
+ 只有在扩展界面引擎设计器源码时才使用全局事件总线。用
64
+ `EventBus.on(eventName, handler)` 监听保存、日期选择或组件跳转等事件,并在
65
+ 组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
66
+ 触发多次;普通页面 JSON 生成不需要注册事件总线。
67
+
68
+ <!-- /microi-progressive:chunk -->
69
+ <!-- microi-progressive:chunk id=page-engine-001 sha256=57717991f9c7de557b524ec36fc9bdd716080b71b682439f1b6662b0b9b2f45c -->
70
+ ## 核心数据结构
71
+
72
+ ```
73
+ formData(页面)
74
+ ├── Id: string // 页面唯一ID(GUID)
75
+ ├── Title: string // 页面标题
76
+ ├── Number: string // 页面编号(如 PAGE1)
77
+ ├── Desc: string // 页面描述
78
+ └── JsonObj
79
+ ├── formConfig // 页面全局配置
80
+ └── wrapperList[] // 容器列表
81
+ ├── wrapperOption // 容器配置
82
+ └── widgetList[] // 组件列表
83
+ ├── widgetOption // 组件通用配置
84
+ └── widgetParams[] // 组件私有参数
85
+ ```
86
+
87
+ <!-- /microi-progressive:chunk -->
88
+ <!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
89
+ ## formConfig 页面全局配置
90
+
91
+ ```json
92
+ {
93
+ "gutter": 0, "mask": true, "drag": true, "left": true,
94
+ "hover": true, "shadow": true, "link": false, "watermark": false,
95
+ "mobile": false, "dark": false, "autoRefresh": 0, "lastRefreshTime": "",
96
+ "watermarkStyle": {
97
+ "content": "Microi吾码",
98
+ "font": { "fontSize": 16, "color": "rgba(255, 0, 0, 0.15)" },
99
+ "rotate": -22
100
+ },
101
+ "dynamicStyle": { "padding": "4px", "backgroundColor": "", "opacity": 1 }
102
+ }
103
+ ```
104
+
105
+ <!-- /microi-progressive:chunk -->
106
+ <!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
107
+ ## 容器类型
108
+
109
+ | type | label | 说明 |
110
+ |------|-------|------|
111
+ | `pannel` | 卡片 | 标准容器,包含一个 `widgetList` |
112
+ | `tabs` | 选项卡 | 多标签页容器,使用 `tabWidgetMap` 存储每个 tab 的组件 |
113
+
114
+ ### 卡片容器(pannel)关键字段
115
+
116
+ ```json
117
+ {
118
+ "type": "pannel",
119
+ "label": "卡片",
120
+ "hidden": false,
121
+ "wrapperOption": {
122
+ "number": 10001, // 随机5位整数,页面内唯一
123
+ "span": 12, // 栅格宽度(1-24,24=满宽)
124
+ "height": 300, // 容器高度(px)
125
+ "margin": "0px 10px 10px 0px",
126
+ "dynamicStyle": { "padding": "10px", "backgroundColor": "" },
127
+ "titleOption": {
128
+ "hidden": true, // true=隐藏标题
129
+ "title": "未命名",
130
+ "dynamicStyle": { "textAlign": "left", "padding": "0px", "height": "20px", "lineHeight": "20px", "fontSize": "14px", "color": "" },
131
+ "moreOption": { "hidden": true, "icon": "More", "iconShow": false, "text": "更多", "linkurl": "/", "linktype": "router", "refresh": "0", "datetime": "0", "autotime": false, "autotimeval": 1, "dynamicStyle": { "color": "", "fontSize": "12px" } }
132
+ }
133
+ },
134
+ "widgetList": []
135
+ }
136
+ ```
137
+
138
+ ### 选项卡容器(tabs)
139
+
140
+ 组件放在 `tabWidgetMap[tabKey][]` 中,**不**放在 `widgetList` 中。
141
+
142
+ ```json
143
+ {
144
+ "type": "tabs",
145
+ "wrapperOption": {
146
+ "number": 10002, "span": 24, "height": 400,
147
+ "tabType": "", // '' | 'card' | 'border-card'
148
+ "tabPosition": "top", // 'top' | 'right' | 'bottom' | 'left'
149
+ "tabs": [
150
+ { "key": "tab_1", "label": "标签页1" },
151
+ { "key": "tab_2", "label": "标签页2" }
152
+ ],
153
+ "activeTab": "tab_1"
154
+ },
155
+ "tabWidgetMap": { "tab_1": [], "tab_2": [] },
156
+ "widgetList": []
157
+ }
158
+ ```
159
+
160
+ <!-- /microi-progressive:chunk -->
161
+ <!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
162
+ ## 组件通用结构
163
+
164
+ ```json
165
+ {
166
+ "type": "bar",
167
+ "label": "柱状图",
168
+ "category": 0,
169
+ "show": 1,
170
+ "widgetOption": {
171
+ "number": 20001, // 随机5位整数,页面内唯一
172
+ "wrapperNumber": 10001, // 必须等于所在容器的 wrapperOption.number
173
+ "span": 24,
174
+ "height": 280,
175
+ "dynamicStyle": { "padding": "8px", "backgroundColor": "" }
176
+ },
177
+ "widgetParams": []
178
+ }
179
+ ```
180
+
181
+ <!-- /microi-progressive:chunk -->
182
+ <!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
183
+ ## widgetParams 参数类型
184
+
185
+ | type | 说明 | value 类型 |
186
+ |------|------|-----------|
187
+ | `textarea` | 多行文本(数据来源) | `string` |
188
+ | `input` | 单行文本 | `string` |
189
+ | `number` | 数字 | `number` |
190
+ | `switch` | 开关 | `boolean` |
191
+ | `slider` | 滑块 | `number` |
192
+ | `color` | 颜色选择 | `string` |
193
+ | `select` | 下拉选择 | `string` |
194
+ | `radio` | 单选组 | `string` |
195
+
196
+ <!-- /microi-progressive:chunk -->
197
+ <!-- microi-progressive:chunk id=page-engine-006 sha256=2c021e43f4f0d730da1f5a5cf6a2d314589435e2bb9ff573148c787538a8cc86 -->
198
+ ## 数据来源(widgetParams[0])
199
+
200
+ 大多数组件的第一个参数(sort=0)是"数据来源":
201
+ - **静态数据**:`value` 为空,数据在 `typeOptions.dataJson` 中
202
+ - **动态接口**:`value` 设为接口地址,运行时请求替换 `dataJson`
203
+
204
+ **接口引擎地址格式:**
205
+ ```
206
+ $ApiBase$/apiengine/{ApiEngineKey}
207
+ ```
208
+
209
+ <!-- /microi-progressive:chunk -->
210
+ <!-- microi-progressive:chunk id=page-engine-007 sha256=4170c6e274fc773427057d8606c4800a5bbd5fabd62d63e931aaa388262a51e9 -->
211
+ ## 运行态布局与滚动规范
212
+
213
+ - 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
214
+ - 经典桌面主滚动容器为路由内容区,导航与 Tab 留在视口内;移动端继续保留外层文档滚动。图表在异步挂载后绑定尺寸观察器,切换导航、收缩侧栏及改变窗口宽度都应重新测量,禁止仅隐藏溢出而保留错误画布宽度。真实回归覆盖两种导航、两种桌面宽度,以及日程创建后刷新、备注编辑和删除。
215
+ - 固定高度只用于设计器拖拽预览、图表画布或确有虚拟滚动需求的组件。设计态可按 `widgetOption.height` 提供滚动,运行态必须先验证内容能完整展开;不能用双滚动条掩盖容器高度不足。
216
+ - 表格型容器通常按 15 条数据验收,表头、工具栏、全部数据行和分页区应同时可见;首页紧凑表格可通过 `diy-table` 的 `PageSizeList` 追加 `[10]`,并在 `sys_menu.DefaultPageSize` 为空时默认选择候选页码中的最小值。空间不足时先压缩统计卡、工具栏、行高和间距,再考虑增加外层页面长度,不隐藏分页、不在卡片内部滚动。
217
+ - 同一行的容器使用一致的左右边距、内边距、标题高度和顶部基线;同层卡片间距必须相同,左右边缘、标题、工具栏和内容区应形成稳定对齐线。推荐使用统一的 8px 基础间距和 8/12/16px 倍数。
218
+ - 成对容器应设置相同的最小高度;内容较少的组件通过内容居中、合理留白或自适应布局消化空间,不能在底部留下明显的大块无意义空白。内容较多时允许容器自然增高并由页面继续向下滚动。
219
+ - 日历和公告应完整展示工具栏、主体和底部操作区;日历优先使用 `height: auto` / `contentHeight: auto`,公告优先使用标准表单引擎分页与权限按钮。
220
+ - 运行态移动端必须按实际视口自动切为 24 栅格,不能只依赖保存 JSON 中的 `formConfig.mobile`;窗口旋转或宽度变化时也要同步。嵌入的 `diytable` 不得渲染独立列表页的固定返回栏和全局 FAB,新增、页面按钮、批量操作应留在当前容器工具栏内;容器标题操作区允许紧凑换行,但不能绝对定位覆盖标题或其它卡片。
221
+ - `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
222
+ - 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
223
+
224
+ <!-- /microi-progressive:chunk -->
225
+ ## 详细参考路由(渐进披露)
226
+
227
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
228
+
229
+ - [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
230
+ - [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
231
+ <!-- microi-progressive:end -->