Claude Code skill: generate a structured session-resume prompt (SESSION-RESUME.md) for context handoff between sessions
SaferSkills independently audited session-resume (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
セッション中断時に、次回セッションへコンテキストを引き継ぐ構造化プロンプトを生成し、対象プロジェクト ディレクトリの `SESSION-RESUME.md` に書き出す skill。「次回再開用の prompt を LLM best practice に沿って 作って」を毎回手で指示する代わりに、対象 dir の確定 → 状況収集 → best-practice 準拠プロンプト生成 → ファイル書き出し + チャット要点表示 までを一括で行う。
~/.claude/projects/<対象 dir を slug 化>/memory/MEMORY.mdとその個別メモリファイル。旧 _memory/(長期記憶/短期記憶/working-memory)3-Layer プロトコルは廃止済 → 新規作成しない。既存の legacy _memory/ が見つかった場合のみ 読み取り専用で補助参照してよい (作成・更新はしない)。
$DIR であり、pwd を直接の正本にしない。プロジェクトを移動/改名した直後は live cwd が旧パスのまま残り、空の旧 dir を収集してしまうため (この skill が以前抱えていた最大の問題)。
走ってしまうため、収集はすべて Instructions の明示ステップ($DIR 確定後)で実行する。 (この説明自体が当該記法を含むとローダに実行されてしまうため、記法そのものは本文に書かない。)
best practice をすべて含む。補足が必要な場合のみ、別 skill LLM-prompting-bestpractice (https://github.com/eUmeda/LLM-prompting-bestpractice) がインストールされていれば参照してよい(無ければ skip)。
「context save」等と明示的に依頼したとき、または /session-resume を直接呼んだとき。 この場合 Claude は Skill ツールからこの skill を起動してよい。
ならない。セッション中の通常作業の区切りごとに勝手に走らせない。 (disable-model-invocation フラグは廃止し model 起動を許可したが、その代わりこの「明示依頼時のみ・ 自発起動禁止」を運用ルールとして MUST 守ること。両者は矛盾しない: 起動経路は開けつつ、起動の引き金は user の明示依頼に限定する。)
以下の手順で再開用プロンプトを生成すること。
$DIR の確定(cwd 非依存・最重要)収集対象 $DIR を以下の優先順で確定する。`pwd` を既定にしない。
--dir があれば、その直後から次のフラグ/補足メモ手前までを1 つのパスとして取り出し $DIR とする(パスに空白が含まれ得るので、空白で途中切りしないこと)。これが最優先。
(「〜へ移動した」「Desktop に移した」「iCloud から出した」「改名した」等のフレーズを手掛かりに)。
$DIR とする。移動が話題なら 移動先(新パス)を選ぶ(live cwd の旧パスを選ばない)。
(誤った場所を黙って収集するのを未然に防ぐ)。
pwd。pwd はプロジェクトを移動/改名していない場合にのみ安全。移動直後は live cwd が旧パスのまま残るため危険。少しでも疑わしければ pwd を使わず AskUserQuestion で確認すること。
確定後、`$DIR` を実パスに置換して sanity check を MUST 実行する (ダブルクォートを外さないこと。空白を含むパスを保護するため。パスはクォートの内側に貼る):
DIR="/絶対/パス/を/ここに" # 例: DIR="/Users/you/projects/my-project"
DIR="${DIR%/}"
if [ ! -d "$DIR" ]; then echo "MISSING_DIR: $DIR"; else
echo "DIR: $DIR"
echo "entries: $(ls -A "$DIR" 2>/dev/null | wc -l | tr -d ' ')"
fiMISSING_DIR が出た / entries: 0(空)/ $DIR が「user が直前に『移動元』と述べた旧パス」に一致する、のいずれかなら、AskUserQuestion で正しい対象 dir を 1 問だけ確認してから次へ進む。
$DIR を以降のすべてのステップで使う。$DIR に対して実行)$DIR 基準で収集する($DIR を実パスに置換。クォートを外さない。cwd 相対では実行しない):
DIR="/絶対/パス/を/ここに"
proj="$HOME/.claude/projects"
# auto-memory の slug は「英数字以外をすべて - に置換」(harness の変換規則。空白・~・/ もすべて - になる)
slug=$(printf '%s' "$DIR" | sed 's#[^A-Za-z0-9]#-#g')
mem="$proj/$slug/memory"
echo "== auto-memory =="
if [ -d "$mem" ]; then echo "($mem)"; ls "$mem"/*.md 2>/dev/null
else
# robust fallback: slug 変換の取りこぼし/プロジェクト移動に備え、basename で照合
base=$(printf '%s' "$(basename "$DIR")" | sed 's#[^A-Za-z0-9]#-#g')
echo "(derived-slug memory なし → basename '$base' で照合)"
# glob はパス境界 (- は / 由来) でアンカーし、部分文字列の誤マッチ (例: my-base が *base に当たる) を防ぐ。
# それでも複数ヒットした場合は推測で 1 つを選ばず、候補を列挙して AskUserQuestion で 1 問確認する (Step 0 と同じルール)
hits=$(ls -d "$proj"/"$base"/memory "$proj"/*-"$base"/memory 2>/dev/null)
[ -n "$hits" ] && printf '%s\n' "$hits" \
|| echo " (該当なし → グローバル $proj/$(printf '%s' "$HOME" | sed 's#[^A-Za-z0-9]#-#g')/memory/MEMORY.md を確認)"
fi
# 状態ファイル
echo "== state files =="
find "$DIR" -maxdepth 2 \( -name 'CLAUDE.md' -o -name 'TODO.md' -o -name 'README.md' -o -name 'HISTORY.md' -o -name 'progress.md' -o -name 'SESSION-RESUME.md' \) -type f 2>/dev/null | head -12
# git
echo "== git =="
git -C "$DIR" log --oneline -3 2>/dev/null && echo "---" && git -C "$DIR" status -s 2>/dev/null | head -10 || echo "Not a git repo"
# legacy _memory(あれば読み取りのみ)
echo "== legacy _memory (read-only) =="
out=$(find "$DIR" -path '*/_memory/*' -name '*.md' -type f 2>/dev/null | head -8)
[ -n "$out" ] && printf '%s\n' "$out" || echo "none"移動/改名直後の auto-memory(任意・該当時のみ): 移動先 dir 由来の memory がまだ無い場合、記憶は移動元の slug 下に残っていることがある。会話文脈で旧パスが分かるなら、それも読み取りのみで確認する:
OLDDIR="" # 旧パスが会話文脈で分かる場合のみ設定。不明なら空のまま
if [ -n "$OLDDIR" ]; then
oldmem="$HOME/.claude/projects/$(printf '%s' "$OLDDIR" | sed 's#[^A-Za-z0-9]#-#g')/memory"
[ -d "$oldmem" ] && { echo "== pre-move auto-memory (read-only: $oldmem) =="; ls "$oldmem"/*.md 2>/dev/null; }
fi採否ルール: 新パスの memory を優先。新パスに無く旧パスにあれば旧パスを読み取りで採用(新規作成はしない)。 両方ある場合は新パスを正本としつつ、旧パス側の未完了 TODO は次回 recommendation に漏らさず引き継ぐ。
収集後、現在のセッションの作業内容を分析する:
$DIR(絶対パス)MEMORY.md + 関連する個別メモリ。無ければグローバル~/.claude/projects/<$HOME の slug>/memory/MEMORY.md。移動直後は旧パス slug 下の memory も読み取りで参照。
SESSION-RESUME.md(前回分があれば)_memory/ が在る場合のみ、読み取り補助として任意で挙げる。MUST にはしない)- [ ] 形式でリストアップし、各タスクに status を分類 する:[actionable]: 即着手可能。外部依存なし[deferred]: user 主導再開のもの (例: 改名議論、心理的に重い判断)。Claude 側から推さない[blocked]: 外部入力・データ収集・user の手動 step 待ち以下のテンプレートに沿って再開プロンプトを生成する。下記 MUST は LLM プロンプティング best practice (XML 構造化 / context-first・query-last / outcome-first 指示 / MUST・MUST NOT 明示) を反映している。
MUST:
<context_files> を先頭に配置する(long context 最適化: ~30%精度改善)<next_action> を末尾に配置する(query 末尾配置で精度向上)$DIR 由来の絶対パス)[actionable] / [deferred] / [blocked] の status を末尾に付与する<recommendation> セクションを <next_action> 内に必ず含め、最有力 1 件 + alternative 1-2 件を理由付きで提示する<next_action> は分岐させる: actionable TODO がある場合は "user に recommend 提示 → 1 質問だけ確認 → 着手" の flow を明記、無い場合は "user 指示待ち" のシンプルな flow_memory/ は在れば補助のみ)MUST NOT:
[deferred] タスクを recommendation に含めない (user 主導再開モード尊重)_memory/ ディレクトリ作成を再開プロンプトに指示しない(廃止済プロトコル)#### Output Template
注: 下の ``フェンス内は **そのまま SESSION-RESUME.md に出力する再開プロンプト本体**。[Case A][Case B]の角括弧マーカーは「現在の Claude が分岐を選ぶための指示」であり、出力には含めない。<next_action>` 内の 番号付き手順は 次セッションの Claude 向けの指示として出力に含める。
以下のコンテキストで作業を再開してください。
<context_files>
MUST: 以下のファイルを最初に読み込んでコンテキストを復元すること:
1. [絶対パス] — [このファイルの役割の1行説明]
2. [絶対パス] — [役割]
</context_files>
<working_directory>[絶対パス]</working_directory>
<project>
## プロジェクト概要
[1-2文のプロジェクト説明]
## 現在の状態
完了済み:
- [具体的な完了項目]
未完了:
- [ ] [具体的な未完了項目] `[actionable]`
- [ ] [具体的な未完了項目] `[deferred]` — [defer 理由]
- [ ] [具体的な未完了項目] `[blocked]` — [何待ちか]
</project>
<file_structure>
[主要ファイル/ディレクトリのtree構造]
</file_structure>
<constraints>
## 重要な設計決定
- [MUST維持すべき判断とその理由]
</constraints>
<next_action>
まず context_files のファイルを読み込んで状況を把握すること。
[Case A: actionable TODO がある場合は以下の <recommendation> ブロックを含める]
このセッションには未完了の actionable TODO が残っている。**user の入力を待たず**、下記 recommendation を能動的に提示すること:
1. 下記 <recommendation> の「最有力」を 1 文で提示 (タスク名 + 所要時間 + 完了成果物)
2. AskUserQuestion で「これで始める? / alternative? / 別の指示?」を 1 質問だけ確認
3. user 同意なら即着手。alternative を選んだらその spec を提示して着手。「別の指示」なら user の input を待つ
4. `[deferred]` タスクは Claude 側から提案しない (user 主導再開を尊重)
<recommendation>
## 最有力 (推奨)
**[タスク名]** — [所要時間目安] / [完了成果物]
理由: [なぜこれを最初にやるべきか、1-2 行]
## alternative
- **[タスク名]** — [所要時間目安] / [理由 1 行]
- **[タスク名]** — [所要時間目安] / [理由 1 行]
</recommendation>
[Case B: actionable TODO が無い、または全て deferred/blocked の場合]
未完了の actionable TODO は無い。context_files を読み込んだ後、user の指示を待つこと。
</next_action>/clear・端末クローズ・ディレクトリ移動後も残り、cwd に依存せず再開できる)。 既存の SESSION-RESUME.md がある場合は上書きでよい(最新の再開状態が正本)。
「対象 dir / 完了 n 件・未完了 m 件 (actionable k 件) / 最有力 recommendation 1 行 / 書き出し先パス」を含める。
$DIR/SESSION-RESUME.md を読ませて再開(または内容を冒頭プロンプトに貼る)。/session-resume --dir <$DIR> で再生成も可」。ファイルは移動後も残るので場所非依存。
--dir 以外の補足メモが含まれる場合は、その内容を <next_action> の補足情報として反映する。生成スタイルの参考として references/examples.md を参照。 これらは合成サンプル(架空プロジェクト)で、情報量と具体性のバランスの基準となる。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.