会话管理技能
加载于:base.md
为了在长时间的开发会话中保持上下文,并在休息后无缝恢复。
核心原则
在自然断点处检查点,立即恢复。
长时间的开发会话有失去上下文的风险。主动记录状态、决策和进展,以便任何会话都可以在离开的地方精确恢复——无论是休息后返回还是达到上下文限制。
分层总结规则
第1层:快速更新(仅current-state.md)
触发器:完成任何小任务或待办事项后 动作:更新“活动任务”、“进展”和“下一步”部分 时间:~30秒
第2层:完整检查点(current-state.md + decisions.md)
触发器:
- 完成功能或重大更改后
- 做出任何架构/库决策后
- 在积极工作中大约20个工具调用后
- 当切换到代码库的不同区域时
动作:
- 更新完整的current-state.md
- 将任何决策记录到decisions.md
- 更新正在修改的文件表
第3层:会话归档(archive/ + 完整检查点)
触发器:
- 工作会话结束时
- 完成主要功能/里程碑时
- 在重大上下文转变之前
- 当上下文感觉沉重(~50+工具调用)时
动作:
- 创建归档条目:
archive/YYYY-MM-DD[-topic].md - 完整检查点
- 从current-state.md中清除详细笔记
- 如果引入了新模式,则更新code-landmarks.md
决策启发式
┌─────────────────────────────────────────────────────┐
│ 完成工作后,问: │
├─────────────────────────────────────────────────────┤
│ 做出了决策吗? → 记录到decisions.md │
│ 任务需要>10个工具调用? → 完整检查点 │
│ 主要功能完成了吗? → 归档 │
│ 会话结束? → 归档 + 交接 │
│ 否则 → 快速更新 │
└─────────────────────────────────────────────────────┘
会话状态结构
创建_project_specs/session/目录:
_project_specs/
└── session/
├── current-state.md # 现场会话状态(频繁更新)
├── decisions.md # 关键决策日志(仅附加)
├── code-landmarks.md # 重要代码位置
└── archive/ # 过去会话摘要
└── 2025-01-15.md
当前状态文件
_project_specs/session/current-state.md - 每15-20分钟或在重大进展后更新。
# 当前会话状态
*最后更新:2025-01-15 14:32*
## 活动任务
[一句话:我们现在正在做什么]
示例:使用JWT令牌实现用户认证流程
## 当前状态
- **阶段**:[探索 | 规划 | 实施 | 测试 | 调试 | 重构]
- **进展**:[X of Y步骤完成,或百分比]
- **阻塞问题**:[无,或描述阻塞者]
## 上下文摘要
[2-3句话总结当前工作状态]
示例:创建了认证中间件和登录端点。JWT签名有效。
目前正在实现令牌刷新逻辑。需要添加刷新令牌
旋转以提高安全性。
## 正在修改的文件
| 文件 | 状态 | 笔记 |
|------|--------|-------|
| src/auth/middleware.ts | 完成 | JWT验证 |
| src/auth/refresh.ts | 进行中 | 令牌旋转 |
| src/auth/types.ts | 完成 | 令牌接口 |
## 下一步
1. [ ] 在refresh.ts中完成刷新令牌旋转
2. [ ] 添加用于注销的令牌黑名单
3. [ ] 为认证流程编写集成测试
## 要保留的关键上下文
- 根据安全要求使用RS256算法(而不是HS256)
- 刷新令牌存储在HttpOnly cookies中
- 访问令牌:15分钟,刷新令牌:7天
## 恢复指令
要继续这项工作:
1. 阅读src/auth/refresh.ts - 目前在第45行
2. rotateRefreshToken()函数需要错误处理
3. 检查decisions.md,了解为什么我们选择RS256而不是HS256
决策日志
_project_specs/session/decisions.md - 仅附加的架构和实现决策日志。
# 决策日志
跟踪关键决策以供将来参考。永远不要删除条目。
---
## [2025-01-15] JWT算法选择
**决策**:使用RS256而不是HS256进行JWT签名
**上下文**:实施认证系统
**考虑的选项**:
1. HS256(对称)- 更简单,单一密钥
2. RS256(非对称)- 公/私钥对
**选择**:RS256
**理由**:
- 允许在不暴露签名密钥的情况下验证令牌
- 更适合微服务(服务只需要公钥)
- 生产系统的行业标准
**权衡**:
- 密钥管理稍微复杂一些
- 令牌大小更大
**参考**:
- src/auth/keys/ - 密钥存储
- docs/security.md - 安全架构
---
## [2025-01-14] 数据库架构方法
**决策**:使用Drizzle ORM与PostgreSQL
**上下文**:设置数据层
**考虑的选项**:
1. Prisma - 流行,良好的DX
2. Drizzle - 类型安全,类似SQL
3. 原始SQL - 最大控制
**选择**:Drizzle
**理由**:
- 比Prisma更好的TypeScript推断
- 更透明的SQL生成
- 更轻量级,更快的冷启动
**参考**:
- src/db/schema.ts - 架构定义
- src/db/migrations/ - 迁移文件
代码地标
_project_specs/session/code-landmarks.md - 重要代码位置的快速参考。
# 代码地标
快速参考代码库中的重要部分。
## 入口点
| 位置 | 目的 |
|----------|---------|
| src/index.ts | 主应用入口 |
| src/api/routes.ts | API路由定义 |
| src/workers/index.ts | 后台作业入口 |
## 核心业务逻辑
| 位置 | 目的 |
|----------|---------|
| src/core/auth/ | 认证系统 |
| src/core/billing/ | 支付处理 |
| src/core/workflows/ | 主工作流引擎 |
## 配置
| 位置 | 目的 |
|----------|---------|
| src/config/index.ts | 环境配置 |
| src/config/features.ts | 功能标志 |
| drizzle.config.ts | 数据库配置 |
## 关键模式
| 模式 | 示例位置 | 笔记 |
|---------|------------------|-------|
| 服务层 | src/services/user.ts | 业务逻辑封装 |
| 仓库 | src/repos/user.ts | 数据访问抽象 |
| 中间件 | src/middleware/auth.ts | 请求处理 |
## 测试
| 位置 | 目的 |
|----------|---------|
| tests/unit/ | 单元测试 |
| tests/integration/ | API测试 |
| tests/e2e/ | 端到端测试 |
| tests/fixtures/ | 测试数据 |
## 陷阱和非明显行为
| 位置 | 问题 | 笔记 |
|----------|-------|-------|
| src/utils/date.ts | 时区处理 | 内部始终使用UTC |
| src/api/middleware.ts:45 | 认证绕过 | 健康检查跳过认证 |
| src/db/pool.ts | 连接限制 | 开发中最大10个连接 |
CLAUDE.md会话规则
## 会话管理
**重要**:遵循session-management.md技能。在自然断点处更新会话状态。
### 每个任务完成后
问自己:
1. 做出了决策吗? → 记录到`decisions.md`
2. 这需要>10个工具调用吗? → 完整检查点到`current-state.md`
3. 主要功能完成了吗? → 创建归档条目
4. 否则 → 快速更新到`current-state.md`
### 检查点触发器
**快速更新**(current-state.md):
- 完成任何待办事项
- 进行小更改
**完整检查点**(current-state.md + decisions.md):
- 重大更改后
- 大约20个工具调用后
- 做出任何决策后
- 当切换焦点区域时
**归档**(archive/ + 完整检查点):
- 会话结束
- 主要功能完成
- 上下文感觉沉重
### 会话开始协议
开始工作时:
1. 阅读`_project_specs/session/current-state.md`
2. 检查`_project_specs/todos/active.md`
3. 如有需要,查看最近的`decisions.md`条目
4. 从“下一步”继续
### 会话结束协议
在结束或上下文限制接近时:
1. 创建归档:`_project_specs/session/archive/YYYY-MM-DD.md`
2. 使用交接格式更新current-state.md
3. 确保下一步具体且可执行
压缩策略
何时压缩(第3层归档)
| 触发器 | 动作 |
|---|---|
| ~50+工具调用 | 总结进展,归档详细笔记 |
| 主要功能完成 | 归档功能细节,更新地标 |
| 上下文转变 | 总结之前的上下文,归档,重新开始 |
| 会话结束 | 完整的会话交接和归档 |
保留与归档
保留在活动上下文中:
- 当前任务和接下来的步骤
- 活动文件列表及其状态
- 阻塞问题
- 影响当前工作的决策
归档/总结:
- 没有成功探索的路径
- 详细的调试跟踪(仅保留结论)
- 冗长的错误消息(仅保留根本原因)
- 研究笔记(仅保留建议)
压缩模板
压缩时,使用此格式:
## 压缩上下文 - [主题]
**摘要**:[1-2句话]
**关键发现**:
- [重要发现的项目点]
**做出的决策**:
- [参考decisions.md条目]
**相关代码**:
- [文件:行引用]
**归档细节**:[如果创建了归档文件,则链接到归档文件]
会话归档
在重要工作或会话结束时创建归档:
_project_specs/session/archive/YYYY-MM-DD[-topic].md
# 会话归档:[日期] - [主题]
## 摘要
[总结完成的工作的段落]
## 完成的任务
- [TODO-XXX] 描述 - 完成
- [TODO-YYY] 描述 - 完成
## 关键决策
- [参考本会话中做出的decisions.md条目]
## 代码更改
| 文件 | 更改类型 | 描述 |
|------|-------------|-------------|
| src/auth/login.ts | 创建 | 登录端点 |
| src/auth/types.ts | 修改 | 添加RefreshToken类型 |
## 添加的测试
- tests/auth/login.test.ts - 登录流程测试
- tests/auth/refresh.test.ts - 令牌刷新测试
## 继续进行的开放项目
- [任何未完成的项目,现在在active.md中]
## 会话统计
- 持续时间:~3小时
- 工具调用:~120
- 修改的文件:8
- 添加的测试:12
与待办事项系统集成
将待办事项链接到会话
在活动待办事项中,引用会话上下文:
## [TODO-042] 实施令牌刷新
**状态:** 进行中
**会话上下文:** 参见current-state.md
### 进展笔记
- 2025-01-15:开始实施,基础结构完成
- 2025-01-15:添加旋转逻辑,需要错误处理
在待办事项完成时自动更新
完成待办事项时:
- 在active.md中标记待办事项为完成
- 更新current-state.md的进展
- 记录任何做出的决策
- 如果引入了新模式,则更新code-landmarks.md
快速命令
将这些添加到项目脚本或别名中:
# 显示当前会话状态
alias session-status="cat _project_specs/session/current-state.md"
# 快速编辑会话状态
alias session-edit="$EDITOR _project_specs/session/current-state.md"
# 查看最近的决策
alias decisions="tail -100 _project_specs/session/decisions.md"
# 创建会话归档
session-archive() {
cp _project_specs/session/current-state.md \
"_project_specs/session/archive/$(date +%Y-%m-%d).md"
echo "Archived to _project_specs/session/archive/$(date +%Y-%m-%d).md"
}
执行机制
1. CLAUDE.md作为入口点
CLAUDE.md必须在技能部分引用session-management.md。Claude首先读取CLAUDE.md,然后指示它遵循会话规则。
2. 会话文件头带有提醒
在会话文件头中包含执行提醒:
current-state.md头部:
<!--
检查点规则(来自session-management.md):
- 快速更新:在完成任何待办事项后
- 完整检查点:在大约20个工具调用或决策后
- 归档:在会话结束或主要功能完成时
-->
3. 自我检查问题
完成任何任务后,Claude应该问:
□ 我做出决策了吗? → 记录它
□ 这需要>10个工具调用吗? → 完整检查点
□ 功能完成了吗? → 归档
□ 我结束/切换上下文了吗? → 归档 + 交接
4. 会话开始验证
开始会话时,Claude必须:
- 检查
current-state.md是否存在并阅读它 - 宣布它找到了什么:“从[最后状态]恢复”
- 在继续之前确认下一步
5. 定期自我审计
每大约20个工具调用,Claude应该检查:
- current-state.md是最新的吗?
- 有没有未记录的决策?
- 上下文变得沉重了吗?
6. 用户提示
用户可以通过询问来执行:
- “更新会话状态” → 触发检查点
- “当前状态是什么?” → Claude阅读并报告
- “结束会话” → 触发归档 + 交接
- “从上一个会话恢复” → Claude首先读取状态文件
反模式
- 没有状态跟踪 - 盲目飞行,无法恢复
- 过于冗长的状态 - 保持可扫描,而不是小说
- 过时的状态文件 - 定期更新,否则它们变得无用
- 缺少决策 - 未来的你不会记得为什么
- 没有代码地标 - 浪费时间重新发现代码库
- 从不归档 - 会话文件变得杂乱无章
- 忽略压缩信号 - 上下文过载会降低性能
- 在决策后跳过检查点 - 关键上下文丢失
- 会话结束时没有交接 - 下一个会话开始时盲目
快速参考
检查点决策树
任务完成了吗?
│
├── 决策做出? ──────────────────→ 记录到decisions.md
│
├── >10个工具调用或重大? ──→ 完整检查点
│
├── 主要功能完成了吗? ─────────────→ 归档
│
└── 否则 ───────────────────────→ 快速更新
文件一览
| 文件 | 更新频率 | 目的 |
|---|---|---|
| current-state.md | 每个任务 | 现场状态,下一步 |
| decisions.md | 做出决策时 | 架构选择 |
| code-landmarks.md | 模式变化时 | 代码导航 |
| archive/*.md | 会话结束/功能 | 历史记录 |