首页 / 全部技能 / 内容创作 / tapestry-sources
内容创作 · michalparkola/tapestry-skills

tapestry-sources

Unified content extraction and action planning. Use when user says "learn-this <URL>", "learn this <URL>", "weave <URL>", "help me plan <URL>", "extract and plan <URL>", "make this actionable <URL>", or similar phrases indicating they want to extract content and create an action plan. Automatically detects content type (YouTube video, article, PDF) and processes accordingly.

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』在本 pin commit 无同名目录(仓库只有 7 个 skill:learn-this / article-extractor / youtube-transcript / ship-learn-next / scrum-sage / session-log / unblock-action),本报告按『下载文章、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 的两条记录(名为 tapestry-sources 的目录 unlocatable;映射到 learn-this 为 discrepancy 级说明)。learn-this 的 description 逐字覆盖三源:'Automatically detects content type (YouTube video, article, PDF) and processes accordingly.'

内容获取靠 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 内嵌完整 'Complete Tapestry Workflow Script'(#!/bin/bash, Usage: tapestry <URL>)供 agent 照抄执行。

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,缺工具时按 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 首行、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 行动计划,交付『内容文件 + 计划文件』两份产物。

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核心能力

01按 URL 自动识别内容类型(YouTube / 文章 / PDF)并分派对应抓取路径
02下载 YouTube 字幕并清洗去重为可读纯文本(转写文件按视频标题命名)
03无字幕视频的兜底转写:先报音频体积并等用户确认,再下载音频交 Whisper 转写
04从任意文章页提取正文(三级工具降级,含无依赖的内联 HTML 解析兜底)
05下载 PDF 并用 pdftotext 抽取文本(可选保留原文件)
06文件名工程:从标题生成跨平台安全、长度受限的 .txt 文件名
07依赖缺失时自动安装(brew / apt / pip / npm 四条路径)
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结论

  • 一个入口覆盖三类源材料:YouTube 字幕、网页文章、PDF 都有专门路径与降级方案,且只需一句『learn-this <URL>』触发。
  • 降级链设计务实:每类内容都预设『首选工具缺失/不可用』的第二、第三方案(含零依赖的内联 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.