关于 baoyu-electron-extract
用于从 Electron 应用提取文件并恢复可用源代码的技能,适合检查或研究应用包内容的开发者。它可从 source map 重建源文件,并格式化提取出的 JS/CSS。
主要功能
- 01发现应用并提取 asar 内容
- 02根据 source map 恢复源文件
- 03使用 Prettier 格式化 JS/CSS
- 04复制 app.asar.unpacked 内容
- 05提供 dry-run 与 JSON 摘要
适用场景
- 01检查 Electron 应用打包内容
- 02恢复嵌入 source map 的源码
- 03格式化提取出的 JS 和 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 应用提取
用户输入工具
当此技能提示用户时,请遵循以下工具选择规则(按优先级排序):
- 优先使用当前 Agent 运行时提供的内置用户输入工具,例如
AskUserQuestion、request_user_input、clarify、ask_user或任何等效工具。 - 备用方案:如果没有此类工具,请发送带编号的纯文本消息,并请用户针对每个问题回复所选编号/答案。
- 批处理:如果工具支持每次调用提出多个问题,请将所有适用问题合并为一次调用;如果每次只能提出一个问题,则按优先级逐一提问。
以下 AskUserQuestion 引用仅为示例 — 在其他运行时中请替换为本地等效工具。
脚本目录
{baseDir} = 此 SKILL.md 所在目录。解析 ${BUN_X}:如果已安装 bun,则使用 bun;否则使用 npx -y bun;否则建议安装 bun。将 {baseDir} 和 ${BUN_X} 替换为实际值。
| 脚本 | 用途 |
|---|---|
scripts/main.ts | 应用发现 + asar 提取 + source-map 还原 + 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 | 在 stdout 输出一行 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
源码映射路径还原
在映射文件允许的范围内保留原始源码名称和目录结构:
- 如果存在
sourceRoot,则解析每个sources[]条目;之后相对于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 常见)。引用外部文件但未内嵌其内容的映射会被跳过,改为使用 Prettier 格式化.js;被跳过的映射会列在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 缓存这些包会比较慢。
评论
支持 Markdown