1实现原理 · 为什么它能做到
实现路径是「1 个纯标准库 Python 脚本 + 2 份格式/校验参考文档」,没有 LLM 编排层:script 做全部实质工作,SKILL.md 只负责触发、参数说明书与操作纪律。
The script is self-contained and requires only Python 3 standard library.
格式判定不是靠扩展名,而是靠内容特征串的优先级嗅探:先 XML(<file path= 且 </file>),再 JSON(以 { 开头且含 "files"),最后 Markdown(含 '## File:')。
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'
XML 提取用非贪婪 DOTALL 正则成对匹配 <file path>…</file>,把捕获组 1 当路径、组 2 当内容——路径直接来自文件内容,不是本地磁盘遍历。
file_pattern = r'<file path="([^"]+)">\n(.*?)\n</file>' matches = re.finditer(file_pattern, content, re.DOTALL)
还原目录树靠 Path(output_dir)/file_path 拼接后 mkdir(parents=True) 再逐文件写 UTF-8。
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)
「反 repomix」的可靠性只到正则边界:脚本对同一文件内的重复路径、绝对路径、越界相对路径、Windows 反斜杠均无处理,SKILL.md 也不宣称处理。
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()
操作纪律由 SKILL.md 承担(先解到 /tmp、核对文件数、tree 查结构、不直接覆盖重要目录),属于「用文档约束代替代码约束」的设计。
### Verify Before Overwriting Never extract directly to important directories without review:
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | python3 |
| cli | tree(仅用于人工检视解包结果,非脚本依赖) |
| cli | skill-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');解到已有目录时会静默覆盖既有文件。用全新空目录可规避。
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结论
e046271700f755d1…d5c4678cb5