コンテンツ制作 · michalparkola/tapestry-skills

tapestry-sources

統合されたコンテンツ抽出およびアクション計画。ユーザーが「learn-this <URL>」、「learn this <URL>」、「weave <URL>」、「help me plan <URL>」、「extract and plan <URL>」、「make this actionable <URL>」、またはコンテンツを抽出してアクションプランを作成したい旨を示す類似のフレーズを発言した際に使用します。コンテンツタイプ(YouTube動画、記事、PDF)を自動検出し、適切に処理します。

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

1仕組みと動作原理

サイト上の項目「Tapestry Sources」は、本ピン留めコミットにおいて同名のディレクトリが存在しません(リポジトリには learn-this / article-extractor / youtube-transcript / ship-learn-next / scrum-sage / session-log / unblock-action の 7 つの skill のみ存在)。本レポートでは、「記事、PDF、YouTube 字幕のソース素材をダウンロードする」という記述に基づき、コンテンツ取得の統合オーケストレーターである learn-this にマッピングし、実際に呼び出される article-extractor および youtube-transcript をダウンロード実装の証拠として扱います。

README.md
| [Learn This](#0-learn-this-) | One command to extract content from any URL and turn it into an action plan. |
マッピングの根拠は verification.second_pass の 2 件の記録を参照(tapestry-sources という名前のディレクトリは unlocatable、learn-this へのマッピングは不一致レベルの説明として記載)。learn-this の description は「Automatically detects content type (YouTube video, article, PDF) and processes accordingly」と 3 つのソースを完全に網羅しています。

コンテンツの取得は URL タイプによって振り分けられます。YouTube は yt-dlp、記事は readability/trafilatura、PDF は curl+pdftotext を使用し、検出と振り分けはすべて直接実行可能なインライン bash として記述されています。

learn-this/SKILL.md
elif [[ "$URL" =~ \.pdf$ ]] || curl -sI "$URL" | grep -iq "Content-Type: application/pdf"; then CONTENT_TYPE="pdf"
YouTube の判定には「if [[ "$URL" =~ youtube\.com/watch || "$URL" =~ youtu\.be/ || "$URL" =~ youtube\.com/shorts ]]」を用い、その他はデフォルトで article と判定します。PDF の場合はさらに HEAD リクエストを送信して Content-Type を確認します。SKILL.md には agent がそのままコピーして実行できる完全な「Complete Tapestry Workflow Script」(#!/bin/bash, Usage: tapestry <URL>)が組み込まれています。

YouTube ブランチは、yt-dlp による自動字幕の取得と、インライン Python による重複排除・プレーンテキスト化のクレンジングという定型パターンを採用しており、動画タイトルを出力ファイル名として使用します。

learn-this/SKILL.md
yt-dlp --write-auto-sub --skip-download --sub-langs en --output "temp_transcript" "$URL"
直後のインラインスクリプトでは「seen = set()」を用いて WEBVTT/Kind/Language/'-->' 行を行単位で除外し、HTML エンティティをデコードして "${VIDEO_TITLE}.txt" を出力した上で、最後に「rm -f temp_transcript.en.vtt」を実行します。youtube-transcript/SKILL.md は同一プロセスの詳細版です(手動字幕の優先、Whisper によるフォールバック、音声ファイルの削除などを含む)。

記事ブランチは、reader(Mozilla Readability)→ trafilatura → curl + インライン HTMLParser という 3 段階のフォールバックチェーンとなっており、ツールが不足している場合は npm/pip でその場でインストールします。

article-extractor/SKILL.md
### Option 1: reader (Recommended - Mozilla's Readability) ```bash command -v reader ```
インストールコマンドは同一ファイル内に記載されています('npm install -g @mozilla/readability-cli' および 'pip3 install trafilatura')。フォールバックは「curl -s "URL" | python3 -c "…class ArticleExtractor(HTMLParser)…"」であり、script/style/nav/header/footer/aside/form をスキップします。タイトルはそれぞれ Markdown の 1 行目、trafilatura --json の title、または <title> の正規表現から取得します。

PDF ブランチは最もシンプルで、curl -L でダウンロードした後に pdftotext でテキストを抽出します。poppler が不足していても処理をブロックせず、PDF を保持したままインストールコマンドを提示します。

learn-this/SKILL.md
echo "⚠️ pdftotext not found. PDF downloaded but not extracted." echo " Install with: brew install poppler"
抽出に成功した際、元の PDF を保持するか確認し('echo "Keep original PDF? (y/n)"')、不要であれば rm で削除します。生成物は ${PDF_FILENAME%.pdf}.txt です。

すべてのブランチは「タイトルを安全なファイル名に変換してカレントワーキングディレクトリに出力する」処理で終了します。/ : ? " < > | を除去し、80〜100 文字に切り詰めた上で .txt を付加します。

learn-this/SKILL.md
FILENAME=$(echo "$ARTICLE_TITLE" | tr '/' '-' | tr ':' '-' | tr '?' '' | tr '"' '' | cut -c 1-80 | sed 's/ *$//')
YouTube ブランチでも VIDEO_TITLE に対して同様のクレンジングを行います。article-extractor/SKILL.md には、より完全な tr チェーンと「< 100 chars」の推奨事項が記載されています。

コンテンツ取得は前半フェーズにすぎません。txt を取得した後、learn-this は必須処理として('Always create an action plan')ship-learn-next を呼び出して 5-rep アクションプランを生成し、「コンテンツファイル + 計画ファイル」の 2 つの成果物を提供します。

learn-this/SKILL.md
**IMPORTANT**: Always create an action plan after extracting content.
skills テーブルにおける learn-this の位置づけである「The unified workflow that orchestrates everything」(README)に対応しています。本項目の「ソース素材のダウンロード」機能は SKILL.md の Step 1-2 に該当します。

2コア機能

01URL に基づいてコンテンツタイプ(YouTube / 記事 / PDF)を自動判別し、対応するスクレイピングルートへディスパッチ
02YouTube の字幕をダウンロードし、読みやすいプレーンテキストへとクレンジング・重複排除(文字起こしファイル名は動画タイトルから生成)
03字幕のない動画に対するフォールバック文字起こし:音声ファイルの容量を事前通知してユーザーの確認を待ってから、音声をダウンロードして Whisper で文字起こしを実行
04任意の記事ページから本文を抽出(依存関係なしのインライン HTML 解析フォールバックを含む 3 段階のツールフォールバック)
05PDF をダウンロードし、pdftotext を用いてテキストを抽出(元のファイルを保持するか選択可能)
06ファイル名エンジニアリング:タイトルからクロスプラットフォームで安全かつ長さ制限を考慮した .txt ファイル名を生成
07依存関係の不足時に自動インストールを実行(brew / apt / pip / npm の 4 つのパス)
08取得結果を下流へ引き渡し(ship-learn-next による 5-rep アクションプランの生成)、「情報ソース取得 → 計画策定」の一元化されたエントリポイントを形成

3外部依存関係

KindDependency / Endpoint
cliyt-dlp(字幕/元数据/音频下载)
clireader(@mozilla/readability-cli 或 reader-cli,文章提取首选)
clitrafilatura(Python 文章提取备选)
clicurl(PDF 下载与文章兜底抓取)
clipdftotext(poppler,PDF 取文)
cliwhisper(openai-whisper,仅在完全无字幕时使用)
clipython3(VTT 去重清洗与 HTML 兜底解析的内联脚本)
networkYouTube(经 yt-dlp 取字幕/元数据/音频)
network目标网页(用户给的任意 URL:HEAD 探测、curl 抓 HTML、reader/trafilatura 拉正文)
network包管理器源(Homebrew / apt / PyPI / npm registry)——依赖自动安装路径上的网络出口

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

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: yt-dlp --list-subs / --write-sub / --write-auto-sub --skip-download --sub-l
  • scripts/ 或 SKILL.md: 外部言語パッケージの依存関係の動的インストールを宣言
  • 网络端点: 外部ネットワークアクセスの宣言: YouTube(yt-dlp:字幕、メタデータ、必要に応じた音声データ。youtube.com / youtu.be / /shorts/)
  • 本地工作目录: ファイルの読み書きと成果物の出力: カレントワーキングディレクトリ:<タイトル>.txt(クレンジング済みの本文/字幕、最終成果物)
監査ノート: 統一基準に基づく判定:本 skill(コンテンツ取得パス)は認証情報やアカウント情報の読み取りを一切行わず、外部通信先も YouTube の公開字幕、ユーザー自身が指定した URL、公式パッケージマネージャーのリポジトリなど予測可能な範囲に限定されており、「通常のネットワーク呼び出し + ローカル読み書き」に該当します。ただし、ダウンロード系 CLI(yt-dlp/curl/reader/trafilatura)を実行してリモートコンテンツをディスクに保存し、依存関係が不足している場合は brew/apt/pip/npm を使ってその場でインストール(sudo を含む)を行うため、純粋なローカル実行(青)よりは上位となります。一方で、オレンジ区分のトリガー条件(認証情報/Cookie の読み取り、サードパーティ製プラグインミラーへの依存)には該当しません(Whisper はオプションのローカルモデルであり、ミラーやプロキシは不要)。主な注意点は、任意の URL スクレイピング、自動インストール、およびスクレイピング結果が下流モデルの入力として渡される点にあります。

5二重目の独立検証

  • [unlocatable] 任务表 name_slug=tapestry-sources 对应的 skill 目录 — git ls-tree -r HEAD 列名:LICENSE、README.md、article-extractor/SKILL.md、install.sh、learn-this/SKILL.md、scrum-sage/SKILL.md、session-log/SKILL.md、ship-learn-next/SKILL.md、unblock-action/SKILL.md、youtube-transcript/SKILL.md——无 tapestry-sources 或任何 sources 命名的目录/SKILL.md;pool.json 侧该条目 path="{空}"、来源为 awesome-skills.com 的 repo 级摘要。按任务书规则记为 unlocatable,不硬造目录。
  • [discrepancy] 映射决定:以 learn-this 作为本条目主体 — 站点摘要『Download sources from articles, PDFs, and YouTube video transcripts』与 learn-this frontmatter description 的三源检测('Automatically detects content type (YouTube video, article, PDF)')逐项对应,仓库内没有第二个覆盖三源的入口(article-extractor 只做文章、youtube-transcript 只做视频)。故 skill.path 记为 learn-this,报告显式说明这是映射而非同名命中;如需严格一一对应,本条目应在站点侧标注为 repo 级条目。
  • [ok] 文章三级降级链真实存在 — article-extractor/SKILL.md '## Extraction Methods' 依次 Method 1 reader、Method 2 trafilatura、Method 3 兜底 curl + 内联 HTMLParser;'## Complete Workflow' 用 if command -v reader / elif command -v trafilatura / else 分支实现,与 learn-this Step 2 的 case 一致。
  • [ok] YouTube 三段策略与确认门 — youtube-transcript/SKILL.md 明列 Option 1 --write-sub、Option 2 --write-auto-sub、Option 3 Whisper('**ONLY use this if both manual and auto-generated subtitles are unavailable.**'),且 Whisper 前有体积展示+等待确认、安装前再次等待确认、转写后询问是否删除音频——确认门原文均在。
  • [ok] PDF 分支的 pdftotext 与降级 — learn-this Step 2 PDF 段:curl -L 下载 → if command -v pdftotext → pdftotext 取文并可选删 PDF;否则打印 'pdftotext not found' 与 brew/apt 安装提示并保留 PDF 作为产物。
  • [ok] 无凭证读取(重要:决定档位) — 对 learn-this/article-extractor/youtube-transcript/install.sh/README 扫描 .env|API_KEY|token|secret|cookie|login 无命中;yt-dlp 未使用 --cookies-from-browser,Whisper 为本地模型,无任何账号依赖。故 credential_reads 为空、档位落黄而非橙。
  • [ok] 文件名清洗与写盘范围 — 清洗链在 learn-this(article 行)与 article-extractor(tr '/' '-' / tr ':' '-' / cut -c 1-80|100)均存在;产物写当前目录,中间文件 rm;install.sh 只写 $HOME/.claude/skills(SOURCE 目录为脚本自身所在目录)。
  • [ok] 安装命令是否需要提权 — youtube-transcript/SKILL.md 的 Linux 路径为 'sudo apt update && sudo apt install -y yt-dlp'(需要 sudo);macOS/pip/npm 路径无需提权。已如实写入 scripts_executed 与 external_deps。

6結論

  • 1 つのエントリポイントで 3 種類のソース素材をカバー:YouTube 字幕、Web 記事、PDF のそれぞれに専用ルートとフォールバック策が用意されており、「learn-this <URL>」と指示するだけでトリガー可能。
  • 実用的なフォールバックチェーン設計:各コンテンツ種別において「優先ツールが不足/使用不能」な場合の第 2・第 3 の代替策(依存関係なしのインライン HTMLParser を含む)が事前定義されており、最小限の環境でも結果を出力可能。
  • 大きなアクションに対する確認ゲート:Whisper のインストールや音声ダウンロードの前に容量を提示してユーザーの同意を待ち、文字起こし後に音声を削除するか確認。PDF においても元ファイルを保持するか確認を実施。
  • クリーンな成果物:タイトルに基づいた単一の .txt ファイルがカレントディレクトリに出力され、中間ファイルは使用後速やかに削除されるため、プロジェクト構造を汚染しない。
  • プレーンテキストによる高い可搬性:すべての機能が SKILL.md 内に記述されており、スクリプトディレクトリやランタイムに依存することなく、ホスト環境間でディレクトリごと移植可能。
  • 最適な用途: 適しているケース:閲覧中の記事、論文 PDF、技術動画をワンクリックで可読テキストに変換し(ついでにアクションプランも生成したい)ナレッジワーカー、ローカル環境に yt-dlp/trafilatura/poppler などのツールを導入することに抵抗がない開発者、複数のホスト環境(Claude Code など)で同一の情報取得ワークフローを移行して使用したいユーザー(ランタイム依存のないプレーンテキスト skill)。
    不向きな用途: 適していないケース:認証やログインセッションが必要なコンテンツ(ペイウォール、プライベートリポジトリ、Cookie 必須サイトなど。本 skill にはログイン機能がなく、article-extractor にも「Paywall or login required → Cannot extract」と明記されている)、agent によるローカルマシンへのソフトウェアインストールや sudo 実行が禁止されている環境、コンテンツの出典やコンプライアンスに関して厳格な要件があるチーム(出典表記や著作権処理の機能なし)、高精度な字幕が求められる場合(Whisper base モデルの精度や yt-dlp の自動字幕品質には限界がある)、または大量・大規模なスクレイピングが必要なシナリオ。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload tapestry-sources.tar.gz
    sha256: 1da7c419a2dedca5…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 80e1dc56df.