用途
promote-claude-settings 用于将当前项目 .claude/settings.local.json 中的配置条目提升(promote)到全局 ~/.claude/settings.json。当用户表达“promote settings”“upgrade…”等意图时使用。整个过程是交互式的,逐项确认后再写入全局配置。
主要能力
- 读取当前项目根目录的
.claude/settings.local.json与全局~/.claude/settings.json。 - 对本地与全局的每个顶层键进行差异比较;对数组值(如
permissions.allow)按元素逐个比较,而非整体比较。 - 将每个条目分类为:New(全局中不存在,可添加)、Exists(全局中已完全相同,跳过)、Conflict(全局中存在但值不同)。
- 在询问用户前,先展示完整的差异摘要。
- 对每个非 Exists 条目进行交互式确认:New 询问“Add to global? (Y/N)”;Conflict 展示两个值并询问“Use local / Keep global / Skip”。每个提示使用 question 工具。
- 作用域泛化:本地设置常带有项目特定上下文,提升到全局前会评估是否包含在项目外不成立的收窄信号,并建议更宽泛的版本。
- 将确认后的变更写入
~/.claude/settings.json(使用 Edit 工具);若文件不存在则创建。 - 清理确认:若移除已提升条目后
settings.local.json变为{},会说明该文件已实际为空并询问是删除还是保留空文件;若仍留有其他条目,则询问是否移除已提升的条目。
使用方式
该技能以交互流程运行:先读取两个配置文件,若本地文件缺失或为空({})则告知用户并停止;随后进行差异比较并展示摘要;再逐项询问确认;对需要提升的条目检测是否含项目特定收窄并给出更宽泛建议,询问“Original: X → Suggested: Y — Use suggested version / Keep original / Custom?”;最后写入全局配置并处理本地文件的清理确认。
作用域泛化示例
Bash(./mvnw test:*):相对路径 + 子命令锁定,建议泛化为Bash(*mvnw*)。Bash(./gradlew build:*):相对路径,建议泛化为Bash(*gradlew*)。Bash(npx vitest:*):已足够通用,保持原样。- Hook 命令
cd ./api && lint:相对路径,需评估该 hook 在全局是否合理。 - 环境变量
PROJECT_ROOT=/Users/matt/foo:绝对路径,可能不应提升。
常见收窄信号包括:相对路径(./mvnw、./gradlew、./scripts/foo)、绝对路径(/Users/matt/project-x/...)、项目特定目录或文件名、仅适用于单个项目工作流的过度具体子命令锁定。
适用场景
需要把项目级 Claude 设置升级为全局设置,并希望在提升前逐项审查差异、避免把项目专属配置带入全局的场景。
限制与边界情况
~/.claude/settings.json缺失时,用确认后的条目创建。- JSON 解析错误时,报告并停止,不尝试修复。
- 不要触碰
.claude/settings.json(项目共享设置)。 - 若本地文件缺失或为空(
{}),告知用户并停止。 - 若用户选择保留空的
settings.local.json,则保持文件原样,不移除条目。