はじめに:AIとの「共同開発の歴史」という暗黙知の埋没問題
AIアシスタント(Cursor、Claude、Antigravity/Geminiなど)を用いたペアプログラミングは現代の開発スタイルとして定着しつつあります。しかし、開発中にAIと「なぜこのライブラリを選んだのか」「なぜこのバグをこのような実装で修正したのか」という非常に価値の高い議論をどれだけ交わしても、その対話履歴はAIツールの内部データベース(ローカルの履歴フォルダなど)に埋もれがちです。
プロジェクトフォルダを別のPCに移行したり、Gitでチームと共有したり、あるいは時間が経ってツールのキャッシュがクリアされたりすると、コード自体は残っていても、「どのような議論を経てそのコードにたどり着いたか」という開発の暗黙知(歴史的背景)は失われてしまう恐れがあります。
今回は、Antigravity(Gemini)のローカルに蓄積されたすべての会話履歴を解析し、実在するプロジェクトフォルダへ自動的に非破壊復元・整理して、専用のWebビューアでいつでも閲覧可能にする「会話ログ自動分類・復元システム」の開発プロセスを解説します。また、分類精度を大幅に向上させるための「動的プロジェクトスキャンと多層マッピングアルゴリズム」についても詳しく紹介します。
技術的課題:暗号化されたバックアップと「フォルダ迷子」
復元システムの構築にあたり、クリアしなければならない2つの技術的課題がありました。
1. 過去ログデータの抽出
Antigravityの会話バックアップである .pb ファイルはバイナリエンコード(暗号化)されており、直接解読するのは困難です。しかし調査の結果、ツール内部で動いているシステムのログ(overview.txt)には、過去のすべてのやり取りが平文のJSONストリーム形式で記録されていることが分かりました。まずここから、ユーザーの入力(USER)とモデルの回答(MODEL / AI)を時系列にそって抽出するパーサーを実装します。
2. 元のプロジェクトフォルダの特定(分類問題)
単にすべてのログを一箇所にエクスポートするだけでは意味がありません。各々の会話が「どの開発プロジェクト」で行われたかを特定し、それぞれのプロジェクトフォルダ(例:c:\Dev\ImageArchiver や c:\xampp\htdocs\YahooComments)に自動で配置する必要があります。
ログの中には Active Document や実行したコマンドのパス(Cwd)が残っている場合もありますが、それらの情報が欠落しているログや、テンポラリフォルダで実行されているログもあり、単純なパス抽出だけでは多くの会話が「Unsorted(分類不明)」として処理されてしまう課題に直面しました。
解決策:動的プロジェクトスキャンと多層マッピング
この分類精度を大幅に向上させるため、静的なハードコードによる判定をやめ、ユーザーのPC上の開発環境に合わせた「動的プロジェクトスキャンと多層マッピングアルゴリズム」を設計・実装しました。
- プロジェクトディレクトリの動的スキャン: 起動時に、ユーザーのPC上の主要な開発ルート(
C:\Dev,D:\Dev,C:\xampp\htdocs,C:\Autodeskなど)を自動スキャンし、実在するすべてのサブディレクトリ名(例:ImageArchiver,StabilityMatrix,Medicine_Fixなど)のインデックス(フルパスとのマッピング)を動的に構築します。 - 多層的なパス・キーワード解決: 各ログテキストを解析する際、以下の優先順位で実在フォルダとの紐付けを試みます。
- 層1(絶対パス一致): ログ内に記述された絶対パスを抽出し、そのプレフィックスやディレクトリ名がスキャン済みの実在プロジェクト名と一致するか判定。
- 層2(固有名詞のキーワード検索): ログの本文テキスト全体を検索し、スキャン済みのプロジェクト名(例:
StabilityMatrix)が単語として含まれているか検証(より長くて具体的な名前を優先)。 - 層3(技術用語からのあいまい推測): パスもキーワードも見つからない場合、本文中の技術用語(
fastapi→YahooComments、gan/font→Font)から関連プロジェクトを推論。
この多層解決アルゴリズムにより、以前は30件以上が「Unsorted」に分類されていた会話ログが、すべて実在する正しいプロジェクトフォルダ(分類不明=0件)へと正確にマッピングされるようになりました。
実装の核心:自動分類スクリプトとHTMLビューア
1. 自動分類・エクスポートスクリプト (restore_logs.py)
以下は、実際に実装したプロジェクト動的スキャンおよび多層解決アルゴリズムのコア部分のコードです。
def scan_known_projects():
bases = [r"C:\Dev", r"D:\Dev", r"C:\xampp\htdocs", r"C:\Autodesk"]
projects = {}
for base in bases:
if not os.path.exists(base): continue
for name in os.listdir(base):
full = os.path.join(base, name)
if os.path.isdir(full):
# 汎用的なシステム名等は除外
if name.lower() in ["conversation_logs", "venv", "bat", "temp"]: continue
projects[name.lower()] = full
return projects
# (ログ解析ループ内での判定ロジック)
# 1. ログファイルからWindows絶対パスを抽出してマッチング
paths = re.findall(r'[a-zA-Z]:\\[a-zA-Z0-9_\-\.\u3000-\u30fe\u4e00-\u9fa5]+', full_text)
for p in paths:
p_norm = p.replace('\\', '\').replace('\\', '\')
for name, kpath in known_projects.items():
if f"\\{name}\\" in p_norm.lower() or p_norm.lower().endswith(f"\\{name}"):
proj_path = kpath
break
if proj_path: break
# 2. 会話中のテキスト全体から既知のプロジェクト名を直接キーワード検索
if not proj_path:
low_text = full_text.lower()
matches = []
for name, kpath in known_projects.items():
if len(name) >= 3 and name in low_text:
matches.append((len(name), kpath))
if matches:
matches.sort(reverse=True) # より長い(具体的な)名前を優先
proj_path = matches[0][1]
2. ワンクリック自動同期バッチ (auto_restore_logs.bat)
ユーザーがいつでも手軽に最新の会話ログを各プロジェクトに同期できるよう、以下のシンプルなバッチファイルを配置しました。これをダブルクリックするだけで、自動で最新ログの抽出とプロジェクトごとの再分類・WebUIの更新が行われます。
@echo off
echo Scanning all previous AI conversations and extracting them...
python "%~dp0restore_logs.py"
echo Done! Check the 'conversation_logs' folder in your projects.
pause
3. 各プロジェクトでの見やすい専用ログビューア (log_viewer.html)
復元されたログを単なるテキストファイルとして配置するだけでなく、各プロジェクトフォルダの conversation_logs/log_viewer.html に、リッチなUIで過去の会話を時系列順にフィルタ・閲覧できるWebUI(HTML+JS)を同時に出力します。
WebUIはモダンなダークテーマ(Catppuccin Mocha風)で構成され、サイドバーから各会話セッションを選択すると、チャットツールのように「ユーザーの要求」と「AIのコード解説や設計提案」が読みやすく表示されます。これにより、オフライン状態であっても、過去にAIと交わしたすべての知見が数クリックで呼び出せるようになります。
おわりに:「コード」と「知見」を統合管理し、開発の主権を守る
自分のPCでありながら、ツールの都合で開発の歴史的経緯(ログ)が勝手に消されたり、管理できなくなったりすることは、ある種の「主権侵害」と言えます。今回構築したシステムは、単なる便利ツールにとどまらず、ソースコードとその設計思考プロセス(AIとの対話)をワンセットでローカルに囲い込み、開発者自身の資産として強固に保護するためのアプローチです。
今後AIとの共同開発が進む中で、こうした「思考プロセスのローカル管理」は、コードの品質維持だけでなく、プロジェクトの知的財産を守る上でも極めて重要な役割を果たすことになるでしょう。