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 场景不在本刀)。