# Claude Code 内部机制 学习笔记
> **Session 背景**:设计了 `/exit-learn` command(session 知识萃取→Obsidian 图文笔记)和 `session-learn.sh`(处理历史 session 的独立子进程方案)
> **新知识点**:3 个
---
## 一、Claude Code Commands 机制
**是什么**:`/exit-learn`、`/code-review` 等斜杠命令,本质是 `~/.claude/commands/` 目录下的 Markdown 文件。
**核心机制**:
| 问题 | 技术回答 | 小白秒懂版 |
|------|----------|-----------|
| /command 是什么? | `~/.claude/commands/<name>.md` 文件内容注入为 prompt | 配方书:文件名=菜名,内容=做法 |
| Claude 怎么执行? | 读取 .md 文件内容作为指令,按 Step by Step 执行 | 厨师照着配方做菜 |
| Skills 和 Commands 的区别? | Skills 有独立目录+脚本,Commands 是纯 Markdown prompt | Skills=程序,Commands=说明书 |
**口诀**:Markdown 即 Prompt,放进 commands/ 目录即成斜杠命令。
> 图解待补充:`assets/ClaudeCode命令机制_手绘白板_0.png`(OpenRouter 网络异常未生成)
**与已知的关联**:类似 ChatGPT 的 Custom Instructions,但更灵活——文件即命令,可以版本控制、共享、组合调用。本质是 prompt engineering 的工程化封装。
---
## 二、Claude Code Session JSONL 存储结构
**是什么**:Claude Code 的每次对话(session)以 JSONL 格式持久化存储,可被外部脚本读取和分析。
**存储路径**:
```
~/.claude/projects/<项目目录编码>/<session-id>.jsonl
```
- 项目目录编码:把路径中 `/` 替换为 `-`(如 `/Users/foo/bar` → `-Users-foo-bar`)
- 子 agent 对话存在 `<session-id>/subagents/` 子目录
**关键字段**:
| 字段 | 含义 | 过滤方式 |
|------|------|---------|
| `type` | 消息类型 | 只取 `"user"` 和 `"assistant"` |
| `isSidechain` | 是否为子 agent 消息 | `false` = 主对话,`true` 过滤掉 |
| `message.content` | 消息内容 | string 直接用;list 时取 `type="text"` 的块,跳过 `type="thinking"` |
**Python 解析模板**:
```python
with open(jsonl_file) as f:
for line in f:
obj = json.loads(line)
if obj.get('isSidechain'): continue
if obj.get('type') not in ('user', 'assistant'): continue
content = obj['message']['content']
if isinstance(content, list):
text = ' '.join(c.get('text','') for c in content
if isinstance(c,dict) and c.get('type')=='text')
else:
text = content
```
**口诀**:type=user/assistant + isSidechain=false = 主对话;content 是 list 时只取 type=text 块。
> 图解待补充:`assets/ClaudeCode-Session存储_手绘白板_0.png`(OpenRouter 网络异常未生成)
**与已知的关联**:类似 Jupyter Notebook 的 `.ipynb` 格式(也是 JSON,每个 cell 一条记录)。JSONL(每行一个 JSON)是大数据场景的标准格式,LLM 系统喜欢用它做日志——可追加写入,流式读取。
---
## 三、`claude --print` 非交互模式
**是什么**:Claude Code CLI 的批处理模式,适合脚本自动化调用。
**核心机制**:
| 问题 | 技术回答 | 小白秒懂版 |
|------|----------|-----------|
| 怎么用? | `claude --print --allowedTools "Bash,Read,Write" < prompt.txt` | 把 prompt 文件喂给 claude,结果吐到 stdout |
| 和交互模式有什么区别? | 无 TUI,无上下文保留,每次独立执行 | 交互=对话,--print=一次性执行脚本 |
| 认证怎么处理? | `env -u ANTHROPIC_API_KEY claude ...` 移除 API key,使用 Pro 订阅 | 用会员卡进场,不用现金付费 |
**完整调用模式**:
```bash
PROMPT_FILE=$(mktemp)
echo "$PROMPT" > "$PROMPT_FILE"
env -u ANTHROPIC_API_KEY claude \
--print \
--allowedTools "Bash,Read,Write,Glob,Grep" \
< "$PROMPT_FILE"
rm -f "$PROMPT_FILE"
```
**口诀**:`--print` = 无人值守批处理;stdin 喂 prompt,stdout 收结果。
> 图解待补充(网络异常)
**与已知的关联**:类似 `python script.py` 非交互运行脚本。结合 `env -u` 移除 API key 的设计,对应 CLAUDE.md 中已有的「Hook 启动 Agent 规范」——本质是同一套认证隔离思路。
---
## 总结
| 知识点 | 核心要点 | 记忆口诀 | 领域 |
|--------|----------|----------|------|
| Commands 机制 | Markdown 文件 = slash command | 文件即命令 | Claude Code |
| Session JSONL 存储 | `~/.claude/projects/` + JSONL格式,过滤 isSidechain | type+isSidechain双过滤 | Claude Code |
| `--print` 非交互模式 | stdin→prompt,stdout→结果,env -u 去 API key | 无人值守批处理 | Claude Code |
**本次 session 最大收获**:Claude Code 的内部存储是完全可编程的——session 是可读的 JSONL,commands 是可写的 Markdown,整个工具链可以被自动化脚本深度集成。
---
> ⚠️ 图解因 OpenRouter 网络异常未能生成,可补充运行:
> ```bash
> cd ~/.claude/skills/api-draw
> python scripts/nanobanana_draw.py "..." --style "手绘白板" --subject "ClaudeCode命令机制" --save-dir "/Users/liuyishou/usr/odyssey/0 收集箱/assets/"
> ```