Skip to content

Latest commit

 

History

History
418 lines (313 loc) · 28.5 KB

File metadata and controls

418 lines (313 loc) · 28.5 KB

CCSP — Claude Code Settings Preset

为 Claude Code 提供可切换、可复用的运行时 Settings 预设选择器。

npm version npm 月下载量 npm 总下载量 license node version 最近提交 stars issues

CCSP 交互界面:基础预设选择与项目启动开关

典型流程:先选全局基础预设(左)并以 YAML 或 JSON 预览其配置(右),再在项目启动层切换插件 / Skill / MCP,最后启动 Claude Code。

English | 简体中文


Quick Start

前置条件: 已安装 Claude Code CLI(claudePATH 中可用)。

安装

macOS(Homebrew,推荐) — 通过个人 tap lkangd/homebrew-tap 安装,会自动拉取 Node.js 20 依赖:

brew tap lkangd/tap
brew install cc-settings-preset

npm / pnpm — 需本机已有 Node.js ≥ 20.19.2:

npm install -g @lkangd/cc-settings-preset
#
pnpm add -g @lkangd/cc-settings-preset

安装后可用 ccspcc-settings-preset 命令。

后续需要更新时,运行 ccsp update。它会检查最新发布版本,打印当前版本之后的 changelog,识别当前是 Homebrew 还是 npm 安装,并执行对应的升级命令。

使用

# 在项目目录中启动(推荐入口)
ccsp

# 透传 Claude Code 参数(ccsp 会接管 --settings)
ccsp claude --help
ccsp claude -p "review this PR"

# 直接运行:跳过 TUI,按名称指定预设,其余参数透传给 claude
ccsp -g work -p web
ccsp -g glm-5.1 -p Chore claude -p "汇总未关闭的 issue"
ccsp --global-preset work --project-preset web --dry-run   # 预览合并结果,不启动

# 检查更新,并用识别到的安装器升级 ccsp
ccsp update

# 恢复本项目最近退出的会话,并复用其原始预设 / 启动配置
ccsp --continue

# 按 session id 精确恢复某个会话,复用启动时所用的预设 / 启动配置
ccsp --resume 99580820-9437-475c-883c-399bcfba3c47

首次使用建议:

# 1. 从现有 settings 导入一份「全局基础预设」
ccsp create

# 2. 进入项目,选择预设并配置本次启动的插件 / Skill / MCP,然后启动 Claude
ccsp

# 3. 管理全局预设或项目启动预设
ccsp manage
ccsp manage --project

使用场景

CCSP(Claude Code Settings Preset)面向「同一份 Claude Code 配置,需要在不同上下文里快速切换」的日常开发。典型场景如下。

1. 多模型 / 多后端环境切换

你在不同项目里使用不同的 API Key、ANTHROPIC_BASE_URL、默认模型(如 Opus / Sonnet / 自建网关)。手动改 ~/.claude/settings.json 容易串环境。

做法:ccsp create 为每个环境保存一份全局基础预设(含 env、模型相关字段等),进入项目后 ccsp 选预设即可,无需反复编辑主 settings 文件。

2. 按项目控制插件、Skill、MCP

同一套全局配置下,项目 A 需要关闭某官方插件、项目 B 要禁用 Chrome DevTools MCP、项目 C 要关掉部分 Skill。

做法: 在项目内用启动预设(Launch Preset)只覆盖 enabledPluginsskillOverridesdeniedMcpServers,与全局基础预设合并后生成临时 settings,再启动 claude

3. 团队内共享「基础配置」,个人保留「启动差异」

团队可约定把 .claude/settings.json 提交进仓库作为项目基线;个人仍可在本机维护全局预设,并在 .claude/.ccsp/ 下保存自己的启动组合(默认被 gitignore,避免误提交密钥)。

4. 替代「记住一长串 claude 命令」

以前可能需要:

claude --settings ~/.claude/my-api-1.json -- ...

做法: ccsp / ccsp claude -- ... 在 TUI 里选预设、勾选开关,由工具生成临时 settings 路径并调用 claude --settings <generated>

5. 配置管理与预览

  • ccsp manage:浏览、重命名、删除全局基础预设,预览配置(YAML / JSON),并可直接从管理界面启动。
  • ccsp manage --project:管理当前仓库下的启动预设(创建 / 保存 / 重命名 / 删除 / 启动)。

6. 无头自动化 — 直接运行 + claude -p(亮点)

CCSP 现已支持非交互式直接启动:在命令行指定预设、合并 settings 后直接 spawn claude,无需打开 TUI。这与 Claude Code 的 print / agent 模式claude -p "…")天然契合,适合脚本、cron、GitHub Actions 等自动化场景。

# 一行搞定:全局基础预设 + 项目启动预设 + 非交互 prompt
ccsp -g my-gateway-api -p ci-minimal claude -p "运行测试套件并汇总失败原因"

# 预览即将启动的配置(全局两栏 + 启动层四栏)
ccsp -g my-gateway-api -p ci-minimal --dry-run

为什么现在值得重视:2026 年 6 月 15 日起Anthropic 将 Agent SDK / claude -p 的用量从订阅套餐的交互额度中分离。终端里的交互式 Claude Code 仍占用套餐额度;claude -p 改走独立的 Agent SDK 月度额度(Pro / Max / Team / Enterprise 可领取)。这意味着非交互自动化有了更便宜的专用通道——前提是仍能按任务切换 API 后端,并按需开关 plugins / skills / MCP。

CCSP 的价值: 用全局预设指向第三方 APIANTHROPIC_BASE_URLenv 里的 Key、默认模型等),用启动预设只打开该任务需要的 plugins / skills / MCP。直接运行会合并两层配置,并把剩余 argv 交给 claude

参数 简写 作用
--global-preset -g 全局基础预设名(~/.ccsp/settings/
--project-preset -p 项目启动预设名,或 Detected 表示自动发现的基线
--dry-run 打印解析后的全局 + 启动预览,不启动 claude

说明:

  • 至少提供 -g-p 之一 才会进入直接运行;否则仍为交互式 TUI。
  • 透传参数时,CCSP 的 flag 写在 claude 之前claude 之后的 -p 是 Claude 的 prompt 参数,不是 CCSP 的项目预设。
  • -p 时,全局基础回退到上次使用的预设或项目 settings 来源(与 project-manage 启动一致)。
  • -g 时,启动层使用 Detected 基线(无需已保存的启动预设)。

工作原理

两层预设模型

层级 存储位置 作用
全局基础预设(Base Preset) ~/.ccsp/settings/*.json 一份完整的 settings 快照(可从 user / project / project-local 或任意 JSON 导入)
项目启动预设(Launch Preset) <项目>/.claude/.ccsp/launch-presets/*.json 仅记录相对基础的差异:插件开关、Skill 覆盖、MCP 拒绝列表

启动时 CCSP 不会直接改写 ~/.claude/settings.json 或项目里的 .claude/settings.json,而是写入 临时合并文件.claude/.ccsp/tmp/<timestamp>-settings.json),再执行:

claude --settings <临时文件> [你传入的其它参数]

ASCII 逻辑图

┌─────────────────────────────────────────────────────────────────────────┐
│                           用户执行 ccsp / ccsp claude                    │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ① 发现现有 Settings 来源(按存在性收集,非运行时合并)                         │
│    · .claude/settings.local.json  (project-local)                       │
│    · .claude/settings.json        (project)                             │
│    · ~/.claude/settings.json      (user)                                │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                    ┌─────────────────┴─────────────────┐
                    ▼                                   ▼
         ~/.ccsp 中已有基础预设?                  尚无基础预设
                    │                                   │
                    ▼                                   ▼
    ┌───────────────────────────┐          使用空基础 {} 或
    │ TUI:选择全局基础预设       │          先 ccsp create 导入
    │ (记住每个 cwd 上次选择)   │
    └───────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ② 解析「有效基线」                                                          │
│    · 插件:user < project < project-local < 所选基础预设                   │
│    · Skill:扫描 ~/.claude/skills、项目 skills/commands、已启用插件缓存      │
│    · MCP:合并 .mcp.json、~/.claude.json、插件 manifest 等来源              │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ③ TUI:项目启动层(Launch Preset)                                         │
│    · 左:已有启动预设列表  右:插件 | Skill | MCP 三列开关                     │
│    · 可保存为新预设 / 覆盖当前预设 / 临时启动不保存                             │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ④ finalizeSettings(base, launch)                                        │
│    · 以基础预设为主拷贝全文                                                 │
│    · 去掉基础里的 enabledPlugins / skillOverrides / deniedMcpServers      │
│    · 再写入 launch 层的上述三个字段(若有)                                   │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ⑤ 写入 .claude/.ccsp/tmp/*.json(目录默认 gitignore,约保留 50 份)          │
└─────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
┌─────────────────────────────────────────────────────────────────────────┐
│ ⑥ spawn: claude --settings <tmp> [sanitized args]                       │
│    · 剥离用户传入的 --settings / --settings=...(由 ccsp 统一管理)          │
└─────────────────────────────────────────────────────────────────────────┘

针对 Claude Code Settings 的痛点

痛点 说明
多文件、多层作用域 Claude Code 同时存在 user / project / project-local settings,手工维护时难以一眼看清「最终生效」的是哪一层。
切换成本高 换 API、换模型、换插件组合往往要改 JSON 或记不同 --settings 路径。
易误改主配置 直接编辑 ~/.claude/settings.json 容易把个人密钥、全局默认一起改掉。
插件 / Skill / MCP 分散 enabledPluginsskillOverridesdeniedMcpServersenv 等字段混在同一文件,缺少面向「本次启动」的轻量视图。
提交风险 项目 settings 若含 env 里的 Key,误提交到 Git 风险高。

CCSP 的优势

  • 非破坏性启动:通过临时 settings 文件注入配置,不强制覆盖你的主 settings 文件。
  • 两层分离:全局「基础环境」与项目「启动差异」解耦,适合多仓库并行开发。
  • 可视化开关:在终端 TUI 中浏览 JSON、切换插件 / Skill / MCP,比手改数组更不易出错。
  • 快捷设置:在基础预设选择页即可循环切换所选预设的 permissions.defaultModeeffortLeveloutputStyle,仅写回你改过的字段(写入预设文件;Claude Official 则写回 ~/.claude/settings.json)。
  • 直接运行-g / -p / --dry-run 供脚本与 CI 使用;配合 claude -p 做无头 agent 任务。
  • 记忆上次选择:按项目目录记住上次使用的基础预设与启动预设。
  • 可恢复会话:每次启动都会把会话与所用预设 / 启动配置绑定,ccsp --continueccsp --resume <id> 可一键恢复原配置并续上对应 Claude 会话。
  • 安全默认值.claude/.ccsp/ 初始化时写入 .gitignore(忽略全部),降低临时文件与本地预设误提交概率。

快捷设置(mode、effort 与 style)

基础预设选择页中间新增一栏 Quick Settings。用 h/l 或 ←/→ 把焦点切到该栏,按 space 循环切换所选预设的三项 Claude Code 配置:

  • mode —— permissions.defaultModemanualacceptEditsplanautodontAskbypassPermissions
  • effort —— effortLevellowmediumhighxhighmaxultracode
  • style —— outputStyle:内置的 DefaultProactiveConciseExplanatoryLearning,其后接 ~/.claude/output-styles/ 中扫描到的自定义样式。

未改动的字段会展示按优先级(managed → local → project → user)解析出的有效默认值。只有你实际切换过的字段才会被写入,且所有 effort 等级都以同一种方式持久化:作为 effortLevel 写入预设。

maxultracode 多一步处理。Claude Code 的 settings schema 中 effortLevel 只接受 low / medium / high / xhigh,因此它永远不会从 settings 文件应用这两个值,只写 effortLevel: "max" 的预设会静默回落到 ~/.claude/settings.json 里继承来的 effortLevel。为此 CCSP 会在命令行上再声明一次:当按该栏展示的同一条优先级链(preset → managed → local → project → user)解析出的有效等级是 maxultracode 时,启动就追加 --effort max / --effort ultracode,其优先级高于所有 settings 作用域;直接运行与 --resume 同样适用。若你在自己的参数里显式传了 --effort <level>--effort=<level>,则以你的为准。

自定义输出样式读取自 ~/.claude/output-styles/*.md,优先取文件 frontmatter 中的 name,缺失时回落到文件名 —— 与 Claude Code 的规则一致,因此写入的值一定是 Claude Code 能解析的。项目级与插件样式有意不纳入:基础预设页在选定项目之前运行,项目样式会产生一个换个目录就失效的预设值。由该栏之外设定的样式(项目、managed 或插件)仍会原样展示,按 space 则从列表首项开始循环。与另外两行不同,Default 是显式写入的,而不是删除该键。

确认时写回对应预设文件;若编辑临时的 Claude Official 条目,则直接写回 ~/.claude/settings.json —— 该路径正是其他所有预设在展示时回退的 user 作用域,因此在那里设的值,会成为所有未自行设置该字段的预设所显示的有效默认值。其他预设都无法写入该文件。

会话恢复(Session Resume)

Claude 退出后,CCSP 会主动发现 Claude 真实分配的 session id(启动前对 ~/.claude/projects/<编码后的 cwd>/ 做快照,退出时做 diff——--session-id 在交互模式下并不可靠,所以我们不直接 pin),并把它和本次启动配置绑定,存入 .claude/.ccsp/sessions.json(最多 50 条,按 lastUsedAt 淘汰):

  • ccsp --resume <uuid>:用绑定里的输入重新 finalize 启动配置,并以 claude --resume <uuid> 一步启动。
  • ccsp --continue:选取本项目里最近退出的 ccsp 会话,按其 id 确定性地恢复。具体例子:先启 A 再启 B,先退出 A,再 ccsp --continue,恢复的是 A(带 A 当时的预设 / 启动配置),不是 B。
  • ccsp claude --resume <uuid>ccsp claude --continue:保留 Claude 参数透传写法,但会重新选择全局 / 项目预设。
  • 若绑定对应的 Claude 会话已不存在(如旧版本残留),CCSP 会丢弃该绑定并回退到交互式选择。

会话参数的位置决定路由:写在 claude 前表示复用 CCSP 保存的绑定,写在 claude 后表示选择预设;顶层形式末尾的 claude 只是 CCSP 路由标记,不会传给 Claude。

局限与误解澄清(请务必阅读)

不能做到 / 需注意 说明
不是 Claude Code 替代品 仅包装 claude 子进程;未安装 CLI 时会报错退出。
不自动回写主 settings 不会把合并结果写回 ~/.claude/settings.json;若你希望永久生效,仍需自行同步或使用 ccsp create 更新基础预设。
接管 --settings 传入的 --settings 会被忽略并提示警告;路径由 CCSP 生成。
启动层字段有限 Launch Preset 只覆盖 enabledPluginsskillOverridesdeniedMcpServers;其它字段(如 env)来自基础预设。
不能通过 UI 新增 MCP Server 仅支持基于已发现 MCP 的禁用deniedMcpServers),不能创建新 server 配置。
create / manage 仍以 TUI 为主 创建与管理预设需交互界面;无头启动请用直接运行或自行编辑 JSON。
Derived 预设 数据模型支持 derived 类型,但当前 CLI 未暴露创建/管理衍生预设的完整流程。
项目存储默认本地 launch-presetstmpsessions.json 都在 .claude/.ccsp/ 下,默认不进 Git;团队共享需另行约定导出方式。
临时文件有上限 tmp 中的 settings 文件超过 50 份后按写入时间淘汰最旧的,但仍在运行的会话所持有的不会被回收——有活跃会话时份数可能暂时超过 50;statusline 脚本每次退出都会清理。
Resume 只覆盖 ccsp 启动的会话 ccsp --continue / --resume 只能看到通过新版 ccsp 启动并记录过绑定的会话;直接用 claude 启动的会话不在范围内。

命令参考

命令 说明
ccsp 默认流程:选基础预设 → 配置启动层 → 启动 claude
ccsp -g <name> 直接运行:仅指定全局基础预设(启动层 = Detected)
ccsp -p <name> 直接运行:仅指定项目启动预设(全局基础 = 上次使用或项目 settings)
ccsp -g <global> -p <launch> 直接运行:两层都指定,然后启动 claude
ccsp … --dry-run 配合 -g / -p:预览解析结果,不 spawn
ccsp … claude [args…] 直接或交互均可;CCSP 参数写在 claude 前,Claude 参数写在后
ccsp claude [args...] 同上,并将 args 传给 claude(不含 --settings
ccsp --continue 恢复本项目最近退出的 ccsp 会话,复用原始预设 / 启动配置
ccsp --resume <uuid> 按 session id 精确恢复某个会话,复用启动时所用的预设 / 启动配置(未知绑定时回退到交互式选择)
ccsp claude --continue / ccsp claude --resume <uuid> 选择全局 / 项目预设,再透传 Claude 会话参数
ccsp --continue claude / ccsp --resume <uuid> claude 跳过预设选择,复用对应的已保存会话绑定
ccsp create 交互式创建全局基础预设
ccsp manage 管理全局基础预设(预览 / 重命名 / 删除 / 新建 / 启动)
ccsp manage --project 管理当前项目的启动预设
ccsp config 配置 ccsp 偏好(仅 env 预览、statusline)

常用快捷键(TUI)

选择基础预设: h/l 或 ←/→ 在「Settings」与「Quick Settings」两栏间切换,j/k 或 ↑/↓ 移动,space 循环切换当前聚焦的快捷设置,t 切换排序,f 在「仅 env」与「完整配置」预览间切换,Enter 确认,q 退出。

管理全局预设(ccsp manage): l 启动,r 重命名,d 删除,c 新建,o 在 Finder 中打开文件,q 退出。

项目启动层: 在预设与插件 / Skill / MCP 列间切换并开关;支持保存为启动预设。s 将选中预设保存为全局模板,i 打开导入面板(全局模板 + 最近项目的预设,面板内 r/d 直接管理模板)。终端内 Ctrl+L 可刷新界面。

配置(ccsp config): j/k 或方向键移动,space/Enter 切换当前选项,q 退出。

偏好设置(ccsp config

ccsp config 打开左右两栏视图(左侧为选项,右侧为当前聚焦选项的说明),用于管理存放在 ~/.ccsp/config.json 的全局(按用户)偏好。两项默认均为 开启

选项 默认 作用
Global preset env-only 开启 基础预设选择页默认只预览所选预设的 env 字段。在该页面按 f 可在「仅 env」与「完整配置」视图间切换;关闭后默认展示完整配置。
Show statusline 开启 在 Claude Code 底部注入 ccsp statusline,显示当前预设与开关概览(CCSP: <base>/<launch> | plugins(…) | skills(…) | MCPs(…))。关闭后不再注入,也不会生成任何 statusline 脚本。
Settings preview format yaml 基础预设选择页(ccsp)与管理页(ccsp manage)右侧预览所选预设配置的渲染格式 —— yamljson,两者都带语法高亮。

目录结构

~/.ccsp/
├── index.json                 # 全局基础预设索引
├── settings/
│   └── <name>-settings.json   # 基础预设内容
├── launch-presets/            # 全局启动预设模板(由 s 提升产生)
│   ├── index.json
│   └── <name>-launch.json
├── config.json                # 用户偏好(仅 env 预览、statusline)
└── last-settings.json         # 各项目 cwd 上次使用的基础预设名;同时作为导入候选池

<项目>/.claude/.ccsp/          # 默认整目录 gitignore
├── launch-presets/
│   ├── index.json
│   └── <name>-launch.json     # 仅含启动层覆盖字段
├── tmp/
│   └── <stem>-settings.json   # 本次启动的最终配置(约保留 50 份,淘汰最旧的)
├── sessions.json              # sessionId → 启动配置 的绑定,供 --continue / --resume
├── worktree-seed.json         # 仅在 worktree 拒绝继承时写入
└── last-used.json             # 上次使用的启动预设

模板是复制而非引用:从模板导入的预设从落地那一刻起就是独立文件,副本会记录来源(列表中显示为 ← <来源>)。 预设可能引用本项目未安装的插件 / Skill / MCP,这些条目显示为 [!] not installed、不可切换,并在保存时原样保留—— 装上之后该预设即自动生效。

在没有自己预设的 git linked worktree 中,ccsp 会询问一次是否继承主仓库的预设(含上次使用的那一个); 拒绝后该 worktree 不再重复询问。


从源码开发

git clone https://github.com/lkangd/cc-settings-preset.git
cd cc-settings-preset
pnpm install
pnpm run dev          # 直接跑 tsx src/cli.ts
pnpm run check        # typecheck + build + test

贡献指南

欢迎 Issue 与 Pull Request。参与前建议:

  1. 先搜已有 Issue,避免重复讨论;新功能请先开 Issue 简述动机与用法。
  2. 本地验证: pnpm run check 须通过;若改动 CLI 行为,请补充或更新 tests/ 下对应用例。
  3. 风格: 与现有代码保持一致(ESM、strict TypeScript、Ink 组件 + flows/ 状态机);避免无关重构。
  4. 范围控制: CCSP 聚焦 settings 预设与启动编排,不引入与 Claude Code 无关的重依赖。
  5. 文档: 用户可见行为变更请同步更新 README.mdREADME.zh-hans.md
  6. 提交信息: 使用简洁英文或中文均可,说明「为什么」而不仅是「改了什么」。

报告 Bug 请附带: 操作系统、Node 版本、ccsp 调用方式、相关 ~/.ccsp.claude/.ccsp 结构(请打码密钥)、终端报错全文。


License

ISC © lkangd