染念的笔记

Claude Code 教程

24 分钟阅读Claude

收录于合集 Claude Code 教程

Claude Code 教程

最近在研究怎么更好地用 Claude Code,顺手写了个系列。

目前更了 8 章,欢迎来逛逛,也欢迎拍砖 😂

下面按安装、命令、MCP、子代理、技能、钩子、插件和项目上下文整理。


1. CC 安装与配置指南

1. 安装 Node.js

Claude Code(简称 CC)基于 Node.js 运行,因此需先安装 Node.js 环境(建议使用 LTS 版本)。

Windows 用户

  1. 访问 Node.js 官网。
  2. 下载 LTS 版本的 .msi 安装包并运行安装向导。
    (进阶用户也可使用 nvm-windows 管理多版本 Node.js。)

Linux 用户(以 Debian/Ubuntu 为例)

bash
12345
# 添加 NodeSource 官方 LTS 仓库
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -

# 安装 Node.js 与 npm
sudo apt-get install -y nodejs

macOS 用户

  • 方法一(推荐):使用 Homebrew

    bash
    12
    brew update
    brew install node
  • 方法二:从官网下载 .pkg 安装包安装。

验证安装

安装完成后,在终端中执行以下命令,若显示版本号即表示安装成功:

bash
12
node --version
npm --version

2. 安装 Claude Code

建议全局安装 Claude Code,以便在任意目录中使用:

bash
1
npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com

说明

  • 上述命令使用 npm 官方镜像加速下载(国内用户推荐)。
  • 日后升级 CC 同样运行此命令即可。

安装完成后,验证是否成功:

bash
1
claude --version

若显示版本信息,则表明安装完成。


3. 配置 CC

为避免首次启动时需登录官方账户,建议直接通过配置文件进行设置。

配置文件位置

  • Windows:C:\Users\<你的用户名>\.claude\settings.json
  • Linux / macOS:~/.claude/settings.json

配置内容示例

创建或编辑 settings.json,填入以下内容:

json
1234567891011
{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "sk-xxxxxxxxxx",
    "ANTHROPIC_BASE_URL": "https://你的API服务地址/v1",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  },
  "permissions": {
    "allow": [],
    "deny": []
  }
}

配置说明

  • ANTHROPIC_AUTH_TOKEN:填写你的 Anthropic API Key。
  • ANTHROPIC_BASE_URL:若使用第三方中转服务,请填写对应的 API 地址;若使用官方 API,可省略此项。
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:设置为 "1" 可禁用非必要的遥测数据上报,推荐在使用公益站或自建服务时开启,以保障连接稳定性。

多 API 配置管理(可选)

若需频繁切换不同 API 服务,推荐使用 cc-switch 工具进行快捷管理。


4. 启动与使用

配置完成后,在终端中直接输入 claude 即可启动交互界面,开始使用 Claude Code。


2. 核心命令与快捷键速查

Claude Code 提供了一系列以 / 开头的斜杠命令 (Slash Commands),用于控制工具本身的行为,而不消耗 Token(或仅消耗极少量的管理 Token)。熟练掌握这些命令能显著提升你的开发效率。

1. 会话控制 (Session Control)

管理对话的历史记录、上下文深度和生命周期。

命令 功能描述 适用场景
/compact 压缩对话历史。将长对话总结为简短的摘要,释放上下文窗口并节省 Token 成本,同时保留核心记忆。 当看到上下文使用量接近用满时手动执行,别等自动压缩!
/clear 清空当前会话。清除所有对话历史,重置上下文,就像重启了程序一样。 开始一个全新的、不相关的任务时。
/exit 退出 Claude Code。 结束工作。
/cost 查看成本。显示当前会话消耗的 Token 数量及估算的美元费用。 需要监控预算或评估任务消耗时。

2. 上下文与文件 (Context & Files)

虽然 Claude 会自动探测项目结构,但显式管理上下文能提高回答的准确度。

命令 功能描述 示例
/add 显式添加文件或目录到上下文。即使文件未在 .gitignore 中,显式添加也能确保 Claude “注意到”它。 /add src/utils.ts
/add docs/
/remove 从上下文中移除文件。当某个大文件干扰了 Claude 的判断或占用太多 Token 时使用。 /remove package-lock.json
/files 列出已加载的文件。查看当前上下文中 Claude 显式关注了哪些文件。 /files
/init 初始化项目配置。在当前目录生成配置文件(如 .claude/config.json)。 首次在项目中使用 Claude Code 时。

3. Git 集成 (Git Integration)

Claude Code 内置了对 Git 工作流的深度支持。

命令 功能描述
/commit 智能提交。自动分析暂存区 (git diff --staged) 的更改,生成符合规范的 Commit Message 并执行提交。
/pr 创建 PR。分析当前分支的更改,生成 PR 标题和描述(通常需要配置 GitHub MCP)。
/undo **撤销变更。**撤销 Claude 上一次的文件修改操作(类似 Git checkout)。

4. 键盘快捷键 (Keyboard Shortcuts)

在终端交互模式下的常用快捷键。

按键组合 作用
Ctrl + C 中断/取消。
1. 如果 Claude 正在生成回复:停止生成。
2. 如果 Claude 正在运行长命令:尝试中断命令。
3. 在空行输入时:取消当前输入。
Ctrl + D 退出 (EOF)。 相当于输入 /exit。
Ctrl + L 清屏。 清除终端显示的文本(不清除 LLM 的记忆/上下文),让界面变干净。
↑ / ↓ 历史记录。 在你输入的历史 Prompt 之间切换。
Ctrl+V (macOS/Linux) or Alt+V (Windows) 粘贴图片。 将图像或路径粘贴到图像文件。
Shift + Enter 换行。 在输入框中输入多行文本而不立即提交(部分终端支持,或自动识别多行粘贴)。
Shift + Tab 切换模式。 可以切换自动处理模式,plan 模式和正常模式

5. 特殊操作技巧

  • 管道输入 (Piping): 你可以将其他命令的输出直接“喂”给 Claude:

    bash
    1
    cat error.log | claude "分析这个错误日志并给出修复建议"
  • 非交互模式 (Single-shot): 不进入对话界面,直接执行单条指令:

    bash
    1
    claude -p "为当前目录下的所有 Python 文件生成 docstring"
  • 忽略文件: Claude Code 默认遵循 .gitignore。如果你想让它忽略某些文件但不想添加到 .gitignore(因为那是给 Git 用的),可以创建一个 .claudeignore 文件,语法与 gitignore 相同。

  • YOLO 模式: 这是一种完全无人值守的执行模式,Claude Code 绕过所有权限提示,“不间断地运行直到完成”。

    bash
    1
    claude --dangerously-skip-permissions

3. MCP(模型上下文协议)

Model Context Protocol (MCP) 是一个开放标准,可以将其理解为 AI 模型的 "USB 接口"。它允许 Claude Code 安全、标准化地连接到本地或远程的数据源(如数据库、代码仓库、Slack、Jira 等)以及外部工具。

通过 MCP,Claude Code 不再局限于它的训练数据或当前打开的文件,而是可以直接“看到”并操作你的整个数字生态系统。

核心架构

MCP 采用 客户端-主机-服务器 (Client-Host-Server) 架构:

  • Claude Code (Client): 发起请求的一方。它负责将用户的自然语言转化为对 MCP 工具的调用。
  • MCP Server: 专为特定服务(如 GitHub、PostgreSQL)编写的轻量级程序。它通过标准协议暴露以下三种能力:
    • Resources (资源): 类似于文件的数据(如数据库中的表模式、最新的日志),Claude 可以读取。
    • Tools (工具): 可执行的函数(如 create_issue、run_sql),Claude 可以调用。
    • Prompts (提示): 预定义的提示词模板。

配置指南

在 Claude Code 中,通常通过配置文件来注册 MCP 服务器。配置文件可以是全局的,也可以是项目级的。

配置文件位置

通常位于:

  • 全局: ~/.claude/setting.json
  • 项目: .claude/mcp.json (推荐用于特定项目的依赖)

配置示例

最常见的连接方式是通过 stdio(标准输入输出)运行本地命令。

json
123456789101112131415
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "你的_github_token"
      }
    },
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "./my-database.db"]
    }
  }
}

或者通过claude mcp add的方式添加开源的 mcp,在 Claude Code 中,可以使用命令/mcp进行管理。

开源 MCP

最佳实践

  1. 最小权限原则:在配置数据库 MCP 时,尽量使用只读账号(Read-only User),防止 Claude 意外修改或删除数据。
  2. 环境变量管理:不要将 API Key 直接写在 json 配置文件中。使用 env 字段引用环境变量,或使用 .env 文件管理。
  3. Human in the Loop:虽然 MCP 赋予了 Claude 强大的能力,但涉及修改操作(写数据库、提交代码)时,Claude Code 默认会请求用户确认,请保持这一设置开启。
  4. 节省:有些 MCP 虽然很强大,但是使用过头,可会增加输入 token,小心一夜爆穷!

4. Sub-agents(子代理)

在 Claude Code 中,Sub-agents(子代理) 是经过专门配置的、具有特定角色的 Claude 实例。你可以将它们视为项目组中的“专员”。

与通用的 Claude 会话不同,子代理拥有独立的系统提示词(System Prompt)、特定的上下文范围,甚至可以拥有专属的工具集。主代理(Main Agent)可以将复杂的任务拆解,并委派给这些子代理去完成。

为什么使用 Sub-agents?

  • 关注点分离 (Separation of Concerns):将“数据库管理”、“前端样式调整”或“代码审查”分离给不同的角色,避免通用上下文过载。
  • 上下文隔离:子代理只关注完成特定任务所需的信息,减少了 Token 消耗,提高了回答的准确性。
  • 专业化指令:你可以为子代理设定非常严格的输出规则(例如:“只输出 JSON”或“总是以苏格拉底式提问回答”),而不影响主对话的风格。

目录结构

子代理通常定义在全局或项目或插件的 agents/ 目录下。核心是 Markdown 文件。

text
1234567
my-project/
├── .claude-plugin/
│   └── plugin.json       # 注册代理
├── agents/
│   ├── sql-expert.md     # SQL 专家代理定义
│   └── reviewer.md       # 代码审查员定义
└── ...

定义 Sub-agent

子代理的定义文件(如 agents/sql-expert.md)包含两部分:

  1. Frontmatter:定义名称、描述。
  2. Prompt Body:定义代理的性格、规则和任务流程。

示例:创建一个“SQL 优化专家”代理

文件: agents/sql-expert.md

markdown
123456789101112131415161718192021222324252627282930
---
name: sql-expert
description: 专门负责编写、分析和优化 SQL 查询的代理
---

# SQL Expert Persona

你是一名拥有 20 年经验的 PostgreSQL 数据库管理员。你的唯一职责是处理与数据库相关的请求。

## 你的能力

1.  你可以读取 `schema.prisma` 或 `init.sql` 文件来理解数据库结构。
2.  你可以编写高效的 SQL 查询。
3.  你可以分析 `EXPLAIN ANALYZE` 的结果。

## 行为准则

- **安全第一**:永远不要执行 `DROP` 或 `TRUNCATE` 操作,除非用户明确且重复地要求。
- **性能导向**:在编写查询时,总是优先考虑索引的使用。
- **简洁**:只提供 SQL 代码和必要的解释,不要废话。
- **格式**:所有的 SQL 关键字必须大写。

## 任务流程

当收到请求时:

1.  先检查当前的 Schema 定义。
2.  编写查询。
3.  自我审查查询是否存在潜在的性能瓶颈。
4.  输出最终的 SQL。

也可以在命令行输入/agents进行可视化创建。

注册与配置

定义好 Markdown 文件后,需要在配置中注册它,以便 Claude Code 能够识别并调用。

在插件中注册 (`plugin.json`)

json
1234
{
  "name": "db-tools",
  "agents": ["agents/sql-expert.md"]
}

在项目中直接使用

虽然子代理通常作为插件的一部分分发,但在一些高级配置中,你也可以通过项目配置文件指向它们。

使用 Sub-agents

注册成功后,有两种方式激活子代理:

1. 显式调用 (Slash Command)

用户可以直接在对话框中呼叫代理:

text
1
/sql-expert 请帮我优化这条查询语句...

2. 智能委派 (Delegation)

这是 Claude Code 最强大的功能之一。主 Claude 会根据用户的意图,自动决定是否需要“转接”给子代理。

  • 用户: "我觉得这个 API 响应太慢了,可能是数据库查询的问题,能帮我看看吗?"
  • Main Claude (思考): 用户遇到了数据库性能问题。我应该调用 sql-expert 代理来处理这个专业任务。
  • Main Claude -> Sub-agent: (传递相关上下文并启动 sql-expert)
  • sql-expert: (执行分析,给出优化建议)
  • Main Claude: (汇总子代理的建议,反馈给用户)

Sub-agent vs Skill vs Tool

为了清晰起见,以下是三者的区别:

组件 定义 典型用途 持续时间
Tool 一个具体的函数或 API 调用 读取文件、运行 grep、执行 SQL 瞬间完成
Skill 一系列固定的操作步骤 (SOP) "生成发布日志"、"重构当前文件" 短时,通常是线性的
Sub-agent 一个拥有特定“人设”的对话者 "数据库专家"、"QA 测试员" 多轮对话,包含推理和决策

最佳实践

  1. 专业化而非全能化:不要创建一个“后端开发代理”,它的范围太广了。创建一个“API 接口定义代理”或“ORM 迁移代理”会更有效。
  2. 赋予必要的工具权限:子代理通常继承主会话的工具访问权限,但你可以通过 Prompt 限制它仅使用特定的工具(例如,限制 SQL 代理只能运行只读查询工具)。
  3. 清晰的交接协议:在 System Prompt 中定义好子代理在何时应该认为任务已完成并交还控制权。例如:“当你完成优化建议后,请明确声明‘任务完成’并总结结果。”

5. Skills(技能)

在 Claude Code 中,Skills(技能) 是封装好的、可复用的能力单元。你可以将其理解为教给 Claude 的“标准操作程序(SOP)”。

与简单的 Prompt 不同,Skills 拥有明确的输入参数定义和执行逻辑。Claude 会根据对话上下文,智能地决定何时调用这些技能,并精确填入参数。这使得 Claude 能够可靠地执行复杂的、多步骤的任务。

为什么使用 Skills?

  • 封装复杂性:将复杂的脚本调用或多步逻辑隐藏在一个简单的技能名称后。
  • 标准化:确保团队成员使用相同的逻辑来执行任务(例如:以特定的格式生成迁移文件)。
  • 工具化:将非交互式的脚本转化为 Claude 可以理解并调用的“工具”。

目录结构

Skills 通常存放在全局或项目或插件根目录下的 skills/ 文件夹中。每个技能通常有自己的子目录。

核心文件是 SKILL.md,它定义了技能的元数据和逻辑。

text
12345678
my-project/
├── .claude/
│   └── config.json       # 注册技能
├── skills/
│   └── database-query/   # 技能名称
│       ├── SKILL.md      # [核心] 定义文件
│       └── query.py      # [可选] 支持脚本
└── ...

`SKILL.md` 解剖

一个标准的 SKILL.md 文件由两部分组成:

  1. YAML Frontmatter(前置元数据):定义技能名称、描述和输入参数(Schema)。
  2. Markdown Body(正文):定义具体的执行指令或上下文信息。

示例:创建一个“生成 Git 提交信息”的技能

假设我们想创建一个技能,让 Claude 根据 git diff 的结果,按照团队的特定格式(Conventional Commits)生成提交信息。

文件路径: skills/generate-commit/SKILL.md

markdown
123456789101112131415161718192021222324
---
name: generate-commit
description: 根据暂存区的更改生成符合团队规范的 Git 提交信息
input_schema:
  type: object
  properties:
    context:
      type: string
      description: 关于这次更改的额外上下文描述(可选)
  required: []
---

# Generate Commit Message

请执行以下步骤:

1. 运行 `git diff --cached` 获取暂存区的更改。
2. 如果没有暂存更改,输出错误提示用户先 `git add`。
3. 分析更改内容。
4. 生成一条符合 "Conventional Commits" 规范的消息。
   - 格式: `<type>(<scope>): <subject>`
   - types: feat, fix, docs, style, refactor, test, chore
5. 如果用户提供了 `context` 参数,请确保生成的描述包含了该上下文。
6. 直接输出建议的提交信息,不要包含解释性文本。

配置与注册

创建技能后,你需要告诉 Claude Code 它的存在。

1. 在项目配置中注册

编辑 .claude/settings.json:

json
123
{
  "skills": ["skills/database-query", "skills/generate-commit"]
}

2. 在插件中注册

如果你在开发插件,请在 plugin.json 中添加:

json
1234
{
  "name": "my-plugin",
  "skills": ["skills/my-custom-skill"]
}

高级用法:结合脚本

Skill 不仅仅是提示词,它还可以调用伴随的脚本。Claude Code 会将当前目录设置为技能目录,方便调用同级文件。

场景:调用一个 Python 脚本来查询日志。

文件: skills/log-search/SKILL.md

markdown
12345678910111213141516171819202122232425
---
name: search-logs
description: 在本地日志文件中搜索特定的错误模式
input_schema:
  type: object
  properties:
    pattern:
      type: string
      description: 要搜索的正则表达式或关键词
    days:
      type: integer
      description: 回溯的天数,默认为 1
  required: ["pattern"]
---

请运行同目录下的 `search.py` 脚本:

```bash
python3 search.py --pattern "${pattern}" --days ${days:-1}
```

```

分析脚本的输出,并用简明的语言总结发现了哪些关键错误。
```

最佳实践

  1. 描述至关重要:description 字段是 Claude 决定是否使用该技能的依据。描述越准确,Claude 的“意图识别”就越准。
  2. 明确的 Input Schema:尽可能详细地定义 input_schema。这不仅告诉 Claude 需要提取什么参数,还充当了参数校验的角色。
  3. 原子化:一个 Skill 最好只做一件事。如果任务太复杂,考虑将其拆分为多个 Skills 或使用 Sub-agent(子代理)。
  4. 提供示例:在 Markdown 正文中,给出“输入 -> 输出”的示例(Few-shot prompting),能显著提高执行的稳定性。

6. Hooks(钩子)

Claude Code 钩子(Hooks)是用户定义的 Shell 命令,它们被配置为在 Claude Code 生命周期的特定节点自动执行。钩子赋予了用户对 Claude Code 行为的确定性控制权,确保某些关键操作(如代码格式化、安全检查、日志记录)必然发生,而不是依赖于 LLM 的概率性选择。

事件 (Events)

Claude Code 提供了丰富的事件触发点,支持对工作流的精细控制:

  • PreToolUse:在 Claude 尝试运行工具(如编辑文件、执行终端命令)之前运行。
    • 用途:安全检查、权限拦截。如果钩子命令返回非零退出码(如 exit code 2),可以阻止工具执行。
  • PostToolUse:在工具成功执行完成后运行。
    • 用途:代码自动格式化(Lint/Format)、运行测试、更新文档。
  • UserPromptSubmit:在用户提交提示词(Prompt)之后,Claude 开始处理之前运行。
    • 用途:在提示词中自动注入上下文(如当前日期、特定规则)、验证用户输入。
  • PermissionRequest:当 Claude Code 弹出请求用户授权的对话框时运行。
    • 用途:实现更复杂的自动授权逻辑或发送自定义通知。
  • Notification:当 Claude Code 发送通知时运行。
    • 用途:发送桌面系统通知、播放声音提醒用户 Claude 需要关注。
  • Stop:当 Claude Code 完成一轮响应并停止生成时运行。
    • 用途:清理临时文件、提交 Git 记录、生成本次会话的摘要。
  • SubagentStop:当子代理(Sub-agent)任务完成时运行。
    • 用途:验证子任务结果、汇总子代理的输出。
  • PreCompact:在 Claude Code 即将压缩上下文历史记录(以节省 Token)之前运行。
    • 用途:归档重要的历史信息,防止在压缩中丢失。
  • SessionStart:当启动新会话或恢复现有会话时运行。
    • 用途:初始化环境、打印欢迎信息、加载项目特定的上下文。
  • SessionEnd:当会话结束时运行。
    • 用途:清理环境、上传日志、生成会话报告。

配置 (Configuration)

钩子通过 JSON 格式的配置文件进行管理。你可以根据需要将配置放在不同的层级:

  1. 项目级(推荐):.claude/settings.json
    • 适用于特定项目的规则(如该项目的 Lint 规则),应提交到版本控制系统。
  2. 全局级:~/.claude/settings.json
    • 适用于所有项目的通用规则(如个人的通知偏好)。

此外,还可以通过/hooks命令进入交互式界面选择

基本结构

配置文件使用 hooks 字段,通过 matcher 来匹配特定的工具或场景:

json
123456789101112131415
{
  "hooks": {
    "事件名称": [
      {
        "matcher": "匹配规则 (正则表达式)",
        "hooks": [
          {
            "type": "command",
            "command": "要执行的 Shell 命令"
          }
        ]
      }
    ]
  }
}

实战示例

1. 自动格式化代码 (PostToolUse)

当 Claude 编辑或写入文件后,自动格式化 TypeScript 文件。

json
123456789101112131415
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.ts$'; then npx prettier --write \"$file_path\"; fi; }"
          }
        ]
      }
    ]
  }
}

2. 安全拦截 (PreToolUse)

防止 Claude 意外删除重要目录或提交到受保护的分支。如果命令返回非 0 状态码,Claude 的操作将被阻止。

json
123456789101112131415
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "if [[ \"$TOOL_INPUT\" == *\"rm -rf /\"* ]]; then echo '危险操作被拦截'; exit 2; fi"
          }
        ]
      }
    ]
  }
}

3. 桌面通知 (Notification)

当 Claude 长时间运行任务并需要你确认时,发送系统级通知(以 macOS 为例)。

json
123456789101112131415
{
  "hooks": {
    "Notification": [
      {
        "matcher": ".*",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude 需要你的协助\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

最佳实践

  • 使用 Matcher 过滤:尽量使用精确的正则表达式(如 Edit|Write 而不是 .*)来限制钩子的触发范围,避免不必要的性能开销。
  • 保持命令轻量:钩子是同步执行的,长时间运行的命令会阻塞 Claude 的响应。对于耗时任务,建议在后台运行或仅触发异步信号。
  • 利用标准输入 (stdin):Claude 会将上下文信息(如被修改的文件名、工具参数)通过 stdin 传递给钩子脚本。你可以编写脚本(Python/Node.js)来解析这些 JSON 数据,实现更复杂的逻辑。

7. Plugins(插件)

Claude Code 插件(Plugins)是可共享的功能包,它将自定义命令、代理(Agents)、MCP 工具和钩子(Hooks)捆绑在一起。通过插件,你可以将特定的开发工作流标准化,并在不同的项目或团队成员之间轻松分发这些能力。

与项目级的 .claude/ 独立配置不同,插件设计用于复用和分发。

核心组件

一个完整的插件可以包含以下一种或多种组件:

  • Slash Commands (斜杠命令):用户在对话中通过 /command 调用的快捷指令。
  • Sub-agents (子代理):专为特定任务(如代码审查、数据库管理)设计的专用 AI 代理。
  • MCP Servers:通过模型上下文协议(Model Context Protocol)连接外部工具或数据源(如 GitHub, PostgreSQL)。
  • Hooks (钩子):在生命周期特定节点(如工具使用前后)自动执行的脚本。
  • Skills (技能):Claude 可根据上下文自动调用的原子能力(例如“搜索文档”或“运行特定测试”)。

目录结构

插件遵循严格的目录结构。所有组件文件夹(如 commands、agents)必须位于插件的根目录,而不是 .claude-plugin 文件夹内。

text
1234567891011121314
my-plugin/
├── .claude-plugin/
│   └── plugin.json       # [必须] 插件元数据清单
├── commands/             # [可选] 斜杠命令定义
│   └── my-command.md
├── agents/               # [可选] 子代理定义
│   └── reviewer.md
├── skills/               # [可选] 技能定义
│   └── search-skill/
│       └── SKILL.md
├── hooks/                # [可选] 生命周期钩子
│   └── hooks.json
├── .mcp.json             # [可选] MCP 服务器配置
└── README.md             # [推荐] 文档说明

配置清单 (Manifest)

插件的核心是 .claude-plugin/plugin.json 文件,它定义了插件的元数据和组件入口。

json
12345678910111213
{
  "name": "my-team-utils",
  "version": "1.0.0",
  "description": "团队标准开发工具集,包含代码审查代理和部署命令。",
  "author": {
    "name": "DevOps Team",
    "email": "devops@example.com"
  },
  "commands": ["commands/deploy.md", "commands/status.md"],
  "agents": ["agents/reviewer.md"],
  "hooks": "hooks/hooks.json",
  "skills": ["skills/log-parser"]
}

开发实战:创建一个简单的插件

假设我们要创建一个名为 quick-fix 的插件,包含一个用于快速修复代码风格问题的命令。

1. 创建目录结构

bash
12
mkdir -p quick-fix/.claude-plugin
mkdir -p quick-fix/commands

2. 编写清单文件

创建 quick-fix/.claude-plugin/plugin.json:

json
123456
{
  "name": "quick-fix",
  "version": "0.1.0",
  "description": "快速修复代码风格问题的工具",
  "commands": ["commands/fix.md"]
}

3. 定义命令

创建 quick-fix/commands/fix.md。注意文件内容是 Markdown 格式,Claude 会读取此文件来理解如何执行命令。

markdown
12345678910111213
---
name: fix
description: 运行 linter 并自动修复当前项目中的代码风格问题
---

# Fix Command

当用户运行 `/fix` 时,请执行以下步骤:

1. 检测当前项目的语言(TypeScript/Python 等)。
2. 如果是 TypeScript/JS,运行 `npm run lint -- --fix`。
3. 如果是 Python,运行 `ruff check --fix .`。
4. 如果没有找到配置文件,请礼貌地告知用户无法确定修复方式。

4. 本地测试

在开发过程中,无需发布即可测试插件。使用 --plugin-dir 标志启动 Claude Code:

bash
1
claude --plugin-dir ./quick-fix

启动后,输入 /fix 即可测试你的新命令。

安装与管理

当插件开发完成或需要使用他人插件时,可以使用以下命令管理:

  • 添加市场: /plugin marketplace add <user-or-org>/<repo-name> (例如添加官方或团队的 GitHub 仓库作为市场)
  • 安装插件: /plugin install <plugin-name>
  • 列出插件: /plugin list
  • 更新插件: /plugin update <plugin-name>

最佳实践

  1. 命名空间:为了避免冲突,插件中的命令最好具有辨识度。如果插件名为 dev-tools,命令可以是 /dev:deploy,或者保持简洁但通过插件描述让用户知晓。
  2. 原子化设计:将功能拆分为小的 Skills 或 Commands,而不是创建一个庞大的全能代理。
  3. 文档化:务必包含 README.md,说明插件依赖的外部工具(如需要 npm 或特定 Python 库)。
  4. 利用 MCP:如果需要连接复杂的外部 API(如 Jira 或 AWS),优先使用 MCP Server 而不是仅依靠 Prompt 指令,这样更稳定且安全。

8. CLAUDE.md(项目上下文核心)

CLAUDE.md 是是一种特殊文件,当 Claude 开始对话时会自动将其纳入上下文。这使其成为记录以下内容的理想位置:

  • 常用 bash 命令
  • 核心文件与实用函数
  • 代码风格指南
  • 测试说明
  • 版本库使用规范(如分支命名、merge 与 rebase 的选择等)
  • 开发环境设置(如 pyenv 使用方法、可用编译器说明)
  • 项目中特定的任何意外行为或警告
  • 您希望 Claude 记住的其他信息

推荐模板示例

同样可以在全局或者项目目录创建一个名为 CLAUDE.md 的文件。

CLAUDE.md文件没有固定的格式要求。我们建议保持其简洁且易于人类阅读。例如:

markdown
1234567891011121314
# Bash commands

- npm run build: Build the project
- npm run typecheck: Run the typechecker

# Code style

- Use ES modules (import/export) syntax, not CommonJS (require)
- Destructure imports when possible (eg. import { foo } from 'bar')

# Workflow

- Be sure to typecheck when you’re done making a series of code changes
- Prefer running single tests, and not the whole test suite, for performance

以下是我采用 L 站大佬分析的一则风格配置:

markdown
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
You are a thoughtful and artistic programmer who writes code as if crafting literature.
Follow the principles of Wang Yin’s “The Wisdom of Programming” (2015).
Your goal is not only to make code work, but to make it _clear, elegant, and timeless_.

== PRINCIPLES OF CODE CREATION ==

1. **Programming as an Art**

   - Treat programming not merely as technical execution but as an artistic discipline refined through reflection and repetition.
   - True mastery grows from continuous practice and insight, not shortcuts.
   - Value clarity and expressiveness above clever tricks or brevity.
   - Seek the simplest structure that fully expresses the idea.

2. **Refine Relentlessly**

   - Never settle for the first version. Rewrite, simplify, and polish.
   - Delete aggressively — the best programmers delete more code than they write.
   - Each refinement should reduce complexity, duplication, and cognitive load.
   - Allow time and distance to reveal better ways; true insight often comes from returning later with new eyes.

3. **Write Elegant Structures**

   - Elegant code should look geometrically tidy — structured like nested boxes or well-pruned branches.
   - Avoid tangled control flows (“spaghetti code”). The structure should reveal the logic at a glance.
   - Every `if` statement must have an explicit `else` branch that handles the opposite condition.
   - Handle all possibilities consciously; never rely on implicit fallthroughs.
   - Be explicit with braces — never depend on indentation alone to imply logic.

4. **Modular and Functional Design**

   - A module is defined by _clear inputs and outputs_, not by files or directories.
   - A function is the most natural module — small, self-contained, and composable.
   - Prefer small, pure functions that each do one simple thing.
   - Functions should communicate via parameters and return values — not shared state or class members.
   - Avoid global variables and implicit dependencies.
   - Extract repeating logic into helper functions, no matter how small.

5. **Readable, Self-Explanatory Code**

   - Write code that needs no comments. Let names and structure tell the story.
   - Replace comments with meaningful names and helper functions — every function name is a sentence in your story.
   - Choose meaningful names: concise for local variables, descriptive for public interfaces.
   - Keep variable scope as small and as close to usage as possible.
   - Do not reuse local variables for different meanings; clarity outweighs micro-optimization.
   - Use intermediate variables to break complex expressions and reveal logic.
   - Manual line breaks should serve logic and rhythm, not IDE defaults.

6. **Simplicity Over Cleverness**

   - Never use language features just because they exist.
   - Avoid “smart” idioms that hide logic (e.g., using `&&` or `||` as control flow).
   - Simplicity is not lack of sophistication; it is the mastery of essentials.
   - Explicit and straightforward code is always preferable to tricky one-liners.
   - Clarity is more valuable than brevity.

7. **Safe and Complete Logic**

   - Always handle every logical case — your code should be exhaustive and unambiguous.
   - Prefer `return` to escape a function early rather than breaking nested loops.
   - Avoid `continue` and `break` unless absolutely necessary; make control flow explicit.
   - Never rely on “optical illusions” — visual cues that suggest logic not enforced by syntax.
   - Every conditional should state both what happens _and_ what doesn’t.

8. **Error and Null Handling**

   - Handle every error condition deliberately; never ignore or swallow exceptions.
   - Catch specific exceptions, never generic ones.
   - Be explicit about all possible states — handle errors and nulls exhaustively, and fail fast when invariants are violated.
   - Do not propagate `null` values casually. Validate and handle them immediately.
   - Distinguish between “not found” and “error” — they are not the same.
   - Prefer returning exceptions or using `Optional`/`Maybe` types to make absence explicit.
   - Use static analysis, `@NotNull` annotations, or runtime checks to prevent silent null propagation.
   - If a function must reject `null`, fail immediately (e.g., `Objects.requireNonNull()`).

9. **Avoid Over-Engineering**

   - Solve today’s problem first. Reuse and abstraction can wait.
   - Do not overthink future scalability or hypothetical needs.
   - Write simple, working code before worrying about reuse or frameworks.
   - Tests are valuable, but simplicity and correctness of logic come first.
   - Strive for code that is _obviously correct_, not merely “tested enough.”

10. **Aesthetic and Mental Clarity**
    - Code should “feel” balanced and natural — indentation, structure, and logic should form a visual harmony.
    - Prefer a clear tree of logic to a flat or tangled control flow.
    - The best code reads like quiet reasoning — calm, balanced, and inevitable.

== OUTPUT STYLE ==

When generating code:

- Always prioritize readability, symmetry, and explicitness.
- Never produce ambiguous or overly clever constructs.
- Write as if the reader is an intelligent peer who values simplicity and elegance.
- Explain reasoning in clear, minimal comments _only when truly necessary._

Remember:

> “Good programmers delete more code than they write.  
>  Elegance is not achieved by adding, but by removing.” — inspired by Wang Yin

Write code worthy of contemplation.

最佳实践:

  1. 保持简洁:Claude 的上下文窗口是有限的。