デザイン&モーション · nexu-io/html-anything

social-spotify-card

Spotify Now Playing 風カード: アルバムアート + プログレスバー + 再生コントロール、動画オーバーレイ / 個人ホームページに対応

L3 ネットワーク · ドメインとキー範囲を宣言V1 コミット固定ネットワーク通信Dual-pass Audit
Author nexu-ioGitHub nexu-io/html-anything ↗Stars 8827License Apache-2.0(仓库根 LICENSE = Apache License 2.0;GitHub API spdx_id=Apache-2.0)Commit 553ed98c28
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

本テンプレートは「フォルダー=テンプレート」構造における純粋なデータです。SKILL.md はセレクター用の YAML frontmatter と agent へのレイアウト指示である本文で構成されます。リポジトリは個別テンプレート用のコードを保持せず、テンプレートの追加はフォルダーの追加のみで完結します。

next/src/lib/templates/loader.ts
SKILL.md — frontmatter (id, scenario, tags, …) + prompt body
loader.ts のヘッダーコメントにディレクトリの命名規則が明記されています。frontmatter はプロセス内の正規表現で解析され(YAML 依存関係なし)、本文はそのまま prompt body として抽出され、フロントエンドには渡されません(「Body is excluded so we can return the entire registry in one cheap fetch without shipping prompt text to the browser.」)。

実行時、ホストが本テンプレートの本文を共有デザイン指示とユーザーコンテンツの間に挟み込んで 1 つの prompt を組み立てます。テンプレートの「インテリジェンス」はこの自然言語の中にのみ存在し、実行可能コードは含まれません。

next/src/lib/templates/shared.ts
return `${SHARED_DESIGN_DIRECTIVES} ${opts.body.trim()}
assemblePrompt の戻り値は「共有デザイン指示 + テンプレート本文 + 【入力フォーマット】+【ユーザーコンテンツ】」です。共有セクション(同一ファイルの SHARED_DESIGN_DIRECTIVES)は、単一ファイル HTML、Tailwind/フォント CDN、コンテンツ駆動の生成数、ファイルシステムツールの使用禁止などの必須要件を担っており、全テンプレート共通で適用され、本テンプレート固有のものではありません。

ホストの /api/convert が本テンプレートをロードした後、テキストをローカルで認証済みの coding-agent CLI に渡し、stdout を HTML としてストリーミング回収します。テンプレート自体はネットワーク通信、認証情報の読み取り、ファイル書き込みを行いません。

next/src/app/api/convert/route.ts
prompt = assemblePrompt({ body: skill.body, content, format });
同一ルートが続いて invokeAgent({ … }) を呼び出し、CLI(ホストの PATH から検出された claude / codex / cursor-agent など)を起動します。これに付随する共有指示には「**Write / Edit / MultiEdit / Bash / Create / いかなるファイルシステムツールの使用も禁止**」と明記されています。

テンプレートに付属する example.html は「事前レンダリングされたサンプル」であり、プレビューエンドポイントからそのまま返送され、セレクターやギャラリーの iframe に表示されます。テンプレートカードの視覚プレビューの有無を決定するものであり、コンテンツ生成には関与しません。

next/src/app/api/templates/[id]/preview/route.ts
Returns the skill's `example.html` verbatim so it can be loaded into an
プレビューは skill id ごとにキャッシュされます(Cache-Control: public, max-age=300)。フロントエンドはプレビューパネルの iframe に sandbox="allow-scripts allow-same-origin" を付与しています(ホスト側の実装であり、本テンプレートからは制御不能)。

frontmatter のフィールドはセレクターのメタデータに 1 対 1 でマッピングされ(featured は全体ソート順、recommended は上部「★ おすすめ」グループへの配置、example_* はサンプルカードのテキスト生成)、カテゴリやシナリオのフィルタリング時の表示位置を決定します。

next/src/lib/templates/loader.ts
if (typeof fm.featured === "number") meta.featured = fm.featured;
fmToMeta は category/scenario/aspectHint/tags を SkillMeta に直接移行します。example ブロックは example_id または example.{md,html} が存在する場合に生成されます(id/name/format/tagline/desc + 任意の source)。これらのフィールドは表示やソートにのみ影響し、生成動作には影響しません。

本テンプレートの生成能力はすべて自身の本文によって実現されます。social-spotify-card/SKILL.md はレイアウト、配色、フォント、コンテンツ規律のみを規定しており、agent にツールの実行、エンドポイントの呼び出し、外部データの読み取りを指示する記述は一切ありません。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
【模板: Spotify Now-Playing 卡】
skill ディレクトリは計 2〜3 ファイル(SKILL.md + example.html [+ example.md])で構成され、scripts/references/データファイルは存在しません。example.html は本テンプレートの手動サンプル成果物にすぎません(internal_assets を参照)。

楽曲、ポッドキャストの一部、または自己紹介文を Spotify 再生中カードとしてレンダリングすることを意図しており、hyperframes の spotify-card からインスピレーションを得た旨が記載されています。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
【意图】把一首歌、一段播客、或一段个人介绍渲染成 Spotify 正在播放卡, 适合 video overlay / 个人 about page / 创作者 hero。Inspired by hyperframes spotify-card。

本文では 2 種類のキャンバスを提供しています。1280×720 の横型動画オーバーレイ枠と、600×200 のコンパクトな横長ウィジェットです。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
- 紧凑横条 widget: 600×200, 可嵌入到任何 hero。

カード構成は、ヘッダーラベル + 曲名 + アーティスト + プログレスバー + タイムスタンプ + コントロール行から成り、プログレスバーの両端にはタイムスタンプの記載が求められます。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
- 进度条: 4px 高, 圆角, 灰色背景 + 白色 fill (`width: 38%`); 两端时间戳 `1:24 / 3:42` (mono, 11px, 灰)。

音楽以外の入力にも対応可能です。「タイトル」を曲名、「サブタイトル/著者」をアーティストとして扱い、再生時間はデフォルトで 3:42 とします。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
- 若用户输入是文本/标题 → 把 "标题" 当歌名, "副标/作者" 当艺人, 估算"时长" 3:42 默认。

アニメーションは控えめで停止可能であることが求められます。音波には @keyframes を使用し、prefers-reduced-motion で無効化できるようにします。

next/src/lib/templates/skills/social-spotify-card/SKILL.md
- 微动效: 音波动效用 `@keyframes`, 可被 `prefers-reduced-motion` 关闭。

サンプル成果物は 3 つのバー + animation: wave で音波を再現し、タイムスタンプは本文と一致する 1:24 / 3:42 を使用しています。

next/src/lib/templates/skills/social-spotify-card/example.html
.wave i { display:inline-block; width:3px; margin-right:2px; background:#1DB954; transform-origin:bottom; animation: wave 1s ease-in-out infinite; }

2コア機能

01デュアルキャンバス対応(1280×720 動画オーバーレイ / 600×200 コンパクト横長バナー)
02Now Playing カード構成(ヘッダーラベル + 曲名 + アーティスト + プログレスバー + タイムスタンプ)
03再生コントロール行(⏮ ⏯ ⏭ インライン SVG + シャッフル/リピート)
04CSS グラデーション + モノグラム/幾何学図形によるアルバムアート描画(外部リンク画像禁止)
05任意のテキストから楽曲セマンティクスへのマッピング(タイトル→曲名、サブタイトル→アーティスト、デフォルト再生時間 3:42)
06無効化可能な音波マイクロアニメーション(@keyframes + prefers-reduced-motion)
07サンプル成果物: Lo-Fi カード + 1:24/3:42 進行状況 + 緑色の音波

3外部依存関係

KindDependency / Endpoint
networkTailwind CDN(仅出现在产物示例 example.html,运行时不要求)
networkGoogle Fonts(仅出现在产物示例 example.html)
network灵感出处标注(frontmatter example_source_url,非运行时调用)
cli本地 coding-agent CLI(宿主提供,模板自身不调用)

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

安全運用のための推奨統制措置
Agent 向け
アクセス可能ドメインとキー範囲を宣言
管理者向け
最小権限のキー、リクエストログを保持
判定根拠(ファイルパスと抜粋)
  • 网络端点: 外部ネットワークアクセスの宣言: cdn.tailwindcss.com(example.html の <script src>、セレクターのプレビューやサンプルのローカル表示時にブラウザからリクエスト)
監査ノート: 。判定対象=本 skill ディレクトリ(SKILL.md + example.html [+ example.md]): 付属スクリプトなし、認証情報の読み取りなし、ディスク書き込み命令なし、実行時の外部エンドポイント要求なし。本文はレイアウト、配色、フォントファミリ名、コンテンツ規律のみを規定しており、フォントファミリ名はリクエストを構成しません。ディレクトリ内に実際に現れる外部リンクはすべて「成果物サンプル」としての性質であり、検証のため個別に列挙します: cdn.tailwindcss.com(example.html 6 行目 <script src>)、fonts.googleapis.com(example.html 8 行目 <link>、Inter + Noto Sans SC)、hyperframes.heygen.com(frontmatter の出典表記)。バッチ 4 の基準(エンドポイントが成果物サンプル/出典表記にのみ現れる場合は green)に基づき、判定区分には影響しません。ホスト側の動作(loader.ts のディスク読み込み、assemblePrompt のプロンプト結合、agents/invoke.ts によるローカル CLI 起動、プレビュー iframe の sandbox="allow-scripts allow-same-origin")は verdict.risks に記載し、区分判定の根拠とはしません。

5二重目の独立検証

  • [ok] skill 目录的脚本 / 网络 / 凭证 / 写盘面 — 目录仅 SKILL.md / example.html / example.md 3 个文件,无 scripts/references/数据目录;token 扫描(curl / wget / fetch / exec / spawn / process.env / API_KEY / token / secret / write / save / delete)在该目录的 SKILL.md 中零命中;无自带可执行脚本。
  • [ok] 运行时链路复核 — 重读 loader.ts / shared.ts / app/api/convert/route.ts / app/api/templates/[id]/preview/route.ts:模板正文只作为 prompt body 被 assemblePrompt 拼装,宿主 spawn 本地 CLI 并捕获 stdout;模板不参与任何执行。
  • [ok] commit 与元数据 — 工作副本 git HEAD = 553ed98c283f9c0f489902d035416a972d6a9699(=任务表 pin 的 full 40 位);GitHub API nexu-io/html-anything:stars 8827、license spdx Apache-2.0、pushed_at 2026-09-15T03:36:24Z(与本地 HEAD 提交时间 2026-09-15 11:36:24 +0800 一致)。
  • [discrepancy] README 与源码的 frontmatter schema 漂移(仓库级) — README 第 213 / 217 / 468 行称模板 frontmatter 必须含 mode · scenario · surface · preview · design_system;但在 next/src/lib/templates/skills/ 下 '^mode:'、'^surface:'、'^design_system:' 全部零命中,实际字段是 category / scenario / aspect_hint / featured / recommended + example_*(loader.ts 的 SkillFrontmatter)。文档滞后于代码,不影响本模板运行,但照 README 新写模板会踩空。
  • [ok] frontmatter 元数据映射 — loader.ts fmToMeta 逐字段映射 zhName / enName / emoji / description / category / scenario / aspectHint / tags + featured / recommended + example 卡;本模板取自 SKILL.md 的实际取值与之相符。
  • [ok] example.html 与 SKILL.md 的一致性 — 固定色 #1DB954、时间戳 1:24 / 3:42、音波动效(animation: wave)均在示例实现;专辑封面为 CSS 绘制,无外链图片,符合正文「不能外链图片」。
  • [ok] 端点扫描(目录内) — 3 处:cdn.tailwindcss.com、fonts.googleapis.com(均在 example.html)+ frontmatter 的 hyperframes.heygen.com 出处标注;SKILL.md 正文无 URL。
  • [discrepancy] 「prefers-reduced-motion 可关闭」核对 — 正文要求 "- 微动效: 音波动效用 `@keyframes`, 可被 `prefers-reduced-motion` 关闭",但 example.html 中只有 animation: wave 的定义,未找到 @media (prefers-reduced-motion: reduce) 规则——无障碍承诺在示例里没兑现(规格要求,示例未实现)。

6結論

  • デュアルキャンバス(動画オーバーレイ枠 + 600×200 バナー)により、同一のビジュアルスタイルを動画編集とホームページ埋め込みの双方で活用可能
  • セマンティックマッピングによる入力ハードルの低減: 任意のテキストを Now Playing としてレンダリング可能
  • カラーコード単位で固定されたブランドビジュアル(#121212 / #1DB954 / #b3b3b3)
  • モーションアクセシビリティ設定を明示的に考慮した唯一のテンプレート(@keyframes + prefers-reduced-motion)
  • 外部リンク画像を禁止し、CSS グラデーション/モノグラムを用いた自己完結型の出力
  • 最適な用途: 動画オーバーレイ(ポッドキャスト、プレイリスト、ライブ配信のテロップ)、個人ホームページやクリエイターのヒーローセクションにおける「再生中」装飾枠に最適です。また、自己紹介文を Now Playing 風に仕立てるユニークな演出にも適しています。
    不向きな用途: リアルタイムな再生ステータスが必要な用途(Spotify API に接続せず、再生データを読み取らないためプログレスバーは固定値)、厳密な公式ブランド素材(商標の忠実な再現)、情報量の多いプロフィール紹介(カードには曲名/アーティスト/1 行の進捗バーのみ配置可能)には適していません。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload social-spotify-card.tar.gz
    sha256: 80174180f4c38b73…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 553ed98c28.