
baoyu-electron-extract
熱門從任何已安裝的 Electron 應用程式(`.asar` 套件)中提取資源和 JavaScript,當有 `.js.map` 檔案時從中還原原始原始碼,否則使用 Prettier 格式化壓縮後的程式碼。當使用者想要「提取 Electron 應用程式」、「反編譯 Electron」、「取得 <app> 的原始碼」、「檢查 app.asar」、「看 Electron 應用原始碼」、「提取 .asar」,或詢問桌面 Electron 應用程式如何建置時使用。跳過 `node_modules`,支援 macOS 和 Windows。
Extracts resources and JavaScript from any installed Electron app (`.asar` bundle), restoring original sources from `.js.map` files when available or formatting minified code with Prettier otherwise. Use when user wants to "extract Electron app", "decompile Electron", "get the source code of <app>", "inspect app.asar", "看 Electron 应用源码", "提取 .asar", or asks how a desktop Electron app is built. Skips `node_modules` and supports both macOS and Windows.
Electron 應用程式提取
從已安裝的 Electron 應用程式的 app.asar 中提取資源和程式碼。當存在 .js.map 時,從內嵌的 sourcesContent 還原原始原始檔;否則使用 Prettier 格式化壓縮後的程式碼。Source-map 路徑會先相對於 .js.map 檔案解析,因此像 ../../src/main.ts 這樣的打包路徑會還原為可讀路徑,例如 restored/src/main.ts,而不是雜湊佔位符。一律跳過 node_modules。適用於 macOS 和 Windows。
使用者輸入工具
當此技能提示使用者時,請遵循以下工具選擇規則(優先順序):
- 優先使用目前代理執行環境提供的內建使用者輸入工具,例如
AskUserQuestion、request_user_input、clarify、ask_user或任何等效工具。 - 備用方案:如果沒有此類工具,則發出編號的純文字訊息,並要求使用者回覆每個問題的選擇編號/答案。
- 批次處理:如果工具支援每次呼叫多個問題,則將所有適用的問題合併為一次呼叫;如果僅支援單一問題,則按優先順序逐一詢問。
以下具體的 AskUserQuestion 參考僅為範例 — 請在其他執行環境中替換為本地等效工具。
腳本目錄
腳本位於 scripts/ 子目錄。{baseDir} = 此 SKILL.md 的目錄路徑。解析 ${BUN_X} 執行環境:如果已安裝 bun → bun;如果可用 npx → npx -y bun;否則建議安裝 bun。將 {baseDir} 和 ${BUN_X} 替換為實際值。
| 腳本 | 用途 |
|---|---|
scripts/main.ts |
應用程式發現 + asar 提取 + source-map 還原 + Prettier 格式化 |
使用時機
每當使用者想要查看已安裝的 Electron 應用程式內部或檢查其打包的程式碼時,使用此技能。觸發詞包括:
- "extract Electron app", "decompile this Electron app", "unpack app.asar"
- "show me the source of <app>", "look inside <app>", "how is <app> built"
- "get the source code of Codex / Cursor / Discord / Slack / VS Code / Notion / Obsidian / ChatGPT desktop"
- "提取 Electron 應用", "看 <app> 的原始碼", "反編譯 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. 處理結果。
- 成功 → 回報輸出路徑以及計數(提取 / 還原 / 格式化)。
- 多個匹配 → 腳本列出候選項目並以非零退出。向使用者顯示候選項目,詢問要使用哪一個(透過
AskUserQuestion或執行環境等效工具),然後使用選擇的絕對路徑重新執行。 - 現有非空輸出目錄 → 腳本拒絕寫入,除非使用
--force。詢問使用者是否要覆寫(--force)或選擇新的--output路徑。 - 不支援的平台 / 無匹配 → 如果使用者知道套件位置,建議傳遞
--asar /full/path/to/app.asar。
4. 引導使用者查看結果。 預設輸出目錄是 ~/Downloads/<AppName>-electron-extract/。最有趣的子目錄取決於找到的內容:
- 存在
restored/→ 原始原始碼樹已從.js.map檔案重建;這是應優先閱讀的內容。 - 僅存在
extracted/(無 map)→extracted/中的 JS/CSS 已就地使用 Prettier 格式化;從那裡閱讀。
Source-map 路徑還原
腳本應盡可能保留原始原始碼名稱和目錄結構,以 source map 允許的程度為準:
- 解析每個
sources[]條目,若存在sourceRoot則合併,然後相對於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。 - 從原始碼名稱中移除 URL/查詢裝飾,包括常見的
webpack://、file://和?loader後綴。 - 僅在原始碼名稱為空或無法簡化為安全檔案路徑時,才使用
restored/__unknown/<hash>.<ext>。 - 繼續跳過
node_modules和webpack/runtime/*條目;這些是打包器/執行環境噪音,而非應用程式原始碼。
使用方式
# 依應用程式名稱提取(預設輸出:~/Downloads/Codex-electron-extract/)
${BUN_X} {baseDir}/scripts/main.ts Codex
# 依絕對路徑提取(適用於 .app 套件、安裝目錄或 .asar 檔案)
${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
# 自訂輸出
${BUN_X} {baseDir}/scripts/main.ts Codex --output ~/work/codex-source
# 預覽發現而不寫入任何內容
${BUN_X} {baseDir}/scripts/main.ts Codex --dry-run
# 覆寫現有輸出目錄
${BUN_X} {baseDir}/scripts/main.ts Codex --force
# 機器可讀結果(stdout 上一行 JSON)
${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 |
跳過 source-map 還原 | false | |
--no-unpacked |
不要同時複製 app.asar.unpacked/ |
false | |
--dry-run |
印出解析後的路徑並退出,不寫入 | false | |
--json |
在 stdout 輸出一行 JSON 摘要(抑制一般輸出) | false |
輸出結構
~/Downloads/<AppName>-electron-extract/
├── extract-report.json # JSON 摘要:計數、警告、解析後的路徑
├── extracted/ # 原始 asar 內容(無 map 時 JS/CSS 使用 Prettier 格式化)
│ └── ... # node_modules 保持不變(跳過格式化)
├── extracted.unpacked/ # 從 <asar>.unpacked/ 複製(如果存在)
│ └── ... # 原生模組 (.node)、大型資源
└── restored/ # 僅在至少有一個可用的 .js.map 時存在
└── <原始/原始碼/樹> # 從每個 .js.map 的 sourcesContent 重建
注意事項
- node_modules 一律跳過 — 無論是 source-map 還原還是 Prettier 格式化 — 因為在檢查應用程式時,供應商依賴項是噪音。
- Source-map 還原僅在
.js.map內嵌sourcesContent時有效。這是現代打包器(webpack、esbuild、Vite、rollup)的常見情況。如果 map 引用了外部.ts/.js檔案但未內嵌,則跳過該 map,並改用 Prettier 格式化對應的.js。跳過的 map 會列在extract-report.json的warnings下。 - 可讀路徑優先於雜湊 — 不要將 source-map 路徑中的
../區段視為自動不安全。首先從 map 位置解析它們,然後清理最終輸出路徑,使其仍保持在restored/下。雜湊備用僅用於不可用的原始碼名稱。 - 應用程式發現在 macOS 上搜尋
/Applications+~/Applications,在 Windows 上搜尋%LOCALAPPDATA%\Programs、%PROGRAMFILES%、%PROGRAMFILES(X86)%、%APPDATA%。如果發現多個匹配,腳本會退出並列出它們 — 請使用絕對路徑重新執行。在 Linux 或其他平台上,請明確傳遞--asar /path/to/app.asar。 - 安全性 — 腳本拒絕寫入
/、使用者家目錄或目前工作目錄,並且拒絕在沒有--force的情況下寫入現有的非空輸出目錄。 - 無需全域安裝 —
@electron/asar和prettier透過npx -y即時解析。首次執行會較慢,因為 npx 需要快取它們。





