AgentDock

Cli Publish Source Normalization

Archived on 2026-08-16 · roadmap: publish-source-url-normalization

Archived: 2026-08-16 · roadmap-id: publish-source-url-normalization

Why

skill publish 产出的 manifest 里,source 字段是非确定性的。

packages/cli/src/core/skillPublish.ts:87-110 把 git remote get-url origin 的输出 零规范化直接写进 source。因此产出物取决于发布者本机的 git 配置:

发布者的 origin 形式产出的 source无凭据的人能否 clone
git@github.com:owner/repo.git(SSH)原样 SSH❌ 需要被授权的 SSH key
https://github.com/owner/repo.git原样 HTTPS✅

准确的表述不是「它输出 SSH」,而是——同一个仓库、两个贡献者发布同一个 skill, 会产出一个能装、一个不能装的 manifest。 这是发布产物里的非确定性, 且它对发布者本人不可见(他自己的 clone 一定能用)。

违反的护栏是消费侧的那条:「别家 Agent 拿到 git 地址就能直接装」。 判据不是「URL 能被解析」,而是——产出的 URL 能被一个没有任何凭据的人 clone。

证据来源:归档 cli-skill-publish 时用真实样本 lesson-prep 实跑一次 publish 并 读产出物内容(不是只看退出码)才暴露。完整证据链见 openspec/changes/archive/2026-08-16-cli-skill-publish/design.md 末尾章节。

设计期新发现的第二个缺陷:凭据会被写进产物

git remote get-url origin 可能返回内嵌凭据的形式 (https://x-access-token:<TOKEN>@github.com/owner/repo.git —— CI 检出、 gh auth setup-git、公司代理都会产生它)。当前实现会把该 token 原样写进 manifest, 而 manifest 的用途就是提交进公开 registry 仓。

这条不在原 roadmap 注释里,是本次设计时顺着「规范化」这条线查出来的。 它与主缺陷同源(零规范化),修法也同源(解析后只保留 scheme/host/path), 故并入本刀,不另立条目。

Non-goals

  • ❌ 不做网络可达性探测——publish 保持离线、纯。判据是「形式上与凭据无关」, 不是「这个仓此刻存在」。加网络探测会让 publish 依赖网络与私有仓可见性,得不偿失。
  • ❌ 不迁移/回填既有 manifest 里的历史条目——本刀只保证今后产出正确。 存量条目由发布者重跑 publish 覆盖(publish 本就幂等)。
  • ❌ 不支持自定义 host 映射表 / 企业 SSH 别名解析——~/.ssh/config 的 Host alias 无法从 URL 还原。对这类形式显式报错,让人改 origin,不做猜测式映射。
  • ❌ 不改 skill validate,不改 path 推导,不改 manifest schema 的其它字段。
  • ❌ 不做自动 commit / push / 开 PR——既有硬边界不变。
  • ❌ 不碰 origin 以外的 remote 选择逻辑(多 remote 场景不在本刀)。

On this page