基础工具与工作流 · daymade/claude-code-skills

repomix-unmixer

Extracts files from repomix-packed repositories, restoring original directory structures from XML/Markdown/JSON formats. Activates when users need to unmix repomix files, extract packed repositories, restore file structures from repomix output, or reverse the repomix packing process.

风险提醒:橙色 · 评估后使用AI 侦查报告
作者 daymadeGitHub daymade/claude-code-skills ↗Stars 1392许可 MIT(仓库根 LICENSE,Copyright (c) 2025 daymade;GitHub API spdx MIT)commit d5c4678cb5
agent 宿主通常会约束 skill 执行权限;风险提醒为 AI 侦查观点,不构成质量或安全保证。第三方 skill 仅作拆解与展示,安装使用风险自负,版权归原作者。

1实现原理 · 为什么它能做到

实现路径是「1 个纯标准库 Python 脚本 + 2 份格式/校验参考文档」,没有 LLM 编排层:script 做全部实质工作,SKILL.md 只负责触发、参数说明书与操作纪律。

repomix-unmixer/SKILL.md
The script is self-contained and requires only Python 3 standard library.
注:反向核对脚本 import 段(re/os/sys/json/pathlib)确无第三方依赖,声明成立。

格式判定不是靠扩展名,而是靠内容特征串的优先级嗅探:先 XML(<file path= 且 </file>),再 JSON(以 { 开头且含 "files"),最后 Markdown(含 '## File:')。

repomix-unmixer/scripts/unmix_repomix.py
if '<file path=' in content and '</file>' in content: return 'xml' # Check for JSON format if content.strip().startswith('{') and '"files"' in content: return 'json' # Check for Markdown format if '## File:' in content: return 'markdown'
注:这就是「为什么它能处理三种格式」的全部机制:无 schema 校验、无版本探测,纯字符串嗅探。

XML 提取用非贪婪 DOTALL 正则成对匹配 <file path>…</file>,把捕获组 1 当路径、组 2 当内容——路径直接来自文件内容,不是本地磁盘遍历。

repomix-unmixer/scripts/unmix_repomix.py
file_pattern = r'<file path="([^"]+)">\n(.*?)\n</file>' matches = re.finditer(file_pattern, content, re.DOTALL)
注:关键安全含义:写入路径完全由被解包文件的内容决定,这是本 skill 唯一的攻击面来源。

还原目录树靠 Path(output_dir)/file_path 拼接后 mkdir(parents=True) 再逐文件写 UTF-8。

repomix-unmixer/scripts/unmix_repomix.py
full_path = Path(output_dir) / file_path full_path.parent.mkdir(parents=True, exist_ok=True) # Write the file with open(full_path, 'w', encoding='utf-8') as f: f.write(file_content)
注:三种格式(xml/markdown/json)走的是同一段写盘逻辑,风险一致。

「反 repomix」的可靠性只到正则边界:脚本对同一文件内的重复路径、绝对路径、越界相对路径、Windows 反斜杠均无处理,SKILL.md 也不宣称处理。

repomix-unmixer/scripts/unmix_repomix.py
def unmix_repomix(repomix_file, output_dir): """Extract files from a repomix file (auto-detects format).""" # Read the repomix file with open(repomix_file, 'r', encoding='utf-8') as f: content = f.read()
注:全脚本 grep 无 resolve/is_relative_to/normpath/sanitize 任何一项(第二遍复核确认,见 verification)。

操作纪律由 SKILL.md 承担(先解到 /tmp、核对文件数、tree 查结构、不直接覆盖重要目录),属于「用文档约束代替代码约束」的设计。

repomix-unmixer/SKILL.md
### Verify Before Overwriting Never extract directly to important directories without review:
注:这条纪律缓解但不消除路径越界——见 security.file_writes。

2核心能力

01XML 格式解包(repomix 默认格式)
02Markdown 格式解包(## File: + 围栏代码块)
03JSON 格式解包(files[].path/content)
04自动格式探测,无需用户声明
05还原多级目录结构并自动建父目录
06逐文件进度与总数统计输出
07面向 Claude skill 的专项校验流程(文件数/结构/YAML frontmatter/skill-creator 校验器)
08格式规范速查(XML/Markdown/JSON 三种块结构 + 检测逻辑)

3外部依赖

类型依赖
clipython3
clitree(仅用于人工检视解包结果,非脚本依赖)
cliskill-creator 的 quick_validate.py(可选校验器,需用户本机已装 and 从 anthropics-skills 市场)

4风险提醒 风险提醒:橙色 · 评估后使用

风险提醒:橙色 · 评估后使用
  • 解包路径未校验,可写到 output_dir 之外 — 三个解包函数一律 Path(output_dir)/file_path 直接 mkdir+write,无 ../ 过滤、无绝对路径拒绝、无 resolve 后越界检查。构造一个含 path="../../.zshrc" 或 path="/home/u/.zshrc" 的 repomix 文件即可覆盖任意用户可写文件——而「解包别人分享的包」正是该 skill 的推荐用法。缓解:只对自产包使用,或解包后先核对路径清单。
  • 解包结果会进入 agent 上下文,形成二次注入面(非本 skill 独有) — 流程要求 agent 读回解出来的 SKILL.md/代码做 review('Then review, validate, or install the extracted skills')。被解出的文本若含指令性内容,会作为普通文件内容进入上下文——这是所有「先下载再阅读」类 skill 的共性风险,此处仅作提醒,非本 skill 引入。
  • 文档漂移会直接导致误用 — README 的 Markdown 示例(### File:)与脚本正则(## File:)不匹配,照 README 造的输入会静默零提取;README 还指向仓库内不存在的 repomix-unmixer.zip。建议以 SKILL.md + references/repomix-format.md 为准。
  • 无去重与覆盖保护 — 同名条目会被后写覆盖且不报告(SKILL.md 只说 'Option 2: Clear the directory first');解到已有目录时会静默覆盖既有文件。用全新空目录可规避。
风险提醒:橙色,评估后使用。判橙不是因为有网络或凭证(两者皆无,代码层面干净),而是因为「不可信第三方内容 → 未经校验的文件路径 → 任意用户可写位置」这条链完整且可行:三个解包函数一律 Path(output_dir)/file_path 直接写,全脚本 grep 无 resolve/is_relative_to/normpath/sanitize(第二遍复核确认)。触发条件是「解包一个来源不可信的 repomix 文件」——正是该 skill 的主打用法。缓解因素有三:①脚本不执行文件内容;②SKILL.md/README 都明确要求先解到 /tmp、review 后再移动;③无网络回传,写入是纯本地。因此定橙(评估后使用)而非红:要形成实际危害需要用户去解包一个特意构造的恶意包,且后续仍要落到「有人去消费被覆盖的文件」这一步。若只解包自己生成的 repomix,实际风险很低。建议使用时固定先解到全新空目录,并在解包后核对路径清单再使用内容。

5第二遍独立确认

  • [ok] 「无网络外发、无凭证读取」结论是否有反例(隐藏脚本/混淆内容/间接调用) — 目录内共 5 个文件全部读毕;脚本 import 段仅 re/os/sys/json/pathlib;全目录 token 终扫 urllib/requests/httpx/socket/subprocess/curl/wget/Authorization/token/key/secret/.env 零命中;无长混淆行;无 .skill 打包物需要与仓库比对。结论成立。
  • [ok] 「实现原理」是否夸大:声明支持三种格式 vs 代码实际能力 — 三种格式各有独立解析函数(unmix_xml/unmix_markdown/unmix_json)且 detect_format 会真的分派,非口头宣称。SKILL.md 的示例输出(✓ Extracted: …/✅ Successfully extracted N files!)与脚本 print 语句逐字一致。无夸大。
  • [discrepancy] README.md 声明的 Markdown 格式与脚本实际正则是否一致 — README「Supported Formats → Markdown Format」给出的是三级标题加四反引号围栏(### File: relative/path/to/file.ext),而脚本正则是 r'## File: ([^\n]+)\n```[^\n]*\n(.*?)\n```'(两个 #、三反引号)。'### File:' 不含子串 '## File:'(第三个字符是 # 而非空格),按 README 示例构造的输入会零提取并触发脚本的 '⚠️ No files extracted!' 退出。SKILL.md 与 references/repomix-format.md 的示例是对的(## File:),即漂移只在 README。
  • [unlocatable] README.md 声明的安装方式是否在仓库内可验证 — README 第 1 步要求「Download repomix-unmixer.zip」,但仓库内不存在任何 .zip/.skill 打包物(find 全仓 -name '*.skill' -o -name 'repomix-unmixer.zip' 零命中)。该 zip 是否由外部发布渠道提供,源码内无法定位,记为待补。
  • [discrepancy] README 声明的许可与版本是否与仓库一致 — README 写「This skill follows the same license as Claude Code」且「Version: 1.0.0 / Created: 2025-10-22」,未点名 MIT;仓库根 LICENSE 为 MIT(Copyright (c) 2025 daymade)。属表述含糊(未直接冲突,但 README 未指向仓库根 LICENSE),且 README 未记录任何后续更新日期。
  • [discrepancy] 写入路径是否真的无防护(安全结论的关键项,须找反例而非确认) — 反例检索失败→确认无防护:对 unmix_repomix.py grep '..|resolve|is_relative_to|abspath|normpath|startswith|sanitiz|safe' 仅命中无关行(正则里的 '<file path='、'## File:' 与 main() 的 os.path.exists 输入文件检查)。即输出目录内的路径完全未校验,第一遍判断成立并被强化。
  • [ok] pin commit 与 skill.path 是否与任务书一致 — git rev-parse HEAD = d5c4678cb5d4fd6acc9c922690df035dbd33d247;该目录位于仓库根,相对路径 repomix-unmixer;该目录最后一次提交为 878f947(2026-09-07),HEAD 未触及本目录。GitHub API 复核:MIT、stars 1392、pushed 2026-09-15T09:30:04Z。

6结论

  • 零依赖确定性解包:不需要安装 repomix,只要 python3 就能把 XML/Markdown/JSON 三种 repomix 包还原成原目录树,离线可用。
  • 自带验收纪律而非只给命令:先解到 /tmp、数文件数、tree 看结构、抽查内容、必要时跑 skill-creator 校验,把「解包是否正确」变成可执行步骤。
  • 格式嗅探容错:不依赖扩展名,按内容特征串判定,用户把 repomix 输出存成任意文件名都能识别。
  • 面向 Claude skill 的专项校验资产(YAML frontmatter、资源组织、与 skill-creator 校验器对接),比通用解包工具更贴 agent 生态。
  • 适合:适合:拿到一个 repomix 打包的仓库/skill 包、想在做任何事之前把它摊成真实目录树来读源码的人;也适合把 repomix 备份还原成工作副本(SKILL.md 的 Use Case 3)。离线、无依赖、单命令,适合放进 agent 的「文件格式转换」工具箱。
    不适合:不适合:需要处理恶意或来路不明的 repomix 包(无路径沙箱,见 risks 第 1 条);需要大文件/二进制内嵌内容的场景(正则 + UTF-8 只处理文本,二进制嵌入会被破坏);需要保留原 repomix 元数据(仓库统计、token 数)的场景——脚本只还原 path/content;也不适合期待「像 repomix 那样打包」的反向操作。
    安装 agent 直装可复制
    ① 本站镜像 更新 2026-09-15
    方式 A · 人下载镜像包下载 repomix-unmixer.tar.gz
    sha256: e046271700f755d1…
    方式 B · JSON 格式安装指南,复制给 agent
    安装指南
    agent 读 JSON 指南后会自动从本站下载安装,无需更多说明。
    ② 上游 GitHub · 原始来源
    能访问 GitHub?直接去上游安装(实时版,可能已更新)GitHub 原始 ↗
    本页镜像锁定 commit d5c4678cb5;上游为实时仓库。
    来源信息 GitHub 原始
    作者 / 仓库daymade / daymade/claude-code-skills
    Stars1392
    最近推送2026-09-15
    本 skill commitd5c4678cb5
    许可MIT(仓库根 LICENSE,Copyright (c) 2025 daymade;GitHub API spdx MIT)
    本站信息
    收录日期2026-09-06
    分类基础工具与工作流
    侦查报告AI 侦查 · 2 遍 · 2026-09-06
    本站镜像与 GitHub 原始是不同来源:本站锁定 commit 快照经 /r2 分发;GitHub 为实时上游,内容可能已更新。
    同分类邻近