mcpField
B
baoyu-electron-extract

baoyu-electron-extract

github.com/jimliu開発27.0k7.9k 回インストール7 週間前に更新
リポジトリ

baoyu-electron-extract について

baoyu-electron-extractは、インストール済みElectronアプリのapp.asarを抽出し、コードを調べるためのスキルです。ソースマップ内のソースを復元し、利用できない場合はPrettierでJavaScriptを整形します。

主な機能

  1. 01Electronアプリのバンドルを検出
  2. 02app.asarの内容を抽出
  3. 03ソースマップからソースを復元
  4. 04PrettierによるJavaScript整形
  5. 05node_modulesを除外

活用シーン

  1. 01インストール済みElectronアプリのコードを調査
  2. 02埋め込みソースマップから読みやすいファイルを復元
  3. 03マップがない場合にバンドル済みJavaScriptを整形
  4. 04指定したパスからアプリを抽出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jimliu/baoyu-skills --skill baoyu-electron-extract

インストール後、Claude Code で/baoyu-electron-extractを入力して読み込まれたか確認します。

同梱ファイルscripts/main.test.tsscripts/main.ts

詳細

Electron アプリの抽出

インストール済み Electron アプリの app.asar からリソースとコードを抽出します。.js.map がある場合は、埋め込まれた sourcesContent から元のソースファイルを復元します。それ以外の場合は、Prettier で圧縮されたコードを整形します。ソースマップのパスは、まず .js.map ファイルを基準に解決されるため、../../src/main.ts のようなバンドル内パスは、ハッシュ化されたプレースホルダーではなく、restored/src/main.ts のような読みやすいパスに復元されます。node_modules は常にスキップします。macOS と Windows で動作します。

ユーザー入力ツール

このスキルがユーザーに質問する場合は、次のツール選択ルール(優先順位順)に従ってください。

  1. 組み込みのユーザー入力ツールを優先します。現在のエージェントランタイムが公開している AskUserQuestion、request_user_input、clarify、ask_user など、または同等のツールを使用してください。
  2. フォールバック:そのようなツールがない場合は、番号付きのプレーンテキストメッセージを出力し、各質問への回答として選んだ番号/回答をユーザーに返信してもらいます。
  3. まとめて質問:ツールが複数の質問を1回の呼び出しで処理できる場合は、該当する質問をすべてまとめてください。1回に1つの質問しかできない場合は、優先順位に従って1つずつ質問してください。

以下の具体的な AskUserQuestion の例は参考です。他のランタイムでは、ローカルで同等のものに置き換えてください。

スクリプトディレクトリ

スクリプトは scripts/ サブディレクトリにあります。{baseDir} = この SKILL.md のディレクトリパスです。${BUN_X} ランタイムを解決します。bun がインストールされている場合は bun、npx が利用可能な場合は npx -y bun を使用し、それ以外の場合は bun のインストールを提案します。{baseDir} と ${BUN_X} は実際の値に置き換えてください。

スクリプト用途
scripts/main.tsアプリの検出 + asar の抽出 + ソースマップの復元 + Prettier による整形

使用する場面

インストール済みの Electron アプリの内部を確認したい場合や、バンドルされたコードを調べたい場合は、いつでもこのスキルを使用してください。次のようなフレーズがあれば起動してください。

  • 「Electron アプリを抽出」「この Electron アプリを逆コンパイル」「app.asar を展開」
  • 「 のソースを見せて」「 の中を調べて」「 はどのように作られているか」
  • 「Codex / Cursor / Discord / Slack / VS Code / Notion / Obsidian / ChatGPT デスクトップのソースコードを取得」
  • 「提取 Electron 应用」「看 的源码」「反编译 Electron」「解包 app.asar」「还原 source map」

アプリ名(例:Codex)と絶対パス(例:/Applications/Codex.app、.asar ファイル、Windows のインストールディレクトリ)は、どちらも指定できます。スクリプトは両方のプラットフォームでアプリを検出します。

ワークフロー

1. 入力を確認します。 アプリ名またはパスが指定されていない場合は、ユーザーに尋ねます。出力ディレクトリをカスタマイズしたい場合は、そのパスも尋ねます。

2. スクリプトを実行します。

${BUN_X} {baseDir}/scripts/main.ts "<app>" [--output <dir>] [--asar <path>] [--force]

適切なバンドルが検出されるか不確かな場合は、まず --dry-run を指定してください。解決されたパスを表示し、ファイルシステムに変更を加えずに終了します。

3. 結果に応じて対応します。

  • 成功 → 出力パスと件数(抽出済み/復元済み/整形済み)を報告します。
  • 複数の候補が見つかった → スクリプトは候補を一覧表示して、0以外の終了コードで終了します。候補をユーザーに提示し、どれを使うかを尋ね(AskUserQuestion またはランタイムの同等ツールを使用)、選択された絶対パスを指定して再実行します。
  • 既存の空ではない出力ディレクトリ → --force を指定しないとスクリプトは処理を拒否します。上書きする(--force)か、新しい --output パスを選ぶか、ユーザーに尋ねます。
  • 未対応のプラットフォーム/一致する候補がない → バンドルの場所が分かる場合は、--asar /full/path/to/app.asar を指定するよう提案します。

4. 結果の場所を案内します。 デフォルトの出力ディレクトリは ~/Downloads/<AppName>-electron-extract/ です。確認するべきサブディレクトリは、見つかったものによって異なります。

  • restored/ がある → .js.map ファイルから元のソースツリーが再構築されています。まずはこちらを確認してください。
  • extracted/ のみがある(マップなし) → extracted/ 内の JS/CSS はその場で Prettier による整形が済んでいます。こちらを確認してください。

ソースマップのパス復元

このスクリプトは、ソースマップで可能な限り、元のソース名とディレクトリ構造を保持します。

  • sourceRoot がある場合は各 sources[] エントリを使って解決し、その後、extracted/ 内にある .js.map ファイルのディレクトリを基準に解決します。
  • バンドラーによる通常の相対パスは、復元されたプロジェクトツリー内に収めます。たとえば、.vite/main/index.js.map + ../../src/main.ts は restored/src/main.ts になります。
  • ソースパスが extracted/ より上の階層に遡る場合は、ハッシュ化せず、読み取れる残りのパスを restored/ の下に保持します。たとえば、.vite/main/index.js.map + ../../../shared/src/lib/foo.ts は restored/shared/src/lib/foo.ts になります。
  • 一般的な webpack://、file://、および ?loader サフィックスなど、ソース名に含まれる URL やクエリの装飾を取り除きます。
  • ソース名が空、または安全なファイルパスに変換できない場合に限り、restored/__unknown/<hash>.<ext> を使用します。
  • node_modules と webpack/runtime/* のエントリは引き続きスキップします。これらはアプリのソースではなく、バンドラーやランタイムのノイズです。

使い方

# Extract by app name (default output: ~/Downloads/Codex-electron-extract/)
${BUN_X} {baseDir}/scripts/main.ts Codex

# Extract by absolute path (works for .app bundles, install dirs, or .asar files)
${BUN_X} {baseDir}/scripts/main.ts "/Applications/Visual Studio Code.app"
${BUN_X} {baseDir}/scripts/main.ts "C:\Users\you\AppData\Local\Programs\codex"
${BUN_X} {baseDir}/scripts/main.ts --asar /Applications/Codex.app/Contents/Resources/app.asar Codex

# Custom output
${BUN_X} {baseDir}/scripts/main.ts Codex --output ~/work/codex-source

# Preview discovery without writing anything
${BUN_X} {baseDir}/scripts/main.ts Codex --dry-run

# Overwrite an existing output dir
${BUN_X} {baseDir}/scripts/main.ts Codex --force

# Machine-readable result (one JSON line on stdout)
${BUN_X} {baseDir}/scripts/main.ts Codex --json

オプション

オプション短縮形説明デフォルト
<app>アプリ名または絶対パスです。--asar を指定しない場合は必須です。—
--output-o出力ディレクトリ~/Downloads/<AppName>-electron-extract
--asar解決済みの .asar パスを上書きします自動検出
--force-f既存の空でない出力ディレクトリへの書き込みを許可しますfalse
--skip-formatPrettier によるフォーマットをスキップしますfalse
--skip-restoreソースマップの復元をスキップしますfalse
--no-unpackedapp.asar.unpacked/ を一緒にコピーしませんfalse
--dry-run解決されたパスを表示し、書き込みを行わずに終了しますfalse
--json標準出力に JSON 形式のサマリーを1行出力します(通常の出力は抑制されます)false

出力レイアウト

~/Downloads/<AppName>-electron-extract/
├── extract-report.json          # JSON summary: counts, warnings, resolved paths
├── extracted/                   # raw asar contents (JS/CSS Prettier-formatted when no map)
│   └── ...                      # node_modules left untouched (skipped from format)
├── extracted.unpacked/          # copied from <asar>.unpacked/ if present
│   └── ...                      # native modules (.node), large assets
└── restored/                    # only present if at least one .js.map was usable
    └── <original/source/tree>   # rebuilt from sourcesContent in each .js.map

注意事項

  • node_modules は常にスキップされます。ソースマップの復元時も Prettier によるフォーマット時も、アプリを調査する際にベンダー依存関係はノイズになるためです。
  • ソースマップの復元が機能するのは、.js.map に sourcesContent が埋め込まれている場合のみです。これは最新のバンドラー(webpack、esbuild、Vite、rollup)では一般的です。マップが外部の .ts/.js ファイルを参照していて、それらが埋め込まれていない場合、そのマップはスキップされ、対応する .js が Prettier でフォーマットされます。スキップされたマップは extract-report.json の warnings に記載されます。
  • ハッシュより読みやすいパスを優先 — ソースマップ内のパスにある ../ を、自動的に危険と判断しないでください。まずマップの場所を基準に解決し、その後、最終的な出力パスをサニタイズして、引き続き restored/ 配下に収まるようにします。ハッシュへのフォールバックは、ソース名が使用できない場合にのみ行われます。
  • アプリの検出では、macOS では /Applications と ~/Applications を、Windows では %LOCALAPPDATA%\Programs、%PROGRAMFILES%、%PROGRAMFILES(X86)%、%APPDATA% を検索します。複数の候補が見つかった場合、スクリプトは終了して候補を一覧表示します。絶対パスを指定して再実行してください。Linux その他のプラットフォームでは、--asar /path/to/app.asar を明示的に指定してください。
  • 安全性 — スクリプトは /、ユーザーのホームディレクトリそのもの、または現在の作業ディレクトリへの書き込みを拒否します。また、--force を指定せずに、既存の空でない出力ディレクトリへ書き込むことも拒否します。
  • グローバルインストール不要 — @electron/asar と prettier は npx -y を介して実行時に解決されます。npx のキャッシュに保存されるまで、初回の実行には時間がかかります。

コメント