Claude Codeで3時間分の作業を失ったので、AI支援コーディング用の「取り消し」ボタンを作った

Dev.to / 2026/3/27

💬 オピニオンTools & Practical Usage

要点

  • 著者は、Claude Codeが多くのファイルにわたって危険なリファクタリング変更を行った結果、プロンプト間にチェックポイント/取り消しがなくTypeScriptのエラーが残り、3時間を失ったと述べている。
  • AI支援コーディングのツールには、プロンプトをまたいだ「undo(取り消し)」機構がないという共通の使い勝手上のギャップがあると主張し、そのため複数の反復を重ねるうちに失敗が積み重なり得る点を問題としている。
  • これに対処するため、著者はsnaprevertという、AIコーディング中にファイル変更が発生した際にプロジェクト状態を自動でスナップショットするコマンドラインの「undoボタン」を作成した。
  • snaprevertは、ファイルシステムを監視し、変更をデバウンスして1つのプロンプトに由来する編集をまとめ、差分(diff)を計算して、素早いロールバックと検査のためにローカルの .snaprevert ディレクトリに保存することで動作する。
  • このツールは、スナップショットの一覧表示、特定のスナップショットに対する差分の閲覧、そして破壊的でないロールバックをサポートしており、過去のスナップショットを保持したまま再度復元できる。

Claude Codeにauthモジュールを完全に消し去られて、3時間分の作業を失いました

私は集中モードに入っていました。Claude Codeはすごい勢いで仕上げてくれていました——OAuthを追加して、データベースをつなぎ、ルートを配線しました。そこで私はこう言いました。「inlineのチェックじゃなくて、middlewareを使うようにauth.tsをリファクタして。」

ファイルが15個変わりました。あちこちでTypeScriptのエラーです。アプリはビルドできません。そして気づいたのは、1時間以上コミットしていなかったということ。

git diffを見ると、15個のファイルにまたがる変更が400行。どのバージョンのauth.tsが実際に動いていたのか分かりませんでした。最後に動いていた状態を再構築するのに3時間かけました。

その瞬間にsnaprevertを作りました。

誰も話さない問題

AIコーディングツール——Claude Code、Cursor、Copilot、Aider——はみんな同じ根本的な問題を共有しています:プロンプト間に「元に戻す(undo)」がない。

それぞれのプロンプトは5〜20個のファイルに触れます。確認して、またプロンプトを出して、確認して、またプロンプト。あなたはフロー状態です。プロンプトを出すたびに誰も止まってgit commit -m "checkpoint before risky refactor"なんてしません。何かが壊れた時には、チェックポイントなしで5〜10個目のプロンプトまで進んでしまっている。

Gitには意図が必要です。でも、AIと100mphでペアプログラミングしていると、意図が最初に消えます。

snaprevert:AIコーディングのための「戻す」ボタン

npx snaprevert watch

これでセットアップは終わりです。コマンドひとつ。設定ゼロ。ファイルが変わるたびにプロジェクトをこっそりスナップショットします。AIが何かを壊したら:

snaprevert list        # タイムスタンプ付きで全スナップショットを見る
snaprevert diff 5      # スナップショット #5 で何が変わったかを正確に見る
snaprevert back 3      # スナップショット #3 の前に戻す

プロジェクトは1秒未満で復元されます。

仕組み(思っているよりずっと単純)

Gitは使いません。ブランチもありません。ステージングエリアもありません。ファイルシステムレベルです:

  1. Watch — chokidar がプロジェクトのファイル変更を監視します
  2. Debounce — 変更が落ち着くまで3秒待ちます(1つのAIプロンプトによる変更をひとまとめにする)
  3. Diff — 変更されたファイルのユニファイド差分を計算し、新規ファイルは内容全体を保存します
  4. Store.snaprevert/snapshots/{timestamp}-{id}/ に保存します

以上です。スナップショットは完全なコピーではなく差分です。重いAIコーディングを丸1日やっても<10MBです。

ロールバックは非破壊です——戻したスナップショットは保持されます。snaprevert restoreでそれらのどれでも再適用できます。

まさか必要になるとは思わなかった機能

ファイル単位の選択的ロールバック — Claudeがauth.tsを壊したけどuser.tsは大丈夫?壊れているところだけ元に戻せます:

snaprevert back 3 --only auth.ts,routes.ts

インタラクティブなレビュー — コミットする前に、各ファイルの変更を順に確認:

snaprevert review 5
# 各ファイルごとに: [a]ccept [r]eject [s]kip [v]iew diff

AIツールの検出 — スナップショットは自動的に、どのAIツールが変更を行ったかを検出します。ラベルにclaude: modified auth.tscursor: added 3 filesのように表示されます。

スナップショットのブランチ(分岐) — 同じチェックポイントから、2つの異なるAIアプローチを試す:

snaprevert fork 3 --name "approach-a"
# ... 1つ目のアプローチを試す ...
snaprevert fork --switch main
# ... 別のアプローチを試す ...

MCPサーバー — AIエージェントが名前付きのチェックポイントをプログラム的に作成できます:

snaprevert mcp  # JSON-RPCサーバーを起動します

Claude Codeに対応しており、どんなMCPクライアントでも動きます。AI自体も、危険な操作の前にチェックポイントを作れます。

じゃあGitを使えばいいのでは?

毎回この質問を受けます。正直な答えはこうです:

Git snaprevert
保存されるタイミング あなたが思い出したとき 自動
粒度 あなたがステージした内容 すべてのAIプロンプト
認知コスト 何を+どんなメッセージで書くかを決める ゼロ
ロールバック git reflog、reset、stash… snaprevert back 3

これは競合ではなく補完関係です。Gitは、チームにプッシュする意味のある、厳選された履歴のため。snaprevertは、コミットの間にある継続的なオートセーブです——Googleドキュメントがすべてのキー入力を保存するようなものですが、それでも「バージョンを公開」できます。

スタック

  • 3つの依存関係:commander、chalk、chokidar
  • 221のテスト:ユニット、統合、UATにまたがる
  • 設定ゼロ — どんなプロジェクトでも、どんなAIツールでも動く
  • <100ms でスナップショット作成、<1s でロールバック

AIツールではなく、あなたのファイルシステムを監視します。Claude Code、Cursor、Copilot、Aider、Windsurf、あるいは何であれファイルを書き込むものと動作します。

使ってみる

npm install -g snaprevert
snaprevert watch

その後、通常通りAIツールを使ってください。壊れたら:snaprevert listsnaprevert back 3

リポジトリは github.com/HadiFrt20/snaprevert です。MITライセンス、221のテスト、継続的にメンテナンスされています。

AIコーディングツールで作業を失ったことがあるなら、これが存在する理由が分かるはずです。

これが役に立ったなら、リポジトリへのスターはとても嬉しいです。機能アイデアがあれば、issueは公開されています。