【免费下载链接】clui-cc
Clui CC — Command Line User Interface for Claude Code
Clui CC 是一款为 Claude Code 打造的桌面图形界面(GUI),其内置的 Marketplace 插件市场可以直接从 Anthropic 官方 GitHub 仓库拉取 Skill 与插件,并在界面上完成一键安装。本文带你完整看懂这套插件市场的实现原理:数据从哪里来、目录如何解析、"一键安装"背后到底做了什么,以及界面如何实时同步安装状态。
一、先认识 Clui CC:一个带"应用商店"的 Claude Code 客户端
Clui CC 基于 Electron 开发,把 Claude Code 的终端体验封装成了 macOS 桌面应用:多标签会话、附件、权限确认卡片,还有一个Skills Marketplace(技能市场)面板——相当于给 Claude Code 装了一个"App Store"。
打开 Marketplace 面板后,你可以搜索、按标签筛选、查看官方仓库中的每个 Skill / 插件,点击 Install 后二次确认,即可把它装进本地 Claude Code 环境,全程无需打开终端。
整个功能涉及的核心文件如下(均使用仓库内相对路径):
| 模块 | 文件 | 职责 |
|---|---|---|
| 市场核心逻辑 | src/main/marketplace/catalog.ts | 拉取目录、解析、安装、卸载 |
| 市场 UI 面板 | src/renderer/components/MarketplacePanel.tsx | 搜索、筛选、插件卡片与确认面板 |
| 界面状态管理 | src/renderer/stores/sessionStore.ts | 加载目录、安装/卸载状态流转 |
| 插件数据模型 | src/shared/types.ts | CatalogPlugin类型定义 |
| IPC 通道 | src/main/index.ts | 渲染进程与主进程通信 |
| 启动自动安装 | src/main/skills/installer.ts | 内置 Skill 的原子化安装 |
| 内置 Skill 清单 | src/main/skills/manifest.ts | 声明式清单 |
二、三个官方数据源:Skill 从哪里来
市场目录并非来自某个中央服务器,而是直接读取Anthropic 官方仓库中的marketplace.json清单。数据源在 catalog.ts 中声明为三个仓库,各自对应一个分类:
anthropics/skills→ Agent Skills(如 xlsx、skill-creator 等单 Skill 集合)anthropics/knowledge-work-plugins→ Knowledge Work(知识工作插件包)anthropics/financial-services-plugins→ Financial Services(金融服务插件包)
每个仓库都遵循 Claude Code 插件规范,在.claude-plugin/marketplace.json中登记plugins数组,每一项包含name、source、description、author,Skills 仓库还会提供skills路径数组。
网络请求由 netFetch 封装:它基于 Electron 的net.request发起 HTTP 请求并收集响应体,返回统一的{ ok, status, body }结构,供后续解析使用。
三、目录拉取流程:fetchCatalog 做了什么
核心入口是 fetchCatalog,流程可以概括为五步:
- TTL 缓存命中判断:结果缓存 5 分钟(
CACHE_TTL),5 分钟内重复打开面板直接返回缓存,点击刷新按钮才强制重新拉取。 - 三源并行拉取:用
Promise.allSettled同时请求三个仓库的marketplace.json。任何一个源失败都不会影响其他源——只有全部失败且拿不到任何插件时才向 UI 报错。 - 条目展开:遍历
plugins数组,区分两种条目(见 条目展开逻辑):- 带
skills数组的条目:每个 Skill 路径(如./skills/xlsx)被拆成一条独立的目录项,安装名取目录名,标记isSkillMd = true; - 不带
skills的条目:视为整包 CLI 插件,source指向含.claude-plugin/plugin.json的目录。
- 带
- 元信息补全:SKILL 条目会进一步拉取对应
SKILL.md,用 parseSkillFrontmatter 从文件头部解析name:与description:字段,并把原始内容写入skillContentCache——这是后文"秒装"的关键;插件包条目则解析plugin.json得到version、author等字段。 - 组装与缓存:每个条目最终组装成一个 CatalogPlugin 对象(
id、name、description、version、marketplace、repo、sourcePath、installName、category、tags、isSkillMd),按名称排序后更新全局缓存。
这样,"浏览市场"本质上只是并行读取若干小 JSON 和 Markdown 文件,开销极低且天然支持断网降级(缓存 + 部分成功)。
四、语义标签:让插件"可发现"
除了仓库自带的描述,catalog.ts 还内置了一套TAG_RULES 正则规则(Design、Finance、Docs、Spreadsheet、Slides、Security、Data 等 19 类),对name + description + 路径做关键词匹配,为每个插件派生最多 2 个语义标签。
这些标签直接驱动了面板上的筛选 Chips:MarketplacePanel.tsx 会统计全目录的标签频次,按热度降序生成筛选按钮。于是"我想找个做报表的 Skill"这类模糊需求,可以靠Spreadsheet、Analysis标签快速命中,而不必精确记忆插件名。
五、一键安装的两种路径
用户在卡片上点击 Install → 弹出确认面板(明确提示"Will install to" 或 "Will run",见 确认面板代码)→ 确认后,sessionStore 通过 IPC 调用主进程 installPlugin。这里会走两条完全不同的路径:
路径 A:SKILL.md 直接安装(零依赖)
针对isSkillMd = true的单个 Skill:
- 先做严格输入校验:插件名必须匹配 SAFE_PLUGIN_NAME(字母数字开头、禁止
..),sourcePath拒绝绝对路径、反斜杠与路径穿越; - 命中
skillContentCache时完全不再发网络请求,直接用拉目录时预热的内容; - 在
~/.claude/skills/<name>/下写入SKILL.md文件,并用 assertSkillDirContained 断言目标目录确实落在 skills 基目录内。
也就是说,最常见的单 Skill 安装 = 一次本地文件写入,这就是"秒装"体验的来源。
路径 B:委托 CLI 插件安装
针对 Knowledge Work / Financial Services 这类整包插件,CLUI 不自己处理包结构,而是代跑 Claude Code 官方命令(带 15 秒超时):
claude plugin marketplace add <repo>claude plugin install <name>@<marketplace>
对 CLI 的"already added"提示做了容错处理,命令失败时把 stderr 原样返回给 UI 展示。卸载逻辑同样分叉:SKILL 直接删除~/.claude/skills/<name>目录(见 uninstallPlugin),插件包则交给 CLI 管理。
六、安装状态如何检测:直接读文件系统
判断"已安装"没有依赖 CLUI 自己的数据库,而是由 listInstalled 直接读取 Claude Code 的本地产物:
- 插件:读取
~/.claude/plugins/installed_plugins.json,键形如name@marketplace,同时登记短名与完整键以便精确匹配; - Skill:枚举
~/.claude/skills/下的子目录。
两条来源取并集后与目录项比对,卡片状态按钮随之呈现 Install / Installing... / Installed / Failed — Retry 四种形态(见 StatusButton)。由于依据是文件系统事实,即使 CLUI 崩溃重启,安装状态也永远准确。
七、界面层:搜索、筛选与卡片交互
MarketplacePanel.tsx 提供了一整套开箱即用的市场体验:
- 防抖搜索:输入 200ms 后才真正过滤,覆盖名称、描述、标签、作者、仓库、市场名六个字段;
- 动态筛选 Chips:由语义标签频次生成,外加 All 与 Installed;
- 双列卡片流:点击卡片展开为整行详情(标签、仓库/作者/版本、安装目标提示);展开动画由 framer-motion 驱动,展开时列表自动重排消除空隙;
- 状态兜底:加载中显示骨架屏,全部源失败时显示错误摘要 + Retry 按钮,空结果显示空态提示。
状态流转全部集中在 sessionStore 的 loadMarketplace / installMarketplacePlugin / uninstallMarketplacePlugin,UI 只负责渲染marketplacePluginStates中的状态映射。
八、彩蛋:启动时自动安装的内置 Skill
除了手动安装的市场,CLUI 还有一层"启动即装"的内置 Skill 机制,与 Marketplace 互补:
- manifest.ts 以声明式清单定义要自动安装的 Skill(当前为
skill-creator,来自anthropics/skills仓库),关键是锁定具体 commit SHA而非分支头,保证可复现; - installer.ts 采用原子安装:下载到临时目录 → 校验
requiredFiles齐全 →rename原子替换到~/.claude/skills/,并写入.clui-version版本标记; - 版本标记同时是"管辖权声明":没有该文件的目录视为用户自管理 Skill,CLUI 绝不触碰(见 user-managed 保护逻辑);版本一致但文件缺失时会自动修复。
九、设计亮点小结
最后用一张清单回顾这套 Marketplace 实现的工程细节:
| 关注点 | 实现手法 | 对应位置 |
|---|---|---|
| 可用性 | 三源并行 + 部分成功容错 + 5 分钟缓存 | fetchCatalog |
| 速度 | 目录拉取时预热 SKILL.md 内容缓存,安装零网络 | skillContentCache |
| 安全 | 名称白名单、路径穿越拦截、目录包含断言、commit 锁定 | 输入校验 |
| 准确 | 安装状态直读~/.claude文件系统 | listInstalled |
| 可靠 | 临时目录 + 校验 + 原子 rename,失败自动清理 | installer.ts |
| 友好 | 二次确认明示安装目标、失败可一键重试 | 确认面板 |
一句话总结:Clui CC 的 Marketplace 用"清单驱动 + 预取缓存 + 双路径安装 + 文件系统状态同步"四件套,把 Claude Code 的插件安装从"敲命令查文档"变成了界面上的两下点击——这也是理解 Claude Code 插件生态如何落到本地环境的一个很好切入点。
【免费下载链接】clui-cc
Clui CC — Command Line User Interface for Claude Code
相关推荐
ECC 插件与市场完全指南:从 Marketplace 安装到仓库级插件清单深度解析
ECC 插件与市场完全指南:从 Marketplace 安装到仓库级插件清单深度解析 本指南以 docs/ja JP/plugins/README.md htt
人工智能AI 技能AI 插件AI 评测Agent 评测MCP Clients开发工具DBX 插件市场(Marketplace)实战指南:从本地示例目录到仓库签名安装的完整流程
DBX 插件市场(Marketplace)实战指南:从本地示例目录到仓库签名安装的完整流程 导读 本文围绕 plugins/examples/marketpla
数据库开发者工具桌面应用CLIMCP 服务AI 应用Zotero插件市场完整指南:一键安装所有实用插件
还在为Zotero插件的繁琐安装流程而烦恼吗?每次发现好用的插件,都要经历下载文件、手动安装、版本验证的重复劳动。zotero addons插件市场彻底改变了这
插件系统桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考