fix(plugin): 品牌标字段改用官方口径 logo/logoDark(PNG/SVG 均可),studio 0.3.13 / writer 0.1.4
CI / contract (push) Has been cancelled

上一版把技能字段 iconSmall/iconLarge 写进了插件清单——插件不认这两个键,卡片图标不会显示。对照官方内置插件(latex/visualize/deep-research)的真实清单,插件品牌标是 interface.logo + interface.logoDark(相对插件根,PNG 或 SVG 都接受;latex 用 512×512 PNG,visualize 用 SVG),而 iconSmall/iconLarge 属于**技能**的 SkillInterface。

本提交:assets/logo.svg(浅色,门店 favicon 同源)+ assets/logo-dark.svg(深色,填色 #e5e5e5,与 @deta/ui Logo 的 currentColor 行为一致),interface.logo/logoDark 指向二者并移除 iconSmall/iconLarge;契约校验 E5 改为校验 logo/logoDark(缺失/越界/文件不存在均报错,hint 里点明 icon* 是技能字段)。已装副本 interface 键序与官方一致。
This commit is contained in:
ringo
2026-09-20 16:32:29 +08:00
parent 774e27cfc8
commit abb5835310
9 changed files with 27 additions and 20 deletions
+7 -6
View File
@@ -71,8 +71,9 @@ const RULES = {
},
E5: {
level: 'error',
what: '插件图标的路径不存在(interface.iconSmall / iconLarge 指向缺失文件或越出插件根)',
hint: '图标必须是插件根下的相对路径(如 ./assets/logo.svg),且文件真实存在——品牌标用 deta.city 的 logo.svg',
what: '插件品牌标(interface.logo / logoDark)缺失、路径越出插件根或文件不存在',
hint: '插件清单用 logo / logoDark 指向插件根内相对路径(如 ./assets/logo.svg,深色主题给 logoDark);'
+ '注意 iconSmall/iconLarge 是**技能**的字段,插件里写了不生效',
},
};
@@ -150,7 +151,7 @@ for (const rel of ['.agents/plugins/marketplace.json', '.agents/plugins/api_mark
}
}
// E5:插件图标引用必须落在插件根内且真实存在(品牌标 = deta.city logo)
// E5:插件品牌标(logo / logoDark)必须落在插件根内且真实存在
for (const pluginDir of ['plugins/studio', 'plugins/writer']) {
const manifest = join(ROOT, pluginDir, '.codex-plugin', 'plugin.json');
if (!existsSync(manifest)) continue;
@@ -160,13 +161,13 @@ for (const pluginDir of ['plugins/studio', 'plugins/writer']) {
} catch {
continue; // 清单不合法由 validate_plugin.py 报
}
for (const key of ['iconSmall', 'iconLarge']) {
for (const key of ['logo', 'logoDark']) {
const val = String(itf[key] ?? '');
if (!val) {
add('E5', manifest, 1, `interface.${key} 未设置(品牌标应指向 ./assets/logo.svg)`);
add('E5', manifest, 1, `interface.${key} 未设置(品牌标应指向 ./assets/logo.svg / ./assets/logo-dark.svg)`);
continue;
}
if (/^https?:/i.test(val)) continue; // *Url 形态才是远端地址
if (/^https?:/i.test(val)) continue; // 远端地址形态
if (val.includes('..') || !val.startsWith('./')) {
add('E5', manifest, 1, `${key} 必须是插件根内相对路径(收到 ${val})`);
continue;