这是啥

读完 入门 你已经能用起来。这一篇是下一步:把 Claude Code 从”能用”调教成”合你工作流”。三件事:

  • settings.json:权限、默认模型、env 变量——你的个性化配置中心
  • hooks:Claude 做某事前/后自动触发脚本——自动化陷阱
  • plugins:打包好的能力集(agents + skills + commands + hooks)——一键装一套工作流

settings.json:配置的总闸门

来源:claude-code-docs/settings.md

Claude Code 按优先级读三层 settings.json后者覆盖前者

路径作用域
全局~/.claude/settings.json你所有项目
项目共享<project>/.claude/settings.json本项目 + 全团队(进 git)
项目本地<project>/.claude/settings.local.json本项目 + 只你本机(不进 git)

最常用的 5 个字段

{
  "model": "claude-opus-4-7",
  "permissions": {
    "allow": ["Bash(bun run test:*)", "Bash(git status)"],
    "deny": ["Bash(rm -rf:*)"]
  },
  "env": { "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "90" },
  "hooks": { /* 见下文 */ },
  "enabledMcpjsonServers": ["slack", "github"]
}

(来源:settings.md 字段表 + permissions.md allow/deny 语法)

permissions 的三种态度

permissions.md 明确给出三档:

  • allow:不问,直接做(把你验证过的安全命令放这)
  • ask:默认值,每次弹窗让你确认
  • deny:永远不做(危险命令写这里)

Boris 的做法(how-boris-uses-cc.md tip 10):不用 --dangerously-skip-permissions,改用 /permissions 命令把常用安全命令一条条 pre-allow,团队共享 .claude/settings.json 里的 allow 列表。

hooks:事件驱动的自动化

来源:claude-code-docs/hooks.md + hooks-guide.md + Boris tip 9。

基础概念在 hook-slash-command 写过了。这里只讲进阶用法

五个触发时机

hooks.md 列的完整事件类型:

事件什么时候跑典型用途
PreToolUseClaude 准备调工具前拦截危险命令、加前置检查
PostToolUseClaude 用完工具后自动格式化、自动跑测试
UserPromptSubmit你刚输入 prompt 时记录意图、预处理 prompt
StopClaude 回答完一轮记日志、发通知
Notification需要你介入时响铃、push 通知

matcher 语法(hooks-guide.md

matcher 决定 hook 对哪些工具/事件生效:

{
  "PostToolUse": [
    {
      "matcher": "Write|Edit",
      "hooks": [
        { "type": "command", "command": "bun run format || true" }
      ]
    }
  ]
}

上面:只对 WriteEdit 工具触发。| 是或,也支持正则。

Boris 的三条 hook 经验(tip 9)

“Claude generates well-formatted code 90% of the time, the hook catches edge cases to prevent CI failures.”

  • || true 是关键——hook 失败不该中断 Claude
  • hook 的 exit code 会被 Claude 看见——非 0 等于告诉 Claude”这步出错了”,它会反应
  • PreToolUse hook 可以 block——返回特定 exit code Claude 就不执行原工具(危险命令拦截器)

plugins:成套工作流打包

来源:claude-code-docs/plugins.md + plugin-marketplaces.md

是什么

一个 plugin 是一个目录,里面同时打包了 agents / skills / commands / hooks。装上一个 plugin = 一次性获得一整套工作流。

目录结构(plugins.md):

my-plugin/
├── plugin.json           ← 元数据
├── agents/
│   └── code-reviewer.md
├── skills/
│   └── my-skill/
│       └── SKILL.md
├── commands/
│   └── review.md
└── hooks/
    └── on-commit.json

marketplaces

plugin-marketplaces.md 说明:plugin 可从 marketplace 安装,也可本地目录直接引用。现阶段官方推荐 claude-plugins-official 和社群的 superpowers / ralph-loop 等。

什么时候该做 plugin

plugins.md 隐含的门槛:当你有 3+ 个相关 agent/skill/command,且要让别人也能一键用时。单独的 skill 还没到打包成 plugin 的必要。

场景三则

下面三则不是概念解释,而是你真的会在项目里遇到的配置组合。看这三则,能更快判断:什么时候该上 hooks,什么时候只改 settings,什么时候已经值得打包成 plugin。

场景 1:Claude 改完代码,测试自动跑;危险命令在前面就被掐掉

一个典型团队流是:PostToolUseWrite|Edit,每次 Claude 改完文件就自动跑 bun run testbun run lint;同时再用 PreToolUseBash,把 rm -rf、乱删 lockfile 这类命令拦在执行前。

没 hook 时,Claude 可能写完代码就直接收工,CI 才告诉你红了;或者它在 panic 状态下乱试危险 bash。
有 hook 时,节奏变成:写完立刻验证,危险命令先过门卫。你把”记得跑测试”从提示词期待,变成了确定会发生的系统行为

场景 2:settings.json 调好后,Claude 会安静很多

很多人觉得 Claude Code “太吵”,本质上不是模型吵,是权限配置没沉淀。比如团队稳定使用 bun run test:*git statusrgfind 这些命令,却每次都走 ask 流。此时把它们沉到项目级 .claude/settings.jsonpermissions.allow,再把你的个性偏好留在 .claude/settings.local.json,Claude 会一下子安静很多。

这时再配合 sandboxing,效果更明显:安全命令少确认,越界命令照样挡。
所以 settings.json 的真正作用不是”多一个配置文件”,而是把高频、低风险、重复确认的那部分摩擦先抹平。

场景 3:一个团队共享 skill 包,值得升级成 plugin

如果你团队已经有:

  • 代码审查 agent
  • PR 描述生成 command
  • 提交前校验 hook
  • 两三个常用 skill

这时继续靠”把 .claude/ 整个复制进每个仓库”会越来越乱:版本不同步、谁改了不清楚、一个 repo 的 hotfix 很难回流。
把它们打成 plugin 之后,新项目只需要启用同一个 marketplace / plugin 名,就能拿到同一套 agent、skill、command、hook。这时 plugin 不只是”分享方便”,而是把团队工作流变成可版本化、可升级、可回滚的组件

升级路径(从 入门 到这一层)

基于 Boris tip 和官方 docs 的交叉推断,典型升级节奏大概是:

  1. 入门 → 1 周:只用 CLAUDE.md + 原生对话
  2. 1 周 → 1 月:加 3-5 个 slash command(/commit/pr 等)
  3. 1 月 → 3 月settings.json 的 permissions allow 逐步扩展;偶尔加 1-2 个 PostToolUse hook
  4. 3 月+:把稳定工作流打包成 plugin;自建 MCP server

注意:这是按素材推断的”一种升级路径”——不是唯一路径,也不是”业界共识”,仅供参考。

陈彬视角

“settings.json 升级得比 CLAUDE.md 快”是典型初学者错位。正确顺序:先把 CLAUDE.md 写厚(规则写明白),再上 hook(自动化),最后才是 plugin(打包分发)。很多人反了——还没把规则想清楚,就先搞一堆 hook,结果是”AI 行为不可预测 + 配置黑魔法 + 自己都不敢改”。

hook 的隐形代价:每加一个 hook,你的 session 启动时会多一层复杂度。hook 挂了、hook 间冲突、hook 吃了太多 token,都是常见坑。保守建议:同一件事你已经手动做了 5 遍以上,再上 hook

坑点与恢复

最典型的反例:hook 写坏了,结果不是”偶尔误伤”,而是”每次 tool 调用都被 block”。 常见原因有两个:

  • matcher 写太宽,比如用 * 或裸 Bash,把本来只想拦截 rm 的逻辑挂到了所有工具上
  • hook 脚本默认 exit 2,或者 stderr 里一直报错,Claude 于是把每次调用都当失败处理

排查顺序别乱:

  1. 先跑 /hooks:看是哪个事件、哪个 matcher、哪个 source location 在生效
  2. 先恢复通路:在本地 settings 里临时加 "disableAllHooks": true,把控制权抢回来
  3. 缩 matcher,不要一把兜底:例如把 Bash 收窄成 if: "Bash(rm *)",或把 PostToolUse 只挂在 Write|Edit
  4. 把危险 hook 先放项目本地或本机层测试:别一上来就进团队共享配置或 plugin
  5. 再开一条 harmless 命令复测:例如 git status 或一次普通 Edit,确认只在该拦的时候拦

一句话:hook 最大的坑不是不会写,而是写得太宽、太硬、太早共享。

关联

官方链接