AgentDock

Cli Publish Giturl Scope

Archived on 2026-08-20 · roadmap: skills-hub-cli

Archived: 2026-08-20 · roadmap-id: skills-hub-cli

Why

CLI 发布写进 registry 的 git_url 粒度是「仓库」,而安装的粒度是「skill」。这个错配是一个真实的付费绕过。

链路每一步都在代码里坐实过:

步位置事实
①agentdock core/registryIndex.ts请求体只有 skill_id/git_url/name/description/version?/license?。git_url 取自 git remote = 仓库根。manifest entry 里本来就有 path(如 skills/format-markdown),没被发出去
②web server/skills-publish-handler.ts原样把收到的 git_url 落库,不做粒度判断
③electron ipc/skillsHandlers.ts授权门查 access_tier 后放行,并刻意只用 registry 自己的 git_url 下载(其 header 注释写明这是为了堵死「用免费 id 配付费 URL」)
④electron skillManager.ts collectSkillDirsFromSource()拿到无子路径的仓库根,发现 <root>/skills/ 后返回其下全部 skill 目录
⑤electron skillManager.ts downloadSkill()for (const skillDir of skillDirs) { cpRecursiveSync(...) } —— 逐个全装,不按请求的 skill_id 过滤

净效果:免费账号点「安装 format-markdown」→ 连同一仓库里 access_tier: vip 的 lesson-prep 一起装进本地。

③ 那道门的设计没有错。 它把「验的是这个、装的是那个」从结构上堵死了——攻击者无法自带 URL。这次是从另一头破的:门用来下载的、registry 自己的那份数据,粒度太粗,指向一个装着别人(含付费)skill 的仓库。

⚠️ 止血(PR #212)只改了已经写进去的那一行。下一条经 CLI 发布的 skill 仍会拿到仓库根的 git_url——洞会随着 CLI 发布被推广而重新打开,而且越开越大。这是本刀必须做的理由。

On this page