标签 hooks 下的文章

最近想搞一搞 agent cli 开发。UI 层面,node 有比较成熟的 ink 方案。

但是看了下 go TUI 相关的解决方案,描述 UI 的方式有点别扭。当然可能是我没找到更好的实现思路。

所以实现了 rego ,取 react + go 的意思。

话不多说,先上代码。

package main

import (
    "fmt"
    "github.com/erweixin/rego"
)

func App(c rego.C) rego.Node {
    count := rego.Use(c, "count", 0)
    
    rego.UseKey(c, func(key rego.Key, r rune) {
        switch r {
        case '+': count.Set(count.Val + 1)
        case '-': count.Set(count.Val - 1)
        case 'q': c.Quit()
        }
    })
    
    return rego.VStack(
        rego.Text("Rego Counter").Bold(),
        rego.Text(fmt.Sprintf("Count: %d", count.Val)),
        rego.Spacer(),
        rego.Text("[+] 增加  [-] 减少  [q] 退出").Dim(),
    )
}

func main() {
    rego.Run(App)
}

运行效果:

Rego Counter
Count: 0

[+] 增加  [-] 减少  [q] 退出

仓库: https://github.com/erweixin/rego

对于多组件的使用可以参考: https://github.com/erweixin/rego/tree/main/examples/gallery

再贴一个 stream 组件的 demo 吧。

https://github.com/erweixin/rego/blob/main/examples/stream/stream_demo.gif

欢迎各位大佬试用、提 Issue 或 PR 。如果你也喜欢这种“在终端写 React”的思路,欢迎给个 Star 支持一下!👏

项目地址:

背景

楼主是学生党,去年为了帮忙开发毕业设计代码,也搭上了谷歌大善人的便车,照着论坛里佬们的思路,搭建了 Claude Code + Claude Code Router + Gemini Api (主要是 GCP 赠金和 done-hub)的框架。但是,在使用的时候,经常发生一些始料未及的报错(毕竟不是 Claude 自家模型)和缺陷(尤其是提示词的遗忘问题),因此在写毕设代码的同时,我也一直在迭代提示词组件,在这里小小分享一下,希望各位佬友能多多提出意见,交流 Claude Code 的提示词构建技巧和使用方法~


具体而言,在 Claude Code 中使用 Gemini 的优点和缺点都很明显:

优点:

  1. 科研思维与创新性:模型具备较强的跨领域知识理解能力,能够提供具有启发性的架构思路与创新方案。
  2. 百万级上下文窗口:1M Token 的上下文容量允许模型全量阅读大型代码库。模型能够维护函数签名、变量定义在长调用链与数据流中的一致性。
  3. 成本效益:基于调用次数的计费模式降低了大规模上下文注入的成本,适合科研场景下的大量文献与代码阅读。最重要的是,注入大批量的提示词一点也不心疼

缺点:

  1. Agent 调度迟缓:模型在使用 Subagent 时(尤其是 Explore)存在延迟与卡死现象。
  2. 遗忘风险:受限于滑窗注意力机制,模型在长对话中容易遗忘初始指令,特别是特定的格式约束;这导致模型一段时间后就会回归其初始的状态。
  3. 回复风格偏差:原生模型倾向于使用夸张、绝对化的词汇,并表现出过度的自信与讨好,不符合科研严谨性要求。(Gemini:你发现了问题的核心!
  4. 非专用编程模型缺陷:作为通用模型,其在 Bash 环境操作与文件系统细节(如文件名字符混淆、编码处理)上存在不稳定性。

此外,在科研与架构验证场景中,我更希望代码生成工具具备 “白盒性” 与 “可控性”。但是 Claude Code 自带的提示词天然倾向于自动化流程,例如使用 SubAgent 等等,但这往往是我不太期望的 (因为我需要提出具体的要求,并与 AI 共同讨论完整的设计方案和风险)。

针对上述局限,我设计了一套基于分层提示词系统与运行时钩子的小组件,以强化模型的工程约束(不过提示词是按照我自己的开发偏好来的,可能因人而异)。这套组件有以下特性:

运行时钩子体系

系统利用 Claude Code 的 Hooks 机制,部署了三个核心钩子以实现全生命周期的工程管控:

  1. 协议执行器 (env_enforcer.py)

    • 触发时机UserPromptSubmit(用户提问提交时)。
    • 功能:在上下文末端强制注入简短的提示词摘要和易遗忘的约束。这有效对抗了 Gemini 模型的长窗口遗忘问题,确保每一轮对话都重置回受控状态。
  2. 上下文管理器 (context_manager.py)

    • 触发时机PreCompact(压缩前)与 SessionStart(会话开始)。
    • 功能:自动扫描 Git 状态、目录结构及 skills/ 下的可用工具,生成 .compact_args.md 快照。在新会话启动时注入该快照,使模型能迅速恢复项目全貌认知,并感知可用的高级能力(Skills)。
  3. 工具安全检查 (pre_tool_guard.py)

    • 触发时机PreToolUse(工具调用前)。
    • 功能:实施多维度的即时修正与拦截。
      • 路径安全:将绝对路径自动修正为相对路径,拦截项目外的非授权访问。
      • 环境修正:自动向 Bash 命令注入 PYTHONIOENCODING 及环境激活脚本,解决 Windows 平台下的编码与环境一致性问题。

行为与风格约束

通过 CLAUDE.mdstyle.md 定义静态规范,修正模型的回复风格。

  • 语言规范:强制全中文回复,禁用营销性术语(如 “赋能”、“痛点”)。为此提供了完整的禁止词列表和 few-shot 替换示例。
  • 句式约束:要求使用无修饰的一般陈述句,禁止使用夸张的形容词与副词。
  • 操作规范
    • 静默执行:减少不必要的口语化确认。
    • 验证后执行:针对 Bash 操作与文件系统,强制先验证后执行。
    • 相对路径优先:规范文件路径的引用方式。

除此之外,output-styles\python-architect.md 中还插入了一些著名开发者的工程哲学(大概算 “请神” 吧…不过不会继承某些人的坏脾气),例如:

  • Linus Torvalds:以数据为中心, 优先考虑内存布局、清晰的数据结构
  • Rich Hickey:简单 容易,拒绝为了贪图方便而引入耦合。
  • Kent Beck: 执行严格的测试驱动开发(TDD),以及尽早识别并处理 “代码异味”。
    . . .

递归上下文完整性

针对代码生成,引入 “递归上下文完整性” 协议。该协议作为核心防幻觉机制,要求模型在生成或修改代码前严格遵循以下步骤:

  • 源头溯源:必须溯源至任何引用变量或函数的原始定义处,禁止仅凭调用处的上下文推断接口签名。
  • 继承链验证:若涉及类继承或接口实现,必须检索父类定义以验证完整的类型契约。
  • 上下文饱和:在消除所有类型歧义前,不得进行代码生成。


希望各位如果用的满意的话可以随手点个 stars ,也欢迎各位提出修改意见~(我没有系统的学过提示词工程,所以某些设计可能比较拙劣)


📌 转载信息
原作者:
ModestMouse
转载时间:
2026/1/24 10:34:21

在这里,我分享一下如何万能的创建属于你自己的 skill 和对应的 hooks 搭配,不过在分享之前,我要声明,我并非原创发现,我只是从各个地方学习到了知识,然后整合分享给大家

一。如何创建自定义的 skill

1. 安装 skill 插件与 MCP

github 仓库地址: anthropics/skills: Public repository for Agent Skills

这里我直接把命令拿过来方便直接使用,在 Claude code 里面输入
/plugin marketplace add anthropics/skills
(两个哪个都行,安装一次就行)
/plugin install document-skills@anthropic-agent-skills
/plugin install example-skills@anthropic-agent-skills
运行后选择 Install for you (user scope)
提示✓ Installed document-skills. Restart Claude Code to load new plugins. 就是安装成功了,然后重启 Claude Code

这里安装 skill 插件是为了有 skill-creator,它的作用是创建或更新 skills 的指南

2. 安装 **chrome-devtools-mcp** 和 upstash/context7: Context7 MCP Server – Up-to-date code documentation for LLMs and AI code editors(可选项)
直接配置这两个 MCP 就行,这里不演示了

2. 此时就可以创建 skill 了

情景一:需要把 API 文档做成 skill

举例:OpenAI 兼容协议文档
❶与 Claude 对话:请你使用 context7mcp 去查找 OpenAI 兼容协议文档,详细的告诉我它的全部内容


❷请你根据刚刚查询到的全部内容,参考 skill-creator 来帮我生成 skill



现在就创建成功了,只不过我发现他放的地方不对


那个文件夹是项目级别(当前项目专用),应该放在.claude\skills 这个文件夹里,这个手动移动一下就行,.skill 文件是打包好的把这个 .skill 文件移动到全局 skills 目录,所有项目都可以使用。
这时候一个 skill 就创建好了

情景二:需要把 context7 查不到的文档做成 skill

举例:智谱的 API 文档
❶与 Claude 对话:请你使用 chrome-devtools-mcp 访问 使用概述 - 智谱 AI 开放文档(链接放在这里变成蓝链了,对话的时候直接粘贴链接就行,别粘贴文字)

❷与 Claude 对话:请你使用 chrome-devtools-mcp 把 cURL;Python SDK;Java SDK;Python SDK (旧) 这几个调用示例的具体内容查一下,还有关于 GLM 编码套餐的端点差异也查看一下
(我这里只是举例子,你看你自己的文档,你需要什么内容,你就把你需要的内容让他再次去查看)


❸与 Claude 对话:请你根据刚刚查询到的全部内容,参考 skill-creator 来帮我生成 skill


创建成功依旧是需要手动一下位置,但是问题不大

情景三:把 MCP 做成 skill

举例:把 context7 做成 MCP
❶与 Claude 对话:请你把 context7 这个 MCP 的调用参考 skill-creator 来帮我生成 skill,我的要求是,在新增或修改代码之前,使用此 mcp 去查询最新的、特定版本的文档和代码示例,放入上下文进行参考

万能创建 skill 总结:

1. 安装 skill-creator(skill 官方的生成技能)
2. 根据自己的需求,先让 Claude code 完成你的任务,先完成一次,然后让他根据上下文参考 skill-creator 去创建一个新的 skill
注:MCP 查询到的结果可以写入 skill,mcp 本身的调用也可以写入 skill, 哪怕我刚刚举的例子里没有也是可以做到的。比如说让它先打开浏览器,然后在浏览器里搜索北京今日天气,然后获取当前页面结构,获得到今天的天气,然后让他去创建一个 md 文档,命名为今日日期,内容为今日天气;在整个流程跑完之后,让他参考 skill-creator 去创建一个这样的一个流程 skill
3. 如果对现有的 skill 需要进行修改,那直接把 skill 文件夹拉到对话框里,然后告诉他,请你参考 skill-creator 进行修改,我需要修改的内容是:******(这里你可以修改触发条件,你也可以修改任何内容,就只要你想修改的东西都可以这样改)

二。如何创建自定义的 hooks

(我贴一下学习来源的原文链接: 25% → 90%!别让 Skills 吃灰:Hooks + Commands + Agents 协同激活 AI 全部能力:Claude Code 工程化实践_hooks + commands + agents + skills-CSDN 博客

1. 创建文件

.claude/hooks/ 目录下创建一个文件:skill-forced-eval.js

2. 编辑内容

// skill-forced-eval.js 核心逻辑 const instructions = `## 指令:强制技能激活流程(必须执行) ### 步骤 1 - 评估
针对以下每个技能,陈述:[技能名] - 是/否 - [理由]

可用技能列表:
- crud-development: CRUD/业务模块开发
- api-development: API设计/RESTful规范
- database-ops: 数据库/SQL/建表
- ui-pc: 前端组件/AForm/AModal
- ui-mobile: 移动端/WD UI组件
...(共26个技能)

### 步骤 2 - 激活
如果任何技能为"是" → 立即使用 Skill() 工具激活
如果所有技能为"否" → 说明"不需要技能"并继续

### 步骤 3 - 实现
只有在步骤 2 完成后,才能开始实现。`;

console.log(instructions);

这里把技能列表改成你自己的 skill 就行

这个 hooks 就可以大幅提升 skill 的使用率了,具体的 hooks 如何去编写,规范如何,我自己还在学习中,学习完成后续也会做教程给大家分享出来


📌 转载信息
原作者:
huanchong
转载时间:
2026/1/16 13:03:58

发现一个 Claude code 的教程,还是中文版的,虽然我也有在用 cc,但想把 cc 用好还是得进阶学习的,不然就算 opus 有时也会原地打转。

目录:

引言
什么是编码助手?
Claude Code 实战
Claude Code 安装与配置
项目准备
添加上下文
进行修改
课程满意度调查
控制上下文
自定义命令
Claude Code 的 MCP 服务器
GitHub 集成
认识 Hooks
定义 Hooks
实现一个 Hook
Hooks 常见坑点
实用的 Hooks
另一个实用 Hook
Claude Code SDK
Claude Code 测验
总结与下一步

原链接(英文)


📌 转载信息
原作者:
shaioo
转载时间:
2026/1/6 11:36:47

最近想搞一搞 agent cli 开发。UI 层面,node 有比较成熟的 ink 方案。

但是看了下 go TUI 相关的解决方案,描述 UI 的方式有点别扭。当然可能是我没找到更好的实现思路。

所以实现了 rego ,取 react + go 的意思。

话不多说,先上代码。

package main

import (
    "fmt"
    "github.com/erweixin/rego"
)

func App(c rego.C) rego.Node {
    count := rego.Use(c, "count", 0)
    
    rego.UseKey(c, func(key rego.Key, r rune) {
        switch r {
        case '+': count.Set(count.Val + 1)
        case '-': count.Set(count.Val - 1)
        case 'q': c.Quit()
        }
    })
    
    return rego.VStack(
        rego.Text("Rego Counter").Bold(),
        rego.Text(fmt.Sprintf("Count: %d", count.Val)),
        rego.Spacer(),
        rego.Text("[+] 增加  [-] 减少  [q] 退出").Dim(),
    )
}

func main() {
    rego.Run(App)
}

运行效果:

Rego Counter
Count: 0

[+] 增加  [-] 减少  [q] 退出

仓库: https://github.com/erweixin/rego

对于多组件的使用可以参考: https://github.com/erweixin/rego/tree/main/examples/gallery

再贴一个 stream 组件的 demo 吧。

https://github.com/erweixin/rego/blob/main/examples/stream/stream_demo.gif

欢迎各位大佬试用、提 Issue 或 PR 。如果你也喜欢这种“在终端写 React”的思路,欢迎给个 Star 支持一下!👏


📌 转载信息
原作者:
weixind
转载时间:
2025/12/26 11:51:48