baoyu-electron-extract

baoyu-electron-extract

熱門

從任何已安裝的 Electron 應用程式(`.asar` 套件)中提取資源和 JavaScript,當有 `.js.map` 檔案時從中還原原始原始碼,否則使用 Prettier 格式化壓縮後的程式碼。當使用者想要「提取 Electron 應用程式」、「反編譯 Electron」、「取得 <app> 的原始碼」、「檢查 app.asar」、「看 Electron 應用原始碼」、「提取 .asar」,或詢問桌面 Electron 應用程式如何建置時使用。跳過 `node_modules`,支援 macOS 和 Windows。

2.4萬星標
2670分支
更新於 2026/7/4
SKILL.md
readonlyread-only
name
baoyu-electron-extract
description

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.

version
1.119.0

Electron 應用程式提取

從已安裝的 Electron 應用程式的 app.asar 中提取資源和程式碼。當存在 .js.map 時,從內嵌的 sourcesContent 還原原始原始檔;否則使用 Prettier 格式化壓縮後的程式碼。Source-map 路徑會先相對於 .js.map 檔案解析,因此像 ../../src/main.ts 這樣的打包路徑會還原為可讀路徑,例如 restored/src/main.ts,而不是雜湊佔位符。一律跳過 node_modules。適用於 macOS 和 Windows。

使用者輸入工具

當此技能提示使用者時,請遵循以下工具選擇規則(優先順序):

  1. 優先使用目前代理執行環境提供的內建使用者輸入工具,例如 AskUserQuestionrequest_user_inputclarifyask_user 或任何等效工具。
  2. 備用方案:如果沒有此類工具,則發出編號的純文字訊息,並要求使用者回覆每個問題的選擇編號/答案。
  3. 批次處理:如果工具支援每次呼叫多個問題,則將所有適用的問題合併為一次呼叫;如果僅支援單一問題,則按優先順序逐一詢問。

以下具體的 AskUserQuestion 參考僅為範例 — 請在其他執行環境中替換為本地等效工具。

腳本目錄

腳本位於 scripts/ 子目錄。{baseDir} = 此 SKILL.md 的目錄路徑。解析 ${BUN_X} 執行環境:如果已安裝 bunbun;如果可用 npxnpx -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_moduleswebpack/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.jsonwarnings 下。
  • 可讀路徑優先於雜湊 — 不要將 source-map 路徑中的 ../ 區段視為自動不安全。首先從 map 位置解析它們,然後清理最終輸出路徑,使其仍保持在 restored/ 下。雜湊備用僅用於不可用的原始碼名稱。
  • 應用程式發現在 macOS 上搜尋 /Applications + ~/Applications,在 Windows 上搜尋 %LOCALAPPDATA%\Programs%PROGRAMFILES%%PROGRAMFILES(X86)%%APPDATA%。如果發現多個匹配,腳本會退出並列出它們 — 請使用絕對路徑重新執行。在 Linux 或其他平台上,請明確傳遞 --asar /path/to/app.asar
  • 安全性 — 腳本拒絕寫入 /、使用者家目錄或目前工作目錄,並且拒絕在沒有 --force 的情況下寫入現有的非空輸出目錄。
  • 無需全域安裝@electron/asarprettier 透過 npx -y 即時解析。首次執行會較慢,因為 npx 需要快取它們。