通过 git URL 分享插件只能解决一次性问题。将插件发布到插件市场,则让"安装团队标准工具链"变成任何人都能一键完成的操作,新员工在入职第一天就能无障碍运行,无需任何人指导。
插件最大的价值在于共享。原因并不复杂——为自己写的 hook 同样值得为团队写,一旦值得为团队写,"好,clone 这个仓库,跑这条命令,把这个文件夹复制到那里"这类操作本身就成了真正的瓶颈。愿意安装一个打磨好的插件的人,未必愿意为此走五步终端操作。
插件市场就是填补这一鸿沟的目录层。它是一个小型 JSON 清单,列出一个或多个插件,托管在团队可以访问的地方。用户一旦添加了你的插件市场(一条命令、一个 URL),其中的每个插件都能通过简短名称安装:lingcode plugin install tdd,而不是 lingcode plugin install git+https://github.com/yourorg/lingcode-plugins/tree/main/tdd。前者才是团队成员实际会去运行的命令。
有一个权衡值得理解:插件市场是安装时刻的快照。用户执行 marketplace add 时,LingCode 读取的是那一刻的清单。没有自动更新流程——若要刷新,需要先移除再重新添加插件市场。这是有意为之(从远程源自动拉取插件变更会带来安全风险),但这也决定了运营插件市场的方式。
marketplace add 和 plugin install 流程在发布位置的根目录创建 marketplace.json:
{
"name": "acme",
"description": "Internal LingCode plugins for the Acme engineering team.",
"plugins": [
{
"name": "tdd",
"description": "Acme's TDD workflow: write the failing test first.",
"source": "git+https://github.com/acme/lingcode-plugins.git",
"subpath": "tdd"
},
{
"name": "deploy-staging",
"description": "Deploy the current branch to Acme's staging environment.",
"source": "git+https://github.com/acme/lingcode-plugins.git",
"subpath": "deploy-staging"
}
]
}
结构很简洁:一个插件市场有名称、描述,以及一个插件列表。每个插件条目包含自己的名称、描述、source(从哪里克隆)和 subpath(source 中的子目录)。用户安装时,LingCode 根据 source+subpath 拉取实际的插件内容。
"托管"插件市场,本质上就是托管一个 JSON 文件,以及它所指向的插件文件夹。通常有两种选择:
marketplace.json 放在根目录,插件放在子目录,推送到 GitHub。用户通过 git URL 添加插件市场;LingCode 从默认分支读取清单。marketplace.json 部署到 CDN 或静态托管服务,将插件的 source URL 单独指向 git 仓库。适合需要将插件市场元数据与插件代码解耦的场景。对大多数团队来说,git 仓库的方式更简单:一个仓库同时包含插件市场和所有插件,更新任意一方都是一次普通的 commit。如果插件引用了内部内容,将仓库设为私有即可。
你的团队成员只需运行一次:
lingcode plugin marketplace add https://github.com/acme/lingcode-plugins
LingCode 读取该地址的 marketplace.json,将其快照保存到 ~/.claude/marketplaces/acme/,此后便知道这个插件市场所提供的所有插件。
注册插件市场后,安装插件变得如此简单:
lingcode plugin install tdd
lingcode plugin install deploy-staging
无需 URL,无需 subpath,无需任何复制操作。LingCode 在已注册的插件市场中查找 tdd,在 acme 中找到它,然后拉取并安装。lingcode plugin search 可以列出所有可用插件,方便用户浏览。
marketplace add 命令添加到团队的"新开发者配置"文档中,与克隆主仓库的步骤并列。两分钟、一条命令,团队使用的所有插件即刻就位。
用户添加插件市场后,他们的快照就固定了。你在清单中新增的插件不会出现在他们的 plugin search 结果中,直到他们重新添加插件市场为止。这是安全性的代价:从远程源自动拉取插件元数据,意味着永久信任那个远程来源。
有两种模式能很好地适应这一限制:
marketplace remove acme && marketplace add <url> 来刷新。"大多数团队都会跟进。version 字段;用户运行 lingcode plugin update <name> 可以获取已注册插件市场中该插件的最新版本。他们仍然无法在不重新添加的情况下看到新插件,但已有插件可以获取更新。v0.3.0)打标插件市场仓库。即使没有工具消费这些标签,未来的你也能一眼定位。plugin install tdd 时,如果插件包含 hooks/hooks.json 或可执行脚本,LingCode 会在安装前弹出提示。你的插件市场不会绕过这一机制——也不应该绕过。这个授权提示是安全模型的组成部分,不是体验上的瑕疵。