📑

エラーのスタックトレースをAIにコピペする時代、終わらせたい

に公開

エラーが出る。ターミナルからスタックトレースをコピー。Claude に貼り付ける。返ってきた修正を手でコードに反映する。

正直、この作業にもう飽きた。

エラーが出た瞬間に、Claude が勝手にソースを読んで直してくれたらよくないですか?

作りました。

https://github.com/otomachiiii/DevSonar

DevSonar とは

ランタイムエラーを自動キャプチャし、Claude Code に渡してコード修正まで行う開発ツールです。

npm install devsonar
{
  "scripts": {
    "dev": "devsonar run -- tsx watch src/index.ts"
  }
}

コードの変更は一切なし。 devsonar run -- の後ろにいつものコマンドを書くだけ。エラーが起きた瞬間に Claude がソースコードを読み、原因を分析し、修正コードを生成します。

Node.js / Python / Go / Ruby / Java / Rust に対応しています。

Turborepo で真価を発揮する

DevSonar が本当に効くのは、フロントエンドとバックエンドが同居する monorepo です。

Turborepo 構成のプロジェクトで開発していると、こういう場面がよくあります:

  • バックエンドの API を変更したら、フロントエンドで TypeError: Cannot read property 'id' of undefined が出る
  • フロントの fetch が 500 を返しているが、原因はバックエンドの validation エラー
  • Python のバッチ処理が Go のマイクロサービスに投げた API が 404 で落ちている

エラーの発生箇所と原因が別のパッケージにある。 これが monorepo 開発の日常です。

DevSonar はフロントエンド・バックエンド両方のエラーを 1 つのリレーサーバーに集約します。Claude はプロジェクト全体のソースコードにアクセスできるので、「フロントで出たエラーの原因がバックエンドにある」ケースでも、パッケージを横断して原因を特定できます。

具体的なセットアップ

my-app/
├── package.json
├── turbo.json
└── apps/
    ├── backend/
    │   ├── package.json   # devsonar run で起動
    │   └── src/
    └── frontend/
        ├── package.json   # import 'devsonar' を追加
        └── src/

バックエンド — CLI でラップするだけ。コード変更なし:

{
  "scripts": {
    "dev": "devsonar run -- tsx watch src/index.ts"
  }
}

devsonar run がリレーサーバー (port 9100) を起動し、--import hook で Node.js プロセスに自動計装を注入します。uncaughtExceptionunhandledRejection も全部捕まえます。

フロントエンド — 一行追加するだけ:

// src/main.ts
import 'devsonar';

これで window.onerrorunhandledrejection に加えて、fetch の HTTP 4xx/5xx レスポンスまで自動監視します。バックエンドの API が 500 を返したら、フロント側からも自動で報告が飛びます。

Turbo の設定:

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "dev": { "persistent": true, "cache": false }
  }
}

あとは npm run dev するだけ。バックエンドとフロントエンドの両方でエラー監視が動きます。

アーキテクチャ

ポイントはリレーサーバーによるバッファリングです。

実際の開発では、1 つのバグが連鎖的に複数のエラーを引き起こします。フロントとバックエンドで同時にエラーが出ることもある。これを 1 件ずつ Claude に投げたら、同じ原因のエラーに何度も分析が走ってしまいます。

DevSonar はこれを 3 つの仕組みで解決しています:

  • デバウンス — エラー受信後 3 秒待ち、その間に来た追加エラーもまとめて送信
  • 重複排除 — 同じメッセージのエラーが処理中ならスキップ
  • 最大バッファ — 50 件に達したら即フラッシュ(エラー爆発の安全弁)

6 言語対応の裏側

Node.js 以外の言語にも対応しています。言語ごとに最適な方法でエラーを捕捉します。

言語 方式 導入
Node.js --import hook で自動注入 コード変更不要
ブラウザ window.onerror + fetch 監視 import 'devsonar' の一行
Python sys.excepthook + Django/Flask ミドルウェア pip install devsonar
Go panic recovery + HTTP ミドルウェア go get
Ruby / Java / Rust stderr パターンマッチ 設定不要

Ruby や Java には専用 SDK がないですが、devsonar run -- ruby app.rb とするだけで動きます。子プロセスの stderr をリアルタイムでパースして、エラーパターンを自動検出しているからです。

devsonar run -- python app.py     # Python traceback を検出
devsonar run -- go run main.go    # Go panic を検出
devsonar run -- java -jar app.jar # Java 例外を検出
devsonar run -- cargo run         # Rust panic を検出

内部では状態機械を使っています:

  1. IDLE — 通常出力を監視。Traceback (most recent call last): のようなエラー開始行を待つ
  2. ACCUMULATING — スタックトレースの続行行を蓄積
  3. 完了判定 — 2 行連続でスタックトレースに該当しない出力が来たら、エラー確定としてリレーサーバーに送信

バイナリ出力が stderr に混入した場合も、null バイト検出と Unicode 置換文字の密度判定で自動スキップします。

Python / Go の使い方

Python

pip install devsonar
import devsonar
devsonar.init()  # sys.excepthook を自動フック

Django / Flask ミドルウェアも用意しています:

# Django
MIDDLEWARE = ["devsonar.middleware.django.DevSonarMiddleware", ...]

# Flask
from devsonar.middleware.flask import init_devsonar
init_devsonar(app)

Go

import devsonar "github.com/taro-hirose/devsonar-go"

func main() {
    reporter := devsonar.New()
    defer devsonar.RecoverAndReport(reporter, "main")
    // ...
}

HTTP ミドルウェアとしても:

handler := devsonar.Middleware(reporter)(mux)

Claude 連携の仕組み

バッファからフラッシュされたエラーは、構造化されたプロンプトとして Claude に送られます。

以下のエラーが発生しました。ソースコードを読んで原因を特定し、修正してください。

--- Error 1 ---
Message: Cannot read property 'id' of undefined
Source: POST /api/users
Stack: TypeError: Cannot read property 'id' of undefined
    at UserService.create (src/services/user.ts:42:18)

Claude は Agent SDK 経由でプロジェクト全体のソースコードにアクセスし、原因特定からコード修正まで行います。

重要なのはセッションが保持されること。過去に修正したエラーの文脈を覚えた状態で次のエラーに対応するので、同じプロジェクト内で繰り返し発生する問題にも適切に対処できます。

パッケージ構成

パッケージ レジストリ 説明
devsonar npm メインパッケージ。CLI + リレーサーバー + レポーター
@devsonar/error-reporter npm 軽量レポーター単体。ランタイム依存ゼロ
devsonar PyPI Python レポーター。stdlib のみ、外部依存ゼロ
devsonar-go Go module Go レポーター。外部依存ゼロ

@devsonar/error-reporter はリレーサーバーへの送信機能だけを切り出したパッケージです。Express ミドルウェアや手動 reporter.report(err) など、細かい制御をしたい場合に。

前提条件

  • Node.js >= 18.0.0
  • Claude Code CLI がインストール済みであること

まとめ

スタックトレースをコピペして AI に投げる作業、もうやめませんか。

DevSonar は「エラーが出たら Claude が勝手に直す」を実現するツールです。

  • devsonar run -- をつけるだけで動く
  • Turborepo monorepo でフロント・バックエンド両方を一括監視
  • 6 言語対応(Node.js / Python / Go / Ruby / Java / Rust)
  • デバウンス + 重複排除で無駄な API コールを防止
  • セッション保持で Claude がプロジェクトの文脈を覚える

OSS として公開しています。Star / Issue / PR お待ちしています。

https://github.com/otomachiiii/DevSonar

Discussion