baoyu-electron-extract について
Electron アプリからファイルを抽出し、読みやすいソースを復元するスキルです。アプリの解析を行う開発者向けで、source map からの再構築や JS/CSS の整形に対応します。
主な機能
- 01アプリの検出と asar 内容の抽出
- 02source map からソースを復元
- 03Prettier による JS/CSS 整形
- 04app.asar.unpacked 内容のコピー
- 05dry-run と JSON サマリー
活用シーン
- 01Electron アプリのパッケージ内容の確認
- 02source map 内のソース復元
- 03抽出した JavaScript と CSS の整形
- 04書き込み前の解決パスの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ guanyang/ open-agent-hub --skill baoyu-electron-extractインストール後、Claude Code で/baoyu-electron-extractを入力して読み込まれたか確認します。
同梱ファイルscripts/main.test.tsscripts/main.ts
詳細
Electron アプリの抽出
ユーザー入力ツール
このスキルがユーザーに入力を求める場合は、次の優先順位に従ってツールを選択してください。
- 組み込みのユーザー入力ツールを優先します。現在のエージェントランタイムで公開されている
AskUserQuestion、request_user_input、clarify、ask_user、または同等のツールなどが該当します。 - フォールバック:そのようなツールが存在しない場合は、番号付きのプレーンテキストメッセージを出力し、各質問への回答として選んだ番号や回答を返信するようユーザーに依頼します。
- まとめて質問:1 回の呼び出しで複数の質問に対応できるツールの場合は、該当する質問をすべてまとめて呼び出します。1 回に 1 つの質問しかできない場合は、優先順位に従って 1 つずつ質問します。
以下の AskUserQuestion の例は参考です。他のランタイムでは、ローカルの同等ツールに置き換えてください。
スクリプトディレクトリ
{baseDir} = この SKILL.md があるディレクトリです。${BUN_X} を解決します。bun がインストールされている場合は bun、それ以外の場合は npx -y bun を使用します。どちらもない場合は、bun のインストールを提案します。{baseDir} と ${BUN_X} は実際の値に置き換えてください。
| スクリプト | 目的 |
|---|---|
scripts/main.ts | アプリの検出 + asar の抽出 + ソースマップの復元 + Prettier による整形 |
ワークフロー
1. 入力を確認します。 アプリ名(例:Codex)または絶対パス(/Applications/Codex.app、.asar ファイル、Windows のインストールディレクトリ)を受け付けます。指定されていない場合は尋ねてください。ユーザーが希望する場合は、カスタムの出力ディレクトリも尋ねてください。
2. スクリプトを実行します。
${BUN_X} {baseDir}/scripts/main.ts "<app>" [--output <dir>] [--asar <path>] [--force]
適切なバンドルが検出されるか不明な場合は、まず --dry-run を付けて実行してください(解決されたパスが表示され、何も書き込まれません)。
3. 結果を処理します。
- 成功 → 出力パスと件数(抽出済み/復元済み/整形済み)を報告します。
- 複数の一致 → スクリプトは候補を一覧表示し、ゼロ以外の終了コードで終了します。ユーザーにどれを使うか(
AskUserQuestionまたはランタイムの同等ツールを使用して)尋ね、その後、選ばれた絶対パスを指定して再実行します。 - 空ではない既存の出力ディレクトリ → スクリプトは
--forceなしでは処理を拒否します。上書きする(--force)か、新しい--outputを選ぶか尋ねてください。 - 未対応のプラットフォーム/一致なし → バンドルの場所がわかる場合は、
--asar /full/path/to/app.asarを指定するよう提案します。
4. 結果の場所をユーザーに案内します(デフォルト:~/Downloads/<AppName>-electron-extract/)。
restored/が存在する場合 →.js.mapファイルから再構築された元のソースツリーです。まずこちらを確認してください。extracted/のみの場合(マップなし)→extracted/内の JS/CSS は、その場で Prettier によって整形されています。こちらを確認してください。
使い方
${BUN_X} {baseDir}/scripts/main.ts Codex # → ~/Downloads/Codex-electron-extract/
${BUN_X} {baseDir}/scripts/main.ts "/Applications/Visual Studio Code.app" # .app bundle, install dir, or .asar
${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
${BUN_X} {baseDir}/scripts/main.ts Codex --output ~/work/codex-source
${BUN_X} {baseDir}/scripts/main.ts Codex --json # one JSON line on stdout
オプション
| オプション | 短縮形 | 説明 | デフォルト |
|---|---|---|---|
<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 | 標準出力に 1 行の JSON サマリーを出力します(通常の出力は抑制されます) | 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
ソースマップのパス復元
ソースマップで可能な範囲で、元のソース名とディレクトリ構造を保持します。
- 各
sources[]エントリは、sourceRootがある場合はそれを使って解決し、その後extracted/内にある.js.mapファイルのディレクトリを基準に解決します。たとえば、.vite/main/index.js.map+../../src/main.ts→restored/src/main.tsとなります。 ../セグメントを自動的に危険なものとして扱うことはありません。まずマップの場所を基準に解決し、その後、最終パスがrestored/の配下にとどまるようにサニタイズします。パスがextracted/より上位に遡る場合は、読み取り可能な部分を保持します。.vite/main/index.js.map+../../../shared/src/lib/foo.ts→restored/shared/src/lib/foo.tsとなります。- URL やクエリの装飾を取り除きます(
webpack://、file://、?loaderのサフィックスなど)。 restored/__unknown/<hash>.<ext>を使うのは、ソース名が空の場合、または安全なファイルパスに変換できない場合のみです。node_modulesとwebpack/runtime/*のエントリはスキップされます(バンドラー/ランタイム由来のノイズ)。
注意事項
- node_modules は、ソースマップの復元と Prettier によるフォーマットの両方で常にスキップされます。
- 復元には埋め込みの
sourcesContentが必要です(webpack、esbuild、Vite、rollup で一般的です)。外部ファイルを参照していても埋め込みがないマップはスキップされ、代わりに.jsが Prettier でフォーマットされます。スキップされたマップはextract-report.jsonのwarningsに表示されます。 - アプリの検出:macOS では
/Applicationsと~/Applications、Windows では%LOCALAPPDATA%\Programs、%PROGRAMFILES%、%PROGRAMFILES(X86)%、%APPDATA%を検索します。複数の候補が見つかった場合、スクリプトは終了して候補を一覧表示します。絶対パスを指定して再実行してください。Linux/その他の環境では、--asar /path/to/app.asarを指定してください。 - 安全性:
/、ユーザーのホームディレクトリそのもの、または現在の作業ディレクトリへの書き込みを拒否します。また、--forceを指定しない限り、既存の空でない出力ディレクトリへの書き込みも拒否します。 - グローバルインストール不要:
@electron/asarとprettierはnpx -yを使ってその場で解決されます。npx がキャッシュするため、初回の実行には時間がかかります。