会话保存命令¶
捕获本次会话中发生的所有事情(构建了哪些内容、哪些成功、哪些失败、还有哪些遗留),并写入带日期的文件。这样,下一次会话就可以从本次会话中断的位置准确恢复。
使用时机¶
- 在关闭 Claude Code 之前结束工作会话时
- 在达到上下文限制之前(先执行此操作,然后开始新会话)
- 解决想要记住的复杂问题之后
- 任何需要向未来会话传递上下文的时机
流程¶
步骤 1:收集上下文¶
在写入文件之前,收集以下内容:
- 检查本次会话中修改过的所有文件(使用 git diff 或从对话中回忆)
- 回顾讨论过的内容、尝试过的内容以及做出的决定
- 记录发生的错误及其解决方法(如果未解决,则说明未解决)
- 如有相关,检查当前测试/构建状态
步骤 2:如果会话文件夹不存在则创建¶
在用户的 Claude 主目录中创建规范的会话文件夹:
步骤 3:写入会话文件¶
创建 ~/.claude/session-data/YYYY-MM-DD-<short-id>-session.tmp。使用今天的实际日期,以及满足 session-manager.js 中 SESSION_FILENAME_REGEX 所应用规则的 short-id:
- 兼容字符:英文字母
a-z/A-Z、数字0-9、连字符-、下划线_ - 兼容最小长度:1 个字符
- 新文件推荐风格:小写字母、数字、连字符,至少 8 个字符(为避免冲突)
有效示例:abc123de、a1b2c3d4、frontend-worktree-1、ChezMoi_2
新文件中应避免的示例:A、test_id1、ABC123de
完整有效文件名的示例:2024-01-15-abc123de-session.tmp
旧版文件名 YYYY-MM-DD-session.tmp 仍然有效,但新的会话文件推荐使用 short-id 格式,以避免同一天的冲突。
步骤 4:在文件中填写以下所有部分¶
请如实填写所有部分。不要跳过任何部分。如果某个部分确实没有内容,请填写“Nothing yet”或“N/A”。不完整的文件会带来比如实的空部分更差的结果。
步骤 5:向用户显示文件¶
写入后,显示完整内容,并询问如下:
等待确认。如有要求,则进行编辑。
会话文件格式¶
# セッション: YYYY-MM-DD
**開始:** [わかる場合はおおよその時刻]
**最終更新:** [現在の時刻]
**プロジェクト:** [プロジェクト名またはパス]
**トピック:** [このセッションの内容を一行で要約]
---
## 構築しているもの
[機能、バグ修正、またはタスクを説明する1〜3段落。このセッションの記憶がゼロの人でも
目標を理解できる十分なコンテキストを含めてください。
含めるべき内容: 何をするのか、なぜ必要なのか、大きなシステムにどのように適合するのか。]
---
## うまくいったこと(証拠付き)
[動作が確認されたものだけをリストしてください。各項目について、なぜ動作すると
わかるのかを含めてください — テストが通った、ブラウザで動作した、Postmanが200を返した、など。
証拠がない場合は、代わりに「まだ試していないこと」に移動してください。]
- **[動作するもの]** — 確認方法: [具体的な証拠]
- **[動作するもの]** — 確認方法: [具体的な証拠]
確認済みの動作がまだない場合: 「確認済みの動作はまだありません — すべてのアプローチが進行中またはテスト未実施です。」
---
## うまくいかなかったこと(理由付き)
[これは最も重要なセクションです。試みて失敗したすべてのアプローチをリストしてください。
各失敗について正確な理由を記入し、次のセッションが同じことを再試行しないようにしてください。
具体的に: 「YのためにXエラーが発生した」は有用です。「動かなかった」は有用ではありません。]
- **[試みたアプローチ]** — 失敗理由: [正確な理由 / エラーメッセージ]
- **[試みたアプローチ]** — 失敗理由: [正確な理由 / エラーメッセージ]
失敗がない場合: 「失敗したアプローチはまだありません。」
---
## まだ試していないこと
[有望に見えるがまだ試みていないアプローチ。会話の中で出たアイデア。
検討する価値のある代替ソリューション。次のセッションが何を試すべきか
正確にわかるよう、十分に具体的に記述してください。]
- [アプローチ / アイデア]
- [アプローチ / アイデア]
キューに入っているものがない場合: 「特定の未試行アプローチは特定されていません。」
---
## ファイルの現在の状態
[このセッションで触れたすべてのファイル。各ファイルの状態を正確に記述してください。]
| ファイル | ステータス | メモ |
| ----------------- | -------------- | -------------------------- |
| `path/to/file.ts` | PASS: 完了 | [何をするか] |
| `path/to/file.ts` | 進行中 | [完了部分、残り部分] |
| `path/to/file.ts` | FAIL: 壊れている | [何が問題か] |
| `path/to/file.ts` | 未着手 | [計画済みだが未着手] |
ファイルが触れられていない場合: 「このセッションではファイルの変更はありません。」
---
## 決定事項
[アーキテクチャの選択、受け入れたトレードオフ、選択したアプローチとその理由。
これにより、次のセッションが既に決定された事項を蒸し返すのを防ぎます。]
- **[決定]** — 理由: [代替案よりもこれを選んだ理由]
重要な決定がない場合: 「このセッションでは大きな決定はありませんでした。」
---
## ブロッカーと未解決の質問
[次のセッションで対処または調査する必要がある未解決の事項。
出てきたが回答されなかった質問。待機中の外部依存関係。]
- [ブロッカー / 未解決の質問]
ない場合: 「アクティブなブロッカーはありません。」
---
## 正確な次のステップ
[わかっている場合: 再開時に行うべき最も重要な単一のこと。
開始場所について考える必要がないほど正確に記述してください。]
[わかっていない場合: 「次のステップは未定です — 方向性を決める前に
『まだ試していないこと』と『ブロッカー』セクションを確認してください。」]
---
## 環境とセットアップに関するメモ
[関連がある場合のみ記入 — プロジェクトの実行に必要なコマンド、
必要な環境変数、実行中である必要があるサービスなど。標準的なセットアップの場合はスキップ。]
[ない場合: このセクション全体を省略してください。]
输出示例¶
# セッション: 2024-01-15
**開始:** 約14時
**最終更新:** 17:30
**プロジェクト:** my-app
**トピック:** httpOnlyクッキーによるJWT認証の構築
---
## 構築しているもの
Next.jsアプリのユーザー認証システム。ユーザーはメールアドレスとパスワードで登録し、
httpOnlyクッキー(localStorageではなく)に保存されたJWTを受け取り、保護されたルートは
ミドルウェアを通じて有効なトークンを確認します。目標は、トークンをJavaScriptに
公開することなく、ブラウザのリフレッシュ間でセッションの永続性を実現することです。
---
## うまくいったこと(証拠付き)
- **`/api/auth/register` エンドポイント** — 確認方法: Postman POSTがユーザーオブジェクト付きの200を返し、
Supabaseダッシュボードで行が確認でき、bcryptハッシュが正しく保存されている
- **`lib/auth.ts` でのJWT生成** — 確認方法: ユニットテストが通る
(`npm test -- auth.test.ts`)、jwt.ioでデコードしたトークンが正しいペイロードを表示
- **パスワードハッシュ化** — 確認方法: テストで `bcrypt.compare()` がtrueを返す
---
## うまくいかなかったこと(理由付き)
- **Next-Authライブラリ** — 失敗理由: カスタムPrismaアダプターと競合し、
すべてのリクエストで「Cannot use adapter with credentials provider in this configuration」をスロー。
デバッグする価値なし — 我々のセットアップには意見が強すぎる。
- **localStorageへのJWT保存** — 失敗理由: SSRレンダリングはlocalStorageが利用可能になる前に行われ、
すべてのページ読み込みでReactのハイドレーション不一致エラーが発生。
このアプローチはNext.jsのSSRと根本的に互換性がない。
---
## まだ試していないこと
- ログインルートのレスポンスでJWTをhttpOnlyクッキーとして保存する(最も可能性の高いソリューション)
- `next/headers` の `cookies()` を使用してサーバーコンポーネントでトークンを読み取る
- クッキーの存在を確認してルートを保護するmiddleware.tsを書く
---
## ファイルの現在の状態
| ファイル | ステータス | メモ |
| -------------------------------- | -------------- | ----------------------------------------------- |
| `app/api/auth/register/route.ts` | PASS: 完了 | 動作確認済み、テスト済み |
| `app/api/auth/login/route.ts` | 進行中 | トークンは生成されるがクッキーの設定はまだ |
| `lib/auth.ts` | PASS: 完了 | JWTヘルパー、すべてテスト済み |
| `middleware.ts` | 未着手 | ルート保護、クッキー読み取りロジックが先に必要 |
| `app/login/page.tsx` | 未着手 | UIは未着手 |
---
## 決定事項
- **localStorageよりhttpOnlyクッキー** — 理由: XSSトークン盗難を防ぎ、SSRで動作する
- **Next-Authよりカスタム認証** — 理由: Next-AuthがPrismaセットアップと競合し、闘う価値がない
---
## ブロッカーと未解決の質問
- `cookies().set()` はRoute Handler内で動作するのか、それともServer Actions内でのみか?確認が必要。
---
## 正確な次のステップ
`app/api/auth/login/route.ts` で、JWTを生成した後、
`cookies().set('token', jwt, { httpOnly: true, secure: true, sameSite: 'strict' })` を使用して
httpOnlyクッキーとして設定する。
その後Postmanでテスト — レスポンスに `Set-Cookie` ヘッダーが含まれるはず。
注意事项¶
- 每个会话都会分配一个独立文件 — 不要追加到之前会话的文件中
- “失败的事情”部分最重要 — 如果没有这部分,未来会话会盲目重试失败的方法
- 如果用户要求在会话中途(而不是结束时)保存,请保存当前已知内容,并明确标记进行中的项目
- 此文件旨在下一次会话开始时通过
/resume-session被 Claude 读取 - 使用规范的全局会话存储:
~/.claude/session-data/ - 新的会话文件推荐使用 short-id 文件名格式(
YYYY-MM-DD-<short-id>-session.tmp)
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC