Claude Code 的 hooks 与 statusLine:把上下文接入可编排命令链路
在 Claude Code 里,hooks 和 statusLine 的底层模型可以用一句话概括:
它们都是“把上下文送进一条命令”,再消费命令输出。

先建立正确心智模型
你可以把它们理解成两个不同触发时机的命令入口:
statusLine:偏状态展示hooks:偏事件触发
两者共享同一种数据输入方式:Claude Code 将上下文以 JSON 形式写入 stdin,脚本读取后处理,再通过 stdout 输出结果。
配置示例
statusLine
json
"statusLine": {
"type": "command",
"command": "uv run /home/forty-wsl/dev49/ai-all/claudecode/claudeSettings/statusLine.py"
}hooks
json
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "echo 0 | uv run /home/forty-wsl/dev49/ai-all/claudecode/claudeSettings/tg_json_pretty_send.py"
}
]
}
],
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "uv run /home/forty-wsl/dev49/ai-all/claudecode/claudeSettings/tg_json_pretty_send.py"
}
]
},
{
"matcher": "idle_prompt",
"hooks": [
{
"type": "command",
"command": "uv run /home/forty-wsl/dev49/ai-all/claudecode/claudeSettings/tg_json_pretty_send.py"
}
]
}
]
}最小可用脚本示例
下面这段 Python 足够解释完整数据流:
python
import sys
import json
def print_summary(payload):
current_directory = payload["workspace"]["current_dir"]
model_id = payload["model"]["id"]
input_tokens = payload["context_window"]["total_input_tokens"]
output_tokens = payload["context_window"]["total_output_tokens"]
total_tokens = input_tokens + output_tokens
print(f"项目目录:{current_directory} | 模型:{model_id}")
print(f"输入:{input_tokens} | 输出:{output_tokens} | 总数:{total_tokens}")
def main():
payload = json.load(sys.stdin)
print_summary(payload)
if __name__ == "__main__":
main()这段逻辑只做三件事:
- 从
stdin读取 JSON - 解析关键信息
- 把结果输出到
stdout
链路拆解
完整流程可以拆成 5 步:
- Claude Code 生成当前会话上下文
- 上下文序列化为 JSON
- JSON 通过
stdin传给配置命令 - 外部脚本读取并生成输出
- 输出进入
statusLine或外部通知通道
把这条链路理解透后,你会发现:hooks 与 statusLine 不是零散功能,而是统一的可编排入口。
实际价值
当你把它当成“命令编排层”而不是“UI 小功能”,扩展方向会更清晰:
- 在状态栏显示目录、模型、Token
- 在事件触发时推送通知
- 继续串联日志、Git、告警机器人等外部能力
结论
hooks 与 statusLine 的关键不是配置项本身,而是输入输出协议:stdin 接收上下文,stdout 产出结果。
只要脚本可控,这条链路就可以按你的工程需求持续扩展。