Agent Skill のコンポーネント API テーブル生成を CEM から取得へ変更

shoelace-style/webawesome

Agent Skill が出力するコンポーネント API テーブルの生成元を、HTML スクレイピングから Custom Elements Manifest (CEM) 直接参照へ置き換え、テーブル内容の情報ロスを解消します。

背景

この PR は、Agent Skill が生成するコンポーネント API テーブルの取得方法を変更し、テーブルの正確性を向上させます。

従来はビルド済みドキュメントの HTML をスクレイピングしていましたが、スクレイピングにより型情報やデフォルト値が単一セルに統合され、インライン <code> が失われるなどのデータ欠損が発生していました(#2475)。

HTML から直接抽出する手法ではなく CEM からデータを取得することで、元データの完整性を保持したままテーブルを生成できるようになります。

技術的な変更

renderComponentApiTable 関数を新規追加し、CEM のデータ構造を受け取って Markdown 形式のテーブルまたはスロット一覧を生成します。

function renderComponentApiTable(section, component) {
  const bt = s => '`' + s + '`';
  const esc = s =>
    String(s ?? '')
      .replace(/\r?\n/g, ' ')
      .replace(/\|/g, '\\|')
      .replace(/\s+/g, ' ')
      .trim();
  const codeOrDash = s => {
    const t = esc(s);
    return t ? bt(t) : '—';
  };
  const table = (headers, rows) =>
    rows.length
      ? ['| ' + headers.join(' | ') + ' |', '| ' + headers.map(() => '---').join(' | ') + ' |', ...rows].join('\n')
      : null;

  switch (section) {
    case 'Slots': {
      const slots = component.slots || [];
      if (!slots.length) return null;
      const lines = [
        'Valid slot names for this component (use exactly these — any other `slot` value is',
        'silently ignored and the element falls back to the default slot):',
        '',
      ];
      for (const s of slots) {
        const name = s.name ? bt(esc(s.name)) : '`(default)`';
        lines.push(`- ${name} — ${esc(s.description) || 'No description.'}`);
      }
      return lines.join('\n');
    }
    // Attributes, Methods, Events, CSS custom properties, Custom States, CSS parts are handled similarly
  }
}

processHtmlToMarkdown 内で API テーブル対象のセクションを検知すると、上記ヘルパーを呼び出して生成した Markdown を一時的なプレースホルダーとして保存します。後続の Turndown パスが完了した後にプレースホルダーを実際のテーブル文字列に置換するため、バックティックや角括弧がエスケープされずに出力されます。

copyAllComponentDocs 関数の呼び出しに component 引数を追加し、各コンポーネントの CEM データを渡せるよう修正しました。これにより、全コンポーネントで同一ロジックが適用されます。

これらの変更により、API テーブルは CEM から生成され、型・デフォルト・説明が完全に保持された状態で Markdown に変換されます。既存の出力形式やビルドフローは変更されません。

設計判断

CEM 直接参照を選択したのは、情報ロスの根本原因を取り除きつつ、既存のドキュメント生成パイプラインに最小限の侵入で済ませるという方針に沿ったためです。scripts/llms.js が既に CEM からデータを取得している実装を再利用することで、コードの重複を防ぎ保守性を向上させました。

テーブル生成ロジックはプレースホルダー方式を維持しているため、他の Markdown 変換ステップへの副作用はなく、既存の利用者に対する互換性が保たれます。

この設計は、データ取得元を変更するだけで機能的な振る舞いを変えず、将来的な CEM スキーマ変更にも比較的柔軟に対応できる構造となっています。

まとめ

Agent Skill はコンポーネント API テーブルを CEM から直接生成するようになり、型情報・デフォルト値・説明文が正確に保持されます。テーブル生成フローは既存と同様の出力を行うため、利用者への影響はなく、ドキュメント品質の向上が期待されます。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
492f5136

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文・背景・技術的変更・設計判断・まとめの3部構成が明確で、各要素が揃っている。まとめはリード文の単なる繰り返しではなく、変更の意義を再提示している。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは ```javascript:packages/webawesome/scripts/agent-skill.js の形式で正しく記述。GitHubリンクは #2475、#2531 とも短縮IDリンク形式で正しく記載されている。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

内容はエンジニア向けで、専門用語を前提に説明されており、初心者向けの過度な解説はない。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論→各論→結論の流れで構成され、段落はトピックセンテンスで始まり1段落1トピック、長さも適切で空行で区切られている。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは Diff に追加された renderComponentApiTable 関数と一致し、ファイルパスも合致している。抜粋は主要ロジックを網羅しており、Diff からの乖離はない。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

CEM、API テーブル、Slots などの用語は PR や Diff と整合し、誤用は見られない。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

情報ロスの原因や CEM 参照の効果についての説明は PR の目的と一致し、技術的に正確。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

すべての主張は PR のタイトル、ディスクリプション、Diff、Issue #2475 に裏付けられており、憶測や外部知識の付加はない。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

Issue 番号 #2475、PR 番号 #2531 などの数値は正確に記載されている。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の「Agent skill improvements」を具体的に説明したもので、内容と矛盾していない。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

LTS やリリース日程等、PR に記載されていない外部情報は含まれていない。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現のずれはなく、PR の記述と一致している。