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

social-carousel

正方形カード3枚カルーセル、連結見出し、ブランドマーク+番号付け

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 を持ち、本文はエージェント向けのレイアウト指示として機能します。リポジトリ側には個々のテンプレート用のコードは一切書かれておらず、新規テンプレートの追加はフォルダの追加のみで完結します。

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

実行時、ホスト側が本テンプレート本文を共通デザイン指示とユーザー入力の間に挟み込んで1つのプロンプトを構築します。テンプレートの「インテリジェンス」はすべてこの自然言語内にあり、実行可能コードは含まれません。

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 は「事前レンダリング例」であり、プレビューAPIからそのまま返され、セレクターやギャラリーの 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 の各フィールドはセレクターのメタデータへと順次マッピングされ(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-carousel/SKILL.md はレイアウト、配色、フォント、コンテンツの原則のみを記述しており、エージェントにツールの実行、API取得、外部データの読み取りを促す記述は一切ありません。

next/src/lib/templates/skills/social-carousel/SKILL.md
【模板: 三联社交轮播 / Social Carousel】
skill ディレクトリ内のファイルは計 2〜3 個(SKILL.md + example.html [+ example.md])であり、scripts、references、データファイルは存在しません。example.html は本テンプレートの手動作成サンプル成果物にすぎません(internal_assets を参照)。

テンプレートはタスクを 1080×1080 の正方形カード3枚に固定し、見出し(headline)を複数枚にまたがって連続させるよう要求します。

next/src/lib/templates/skills/social-carousel/SKILL.md
【意图】3 张 1080×1080 方形卡片, headline 跨张串联。

3枚のカードには明確な役割分担があります:1枚目は導入 + ブランドマーク + 番号、2枚目は展開 + 視覚的重点、3枚目は結び + CTA + ループアイコンです。

next/src/lib/templates/skills/social-carousel/SKILL.md
- Card 1: display headline (开头) + 品牌 mark + 1/3

連続性のルールはハードな制約です:3つの見出しをつなぎ合わせると1つの完全な文にならなければならず、これがコンテンツの分割方法を決定づけます。

next/src/lib/templates/skills/social-carousel/SKILL.md
- 三个 headline 拼起来是完整一句话

配色は「統一されたカラーパレットを用い、カード間で段階的にグラデーション・切り替えを行う」ことを求め、3枚並べた際の一体感を保証します。

next/src/lib/templates/skills/social-carousel/SKILL.md
- 颜色统一一套调色板, 卡片之间渐进切换

サンプル成果物は、3枚の article.card(c1/c2/c3)と 01/02/03 のナンバリングを用いてこの構造を実証しています。

next/src/lib/templates/skills/social-carousel/example.html
<span class="badge">SERIES · 01 → 03</span>

2コア機能

013枚×1080×1080 正方形カードセット(IG / LinkedIn / Threads 汎用)
02カード間をまたぐ連続テキスト(見出しを導入・展開・結びに分割)
03ブランドマークおよび 1/3、2/3、3/3 のナンバリング体系
04中段カードの視覚的アクセント + 末尾カードの CTA およびループアイコン
05カード間で段階的に推移する単一カラーパレット
06サンプル成果物:3枚の実装済み article.card(c1/c2/c3)+ 通し番号 01→03

3外部依存関係

KindDependency / Endpoint
networkGoogle Fonts(仅出现在产物示例 example.html)
cli本地 coding-agent CLI(宿主提供,模板自身不调用)

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

安全運用のための推奨統制措置
Agent 向け
アクセス可能ドメインとキー範囲を宣言
管理者向け
最小権限のキー、リクエストログを保持
判定根拠(ファイルパスと抜粋)
  • 网络端点: 外部ネットワークアクセスの宣言:fonts.googleapis.com(example.html の <link> 内、プレビュー時にブラウザがフォントを取得)
監査ノート: 評価対象=本 skill ディレクトリ(SKILL.md + example.html [+ example.md]):組み込みスクリプトなし、認証情報の読み込みなし、ディスク書き込み指示なし、実行時の外部エンドポイント要求なし。本文はレイアウト、配色、フォントファミリー名、コンテンツ原則のみを指定しており、フォントファミリー名自体はリクエストを構成しません。ディレクトリ内に実際に現れる外部リンクはすべて「成果物サンプル」としての性質にとどまり、fonts.googleapis.com(example.html 9行目の <link>、Instrument Serif + IBM Plex Mono)のみで、Tailwind CDN や JS は含まれません。第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 2 个文件,无 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 的一致性 — 正文的三张卡 + 编号 + 调色板渐进都能在示例找到对应:三处 <article class="card cN">、.index 01/02/03、badge「SERIES · 01 → 03」;编号写法由「1/3」变为「01 · …」,属同义实现。
  • [ok] 端点扫描(目录内) — social-carousel 目录仅 1 个外部端点:fonts.googleapis.com(example.html 第 9 行);<script> 零命中,动画/布局纯 CSS。
  • [ok] 「1080×1080」是否真的落到画布 — 示例在 .card 上用 aspect-ratio: 1 / 1 固定成正方形(配合 max-width),并非只写在标题里。

6結論

  • 「3連」の構造(導入/展開/結び + 番号 + ブランドマーク)を固定化し、初回の生成から統一感のあるセットを出力可能
  • 見出し連結ルールによるコンテンツ分割の強力な制約により、モデルに物語展開を明確に整理させてからレイアウトを構成させる
  • 段階的なパレット指定により、3枚同時に並べても視覚的な衝突が発生しない
  • サンプル成果物は aspect-ratio: 1 / 1 で正方形を厳密に固定しており、そのままスクリーンショットを撮って画像カードとして活用可能
  • 最適な用途: ひとつの長い主張を3枚の正方形画像カードに分割したいSNS運用(IG / LinkedIn / Threads)や、一目でシリーズとわかるブランド展開に最適です。
    不向きな用途: 1枚あたりの情報密度が高い画像(3連構成が必須)、厳密なレイアウト数値を要求するブランドデザイン(本文は要素指定のみでグリッド指定なし)、動画・アニメーション用途(出力は静的HTMLカード)には適していません。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload social-carousel.tar.gz
    sha256: 285eb81de0f98ec8…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 553ed98c28.