ワークフロー&基本ツール · daymade/claude-code-skills

repomix-unmixer

repomix でパックされたリポジトリからファイルを抽出し、XML/Markdown/JSON 形式から元のディレクトリ構造を復元します。ユーザーが repomix ファイルのアンミックス、パックされたリポジトリの展開、repomix 出力からのファイル構造の復元、または repomix パックプロセスの逆変換を必要とする場合に起動します。

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ファイル書き込みDual-pass Audit
Author daymadeGitHub daymade/claude-code-skills ↗Stars 1392License MIT(仓库根 LICENSE,Copyright (c) 2025 daymade;GitHub API spdx MIT)Commit d5c4678cb5
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

実装アプローチは「1 つの純粋な標準ライブラリ Python スクリプト + 2 つのフォーマット/検証リファレンスドキュメント」であり、LLM オーケストレーション層はありません。スクリプトが実質的なすべての処理を担当し、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'
これこそが「なぜ 3 つのフォーマットを処理できるのか」のメカニズムのすべてです。スキーマ検証やバージョン検出はなく、純粋な文字列スニッフィングです。

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)
3 つのフォーマット(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 のいずれも検出されませんでした(2 回目のレビューで再確認済み、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ファイルごとの進捗状況および合計カウントの出力
07Claude skill に特化した検証ワークフロー(ファイル数/構造/YAML frontmatter/skill-creator バリデータ)
08フォーマット仕様クイックリファレンス(XML/Markdown/JSON の 3 つのブロック構造 + 検出ロジック)

3外部依存関係

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

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: python3 scripts/unmix_repomix.py <repomix_file> [output_directory](リポジトリ同梱、標準ライブラリのみ)
  • 本地工作目录: ファイルの読み書きと成果物の出力: repomix ファイルの内容で指定されたパスに基づき、output_dir 配下に mkdir(parents=True) を行った後でファイルを書き込み: full_path = Pat
監査ノート: オレンジ判定となったのは、ネットワーク通信や認証情報の漏洩があるためではなく(いずれも存在せず、コードレベルでは安全です)、「信頼できないサードパーティ製コンテンツ → 検証されていないファイルパス → ユーザーが書き込み可能な任意の場所」という連鎖が完全かつ実行可能であるためです。3 つの展開関数はいずれも Path(output_dir)/file_path で直接書き込みを行っており、スクリプト全体を grep しても resolve/is_relative_to/normpath/sanitize は一切含まれていませんでした(2 回目のレビューで再確認済み)。トリガー条件は「信頼できない出所の repomix ファイルを展開すること」であり、これは本 skill の主要なユースケースそのものです。ただし、緩和要因が 3 点あります:①スクリプトがファイル内容を実行しないこと、②SKILL.md と README の双方が /tmp への展開とレビュー後の移動を明確に要求していること、③ネットワーク送信がなく、書き込みが純粋にローカルに限定されていること。したがって、レッドではなくオレンジ(評価後に使用)と判定しました。実際に被害が生じるには、意図的に作成された悪意あるパッケージを展開し、さらに上書きされたファイルを誰かが利用するという段階を踏む必要があります。自身で生成した 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 の 3 種類の repomix パックを元のディレクトリツリーに復元可能で、オフラインでも利用できます。
  • 単なるコマンド提示にとどまらない受入規律を内蔵:まず /tmp に展開し、ファイル数を数え、tree で構造を確認し、内容を抜き打ちチェックし、必要に応じて skill-creator 検証を実行するなど、「正しく展開されたか」を実行可能な手順に落とし込んでいます。
  • フォールトトレラントなフォーマットスニッフィング:拡張子に依存せずコンテンツの特徴文字列に基づいて判定するため、ユーザーが repomix の出力を任意のファイル名で保存していても認識可能です。
  • Claude skill に特化した検証アセット(YAML frontmatter、リソース構成、skill-creator バリデータとの連携)を備えており、汎用的な展開ツールよりも agent エコシステムにより適しています。
  • 最適な用途: 推奨対象:repomix でパックされたリポジトリや skill パッケージを受け取り、作業を開始する前に実際のディレクトリツリーに展開してソースコードを確認したい方。また、repomix バックアップを作業コピーに復元したい用途(SKILL.md のユースケース 3)にも適しています。オフライン、依存関係なし、単一コマンドで完結するため、agent の「ファイルフォーマット変換」ツールボックスへの追加に最適です。
    不向きな用途: 非推奨:悪意のある、または出所不明な repomix パッケージの処理(パスサンドボックスがありません。risks の項目 1 参照)。大容量ファイルやバイナリが埋め込まれたコンテンツを扱うシナリオ(正規表現 + UTF-8 はテキストのみを処理するため、埋め込まれたバイナリは破損します)。元の repomix メタデータ(リポジトリの統計情報、トークン数など)を保持する必要があるシナリオ(スクリプトは path/content のみを復元します)。また、「repomix のような再パック」を行う逆方向の操作を期待する用途には適していません。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload repomix-unmixer.tar.gz
    sha256: e046271700f755d1…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit d5c4678cb5.