CCKitKit v0.3.2
cckit v0.3.2
Claude Code 的 Skill 工具箱管理器 —— 从任意 git 仓库拉取带环境依赖的 Skill,自动配置隔离环境,支持 skill 粒度的开关与干净卸载。
v0.3.2 是一个功能版本:新增 Skill 级用户配置 —— 作者声明"这个 Skill 需要哪些环境变量、哪些文件用户可以改",用户在 CLI 与 Web 面板里填值,cckit exec 时自动注入。另外还有 Web 面板的管理员通知、同名 Skill 的明确报错,以及 kit-builder 仓库改造准确度的改进。
⚠️ 有一个针对 kit 作者的破坏性变更:manifest 顶层的env字段改名为kit_env,仍写旧名的 kit 会被直接拒绝安装。详见下文。
从 Release 产物安装
从 wheel(推荐,最快):
uv tool install ./cckit-0.3.2-py3-none-any.whl # 纯命令行
uv tool install './cckit-0.3.2-py3-none-any.whl[web]' # 带 Web 面板
uv tool install './cckit-0.3.2-py3-none-any.whl[alt]' # 带非标准仓库导入(--alt)
uv tool install './cckit-0.3.2-py3-none-any.whl[web,alt]' # 面板 + 非标准仓库导入从源码包(sdist):
uv tool install ./cckit-0.3.2.tar.gz # 纯命令行
uv tool install './cckit-0.3.2.tar.gz[web]' # 带 Web 面板
uv tool install './cckit-0.3.2.tar.gz[alt]' # 带非标准仓库导入前置要求:先安装 uv(Windows PowerShell 可
irm https://astral.sh/uv/install.ps1 | iex),uv会自己拉取所需 Python 版本,无需预装。
--alt需要额外的claude-agent-sdk([alt]extra);未装该 extra 时--alt会提示安装命令并以明确错误结束,不影响其余命令。
新能力:Skill 级用户配置
此前 cckit 只能声明一套 kit 级的环境变量,而且值必须由用户自己在 shell 里 export。Skill 作者只能用散文在 SKILL.md 里写"请先 export XXX",用户装完看不出缺什么 —— 唯一的发现时机是脚本跑崩那一刻。
现在作者按 skill 粒度声明需要什么,用户直接在 CLI 与面板上填:
kit_env: # kit 共用:填一次,整个 kit 生效
- name: OPENAI_API_KEY
required: false # 不填则跳过该步骤,不报错
description: 用于字幕润色
skills:
- name: burn-subtitles
needs: [ffmpeg, python]
scripts: [scripts/burn.py]
env: # 该 Skill 专属;与 kit_env 同名时以此为准
- name: FONT_DIR
required: true # 不填会让 cckit exec 直接报错中止
description: 字幕字体所在目录
conf_files: [config.json] # 相对 Skill 目录,用户可以改只声明,不写值 —— manifest 里没有放值的地方。这从根上杜绝了"作者把自己的密钥提交进仓库、随 kit 分发给所有用户"。
配套的 CLI 与面板:
cckit list --envs # 各 Skill 需要哪些环境变量(只报已设/未设,不回显明文)
cckit list --confs # 各 Skill 有哪些可改的配置文件
cckit env burn-subtitles FONT_DIR D:/fonts # 填值cckit list在 kit 行打[env]、skill 行打[envs]/[conf_files]标记;有必需变量还没填时,对应行末尾会出现⚠ 缺必需变量 FONT_DIR → cckit env提醒 —— 判定口径与cckit exec完全一致,不会出现"列表看着没事、一跑就报错"。- Web 面板里每个 Skill 行有齿轮入口(环境变量 + 配置文件),kit 卡片头部也有一个(只有环境变量)。点开即可改值、预览和编辑配置文件,改完立即生效。
- 值存在
~/.cckit/envs.json,不写 Claude Code 的settings.json—— 那个键里装着用户的核心配置(ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN等),写坏等于 CC 直接不可用。注入只发生在cckit exec拉起脚本的那一刻,优先级为「用户填的 > 进程环境」;声明required: true却两处都取不到时会报错中止,不静默跳过。 - 配置文件路径在服务端校验:必须逐字命中声明、且解析后仍落在 Skill 目录内,所以 Web 上的"保存"不会被用来写任意文件。
⚠️ conf_files里的文件就放在 Skill 目录下,cckit remove或重装会连同 store 一起删除,用户改过的内容会丢。需要长期保留的数据请让脚本写到用户自己的目录。
新能力:面板管理员通知(--notice)
共享部署时可以在面板顶部挂一条公告,用来通知维护窗口:
cckit web --host 0.0.0.0 --notice "维护通知" ./notice.md- 控件出现在
Skills那一行的最右端,两行显示(「管理员通知」+ 你给的标题);点开以纯文本显示文件内容。 - 不传
--notice就完全不显示 —— 没有控件、没有额外请求。 - 标题随页面一起下发,首屏就渲染,不会先空一下再冒出来;正文在点开时才读,所以改了通知文件不用重启服务,正文也不会塞进每一次页面响应。
- 文件路径在启动时校验(写错当场报错退出,不用等用户点开才发现);正文有 256 KiB 上限,非 UTF-8 也能正常显示。
⚠️ 通知内容对所有能访问面板的人都可见(尤其--host 0.0.0.0部署时)。不要往通知文件里放密钥。
⚠️ 破坏性变更:顶层 env 改名为 kit_env
为了让"环境变量"这组字段在 kit 级与 Skill 级保持一致的形状,manifest 顶层的 env: 更名为 kit_env:。
受影响的只有写了顶层 env: 的 kit 作者。 旧名不会被静默忽略 —— 它会被 JSON Schema 直接拒绝:
(root): Additional properties are not allowed ('env' was unexpected)
改法就是把字段名改掉,cckit: 1 不变:
-env:
+kit_env:
- name: OPENAI_API_KEY
required: false为什么选择"明确拒绝"而不是兼容旧名:静默忽略会让作者以为自己声明的变量已经生效,而用户从头到尾看不到该填什么。现在这个问题会在
cckit add阶段就暴露出来。
行为变更:同名 Skill 安装会被拒绝
同一作用域内已存在同名 Skill 时,安装阶段会直接拒绝并点名占用者,而不是静默跳过:
以下 skill 名在全局作用域已被占用,同一作用域内 skill 名必须唯一:
- foo: 已被 kit 'kit-a' 占用 → 先 `cckit remove kit-a`(或 `cckit disable foo --purge`)释放该名字
可用 `--only <skill,...>` 排除这些 skill,或按上面的提示释放该名字后重试。
此前这种情况是静默失效:建链接那一步(cckit.state.set_state)见到同名 link 直接跳过,后装的 Skill 只写进 registry 却永远建不上链接 —— 表现为"装好了但 CC 从不调用",此后按名执行 enable / disable / exec 还会因为归属歧义全部报错。
跨作用域的同名仍然允许(全局一份 + 某个项目一份),由 CC 的优先级决定谁生效,cckit doctor 会给出提示。--only 排除掉的 Skill 不参与检查。
其他改进
- kit-builder 改造更准:
--alt依赖 Claude Code 把普通仓库改造成标准 kit,此前它对kit_env/env/conf_files常有遗漏。现在 Skill 里补了一套可执行的发现流程 —— 逐个脚本搜环境变量读取点(os.environ/os.getenv/process.env/$VAR)、按"被几个 Skill 读"决定放 kit 级还是 Skill 级、按"取不到会不会报错"决定required,并要求改造时逐条给出依据。--alt的改造与审计提示词同步收紧,漏声明现在会导致审计不通过。 - 修复测试的临时目录泄漏:Web 相关测试的夹具清理时只丢了引用、没删
StagedInstall持有的临时目录,每跑一次测试就在系统临时目录里留下两个空壳,现已改为先cleanup()再清。