Claude Code官方,Learning 插件深度解析

5 阅读11分钟

cover

👀 最新、最有用的AI编程姿势,总来自「知识药丸」

《贾杰的AI编程秘籍》付费合集,共10篇,现已完结。30元交个朋友,学不到真东西找我退钱;)

以及我的墨问合集《100个思维碎片》,1块钱100篇,与你探讨一些有意思的话题(文末有订阅方式


写在前面

用 Claude Code 写代码,它自己改文件、跑命令、提交代码,我在操作全自动编程机。但问题来了:我只是在旁边看着,什么都没学到。它写了一堆代码,我看都没看懂就提交了。

这种感觉很诡异——虽然任务完成了,但我好像什么技能也没获得。

直到我发现了这个 learning-output-style 插件,一切都变了。

我发现的问题

我先来说说传统的 AI 辅助编程是什么样的。

我提个需求,AI 哗啦啦写了一堆代码,然后我要么全盘接受,要么复制粘贴到自己的项目里。听起来很高效对吧?

但实际上呢?我只是个搬运工,我并没有真正理解代码的设计思路,没有参与到关键决策中。这就像是——我请了个装修师傅帮我装修房子,他干活很快,但我完全不知道为什么水管要这么走,为什么电路要那么布。

等到下次遇到类似问题,我还是不会。

我理解的 Learning 插件核心思想

这个插件的理念非常优雅:不要让 Claude Code 把所有事情都做完,而是让它成为我的导师。

它会在关键决策点停下来,让我自己写 5-10 行真正有意义的代码

注意,不是让我写那些无聊的模板代码(boilerplate),也不是让我填无脑的 CRUD 操作,而是让我参与到那些真正需要思考的地方

  • • 业务逻辑有多种实现方式时,我会选哪种?
  • • 错误处理策略是宽松还是严格?
  • • 算法要优先考虑性能还是可读性?
  • • 用户体验和安全性该如何权衡?

这些决策会真正影响产品的行为,而这正是我应该学习和掌握的地方。

我研究了它的工作原理

整个插件的实现非常简洁,核心就是一个 SessionStart Hook。

我先来说说 Claude Code 的 Hook 机制(这个设计真的很聪明)。

Hook 是什么?

在 Claude Code 里,Hook 是用户定义的 shell 命令,会在 Claude Code 生命周期的特定时刻自动执行。它们提供了确定性的控制——不需要依赖 AI 模型"记得"去做某件事,而是通过应用层代码保证每次都会执行

Claude Code 提供了 8 种 Hook 事件:

  • PreToolUse: 在工具调用前执行(可以拦截)
  • PostToolUse: 在工具调用后执行
  • PermissionRequest: 权限请求时执行(可以自动批准或拒绝)
  • UserPromptSubmit: 用户提交 prompt 时
  • Stop: Claude 响应完成时
  • SubagentStop: 子代理任务完成时
  • SessionStart: 会话开始时(这是我们今天的主角
  • SessionEnd: 会话结束时

其中 SessionStart Hook 会在 Claude Code 启动新会话或恢复现有会话时触发,我的脚本输出会被添加到对话上下文中。这意味着,无论 Claude 回答什么问题,它都会先"看到"这段上下文。

我看到的插件结构

我研究了一下这个插件的目录结构,非常清爽:

plugins/learning-output-style/   .claude-plugin/     plugin.json          # 插件元信息   hooks/     hooks.json           # Hook 配置   hooks-handlers/     session-start.sh     # 实际执行的脚本   README.md

关键在于 session-start.sh 这个脚本。它的作用就是输出一段 JSON 格式的指令,告诉 Claude:"嘿,你现在进入 Learning 模式了,记得让用户参与编程。"

我来看看这段脚本的核心(简化版):

`#!/usr/bin/env bash

cat << 'EOF'
{  "hookSpecificOutput": {    "hookEventName": "SessionStart",    "additionalContext": "你现在处于 'learning' 输出风格模式..."
}
}
EOF`

没错,就是这么简单。通过 cat 命令输出一段包含详细指令的 JSON,Claude Code 会自动把这段内容注入到会话的上下文中。

我总结的 Learning 模式行为准则

插件注入的指令里包含了非常详细的行为准则,我把核心内容提炼一下:

1. 什么时候请求我贡献代码?

当遇到以下情况时:

  • • 有多种有效的实现方式可选
  • • 需要在安全性和用户体验之间权衡
  • • 设计模式的选择会影响架构
  • • 我的领域知识能改进解决方案

2. 什么时候不请求?

  • • 模板代码或重复性代码
  • • 显而易见、没有选择余地的实现
  • • 配置或设置代码
  • • 简单的 CRUD 操作

3. 怎么请求?

这里有个非常优雅的模式

首先,Claude 会:

  1. 1. 创建文件并填充周围的上下文代码
  2. 2. 添加函数签名和清晰的参数/返回类型
  3. 3. 用注释解释目的
  4. 4. 用 TODO 或占位符标记位置

然后,Claude 会告诉我:

  • • 它已经构建了什么,以及为什么这个决策很重要
  • • 具体在哪个文件的哪个位置
  • • 需要考虑的权衡、约束或可选方案
  • • 这个输入如何影响功能的行为(而不是无意义的填空)
  • • 建议的代码量(5-10 行)

我试了一个实际的例子

假设我在做一个用户认证系统,Claude 可能会这样跟我互动:

Claude: 我已经设置好了认证中间件的基础结构。现在有个关键决策需要你来做——会话超时行为。

这是个安全性 vs 用户体验的权衡:

  • • 自动延长会话:用户体验好,但会话可能保持更长时间
  • • 硬超时:更安全,但可能打断活跃用户

请在 auth/middleware.ts 中实现 handleSessionTimeout() 函数来定义超时行为。

看到了吗?Claude 不是直接把代码写完,而是:

  1. 1. 解释了上下文(已经做了什么)
  2. 2. 说明了决策的重要性(权衡点在哪)
  3. 3. 给出了清晰的位置(哪个文件的哪个函数)
  4. 4. 提供了思考的方向(两种方案各有什么优劣)

然后轮到我了。我会写下类似这样的代码:

function handleSessionTimeout(session: Session): boolean {  const now = Date.now();  const elapsed = now - session.lastActivity;    if (elapsed > SESSION_TIMEOUT) {    return false; // 硬超时,更安全   }      session.lastActivity = now; // 延长会话  return true; }

这 5-10 行代码,你真正思考过,真正做出过选择。下次遇到类似场景,你会知道该怎么做。

双重功能:Learning + Explanatory

有意思的是,这个插件其实融合了两种模式

  1. 1. Learning 模式:让你主动参与编程
  2. 2. Explanatory 模式:提供教育性的见解

在写代码的前后,Claude 会用这种格式给你提供见解:

☆ Insight ───────────────────────────────────── • 为什么选择这种数据结构而不是那种 • 这个设计模式在我的代码库中如何应用 • 这个权衡决策的长期影响 ─────────────────────────────────────────────────

这些见解不是泛泛的编程概念(比如"什么是闭包"),而是针对我的代码库、我的具体实现的深度分析。这才是真正有价值的学习内容。

我理解的它与 CLAUDE.md 的关系

细心的读者可能会问:这和 CLAUDE.md 有什么区别?

CLAUDE.md 是项目级的配置文件,而 SessionStart Hook 是更灵活的机制,允许通过插件分发。

我的理解是:

  • CLAUDE.md: 静态的项目说明书,适合描述项目结构、代码规范等
  • SessionStart Hook: 动态的行为指令,可以执行脚本、读取环境变量、甚至调用外部 API

两者可以完美配合。CLAUDE.md 告诉 Claude "这是什么项目",而 SessionStart Hook 告诉 Claude "你应该怎么工作"。

我是怎么使用这个插件的?

使用非常简单(前提是我已经安装了 Claude Code):

  1. 1. 把插件代码放到我本地某个目录
  2. 2. 在 .claude/settings.json 中配置插件路径
  3. 3. 启动 Claude Code,插件会自动激活

需要注意的是,Claude Code 会继承我的 bash 环境,能访问所有工具。对于自定义的 bash 工具,需要在配置中说明,否则 Claude 不知道它们的存在。

我注意到的安全性问题

这里有个非常重要的点我必须强调。

Hook 会在代理循环中以我当前环境的凭证自动运行。这意味着,恶意的 Hook 代码可能会:

  • • 窃取我的数据
  • • 修改敏感文件
  • • 执行危险命令

所以,Claude Code 包含了一个保护机制:直接编辑 Hook 配置文件需要在 /hooks 菜单中审查后才能生效。

我永远不会盲目安装来源不明的插件。在使用任何插件之前,我务必检查它的代码,特别是 Hook 脚本。

为什么我觉得这个设计很棒?

通过研究这个插件,我发现它体现了几个优雅的设计理念

1. 最小化的实现

整个插件的核心就是一个 shell 脚本和一段 JSON 配置。没有复杂的依赖,没有晦涩的 API,任何懂一点 bash 的人都能看懂、修改、扩展。

2. "Learn by doing" 的教育理念

被动观察永远不如主动实践。通过让用户在有意义的决策点贡献代码,这个插件确保你通过实践来发展实用技能。

3. 灵活的 Hook 机制

SessionStart Hook 不仅可以注入静态文本,还能执行脚本、读取文件、调用 API。这为无穷无尽的自动化场景打开了大门。比如我可以:

  • • 读取 git 状态和 TODO 列表
  • • 从项目管理工具拉取当前 sprint 的任务
  • • 检查代码覆盖率并提醒 Claude 关注
  • • 动态加载团队的编码规范

4. 可组合性

插件可以和其他 Claude Code 功能完美结合:MCP servers、自定义命令、其他插件。我可以构建一个强大的开发工作流,而所有这些都是用简单的配置文件拼接起来的。

我能想到的改进方向

当然,这个插件也不是完美的。我能想到一些可以改进的地方:

1. 更智能的决策点识别

现在 Claude 需要自己判断什么时候应该请求用户贡献。如果能有一些启发式规则或者代码分析工具来辅助判断就更好了。比如:

  • • 检测到多个 if-else 分支 → 可能需要用户决策
  • • 发现关键的配置常量 → 询问用户的偏好
  • • 识别到性能敏感的代码段 → 讨论优化策略

2. 学习进度追踪

如果能记录我参与的决策点和学习轨迹就太棒了。比如:

  • • 这个月我参与了 15 个架构决策
  • • 我在错误处理方面的决策越来越成熟
  • • 推荐我学习的下一个领域是...

3. 社区知识库

我在想,如果有个平台让大家分享"典型决策点"和"最佳实践"会怎样?比如:

  • • "Express.js 中间件设计的 3 个关键决策点"
  • • "React 状态管理:何时用 Context,何时用 Redux"
  • • "数据库索引策略:性能 vs 存储的权衡"

我的总结

这个 learning-output-style 插件虽然代码量很小,但思想很深刻

它回答了一个核心问题:在 AI 辅助编程的时代,我作为开发者应该扮演什么角色?

我的答案是:不是"旁观者",也不是"搬运工",而应该是"决策者"和"学习者"。AI 处理繁琐的细节,我负责关键的思考和选择。

通过 SessionStart Hook 这种简洁的机制,Claude Code 让这种协作模式变得自然而优雅。我不需要学习复杂的 API,不需要配置重量级的框架,只需要一个 shell 脚本和几行 JSON 配置。

如果你也在用 Claude Code,我强烈建议试试这个插件。它会让你从"被 AI 喂饭"变成"和 AI 一起做饭"——后者显然更有成就感,也更能让你真正成长。

P.S. 记得在使用任何插件前检查代码,安全第一。

参考资料

  • • Claude Code 官方文档
  • • Claude Code Hooks 指南
  • • Claude Code 最佳实践
  • • Anthropic GitHub - claude-code
  • • Claude Code 钩子配置深度指南

 坚持创作不易,求个一键三连,谢谢你~❤️

以及「AI Coding技术交流群」,联系 ayqywx 我拉你进群,共同交流学习~