baoyu-electron-extract について
baoyu-electron-extractは、インストール済みElectronアプリのapp.asarを抽出し、コードを調べるためのスキルです。ソースマップ内のソースを復元し、利用できない場合はPrettierでJavaScriptを整形します。
主な機能
- 01Electronアプリのバンドルを検出
- 02app.asarの内容を抽出
- 03ソースマップからソースを復元
- 04PrettierによるJavaScript整形
- 05node_modulesを除外
活用シーン
- 01インストール済みElectronアプリのコードを調査
- 02埋め込みソースマップから読みやすいファイルを復元
- 03マップがない場合にバンドル済みJavaScriptを整形
- 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 で動作します。
ユーザー入力ツール
このスキルがユーザーに質問する場合は、次のツール選択ルール(優先順位順)に従ってください。
- 組み込みのユーザー入力ツールを優先します。現在のエージェントランタイムが公開している
AskUserQuestion、request_user_input、clarify、ask_userなど、または同等のツールを使用してください。 - フォールバック:そのようなツールがない場合は、番号付きのプレーンテキストメッセージを出力し、各質問への回答として選んだ番号/回答をユーザーに返信してもらいます。
- まとめて質問:ツールが複数の質問を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-format | Prettier によるフォーマットをスキップします | false | |
--skip-restore | ソースマップの復元をスキップします | false | |
--no-unpacked | app.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 のキャッシュに保存されるまで、初回の実行には時間がかかります。