Superpowers - 07 从 SessionStart Hook 看 Superpowers:把「技能库」变成「行为操作系统」

news2026/4/14 4:19:24
文章目录Pre一、为什么 SessionStart Hook 如此重要1. 被动工具箱 vs 主动行为系统2. 三阶段注入管线从平台事件到系统提示二、钩子注册与触发Claude、Cursor 与 Copilot 各有各的规矩1. hooks.json服务 Claude Code 与 Copilot CLI2. hooks-cursor.json为 Cursor 定制的扁平结构三、平台检测与 JSON 输出一不小心就会“注入两遍”1. 三种 JSON 结构对应三类平台2. 检测顺序为何如此讲究四、注入的究竟是什么using-superpowers 作为引导技能1. 引导技能的角色行为契约而非业务逻辑2. “反合理化”护栏防止 agent 偷懒五、Bash 实现细节JSON 转义与可移植性踩坑指南1. 纯 Bash 的 escape_for_json不依赖 sed/awk2. 避免 Bash 5.3 heredoc 挂起为什么必须用 printf六、跨平台执行polyglot run-hook.cmd 的巧妙设计1. 同一个文件同时是 CMD 和 Bash2. 常见问题脚本被编辑器打开、bash 不存在……七、旧版路径迁移用“侵入式提醒”确保不被忽略八、注入故障排查从症状倒推根因九、与 Superpowers 整体架构的关系与实践建议1. 唯一引导机制不注入就等于没系统2. 几个实践建议十、结语从一个 Hook 看未来的 Agent 工程PreSuperpowers - 01 让 AI 真正“懂工程”Superpowers 软件开发工作流深度解析Superpowers - 02 用 15 个技能给你的 AI 装上「工程大脑」Superpowers 快速开始深度解析Superpowers - 03 一文搞懂 Superpowers面向多平台 AI 编码助手的安装与实践指南Superpowers - 04 从“会写代码”到“会做工程”Superpowers 工作流引擎架构深度剖析Superpowers - 05 构建一个“会自己找插件用”的 Agent深入解析 Superpowers 的技能发现与激活机制Superpowers - 06 从文档到“结构契约”Superpowers 技能剖析与 Frontmatter 深度解读面对越来越复杂的 AI 开发场景单纯“给模型一个工具箱”已经不够了你需要的是一个能主动使用工具的 agent 行为系统。Superpowers 项目正是为此设计而其中最关键的一块基础设施就是本文要展开的主角SessionStartHook 注入机制。本文面向以下读者经常使用 Claude Code / Cursor / Copilot 等 AI 开发环境希望把自己的工作流沉淀为可复用技能的工程师正在折腾“插件化 agent 能力”、MCP、工具路由、行为注入的研究者或开发者想深入理解 Superpowers 架构、尤其是「技能发现与激活」底层机制的技术爱好者我们将从整体架构讲起再下潜到平台检测、JSON 构造、Bash 转义、跨平台脚本等实现细节最后结合实际场景给出一些最佳实践建议。一、为什么 SessionStart Hook 如此重要在 Superpowers 的设计中所有复杂的 TDD、调试、代码审查、子 agent 工作流……都被抽象为一个个技能文件SKILL.md等。但如果 agent 自己不知道这些技能存在它们就等同于「死代码」。SessionStart Hook 的目标就是在每次会话启动时把整个技能系统“挂到 agent 的大脑里”。1. 被动工具箱 vs 主动行为系统Superpowers 的核心理念可以简单概括为一句话无论 agent 在做什么它都必须先检查有没有合适的技能能帮上忙。为此插件通过SessionStart钩子在每个新会话甚至上下文被清空、压缩时自动注入一个叫using-superpowers的引导技能让 agent 在系统提示中“记住”你现在有一个技能系统所有技能都通过一个统一的Skill工具访问在任何响应前你必须先看技能能否帮忙宁愿多用、不准少用。换句话说SessionStart Hook 是整个 Superpowers 行为系统的唯一引导入口没有它后面的技能、工作流、约束体系统统无法生效。2. 三阶段注入管线从平台事件到系统提示注入管道分三步走平台原生钩子触发Claude Code / Cursor / Copilot CLI 的 SessionStart 事件。调用一个跨平台 shell 包装器run-hook.cmd。包装器再调用真正的hooks/session-start脚本读取skills/using-superpowers/SKILL.md构造平台需要的 JSON并通过标准输出返回给平台由平台注入到 agent 的系统提示中additionalContext/additional_context等。这样无论你在哪个平台使用 Superpowers只要会话启动agent 的系统提示里就会多出一段引导性的技能说明。二、钩子注册与触发Claude、Cursor 与 Copilot 各有各的规矩要让 SessionStart Hook 生效首先得告诉各个平台“我有这么个钩子”。Superpowers 为此维护了两个配置文件hooks.json与hooks-cursor.json。1. hooks.json服务 Claude Code 与 Copilot CLIhooks.json使用的是 Claude 插件格式关键点包括事件名使用SessionStartPascalCase。命令配置为${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd session-start。支持匹配器startup|clear|compact不仅在新会话启动时触发还会在清除对话历史clear上下文压缩compact这种“上下文重置”场景下重新注入技能保证 agent 在上下文被重置后仍然记得技能系统。特别要注意async: false的配置这意味着注入必须在 agent 处理任何一条用户消息之前完成否则就会出现“首轮回复没带技能感知”的竞态条件直接影响用户体验。2. hooks-cursor.json为 Cursor 定制的扁平结构Cursor 的钩子系统与 Claude 略有不同需要单独一个hooks-cursor.json。主要区别体现在属性Claude / Copilot (hooks.json)Cursor (hooks-cursor.json)事件键SessionStartPascalCasesessionStartcamelCase命令run-hook.cmd session-start./hooks/session-start匹配器支持 startupclear版本字段不需要必须有version: 1Cursor 的 agent 直接调用 bash 脚本因此不需要 polyglot 包装器命令直接指向hooks/session-start即可。三、平台检测与 JSON 输出一不小心就会“注入两遍”实现 SessionStart Hook 最难的部分不在“怎么注入”而在“在不同平台上输出正确的 JSON 结构”。1. 三种 JSON 结构对应三类平台hooks/session-start会根据环境变量识别当前运行的平台并输出不同结构的 JSONCursor检测条件CURSOR_PLUGIN_ROOT存在。输出字段顶层additional_context蛇形命名。Claude Code检测条件CLAUDE_PLUGIN_ROOT存在且没有COPILOT_CLI。输出字段{hookSpecificOutput:{hookEventName:SessionStart,additionalContext:...}}注意这里是嵌套在hookSpecificOutput下的additionalContext。Copilot CLI 或未知平台检测条件其他情况可能只有COPILOT_CLI或都没有。输出字段顶层additionalContext。这三种结构差别看似微小但对 Claude 来说如果你在同一平台同时输出additional_context和hookSpecificOutput.additionalContext它会两者都读导致相同的技能文本在上下文中出现两遍白白浪费 token。2. 检测顺序为何如此讲究session-start中的平台检测顺序是刻意设计的先看CURSOR_PLUGIN_ROOT。因为 Cursor 会顺带设置CLAUDE_PLUGIN_ROOT如果不优先判断会误把 Cursor 当作 Claude。再看CLAUDE_PLUGIN_ROOT且无COPILOT_CLI。Copilot 可能同时设置这两个变量所以必须确认没有COPILOT_CLI才能断言是 Claude。最后归类为 Copilot 或未知平台使用顶层additionalContext。如果你在移植或改脚本时随手改了顺序很容易在某些平台上输出错误结构表现为技能文本出现两次上下文膨胀。或者平台根本解析不到你注入的内容导致 agent 完全“失忆”。四、注入的究竟是什么using-superpowers作为引导技能SessionStart Hook 注入的并不是所有技能的内容而是一个非常特殊的引导技能skills/using-superpowers/SKILL.md。1. 引导技能的角色行为契约而非业务逻辑using-superpowers本身不会直接帮你写代码、跑测试它更像是 agent 的「行为守则」。注入后的系统提示中主要完成这几件事告诉 agent你当前处于一个带 Superpowers 的环境。所有技能都通过一个统一的Skill工具被发现和调用。约定行为优先级用户指令 技能指令 默认系统行为。定义“必须调用技能”的规则只要存在 1% 的可能某个技能有用你就应该调用。在任何回答哪怕只是澄清提问之前都要先检查技能列表。这样其他具体技能TDD、调试、代码审查、子任务拆分等就可以专注于“解决问题”而using-superpowers负责保证 agent 一定会去用它们。2. “反合理化”护栏防止 agent 偷懒为了避免 agent 出现“我大概知道这些技能但懒得用”这类行为SKILL.md中还设计了一个有趣的机制列出了一张包含 12 条“危险信号”的思维表格用来识别 agent 在「给自己找理由不查技能」。一旦出现类似“这次不需要用技能也能搞定”这样的内部推理模式就会被视为违反规范。通过这种带有元认知风格的约束Superpowers 在提示层面尽可能压制“模型偷懒”让技能系统真正成为默认路径。五、Bash 实现细节JSON 转义与可移植性踩坑指南当你要把一个富文本 Markdown 文件SKILL.md塞进 JSON 字符串时就会遇到各种转义问题引号、反斜杠、换行、制表符……如果转义不正确要么 JSON 解析失败要么注入内容错乱。Superpowers 在这里做了不少工程优化。1. 纯 Bash 的 escape_for_json不依赖 sed/awkhooks/session-start实现了一个完全用 Bash 字符串替换实现的escape_for_json函数首先处理反斜杠\\→\\\\。处理双引号→\。将换行、回车、制表符替换为字面量\n、\r、\t。使用${s//old/new}这种内建替换而不是逐字符循环。这样做有几个好处不依赖sed/awk等外部命令在各种奇怪的 shell 环境尤其是 Windows 上被 PATH 折腾过的 Git Bash更稳。性能远好于逐字符循环适合处理动辄上 KB 的技能内容。对于想在自己项目中采用类似模式的人来说这是一个很实用的模式在 shell 脚本里构造 JSON 时优先用内建字符串替换 printf避免多进程多工具带来的不确定性。2. 避免 Bash 5.3 heredoc 挂起为什么必须用 printf文章中特别强调了一个看似冷门但非常致命的 bugBash 5.3 在处理包含大量转义内容的 heredoc 时存在可复现的挂起问题。这会导致你的 SessionStart 脚本在会话启动时直接卡死表现为“agent 没反应”或“首条消息超时”。为规避这一点Superpowers 统一使用printf输出最终 JSON而不是catEOF { additionalContext: ... } EOF任何对脚本输出逻辑的修改都被强烈建议继续使用printf否则就有可能重新踩到这个坑。六、跨平台执行polyglotrun-hook.cmd的巧妙设计在 Claude Code 和 Copilot CLI 上hooks.json里配置的命令不是直接调用session-start而是调用run-hook.cmd。这背后是一套“多语言钩子包装器”模式用来解决 Windows CMD 与 Unix shell 的兼容问题。1. 同一个文件同时是 CMD 和 Bashrun-hook.cmd这个脚本有点魔法性质对 Windows CMD 来说它是一个合法的.cmd文件执行逻辑大致是echo off处理参数。调用 Git Bash并通过cygpath做路径转换。执行对应的 bash 脚本比如hooks/session-start。在进入任何 Bash 代码之前就通过exit /b结束 CMD 流。对 Bash 来说同一个文件又是合法的 shell 脚本使用: CMDBLOCK这样一个空操作 heredoc 把所有 CMD 段落“吃掉”。之后执行真正的SCRIPT_DIR/SCRIPT_NAME。这种 polyglot 写法的好处是Windows 环境可以通过.cmd直接调用不需要用户去手动指定 Bash。Unix 环境又可以把它当普通 shell 脚本使用。所有钩子共享这一包装器只需通过第一个参数指定脚本名例如session-start配置简单、复用性高。2. 常见问题脚本被编辑器打开、bash 不存在……在故障排查表里关于run-hook.cmd的问题主要有两类配置指向了.sh结果是在 Windows 上点击时直接被文本编辑器打开而不是执行。正确做法是始终指向run-hook.cmd再由它去执行 bash 版本。bash is not recognized通常是用户没安装 Git for Windows或者安装路径没有被包装器正确找到。解决方案是安装/修正 Git并必要时调整run-hook.cmd中的bash路径。如果你正在为自家项目设计跨平台钩子执行机制这个 polyglot 模式非常值得参考。七、旧版路径迁移用“侵入式提醒”确保不被忽略Superpowers 在演进过程中曾使用~/.config/superpowers/skills作为自定义技能目录后来迁移到~/.claude/skills。为了避免用户“悄悄在旧目录继续放技能”session-start在注入主内容前会做一次检查如果检测到旧目录存在就在注入载荷末尾追加一段警告文本。这段警告被特殊标签包起来并要求 agent 在首次回复时明确提醒用户进行迁移。这种设计看似“有点烦”但从迁移可靠性角度看非常合理迁移提示不会静默消失。在迁移完成并删除旧目录后这个检查也不再带来额外开销。对于需要迁移配置路径、数据目录的项目来说这是一个值得借鉴的模式通过 agent 主动提醒用户完成迁移而不是悄悄写在 README 里指望用户自己发现。八、注入故障排查从症状倒推根因实际使用中最让人头疼的往往不是“怎么注入”而是“为什么不生效”。文中给出了一张非常实用的故障排查表我们可以归纳成几个典型场景Agent 完全忽略技能通常是钩子根本没触发插件没安装好、hooks.json未被平台加载。环境变量如CLAUDE_PLUGIN_ROOT未配置。技能文本出现两次多见于 JSON 结构输出错误对 Claude 同时输出additional_context与hookSpecificOutput.additionalContext。平台检测顺序与实际运行环境不匹配。会话启动时卡死大概率是 Bash 5.3 heredoc bug解决方案是确认改脚本使用的是printf而不是 heredoc。Windows 上脚本被编辑器打开命令误指向.sh文件而不是run-hook.cmd。Cursor 完全没收到注入内容把 Cursor 错误地配置成使用hooks.json。Cursor 需要hooks-cursor.json且字段必须是additional_context蛇形命名。文中还给了一个非常推荐的调试方法CLAUDE_PLUGIN_ROOT$(pwd)bashhooks/session-start直接在仓库根目录手动执行钩子脚本检查输出的 JSON 是否符合目标平台预期。这比在完整 agent 环境中“盲调”要高效得多。九、与 Superpowers 整体架构的关系与实践建议理解了 SessionStart Hook 的细节之后更关键的是把它放到整个 Superpowers 架构中去看。1. 唯一引导机制不注入就等于没系统文中明确指出SessionStart 是 Superpowers 唯一的引导机制所有后续技能头脑风暴、TDD、调试、代码审查、Git 工作流等都依赖于最初注入的using-superpowers。如果 SessionStart 注入失败整个技能系统就处于“冬眠”状态agent 只剩下模型本身的通用能力。这也意味着在扩展或移植 Superpowers 时你可以改技能可以改工作流但绝不能忽略 SessionStart Hook 这一层的兼容性与稳定性。2. 几个实践建议结合文中内容可以给出一些面向真实工程场景的建议在新平台集成时先搞清楚平台支持的钩子事件与 JSON 格式。优先实现一个最小可用的 SessionStart 注入再逐步扩展技能体系。在调试注入问题时始终先在命令行单独运行脚本确认 JSON 输出无误。再检查平台配置hooks.json/hooks-cursor.json是否指向正确脚本。在扩展 SessionStart 注入内容时小心控制注入体积只注入“索引型”“行为契约型”内容。把真正大体量的说明、例子、模板留在技能内部通过Skill调用时按需加载。在设计自家技能系统时借鉴using-superpowers的做法把“必须查技能”“不准偷懒”写成清晰的行为约束。使用类似“危险信号表格”的方式约束 agent 的元推理。十、结语从一个 Hook 看未来的 Agent 工程SessionStart Hook 看起来只是一个“会话启动时执行的脚本”但在 Superpowers 的架构设计里它承载的是把一堆静态技能文件变成一个真正“驱动 agent 行为”的操作系统。它解决的不是“多一个工具能干什么”而是“如何让 agent 每一步行动都在技能系统的监管与帮助下进行”。在未来更复杂的 AI 工程实践中这种“以引导钩子为中心”的设计很可能会成为构建可控、可审计、多工具协作 agent 的标准模式之一。如果你正在搭建自己的 agent 能力体系建议亲手读一遍 Superpowers 的hooks与skills/using-superpowers代码与文档尝试在自己的项目中实现一个最小版本的 SessionStart 引导机制。这会比单纯在提示词里堆规则有更高的可维护性与可迁移性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2511474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…