Skip to content

Fix/open source:新增 Skill 开源 / 闭源权限管控功能,保障贡献者经验数据隐私 - #83

Open
woniu1288 wants to merge 3 commits into
UnicomAI:mainfrom
woniu1288:fix/OpenSource
Open

woniu1288 wants to merge 3 commits into
UnicomAI:mainfrom
woniu1288:fix/OpenSource

Conversation

@woniu1288

Copy link
Copy Markdown

一、需求来源

基于公益服务渠道收集大量社区创作者反馈:
大量志愿者、行业从业者愿意无偿贡献自身专业技能搭建平台 Skill,但担忧自己沉淀的业务经验、行业私有数据上传后完全无限制对外公开,存在隐私与数据泄露顾虑,因此提出需要自主管控 Skill 开放权限的功能需求。

二、本次实现功能

发布流程新增开关

在 Skill 新建发布页面,增加「开源 / 闭源」切换选项,创作者发布时即可提前设定技能开放状态;

后台管理状态操作

在 Skill 「发布管理」页,同步增加状态切换操作按钮,已发布技能支持随时修改开源 / 闭源属性;

权限逻辑约束

闭源状态下,该 Skill 对应的个人经验、私有业务数据仅创作者本人可见,其他用户无法读取完整内部内容;开源状态保持原有全公开逻辑不变,兼容旧版使用习惯。

三、实现方式

后端改动逐层分析

1. Proto 层

文件 改动 影响
skill-service.proto UpdatePublishCustomSkillReq 新增 markdown 字段 (field 3) gRPC 协议向后兼容,旧客户端不传该字段,反序列化为空字符串
skill-service.pb.go 重新生成 rawDesc 修复了描述符缺失 markdown 字段导致序列化丢弃的问题

2. mcp-service 层

文件 改动 对原功能影响
client.go 接口签名 (skillId, versionDesc) → (skillId, versionDesc, markdown) 内部接口,唯一实现(orm)和唯一调用方(grpc handler)已同步更新
orm/skill_publish.go Update("version_description", ...) → Updates(map),markdown 非空才更新 markdown="" 时不更新 markdown 列,与原逻辑等价
grpc/skill_publish.go 透传 req.Markdown 无影响

3. bff-service 层

文件 改动 对原功能影响
app_version.go UpdateAppVersion 新增 isClosedSource *bool 参数 唯一调用方(handler)已更新;isClosedSource=nil 时传空 markdown,mcp 不更新 markdown 列,与原逻辑完全一致
app_version.go GetAppLatestVersion skill 分支新增 IsClosedSource 读取 仅 skill case,resp.GetMarkdown() 安全
appspace.go PublishApp skill 分支注入闭源标记 在 skill 分支内(buildCustomSkillPublishPackage 之后),不影响 workflow/agent/app 类型
skill_square.go 广场列表/详情/下载新增闭源逻辑 详见下方
skill_acquired.go 资源库新增闭源逻辑 详见下方
skill_custom.go 作者视角详情新增 IsClosedSource 字段 不隐藏正文(作者可看自己的内容),仅标记

4. 广场/资源库闭源逻辑

关键设计:所有闭源限制都以 util.IsSkillClosedSource() 返回 true 为前提,开源 skill 完全不走闭源分支。

场景 闭源 skill 开源 skill(原有行为)
广场列表 新增批量查询 closedMap,填充 IsClosedSource closedMap 查询失败时返回空 map → 视为开源,不阻断主流程
广场详情 隐藏正文(stripSkillBody) IsSkillClosedSource 返回 false → 跳过,返回完整正文
广场下载 禁止下载 IsSkillClosedSource 返回 false → 跳过,正常下载
资源库详情 隐藏正文 同上,跳过
资源库列表 填充 IsClosedSource 同上

5. 工具函数

函数 行为 对老数据影响
IsSkillClosedSource 无 frontmatter / 解析失败 → 返回 false 老数据(无 closed_source 标记)视为开源,行为不变
InjectClosedSourceFlag 无 frontmatter → 原样返回 不破坏非 skill 格式的 markdown
SkillFrontMatter struct 新增 ClosedSource 字段 yaml 解析新增字段,不影响 name/description 解析

6. Request/Response Model

新增 IsClosedSource 字段:

  • 请求中 *bool(指针):nil 表示不修改,JSON 反序列化老请求(无该字段)为 nil
  • 响应中 bool:老前端不读取该字段,无影响

前端改动分析

文件 改动 对原功能影响
appPublishActions.vue 新增闭源开关 v-if="appType === 'skill'" 仅 skill 显示,publishForm 默认 false
createScope.vue 新增闭源开关 同上,增量改动
skillDetail.vue 闭源铭牌展示 增量
list.vue 闭源铭牌 + 隐藏下载按钮 v-if="!isClosedSource" 控制下载按钮
card.vue 闭源铭牌 增量
i18n (en.js, zh.js) 新增 closedSource/closedSourceTip 文案 增量

三、潜在风险点

风险点 说明 风险等级
toAcquiredSkillInfo 中 skill.GetSkill().GetMarkdown() 原代码第 276 行已依赖 skill.GetSkill().GetSkill(),新增调用使用同一对象,nil 风险与原代码一致,未引入新风险 极低
InjectClosedSourceFlag(markdown, false) 会移除已有的 closed_source: 行 功能正确(IsSkillClosedSource 仍返回 false),但 markdown 内容会少一行 极低,无功能影响
广场列表 GetPublishCustomSkillByIDList 批量查询 失败时 closedMap 为空,所有 skill 视为开源(降级),不阻断列表 低,容错设计

对原有代码和功能无破坏性影响。

woniu23666 added 3 commits June 26, 2026 11:00
- Add closed_source frontmatter flag parsed via pkg/util/skill.go (IsSkillClosedSource / InjectClosedSourceFlag), backward compatible

- Publish config page: add closed-source switch (appPublishActions / createScope)

- UpdateAppVersion supports toggling closed-source on republish via new markdown field in UpdatePublishCustomSkillReq (proto + pb.go + orm + grpc)

- Square/acquired skill list & detail return isClosedSource; closed-source skills hide body (stripSkillBody) and block ZIP download for non-author users

- Frontend: show closed-source badge for both authors and users, hide download button for closed-source skills

- docker-compose-develop.yaml: switch to WANWU_FRONTEND/BACKEND_IMAGE env vars
docker-compose-develop.yaml changes were local testing only (image env vars / port), not part of the closed-source feature
…tePublishCustomSkillReq descriptor

The rawDesc protobuf descriptor was missing the markdown field for UpdatePublishCustomSkillReq, causing gRPC to silently drop the markdown payload when BFF called mcp-service to toggle closed-source flag. Regenerated with protoc-gen-go v1.34.1 to keep diff minimal.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant