mcpField
B
baoyu-electron-extract

baoyu-electron-extract

github.com/jimliu开发27.0k7.9k 次安装7 周前更新
代码仓库

关于 baoyu-electron-extract

baoyu-electron-extract 用于提取已安装 Electron 应用的 app.asar 内容,方便检查其代码。若 source map 内含源码,可恢复原始文件;否则使用 Prettier 格式化打包的 JavaScript。

主要功能

  1. 01发现 Electron 应用包
  2. 02提取 app.asar 内容
  3. 03从 source map 恢复源码
  4. 04使用 Prettier 格式化 JavaScript
  5. 05跳过 node_modules

适用场景

  1. 01检查已安装 Electron 应用的代码
  2. 02从内嵌 source map 恢复可读文件
  3. 03没有可用映射时格式化打包的 JavaScript
  4. 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。

用户输入工具

当此技能需要向用户提问时,请遵循以下工具选择规则(按优先级排序):

  1. 优先使用当前 Agent 运行时提供的内置用户输入工具,例如 AskUserQuestion、request_user_input、clarify、ask_user 或任何等效工具。
  2. 回退方案:如果没有此类工具,则输出带编号的纯文本消息,并请用户针对每个问题回复所选编号或答案。
  3. 批量提问:如果工具支持每次调用提出多个问题,请将所有适用问题合并到一次调用中;如果每次只能提出一个问题,则按优先级依次提问。

下面对 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 需要缓存这些工具,因此会较慢。

评论

支持 Markdown