关于 baoyu-electron-extract
baoyu-electron-extract 用于提取已安装 Electron 应用的 app.asar 内容,方便检查其代码。若 source map 内含源码,可恢复原始文件;否则使用 Prettier 格式化打包的 JavaScript。
主要功能
- 01发现 Electron 应用包
- 02提取 app.asar 内容
- 03从 source map 恢复源码
- 04使用 Prettier 格式化 JavaScript
- 05跳过 node_modules
适用场景
- 01检查已安装 Electron 应用的代码
- 02从内嵌 source map 恢复可读文件
- 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。
用户输入工具
当此技能需要向用户提问时,请遵循以下工具选择规则(按优先级排序):
- 优先使用当前 Agent 运行时提供的内置用户输入工具,例如
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 提取 + 源映射恢复 + 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. 处理结果。
- 成功 → 报告输出路径和数量(已提取 / 已恢复 / 已格式化)。
- 匹配到多个结果 → 脚本会列出候选项并以非零状态退出。向用户展示候选项,询问要使用哪一个(通过
AskUserQuestion或运行时等效工具),然后使用选定的绝对路径重新运行。 - 输出目录已存在且非空 → 如果没有
--force,脚本会拒绝执行。询问用户是要覆盖(使用--force),还是选择新的--output路径。 - 平台不受支持 / 未匹配到结果 → 如果用户知道程序包所在位置,建议传入
--asar /full/path/to/app.asar。
4. 告知用户结果的位置。 默认输出目录为 ~/Downloads/<AppName>-electron-extract/。具体要查看哪个子目录,取决于发现的内容:
- 存在
restored/→ 已根据.js.map文件重建原始源代码树;建议先查看此目录。 - 仅存在
extracted/(没有映射文件)→extracted/中的 JS/CSS 已就地使用 Prettier 格式化;请从此目录查看。
source map 路径还原
只要 source map 允许,脚本就应保留原始源文件名称和目录结构:
- 如果存在
sourceRoot,先用它解析每个sources[]条目,然后以.js.map文件在extracted/中所在的目录为基准进行解析。 - 将常见的打包器相对路径整理到还原后的项目树中。例如,
.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/*条目;这些是打包器/运行时噪声,并非应用源文件。
用法
# 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 | 跳过 source map 还原 | false | |
--no-unpacked | 不要将 app.asar.unpacked/ 一并复制 | false | |
--dry-run | 打印解析出的路径并退出,不写入文件 | false | |
--json | 在标准输出中输出一行 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
说明
- node_modules 始终会被跳过,不论是还原源映射还是使用 Prettier 格式化都一样,因为查看应用时,随附的依赖项只会带来干扰。
- 源映射还原仅在
.js.map内嵌sourcesContent时有效。这是现代打包工具(webpack、esbuild、Vite、rollup)的常见情况。如果映射引用了外部.ts/.js文件,但未内嵌这些文件,脚本就会跳过该映射,转而使用 Prettier 格式化对应的.js文件。跳过的映射会列在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需要缓存这些工具,因此会较慢。