mcpField
M
mdx-sanitizer

mdx-sanitizer

github.com/curiositech開発257192 回インストール2 日前に更新
リポジトリ

mdx-sanitizer について

JSXの解析エラーを招く可能性があるMDXコンテンツを整えるスキルです。ドキュメントのビルドを保守する開発者向けに、同期時のサニタイズとコミット前・ビルド時の検証を行い、コードブロックは保護します。

主な機能

  1. 01競合する山括弧パターンの検出
  2. 02HTMLエンティティによるエスケープ
  3. 03コードブロックとインラインコードの保護
  4. 04確認・修正コマンドの提供
  5. 05コミット前とビルド時の検証連携

活用シーン

  1. 01ドキュメント内のTypeScriptジェネリクスを修正
  2. 02比較演算子によるMDXビルド失敗を防止
  3. 03コミット前に括弧の問題を確認
  4. 04スキル文書の同期時に内容をサニタイズ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/curiositech/some_claude_skills --skill mdx-sanitizer

インストール後、Claude Code で/mdx-sanitizerを入力して読み込まれたか確認します。

同梱ファイル.claude-plugin/plugin.json

詳細

MDX サニタイザー

山括弧、ジェネリクス、その他の競合するパターンが原因で発生する JSX の解析エラーを防ぐ、包括的な MDX コンテンツサニタイザーです。

問題

MDX 2.x では、エスケープされていない < と { は JSX 構文として扱われます。そのため、コンテンツに次のものが含まれているとビルドが失敗します。

  • TypeScript のジェネリクス:Promise&lt;T&gt;、Array&lt;string&gt;、Map&lt;K, V&gt;
  • 比較演算子:&lt;100ms、&lt;=、&gt;=
  • 矢印:--&gt;、&lt;--、-&gt;
  • 無効なタグ:文章中の &lt;link&gt;、プレースホルダーの &lt;tag&gt;
  • 空の山括弧:&lt;&gt;

ソリューションのアーキテクチャ

このスキルでは、3 層の防御を実装しています。

1. 同期時のサニタイズ(事前対策)

.claude/skills/ から website/docs/ への同期時にコンテンツをサニタイズします。

  • syncSkillDocs.ts - スキルのメインファイル
  • syncSkillSubpages.ts - リファレンスファイル
  • doc-generator.ts - 生成されたドキュメント
2. コミット前の検証(事後対策)

Git のコミット前フックが、コミット前に validate-brackets.js を使ってファイルを検証します。

3. ビルド時の検証(最終確認)

npm run validate:all が prebuild の一部として実行され、問題を検出します。

使い方

問題を確認する(ドライラン)
cd website
npm run sanitize:mdx
# or with verbose output
npm run sanitize:mdx -- --verbose
すべての問題を修正する
cd website
npm run sanitize:mdx -- --fix
# or shorthand
npm run fix:mdx
プログラム API
import { sanitizeForMdx, validateMdxSafety, isMdxSafe } from './lib/mdx-sanitizer';

// Sanitize content
const result = sanitizeForMdx(content, { useHtmlEntities: true });
if (result.modified) {
  console.log(`Fixed ${result.issues.length} issues`);
  fs.writeFileSync(path, result.content);
}

// Validate without modifying
const issues = validateMdxSafety(content, 'path/to/file.md');

// Quick check
if (!isMdxSafe(content)) {
  // Handle issues
}

エスケープ方法

このサニタイザーでは、互換性を最大限に高めるために HTML エンティティを使用します。

パターン元の表記エスケープ後
小なり記号<&lt;
大なり記号>&gt;
ジェネリクス&lt;T&gt;&amp;lt;T&amp;gt;
比較演算子&lt;=&amp;lt;=

コードブロック(``` または `)内のコンテンツは自動的に保護され、エスケープされません。

変更されたファイル

  • website/scripts/lib/mdx-sanitizer.ts - サニタイザーのコアモジュール
  • website/scripts/sanitize-mdx.ts - CLI ラッパー
  • website/scripts/syncSkillDocs.ts - 統合
  • website/scripts/syncSkillSubpages.ts - 統合
  • website/scripts/lib/doc-generator.ts - 統合
  • website/package.json - npm スクリプト

検出するパターン

  1. 数字の前の小なり記号:&lt;100、&lt;0.5ms
  2. 比較演算子:&lt;=、&gt;=
  3. 空の山括弧:&lt;&gt;
  4. 矢印:&lt;--、--&gt;
  5. ジェネリック型:Promise&lt;T&gt;、Array&lt;string&gt;
  6. 小なり記号の後のスペース:&lt; value
  7. 無効な疑似タグ:&lt;link&gt;、&lt;tag&gt;(有効な HTML ではありません)

トラブルシューティング

サニタイザーを実行してもビルドに失敗する
  1. Docusaurus のキャッシュをクリアします:npm run clear
  2. サニタイザーを再実行します:npm run sanitize:mdx -- --fix
  3. 再ビルドします:npm run build
誤検出

有効な JSX コンポーネントがエスケープされる場合:

  • PascalCase が使われていることを確認します(例:&lt;MyComponent&gt;)
  • 有効な HTML5 要素であることを確認します
手動でのエスケープ

例外的なケースでは、ソース内で手動でエスケープします。

  • インラインコードにはバッククォートを使います:`&lt;T&gt;`
  • 複数行のコードにはフェンス付きコードブロックを使います
  • HTML エンティティを使います:&lt; と &gt;

参考資料

コメント