はじめに:なぜClaude Codeは「30分後」にポンコツになるのか?
Claude Codeを使っていると、最初は神のようにコードを書いてくれるのに、セッションが長引くにつれて**「さっき教えたことを忘れる」「同じ修正を繰り返す」「文脈を見失う(Context Rot)」**という現象に悩まされませんか?
いわゆる「Vibe Coding(ノリで書く)」では、実務レベルの複雑なタスクや、日をまたぐ開発には耐えられません。
この記事では、Claude Codeハッカソン優勝者(Affaan Mustafa氏)が提唱する**「メモリ運用(Affaan方式)」と、開発プロセスを型化する人気プラグイン「Superpowers」**を組み合わせた、軽量かつ最強の実務用セットアップを紹介します。
重たいVector DBや複雑な設定は不要です。**「型」と「ログ」**だけで勝てます。
結論:この2つを組み合わせると「補完関係」で最強になる
この構成の肝は、**「プロセスの型化」と「記憶の外部化」**を分担させることです。
| ツール | 役割 | 効果 |
|---|---|---|
| 1. Superpowers | 開発の「型」 (Structure) | 設計→計画→実装→検証のフローを強制し、迷走を防ぐ。 |
| 2. Affaan方式 | 記憶の「外部化」 (Memory) | セッション要約ログをHookで自動管理し、日をまたいでも即再開できる状態を作る。 |
片方だけでは不十分です。
- Superpowersだけだと、セッションが切れた時に「どういう経緯でその決定をしたか」の文脈が消えます。
- Affaan方式だけだと、自由度が高すぎて開発プロセス自体がぐだぐだになる可能性があります。
この2つを組み合わせることで、**「迷わず進めて(Superpowers)、忘れても大丈夫(Affaan方式)」**な状態を作ります。
前提環境
- Claude Code インストール済み
-
OS: Mac / Linux / Windows (WSL2推奨)
- 注意: Windowsネイティブ環境ではHooksが正常に動作しない報告があるため、WSL2(Ubuntu等)での実行を強く推奨します。
- 設定方針:プロジェクトごとに設定ファイル(
.claude/)を置く「プロジェクトローカル」方式
Step 1: Superpowersの導入(開発の「型」を作る)
まずは、開発フローを整えるプラグインを入れます。これはClaude Code公式のMarketplace経由で導入します。
# Claude Codeのプロンプトで実行
/plugin marketplace add obra/superpowers-marketplace
/plugin install superpowers@superpowers-marketplace
これで /plan /architect などのコマンドが使えるようになり、**「いきなりコードを書かせず、計画を立ててから実行する」**という作法が強制されます。
Step 2: Affaan方式「要約ログ」の導入(記憶の外部化)
ここが本記事の核です。ハッカソン優勝者が公開している everything-claude-code の思想をベースに、プロジェクト内に最小構成で導入します。
2-1. フォルダ構成の作成
プロジェクトルートに以下のディレクトリを作成します。
mkdir -p .claude/hooks
mkdir -p .claude/sessions
mkdir -p .claude/memory
touch .claude/memory/last_session_path.txt
.gitignore に以下を追加して、セッションログ自体はGit管理外(または必要に応じて管理)にします。
.claude/sessions/
.claude/memory/
2-2. Hooksの設定 (.claude/settings.json)
Hooksを使って、セッションの開始・終了・圧縮(Compact)のタイミングでスクリプトを自動実行させます。
プロジェクトルートの .claude/settings.json を作成(または編集)します。
{
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/session-start.sh"
}
]
}
],
"PreCompact": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/pre-compact.sh"
}
]
}
],
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/session-end.sh"
}
]
}
]
}
}
Step 3: 自動化スクリプトの配置
Affaan方式のキモとなる3つのスクリプトを .claude/hooks/ に配置します。
3-1. 終了時にログを残す session-end.sh
セッション終了時(/exit や会話終了時)に、**「次の自分のための引き継ぎ書」**のテンプレートを作成します。
#!/usr/bin/env bash
set -euo pipefail
SESS_DIR=".claude/sessions"
MEM_FILE=".claude/memory/last_session_path.txt"
mkdir -p "$SESS_DIR" ".claude/memory"
# 日時でファイル名を作成
TS=$(date +"%Y-%m-%d__%H%M")
OUT="${SESS_DIR}/${TS}__session.md"
# ログテンプレート(ここが重要)
cat > "$OUT" <<'EOF'
# Session Log
## Goal(目的)
-
## Done(完了)
-
## Decisions(決めたこと・理由)
-
## Evidence(根拠:テスト/コマンド/ログ)
-
## Failed attempts(やってダメだったこと ※超重要)
-
## Open questions(未解決)
-
## Next actions(次の1〜5手)
1.
2.
## Learned(次回以降のルール化候補)
-
EOF
# 次回ロード用にパスを記録
echo "$OUT" > "$MEM_FILE"
echo "[Stop] セッションログを作成しました: ${OUT}"
echo "[Stop] ★中身を編集して保存してください。次回は @${OUT} で再開できます"
3-2. 開始時に前回ログを教える session-start.sh
次回 claude を起動したとき、前回のログファイルパスを教えてくれます。
#!/usr/bin/env bash
set -euo pipefail
MEM_FILE=".claude/memory/last_session_path.txt"
echo "[SessionStart] セッションを開始します"
if [[ -f "$MEM_FILE" ]]; then
LAST_PATH=$(cat "$MEM_FILE" || true)
if [[ -n "${LAST_PATH}" && -f "${LAST_PATH}" ]]; then
echo "---------------------------------------------------"
echo "[SessionStart] 前回のセッションログが見つかりました"
echo "以下のコマンドでコンテキストを読み込んで再開できます:"
echo " /compact"
echo " 今回やることを入力 @${LAST_PATH}"
echo "---------------------------------------------------"
fi
fi
3-3. 圧縮前に退避する pre-compact.sh
長時間のセッションで /compact が走ると、短期記憶が消えます。その直前にスナップショットを残します。
#!/usr/bin/env bash
set -euo pipefail
SESS_DIR=".claude/sessions"
TS=$(date +"%Y-%m-%d__%H%M%S")
OUT="${SESS_DIR}/${TS}__precompact.md"
cat > "$OUT" <<'EOF'
# PreCompact Snapshot
コンテキスト圧縮により消える前の状態メモ。
- 作業中のタスク:
- 直近のエラー:
EOF
echo "[PreCompact] 圧縮前の状態を退避しました: ${OUT}"
※スクリプト作成後は実行権限を与えてください(WSL/Mac/Linux):
chmod +x .claude/hooks/*.sh
運用フロー:どう変わるのか?
この構成を入れると、日々の開発はこう変わります。
1. セッション開始
claude と打つと、Hookが走り**「前回ログはこれだよ(@.claude/sessions/xxx.md)」**と教えてくれます。
→ 文脈説明の手間がゼロになります。
2. 作業中(Superpowers)
「この機能を作りたい」と言えば、Superpowersが**「まずはPlanを作りましょう」**と誘導します。
→ 迷走せず、設計どおりに実装が進みます。
3. フェーズの区切り(Affaan方式)
「探索」から「実装」に移るときなど、作業の区切りで /compact を打ちます。
→ PreCompact Hookが走り、念の為のスナップショットが残るので安心して圧縮できます。
4. セッション終了
作業を終えると、自動的に Markdown のログファイルが生成されます。
ここには 「何がうまくいき、何がダメだったか(Failed attempts)」 の欄があります。これを埋めておくことで、翌日の自分が「同じバグでハマる」ことを防げます。
なぜ、他の「記憶プラグイン」ではなくこの方式なのか?
世の中には episodic-memory のような「会話を全部覚えておいて検索する」プラグインもあります。しかし、実務では以下の理由で今回の構成が推奨されます。
-
重くない(Lightweight)
- Vector DB同期やインデックス作成処理が走らないため、動作が軽快です。
-
「失敗の記録」が残る
- AIは「うまくいったこと」はコードに残しますが、「試してダメだったこと」はコードに残りません。Markdownログなら**「A案は〇〇の理由でダメだった」**という意思決定プロセスを資産化できます。
-
プロジェクト単位で完結
-
.claude/に設定を入れるため、プロジェクトごとにルールを変えたり、チームで共有(Git管理)したりが容易です。
-
まとめ
- Superpowers で「Vibe Coding」を卒業し、プロセスを型化する。
- Affaan方式(Hooks + Markdownログ) で、AIの記憶をファイルシステムに外部化する。
この2つを入れるだけで、Claude Codeは「ちょっと賢いチャットボット」から**「文脈を維持できる実務パートナー」**に進化します。まずはこの最小構成から試してみてください。