@microi.net/cli 6.2.1 → 6.2.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.
- 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 +5 -5
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +144 -119
- package/scripts/microi-cli.js +54 -54
- package/scripts/microi-skills.meta.json +247 -238
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +40 -40
- package/skills/README.md +1 -1
- package/skills/microi-client-frontend/SKILL.md +20 -14
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +9 -1
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-datasource-mapping/SKILL.md +5 -0
- package/skills/microi-db-schema/references/form-component-options.md +7 -0
- package/skills/microi-deployment/SKILL.md +3 -3
- package/skills/microi-deployment/references/deployment-matrix.md +1 -1
- package/skills/microi-docs-coverage/references/capability-map.md +6 -6
- package/skills/microi-form-engine/SKILL.md +21 -3
- package/skills/microi-form-engine/references/business-numbering.md +70 -0
- package/skills/microi-form-engine/references/component-catalog.md +4 -0
- package/skills/microi-form-engine/references/component-config-index.md +359 -0
- package/skills/microi-form-engine/references/data-source-events.md +7 -1
- package/skills/microi-form-engine/references/form-generation-quality.md +160 -0
- package/skills/microi-system-delivery/SKILL.md +7 -0
- package/skills/microi-system-delivery/references/delivery-pitfalls.md +5 -0
- package/skills/microi-uniapp-frontend/SKILL.md +3 -1
- package/skills/microi.v8.js +6 -4
- package/skills/module-engine/SKILL.md +8 -0
- package/skills/scripts/sync-embedded-skills.mjs +13 -0
- package/skills/uniapp-mall-assets/SKILL.md +3 -0
- package/skills/v8-file-upload/SKILL.md +283 -283
- 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 +7 -1
- package/skills/v8-frontend-events/SKILL.md +14 -6
- package/skills/v8-image-processing/SKILL.md +13 -2
- package/skills/v8-image-processing/references/api-reference.md +49 -3
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +6 -1
- package/skills/v8-utilities/references/server-api-index.md +1 -0
- package/skills/vision-engine/references/video-timeline.md +1 -0
package/skills/microi.v8.js
CHANGED
|
@@ -569,7 +569,7 @@ function installDatePrototypeCompat() {
|
|
|
569
569
|
}
|
|
570
570
|
}
|
|
571
571
|
|
|
572
|
-
// BEGIN GENERATED PUBLIC RESOURCE ROUTER; source SHA256
|
|
572
|
+
// BEGIN GENERATED PUBLIC RESOURCE ROUTER; source SHA256 94e9f239a70d003f6513a205d02e5d3dcaf3e80268bb3735523047949518ce9a
|
|
573
573
|
const createSdkPublicResourceClient = (() => {
|
|
574
574
|
// 公有资源路由的纯校验器与实际消费者桥接;私有分支继续走既有授权接口。
|
|
575
575
|
const HASH = /^[a-f0-9]{64}$/;
|
|
@@ -583,10 +583,10 @@ function key(value) {
|
|
|
583
583
|
return value;
|
|
584
584
|
}
|
|
585
585
|
const encodeKey = value => value.split('/').map(encodeURIComponent).join('/');
|
|
586
|
-
function plainBase(value, originOnly = false) {
|
|
586
|
+
function plainBase(value, originOnly = false, legacyPrimary = false) {
|
|
587
587
|
if (typeof value !== 'string' || /[\\%?#@\u0000-\u0020\u007f]/.test(value)) throw Error('InvalidPublicBinding');
|
|
588
588
|
const parsed = new URL(value);
|
|
589
|
-
if (parsed.protocol !== 'https:' || parsed.username || parsed.password || parsed.search || parsed.hash
|
|
589
|
+
if ((parsed.protocol !== 'https:' && !(legacyPrimary && parsed.protocol === 'http:')) || parsed.username || parsed.password || parsed.search || parsed.hash
|
|
590
590
|
|| (originOnly && parsed.pathname !== '/')) throw Error('InvalidPublicBinding');
|
|
591
591
|
return value.replace(/\/+$/, '');
|
|
592
592
|
}
|
|
@@ -617,7 +617,9 @@ function legacyPublicFallback(input, binding) {
|
|
|
617
617
|
const rawKey = decoratedAt < 0 ? relative : relative.slice(0, decoratedAt);
|
|
618
618
|
const suffix = decoratedAt < 0 ? '' : relative.slice(decoratedAt);
|
|
619
619
|
const objectKey = key(rawKey.split('/').map(part => decodeURIComponent(part)).join('/'));
|
|
620
|
-
|
|
620
|
+
// Preserve the tenant's existing HTTP FileServer only for the original
|
|
621
|
+
// public fallback. Verified backup/alias bindings remain HTTPS-only.
|
|
622
|
+
return plainBase(binding?.primaryBase, false, true) + '/' + encodeKey(objectKey) + suffix;
|
|
621
623
|
} catch { return ''; }
|
|
622
624
|
}
|
|
623
625
|
function identify(input, binding) {
|
|
@@ -136,6 +136,11 @@ HTTP 成功或菜单字段非空不足以证明统计有效。
|
|
|
136
136
|
|
|
137
137
|
## AI 模块视觉交付门禁(强制)
|
|
138
138
|
|
|
139
|
+
涉及编号、长串编码或来源/去向时,读取
|
|
140
|
+
[业务编号与追溯契约](../microi-form-engine/references/business-numbering.md)。
|
|
141
|
+
默认采用业务名称配业务编号,正常 Code 不按字段名隐藏;外部/历史编码保持来源映射,
|
|
142
|
+
真实追溯核对目标菜单、记录和权限,不能只给文字加蓝色。显式布局与隐藏配置先回读再合并。
|
|
143
|
+
|
|
139
144
|
对每个 `Display=1` 或 `AppDisplay=1` 且绑定业务表的 Diy 模块,AI 不能只依赖 CRUD
|
|
140
145
|
默认页,也不能只写 `Name/DiyTableId` 后结束。至少完成以下设计和回读:
|
|
141
146
|
|
|
@@ -298,6 +303,9 @@ PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须
|
|
|
298
303
|
- PC 和移动端分别验证;MicroService 还要验证运行时、页面路由和宿主上下文。
|
|
299
304
|
### 多级表头与顶部 Banner
|
|
300
305
|
|
|
306
|
+
- UniApp 通用模块行按钮使用 `MoreBtns[].ActionSchema` 进入列表“更多”;详情合并 `FormBtns`、`MoreBtns` 与视图 `Layout.Actions`,按 `Key` 去重,常用动作与编辑并排放到底部固定栏,其余进入“更多”。仅 PC `V8CodeShow` 不构成移动端显隐条件,必须另给 `VisibleWhen`;接口继续鉴权。该渲染行为需重新编译 UniApp 客户端,不能把菜单保存当作客户端已更新。
|
|
307
|
+
- `Layout.Hero` 辅助文字使用 `MetaField`,不使用未支持的 `SubtitleField`;图片、背景、设备/客户字段由模块元数据提供,禁止写死到通用页面。无业务图标的统计卡只居中展示条数,不显示平台占位图标。
|
|
308
|
+
|
|
301
309
|
- 字段权限使用模块 `FieldPermissions`(Manifest `fieldPermissions`),Version=1;按 Everyone/Roles/Users/Departments/Jobs 与 Fields 配置 Visible/Editable,授权对象数组保存 Id。多个匹配组限制取交集,隐藏同时不可编辑;普通用户按最终能力执行,超级管理员按原管理边界。岗位来自 `diy_job`(显示 `JobName`),匹配权威 `sys_user.Jobs` 中的岗位 Id;岗位与角色 `RoleIds` 分开,不得相互替代。
|
|
302
310
|
- 不能只做前端隐藏:FormEngine 查询、隐藏字段条件/排序/统计、导出、写入和导入均须校验。生成代码使用服务端 `DataAppend.FieldAccess`;未传菜单的客户端不能绕过该表已启用的模块限制。验收应覆盖普通账号、直接请求、角色/人员/部门/岗位匹配与只读写入失败。
|
|
303
311
|
- 树模块拖动排序配置 `TreeDragSortEnabled`、`TreeDragSortField`(Manifest 同名小驼峰),排序字段必须为已注册数值字段。业务由 Managed、非匿名接口引擎 `mci-tree-drag-sort` 执行,可信原子仅负责固定引擎的模块解析、权限和白名单写入。
|
|
@@ -38,6 +38,19 @@ for (const name of names) {
|
|
|
38
38
|
text += `\n\n${fs.readFileSync(source, 'utf8')}`;
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
+
// 常规责任 Skill 也会把必读决策和源码索引放到 references;平台 AI 无法访问工作区路径,
|
|
42
|
+
// 必须把显式链接的同目录参考一并嵌入,不能只同步一张指向不可读文件的入口。
|
|
43
|
+
const included = new Set(references.map(reference => reference.path));
|
|
44
|
+
const entry = fs.readFileSync(path.join(skillsRoot, name, 'SKILL.md'), 'utf8');
|
|
45
|
+
const localReferences = [...new Set([...entry.matchAll(/(?:\(|`)(references\/[^\s)`#]+\.md)(?:#[^\s)`]*)?(?:\)|`)/g)].map(match => match[1]))].sort();
|
|
46
|
+
for (const reference of localReferences) {
|
|
47
|
+
if (included.has(reference)) continue;
|
|
48
|
+
const source = path.resolve(skillsRoot, name, reference);
|
|
49
|
+
const relative = path.relative(path.join(skillsRoot, name), source);
|
|
50
|
+
if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('参考文件越过 Skill 目录。');
|
|
51
|
+
text += `\n\n${fs.readFileSync(source, 'utf8')}`;
|
|
52
|
+
included.add(reference);
|
|
53
|
+
}
|
|
41
54
|
text = `${stripMarkers(text).replace(/\r\n/g, '\n').trimEnd()}\n`;
|
|
42
55
|
const target = path.join(serverRoot, 'Resource', file);
|
|
43
56
|
const before = fs.existsSync(target) ? fs.readFileSync(target, 'utf8') : '';
|
|
@@ -36,6 +36,9 @@ Microi 上传字段存在四种必须长期兼容的存储形态,不能假设
|
|
|
36
36
|
|
|
37
37
|
`FileServer` 是对象存储/CDN 地址,不等同于 API 服务。租户切换时必须使用当前 `OsClient` 的运行期配置,禁止在源码中写死域名或租户目录。
|
|
38
38
|
|
|
39
|
+
- 历史配置的原始 `FileServer` 主地址兼容 HTTP/HTTPS。公有相对路径的兼容回退保留协议、端口和路径前缀,不强制升级 HTTPS,也不改拼 API Base;仅此原始主地址允许 HTTP。备用绑定、源地址映射和别名仍限定 HTTPS 并通过原验证,私有路径、带凭据地址及危险协议的限制不变。
|
|
40
|
+
- 公共解析器以 `Microi.Client/src/utils/public-resource-router.mjs` 为单一事实源;修改后运行 `node microi.skills/scripts/sync-public-resource-router.mjs --write` 同步三份 SDK 生成块并执行 `--check`。PlatformService 的 SDK 属于其源码输入,变更后必须按原生 Bundle 入口重建及更新四个所属应用包,不能只更新 PC 或手改嵌入 Base64。
|
|
41
|
+
|
|
39
42
|
### 跨端上传字段的形态与桶属性
|
|
40
43
|
|
|
41
44
|
- 控件读取嵌套 `Config.ImgUpload/FileUpload.Multiple` 与 `MaxCount`;`Multiple=false` 保存单图对象,不能因数量上限或默认九图值而保存数组。已有单元素数组在单图控件中按第一项读取,不在查看时回写业务数据。
|