1仕組みと動作原理
自前実装による展開ではなく、実行時にnpx経由でサードパーティパッケージ@electron/asarをオンデマンドで取得してextractを実行します。引数は配列形式でspawnに渡され、シェル文字列の連結は行われません。
const args = ["-y", "@electron/asar", "extract", asarPath, dest];
元のソースツリーを復元するには.js.map内にsourcesContentが埋め込まれていることが前提です。満たされない場合はPrettierによる圧縮コードの整形にフォールバックします。これが公称される「逆コンパイル」の実際の能力境界です。
only works when the `.js.map` embeds `sourcesContent`
利用可能なsource mapが存在しないJS/CSSは、npx prettier --writeによってインプレースで一括整形され、圧縮コードの可読性を向上させます。
const args = ["-y", "prettier", "--write", ...batch];
クロスプラットフォームのアプリ検出:macOSは/Applicationsおよび~/Applicationsを列挙し、WindowsはLOCALAPPDATAやPROGRAMFILESなどのルートを検索します。複数ヒットした場合はエラー終了し、絶対パスでの指定を要求します。
const roots = ["/Applications", join(homedir(), "Applications")];
ディスク書き込みの厳格なガードレール:ルートディレクトリ、ユーザーホームディレクトリ自体、またはカレントワークディレクトリへの出力を禁止します。既存の空でない出力ディレクトリへの書き込みには--forceが必須です。
const forbidden = [root, home, cwd];
node_modulesとwebpack/runtimeのノイズは、展開の統計、source-mapの復元、Prettier整形の全フェーズで完全にスキップされます。
return s.includes("node_modules/") || s.startsWith("webpack/runtime/");
source-mapのsources[]がディスクへの書き込みパスを決定します。実装上はまずmapが存在するディレクトリを基準に解決し、可読パスをrestored/配下に集約し、安全なパスに縮約できない場合のみハッシュ値によるフォールバックを行います。
Use `restored/__unknown/<hash>.<ext>` only when the source name is empty or cannot be reduced to a safe file path.
成果物はファイルツリー+機械可読なレポートです:デフォルトは~/Downloads/<AppName>-electron-extract/で、extract-report.json(カウント、warnings)を含み、--jsonによる単一行サマリーもサポートします。
join(outputDir, "extract-report.json"),
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | npx(Node 自带)/ bun |
| package | @electron/asar(运行时 npx 拉取,未锁版本) |
| package | prettier(运行时 npx 拉取,未锁版本) |
| cli | bun(首选运行时;无 bun 时由 npx -y bun 兜底) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: bun {baseDir}/scripts/main.ts(または npx -y bun …)——SKILL.mdで指定された実行方法
- 网络端点: 外部ネットワークアクセスの宣言: registry.npmjs.org:初回実行時にnpx -yによって@electron/asarとprettierを取得(本ディレクトリ内にpackage.jsonは存在しない)
- 本地工作目录: ファイルの読み書きと成果物の出力: デフォルトは ~/Downloads/<AppName>-electron-extract/:extracted/、extracted.unpacked/、r
5二重目の独立検証
- [ok] 解包委托 @electron/asar(非自研) — main.ts:404 逐字为 `const args = ["-y", "@electron/asar", "extract", asarPath, dest];`,spawn 以 argv 数组调用,无 shell 拼接。
- [ok] npx 拉取未锁版本第三方包(供应链面) — 本目录无 package.json / lockfile,main.ts 内两处 npx 调用分别拉 @electron/asar 与 prettier;SKILL.md Notes 自述 'resolved on-the-fly via `npx -y`',与代码一致。
- [ok] source map 还原能力边界(需内嵌 sourcesContent) — SKILL.md 明写只在 `.js.map` 内嵌 sourcesContent 时可用,未内嵌则跳过并记 warnings;无夸大表述。
- [ok] 写盘护栏(/、home、cwd 拒绝;非空目录需 --force) — main.ts assertSafeOutputDir 用 `const forbidden = [root, home, cwd];`;SKILL.md Safety 段文字与代码一致。
- [ok] 平台支持范围(仅 macOS/Windows 自动发现) — main.ts:310-313 对非 darwin/win32 平台直接抛错要求 --asar;SKILL.md 同述,无夸大。
- [ok] 外部依赖清单是否完整 — 全目录扫描 URL/API/凭证 token 零命中;唯二第三方包为 @electron/asar 与 prettier(均经 npx),运行时 bun/npx 为宿主运行时而非依赖。
- [ok] 元数据(license/stars/commit) — git rev-parse HEAD=1567581c26ec29f4216c6e6835415bf30343b0e3;仓库根 LICENSE 首行 'MIT License'、'Copyright (c) 2026 Jim Liu';GitHub API 返回 MIT / 25926 stars / 2026-09-10T15:13:43Z。
- [discrepancy] 『decompile』措辞与实际能力是否相符 — 出题/触发词里的『decompile Electron』并不等于反编译:实际是解包 + 用构建产物自带的 source map 还原 + Prettier 美化(SKILL.md 自己写明前提是 sourcesContent 存在)。判级与结论不受影响,但详情页应写清这不是字节码/压缩代码的结构化反编译。
6結論
3d2a2257d7155c7c…