跳到主要内容

打包 .channekcard

.channekcard 是卡的分发形态:一个 zip 单文件包 = 卡目录 + 可选的 plugins/(按 requires 收进来的配套插件)。

组合包:一起分发,各归各位

导出时,打包器可以把卡 requires 里声明、且本机已装的插件一并收进包里——收卡人拿到一个文件就是完整的一套。导入时拆包分道处理:

  • 卡进卡库——纯数据,免代码信任门,但过容器安检(逐条目拒绝路径逃逸、软链、超限体积等,防的是压缩包本身的攻击面);
  • plugins/ 逐个走插件安装——各过各的信任门与签名校验,逐项向用户披露 id / 版本 / 信任级 / 权限并要求确认。

卡目录内恒无插件实体(见卡与插件的关系)——组合包只是分发时的同行,不是嵌套。

bundle 段:出门时不带什么、带一条什么样

"bundle": {
"omit": [
{
"path": "品牌套件/ip/动作库", // 卡内相对路径,前缀匹配
"reason": "IP 动作素材与形象绑定,请用你自己的形象生成一套"
}
],
"demo": {
"path": "示例/first-video", // 随卡示例内容(卡内独立目录)
"license": "sample-only", // sample-only(默认) / cc-by / inherit
"reel": "示例/reel.mp4" // 可选样片(≤30s,市场种草用)
}
}

omit 声明「收卡人应该自己产出」的部分。一条声明同时服务两处:打包时跳过、导入披露时告诉对方「这块要你自己做」——分成两个字段就可能不一致,而不一致的表现是「包里没有、也没人告诉我要补」。

demo 是随卡的示例内容:一条能空跑一遍的样例,让收卡人不建内容就看得出「这张卡产出的东西长什么样」。它住卡内独立目录、不进内容目录——示例不是频道的内容,混进去会污染条目列表与进度判据。license 默认 sample-only:作者带一段自己的片子作样例,不代表授权拿去商用;写 inherit 才跟随卡本身的许可。

瘦身:不是优化,是前提

品牌套件动辄几百 MB 到上 GB,不可能整包塞进卡包。打包要挑「买家真正需要的」:

  • 带走:授权允许的字体、logo、色板、复用片段、提示词、文档;
  • omit 掉:与作者形象绑定的素材(用 reason 说清怎么补)、生成物缓存、超大参考视频;
  • 展示物料(封面/截图/预告片)优先走 meta 的外链,别打进包。

安全边界(作者也该知道)

  • 打包与导入共用同一套容器硬化:绝对路径、逃根、软链/硬链、设备条目、超限体积与文件数、异常压缩比,任何一条命中即拒——别试图用「聪明的」目录结构绕;
  • 组合包内的 T1/T2(带代码)插件必须携带有效签名,否则拒装而非警告;
  • 导入第一屏(任何解包落盘前)会披露「本包含 N 个可执行插件 · 最高信任级」——插件确认与卡导入在界面上视觉分离,「以卡之名诱装插件」这条路是被堵死的。
备注

命名空间提醒:卡 id 用 <publisher>.<name>(点分割,publisher 全局注册、只允许小写字母数字连字符),channek.* 保留给第一方。id 是不可变主键——发布后永不改名,要改名等于发一张新卡。