tapestry

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Tapestry: Unified Content Extraction + Action Planning

Tapestry:统一内容提取+行动计划生成

This is the master skill that orchestrates the entire Tapestry workflow:
  1. Detect content type from URL
  2. Extract content using appropriate skill
  3. Automatically create a Ship-Learn-Next action plan
这是统筹整个Tapestry工作流的核心技能
  1. 从URL检测内容类型
  2. 使用合适的技能提取内容
  3. 自动生成Ship-Learn-Next行动计划

When to Use This Skill

何时使用此技能

Activate when the user:
  • Says "tapestry [URL]"
  • Says "weave [URL]"
  • Says "help me plan [URL]"
  • Says "extract and plan [URL]"
  • Says "make this actionable [URL]"
  • Says "turn [URL] into a plan"
  • Provides a URL and asks to "learn and implement from this"
  • Wants the full Tapestry workflow (extract → plan)
Keywords to watch for: tapestry, weave, plan, actionable, extract and plan, make a plan, turn into action
当用户有以下行为时激活:
  • 说出“tapestry [URL]”
  • 说出“weave [URL]”
  • 说出“help me plan [URL]”
  • 说出“extract and plan [URL]”
  • 说出“make this actionable [URL]”
  • 说出“turn [URL] into a plan”
  • 提供URL并要求“从中学习并落地”
  • 需要完整的Tapestry工作流(提取→计划)
需关注的关键词:tapestry、weave、plan、actionable、extract and plan、make a plan、turn into action

How It Works

工作原理

Complete Workflow:

完整工作流:

  1. Detect URL type (YouTube, article, PDF)
  2. Extract content using appropriate skill:
    • YouTube → youtube-transcript skill
    • Article → article-extractor skill
    • PDF → download and extract text
  3. Create action plan using ship-learn-next skill
  4. Save both content file and plan file
  5. Present summary to user
  1. 检测URL类型(YouTube、文章、PDF)
  2. 提取内容(使用对应技能):
    • YouTube → youtube-transcript skill
    • 文章 → article-extractor skill
    • PDF → 下载并提取文本
  3. 创建行动计划(使用ship-learn-next skill)
  4. 保存文件(内容文件和计划文件)
  5. 向用户展示摘要

URL Detection Logic

URL检测逻辑

YouTube Videos

YouTube视频

Patterns to detect:
  • youtube.com/watch?v=
  • youtu.be/
  • youtube.com/shorts/
  • m.youtube.com/watch?v=
Action: Use youtube-transcript skill
检测模式
  • youtube.com/watch?v=
  • youtu.be/
  • youtube.com/shorts/
  • m.youtube.com/watch?v=
操作:使用youtube-transcript skill

Web Articles/Blog Posts

网络文章/博客

Patterns to detect:
  • http://
    or
    https://
  • NOT YouTube, NOT PDF
  • Common domains: medium.com, substack.com, dev.to, etc.
  • Any HTML page
Action: Use article-extractor skill
检测模式
  • 包含
    http://
    https://
  • 不是YouTube,也不是PDF
  • 常见域名:medium.com、substack.com、dev.to等
  • 任意HTML页面
操作:使用article-extractor skill

PDF Documents

PDF文档

Patterns to detect:
  • URL ends with
    .pdf
  • URL returns
    Content-Type: application/pdf
Action: Download and extract text
检测模式
  • URL以
    .pdf
    结尾
  • URL返回
    Content-Type: application/pdf
操作:下载并提取文本

Other Content

其他内容

Fallback:
  • Try article-extractor (works for most HTML)
  • If fails, inform user of unsupported type
备选方案
  • 尝试使用article-extractor(适用于大多数HTML页面)
  • 如果失败,告知用户当前类型不支持

Step-by-Step Workflow

分步工作流

Step 1: Detect Content Type

步骤1:检测内容类型

bash
URL="$1"
bash
URL="$1"

Check for YouTube

Check for YouTube

if [[ "$URL" =~ youtube.com/watch || "$URL" =~ youtu.be/ || "$URL" =~ youtube.com/shorts ]]; then CONTENT_TYPE="youtube"
if [[ "$URL" =~ youtube.com/watch || "$URL" =~ youtu.be/ || "$URL" =~ youtube.com/shorts ]]; then CONTENT_TYPE="youtube"

Check for PDF

Check for PDF

elif [[ "$URL" =~ .pdf$ ]]; then CONTENT_TYPE="pdf"
elif [[ "$URL" =~ .pdf$ ]]; then CONTENT_TYPE="pdf"

Check if URL returns PDF

Check if URL returns PDF

elif curl -sI "$URL" | grep -i "Content-Type: application/pdf" > /dev/null; then CONTENT_TYPE="pdf"
elif curl -sI "$URL" | grep -i "Content-Type: application/pdf" > /dev/null; then CONTENT_TYPE="pdf"

Default to article

Default to article

else CONTENT_TYPE="article" fi
echo "📍 Detected: $CONTENT_TYPE"
undefined
else CONTENT_TYPE="article" fi
echo "📍 Detected: $CONTENT_TYPE"
undefined

Step 2: Extract Content (by Type)

步骤2:按类型提取内容

YouTube Video

YouTube视频

bash
undefined
bash
undefined

Use youtube-transcript skill workflow

Use youtube-transcript skill workflow

echo "📺 Extracting YouTube transcript..."
echo "📺 Extracting YouTube transcript..."

1. Check for yt-dlp

1. Check for yt-dlp

if ! command -v yt-dlp &> /dev/null; then echo "Installing yt-dlp..." brew install yt-dlp fi
if ! command -v yt-dlp &> /dev/null; then echo "Installing yt-dlp..." brew install yt-dlp fi

2. Get video title

2. Get video title

VIDEO_TITLE=$(yt-dlp --print "%(title)s" "$URL" | tr '/' '_' | tr ':' '-' | tr '?' '' | tr '"' '')
VIDEO_TITLE=$(yt-dlp --print "%(title)s" "$URL" | tr '/' '_' | tr ':' '-' | tr '?' '' | tr '"' '')

3. Download transcript

3. Download transcript

yt-dlp --write-auto-sub --skip-download --sub-langs en --output "temp_transcript" "$URL"
yt-dlp --write-auto-sub --skip-download --sub-langs en --output "temp_transcript" "$URL"

4. Convert to clean text (deduplicate)

4. Convert to clean text (deduplicate)

python3 -c " import sys, re seen = set() vtt_file = 'temp_transcript.en.vtt' try: with open(vtt_file, 'r') as f: for line in f: line = line.strip() if line and not line.startswith('WEBVTT') and not line.startswith('Kind:') and not line.startswith('Language:') and '-->' not in line: clean = re.sub('<[^>]*>', '', line) clean = clean.replace('&', '&').replace('>', '>').replace('<', '<') if clean and clean not in seen: print(clean) seen.add(clean) except FileNotFoundError: print('Error: Could not find transcript file', file=sys.stderr) sys.exit(1) " > "${VIDEO_TITLE}.txt"
python3 -c " import sys, re seen = set() vtt_file = 'temp_transcript.en.vtt' try: with open(vtt_file, 'r') as f: for line in f: line = line.strip() if line and not line.startswith('WEBVTT') and not line.startswith('Kind:') and not line.startswith('Language:') and '-->' not in line: clean = re.sub('<[^>]*>', '', line) clean = clean.replace('&', '&').replace('>', '>').replace('<', '<') if clean and clean not in seen: print(clean) seen.add(clean) except FileNotFoundError: print('Error: Could not find transcript file', file=sys.stderr) sys.exit(1) " > "${VIDEO_TITLE}.txt"

5. Cleanup

5. Cleanup

rm -f temp_transcript.en.vtt
CONTENT_FILE="${VIDEO_TITLE}.txt" echo "✓ Saved transcript: $CONTENT_FILE"
undefined
rm -f temp_transcript.en.vtt
CONTENT_FILE="${VIDEO_TITLE}.txt" echo "✓ Saved transcript: $CONTENT_FILE"
undefined

Article/Blog Post

文章/博客

bash
undefined
bash
undefined

Use article-extractor skill workflow

Use article-extractor skill workflow

echo "📄 Extracting article content..."
echo "📄 Extracting article content..."

1. Check for extraction tools

1. Check for extraction tools

if command -v reader &> /dev/null; then TOOL="reader" elif command -v trafilatura &> /dev/null; then TOOL="trafilatura" else TOOL="fallback" fi
echo "Using: $TOOL"
if command -v reader &> /dev/null; then TOOL="reader" elif command -v trafilatura &> /dev/null; then TOOL="trafilatura" else TOOL="fallback" fi
echo "Using: $TOOL"

2. Extract based on tool

2. Extract based on tool

case $TOOL in reader) reader "$URL" > temp_article.txt ARTICLE_TITLE=$(head -n 1 temp_article.txt | sed 's/^# //') ;;
trafilatura)
    METADATA=$(trafilatura --URL "$URL" --json)
    ARTICLE_TITLE=$(echo "$METADATA" | python3 -c "import json, sys; print(json.load(sys.stdin).get('title', 'Article'))")
    trafilatura --URL "$URL" --output-format txt --no-comments > temp_article.txt
    ;;

fallback)
    ARTICLE_TITLE=$(curl -s "$URL" | grep -oP '<title>\K[^<]+' | head -n 1)
    ARTICLE_TITLE=${ARTICLE_TITLE%% - *}
    curl -s "$URL" | python3 -c "
from html.parser import HTMLParser import sys
class ArticleExtractor(HTMLParser): def init(self): super().init() self.content = [] self.skip_tags = {'script', 'style', 'nav', 'header', 'footer', 'aside', 'form'} self.in_content = False
def handle_starttag(self, tag, attrs):
    if tag not in self.skip_tags and tag in {'p', 'article', 'main'}:
        self.in_content = True

def handle_data(self, data):
    if self.in_content and data.strip():
        self.content.append(data.strip())

def get_content(self):
    return '\n\n'.join(self.content)
parser = ArticleExtractor() parser.feed(sys.stdin.read()) print(parser.get_content()) " > temp_article.txt ;; esac
case $TOOL in reader) reader "$URL" > temp_article.txt ARTICLE_TITLE=$(head -n 1 temp_article.txt | sed 's/^# //') ;;
trafilatura)
    METADATA=$(trafilatura --URL "$URL" --json)
    ARTICLE_TITLE=$(echo "$METADATA" | python3 -c "import json, sys; print(json.load(sys.stdin).get('title', 'Article'))")
    trafilatura --URL "$URL" --output-format txt --no-comments > temp_article.txt
    ;;

fallback)
    ARTICLE_TITLE=$(curl -s "$URL" | grep -oP '<title>\K[^<]+' | head -n 1)
    ARTICLE_TITLE=${ARTICLE_TITLE%% - *}
    curl -s "$URL" | python3 -c "
from html.parser import HTMLParser import sys
class ArticleExtractor(HTMLParser): def init(self): super().init() self.content = [] self.skip_tags = {'script', 'style', 'nav', 'header', 'footer', 'aside', 'form'} self.in_content = False
def handle_starttag(self, tag, attrs):
    if tag not in self.skip_tags and tag in {'p', 'article', 'main'}:
        self.in_content = True

def handle_data(self, data):
    if self.in_content and data.strip():
        self.content.append(data.strip())

def get_content(self):
    return '\n\n'.join(self.content)
parser = ArticleExtractor() parser.feed(sys.stdin.read()) print(parser.get_content()) " > temp_article.txt ;; esac

3. Clean filename

3. Clean filename

FILENAME=$(echo "$ARTICLE_TITLE" | tr '/' '-' | tr ':' '-' | tr '?' '' | tr '"' '' | cut -c 1-80 | sed 's/ *$//') CONTENT_FILE="${FILENAME}.txt" mv temp_article.txt "$CONTENT_FILE"
echo "✓ Saved article: $CONTENT_FILE"
undefined
FILENAME=$(echo "$ARTICLE_TITLE" | tr '/' '-' | tr ':' '-' | tr '?' '' | tr '"' '' | cut -c 1-80 | sed 's/ *$//') CONTENT_FILE="${FILENAME}.txt" mv temp_article.txt "$CONTENT_FILE"
echo "✓ Saved article: $CONTENT_FILE"
undefined

PDF Document

PDF文档

bash
undefined
bash
undefined

Download and extract PDF

Download and extract PDF

echo "📑 Downloading PDF..."
echo "📑 Downloading PDF..."

1. Download PDF

1. Download PDF

PDF_FILENAME=$(basename "$URL") curl -L -o "$PDF_FILENAME" "$URL"
PDF_FILENAME=$(basename "$URL") curl -L -o "$PDF_FILENAME" "$URL"

2. Extract text using pdftotext (if available)

2. Extract text using pdftotext (if available)

if command -v pdftotext &> /dev/null; then pdftotext "$PDF_FILENAME" temp_pdf.txt CONTENT_FILE="${PDF_FILENAME%.pdf}.txt" mv temp_pdf.txt "$CONTENT_FILE" echo "✓ Extracted text from PDF: $CONTENT_FILE"
# Optionally keep PDF
echo "Keep original PDF? (y/n)"
read -r KEEP_PDF
if [[ ! "$KEEP_PDF" =~ ^[Yy]$ ]]; then
    rm "$PDF_FILENAME"
fi
else # No pdftotext available echo "⚠️ pdftotext not found. PDF downloaded but not extracted." echo " Install with: brew install poppler" CONTENT_FILE="$PDF_FILENAME" fi
undefined
if command -v pdftotext &> /dev/null; then pdftotext "$PDF_FILENAME" temp_pdf.txt CONTENT_FILE="${PDF_FILENAME%.pdf}.txt" mv temp_pdf.txt "$CONTENT_FILE" echo "✓ Extracted text from PDF: $CONTENT_FILE"
# Optionally keep PDF
echo "Keep original PDF? (y/n)"
read -r KEEP_PDF
if [[ ! "$KEEP_PDF" =~ ^[Yy]$ ]]; then
    rm "$PDF_FILENAME"
fi
else # No pdftotext available echo "⚠️ pdftotext not found. PDF downloaded but not extracted." echo " Install with: brew install poppler" CONTENT_FILE="$PDF_FILENAME" fi
undefined

Step 3: Create Ship-Learn-Next Action Plan

步骤3:创建Ship-Learn-Next行动计划

IMPORTANT: Always create an action plan after extracting content.
bash
undefined
重要提示:提取内容后务必创建行动计划。
bash
undefined

Read the extracted content

Read the extracted content

CONTENT_FILE="[from previous step]"
CONTENT_FILE="[from previous step]"

Invoke ship-learn-next skill logic:

Invoke ship-learn-next skill logic:

1. Read the content file

1. Read the content file

2. Extract core actionable lessons

2. Extract core actionable lessons

3. Create 5-rep progression plan

3. Create 5-rep progression plan

4. Save as: Ship-Learn-Next Plan - [Quest Title].md

4. Save as: Ship-Learn-Next Plan - [Quest Title].md

See ship-learn-next/SKILL.md for full details

See ship-learn-next/SKILL.md for full details


**Key points for plan creation:**
- Extract actionable lessons (not just summaries)
- Define a specific 4-8 week quest
- Create Rep 1 (shippable this week)
- Design Reps 2-5 (progressive iterations)
- Save plan to markdown file
- Use format: `Ship-Learn-Next Plan - [Brief Quest Title].md`

**计划创建要点**:
- 提取可落地的经验(而非仅摘要)
- 定义明确的4-8周任务(Quest)
- 创建Rep 1(本周可完成)
- 设计Reps 2-5(逐步迭代)
- 保存为Markdown文件
- 命名格式:`Ship-Learn-Next Plan - [任务简要标题].md`

Step 4: Present Results

步骤4:展示结果

Show user:
✅ Tapestry Workflow Complete!

📥 Content Extracted:
   ✓ [Content type]: [Title]
   ✓ Saved to: [filename.txt]
   ✓ [X] words extracted

📋 Action Plan Created:
   ✓ Quest: [Quest title]
   ✓ Saved to: Ship-Learn-Next Plan - [Title].md

🎯 Your Quest: [One-line summary]

📍 Rep 1 (This Week): [Rep 1 goal]

When will you ship Rep 1?
向用户展示:
✅ Tapestry工作流已完成!

📥 已提取内容:
   ✓ [内容类型]:[标题]
   ✓ 保存至:[filename.txt]
   ✓ 提取了[X]个词

📋 已创建行动计划:
   ✓ 任务:[任务标题]
   ✓ 保存至:Ship-Learn-Next Plan - [Title].md

🎯 你的任务:[一句话摘要]

📍 Rep 1(本周):[Rep 1目标]

你何时完成Rep 1?

Complete Tapestry Workflow Script

完整Tapestry工作流脚本

bash
#!/bin/bash
bash
#!/bin/bash

Tapestry: Extract content + create action plan

Tapestry: Extract content + create action plan

Usage: tapestry <URL>

Usage: tapestry <URL>

URL="$1"
if [ -z "$URL" ]; then echo "Usage: tapestry <URL>" exit 1 fi
echo "🧵 Tapestry Workflow Starting..." echo "URL: $URL" echo ""
URL="$1"
if [ -z "$URL" ]; then echo "Usage: tapestry <URL>" exit 1 fi
echo "🧵 Tapestry Workflow Starting..." echo "URL: $URL" echo ""

Step 1: Detect content type

Step 1: Detect content type

if [[ "$URL" =~ youtube.com/watch || "$URL" =~ youtu.be/ || "$URL" =~ youtube.com/shorts ]]; then CONTENT_TYPE="youtube" elif [[ "$URL" =~ .pdf$ ]] || curl -sI "$URL" | grep -iq "Content-Type: application/pdf"; then CONTENT_TYPE="pdf" else CONTENT_TYPE="article" fi
echo "📍 Detected: $CONTENT_TYPE" echo ""
if [[ "$URL" =~ youtube.com/watch || "$URL" =~ youtu.be/ || "$URL" =~ youtube.com/shorts ]]; then CONTENT_TYPE="youtube" elif [[ "$URL" =~ .pdf$ ]] || curl -sI "$URL" | grep -iq "Content-Type: application/pdf"; then CONTENT_TYPE="pdf" else CONTENT_TYPE="article" fi
echo "📍 Detected: $CONTENT_TYPE" echo ""

Step 2: Extract content

Step 2: Extract content

case $CONTENT_TYPE in youtube) echo "📺 Extracting YouTube transcript..." # [YouTube extraction code from above] ;;
article)
    echo "📄 Extracting article..."
    # [Article extraction code from above]
    ;;

pdf)
    echo "📑 Downloading PDF..."
    # [PDF extraction code from above]
    ;;
esac
echo ""
case $CONTENT_TYPE in youtube) echo "📺 Extracting YouTube transcript..." # [YouTube extraction code from above] ;;
article)
    echo "📄 Extracting article..."
    # [Article extraction code from above]
    ;;

pdf)
    echo "📑 Downloading PDF..."
    # [PDF extraction code from above]
    ;;
esac
echo ""

Step 3: Create action plan

Step 3: Create action plan

echo "🚀 Creating Ship-Learn-Next action plan..."
echo "🚀 Creating Ship-Learn-Next action plan..."

[Plan creation using ship-learn-next skill]

[Plan creation using ship-learn-next skill]

echo "" echo "✅ Tapestry Workflow Complete!" echo "" echo "📥 Content: $CONTENT_FILE" echo "📋 Plan: Ship-Learn-Next Plan - [title].md" echo "" echo "🎯 Next: Review your action plan and ship Rep 1!"
undefined
echo "" echo "✅ Tapestry Workflow Complete!" echo "" echo "📥 Content: $CONTENT_FILE" echo "📋 Plan: Ship-Learn-Next Plan - [title].md" echo "" echo "🎯 Next: Review your action plan and ship Rep 1!"
undefined

Error Handling

错误处理

Common Issues:

常见问题:

1. Unsupported URL type
  • Try article extraction as fallback
  • If fails: "Could not extract content from this URL type"
2. No content extracted
  • Check if URL is accessible
  • Try alternate extraction method
  • Inform user: "Extraction failed. URL may require authentication."
3. Tools not installed
  • Auto-install when possible (yt-dlp, reader, trafilatura)
  • Provide install instructions if auto-install fails
  • Use fallback methods when available
4. Empty or invalid content
  • Verify file has content before creating plan
  • Don't create plan if extraction failed
  • Show preview to user before planning
1. URL类型不支持
  • 尝试用文章提取作为备选
  • 如果失败:“无法从此URL类型提取内容”
2. 未提取到内容
  • 检查URL是否可访问
  • 尝试其他提取方式
  • 告知用户:“提取失败,该URL可能需要身份验证”
3. 工具未安装
  • 尽可能自动安装(yt-dlp、reader、trafilatura)
  • 若自动安装失败,提供安装说明
  • 有备选方案时使用备选方法
4. 内容为空或无效
  • 创建计划前验证文件是否有内容
  • 提取失败时不创建计划
  • 计划前向用户展示预览

Best Practices

最佳实践

  • ✅ Always show what was detected ("📍 Detected: youtube")
  • ✅ Display progress for each step
  • ✅ Save both content file AND plan file
  • ✅ Show preview of extracted content (first 10 lines)
  • ✅ Create plan automatically (don't ask)
  • ✅ Present clear summary at end
  • ✅ Ask commitment question: "When will you ship Rep 1?"
  • ✅ 始终展示检测结果(如“📍 Detected: youtube”)
  • ✅ 显示每个步骤的进度
  • ✅ 同时保存内容文件和计划文件
  • ✅ 展示提取内容的预览(前10行)
  • ✅ 自动创建计划(无需询问)
  • ✅ 结尾展示清晰的摘要
  • ✅ 询问承诺问题:“你何时完成Rep 1?”

Usage Examples

使用示例

Example 1: YouTube Video (using "tapestry")

示例1:YouTube视频(使用“tapestry”)

User: tapestry https://www.youtube.com/watch?v=dQw4w9WgXcQ

Claude:
🧵 Tapestry Workflow Starting...
📍 Detected: youtube
📺 Extracting YouTube transcript...
✓ Saved transcript: Never Gonna Give You Up.txt

🚀 Creating action plan...
✓ Quest: Master Video Production
✓ Saved plan: Ship-Learn-Next Plan - Master Video Production.md

✅ Complete! When will you ship Rep 1?
用户: tapestry https://www.youtube.com/watch?v=dQw4w9WgXcQ

Claude:
🧵 Tapestry工作流启动...
📍 检测到:youtube
📺 正在提取YouTube字幕...
✓ 已保存字幕:Never Gonna Give You Up.txt

🚀 正在创建行动计划...
✓ 任务:视频制作精通
✓ 已保存计划:Ship-Learn-Next Plan - Master Video Production.md

✅ 完成!你何时完成Rep 1?

Example 2: Article (using "weave")

示例2:文章(使用“weave”)

User: weave https://example.com/how-to-build-saas

Claude:
🧵 Tapestry Workflow Starting...
📍 Detected: article
📄 Extracting article...
✓ Using reader (Mozilla Readability)
✓ Saved article: How to Build a SaaS.txt

🚀 Creating action plan...
✓ Quest: Build a SaaS MVP
✓ Saved plan: Ship-Learn-Next Plan - Build a SaaS MVP.md

✅ Complete! When will you ship Rep 1?
用户: weave https://example.com/how-to-build-saas

Claude:
🧵 Tapestry工作流启动...
📍 检测到:article
📄 正在提取文章内容...
✓ 使用reader(Mozilla Readability)
✓ 已保存文章:How to Build a SaaS.txt

🚀 正在创建行动计划...
✓ 任务:搭建SaaS MVP
✓ 已保存计划:Ship-Learn-Next Plan - Build a SaaS MVP.md

✅ 完成!你何时完成Rep 1?

Example 3: PDF (using "help me plan")

示例3:PDF(使用“help me plan”)

User: help me plan https://example.com/research-paper.pdf

Claude:
🧵 Tapestry Workflow Starting...
📍 Detected: pdf
📑 Downloading PDF...
✓ Downloaded: research-paper.pdf
✓ Extracted text: research-paper.txt

🚀 Creating action plan...
✓ Quest: Apply Research Findings
✓ Saved plan: Ship-Learn-Next Plan - Apply Research Findings.md

✅ Complete! When will you ship Rep 1?
用户: help me plan https://example.com/research-paper.pdf

Claude:
🧵 Tapestry工作流启动...
📍 检测到:pdf
📑 正在下载PDF...
✓ 已下载:research-paper.pdf
✓ 已提取文本:research-paper.txt

🚀 正在创建行动计划...
✓ 任务:应用研究成果
✓ 已保存计划:Ship-Learn-Next Plan - Apply Research Findings.md

✅ 完成!你何时完成Rep 1?

Dependencies

依赖项

This skill orchestrates the other skills, so requires:
For YouTube:
  • yt-dlp (auto-installed)
  • Python 3 (for deduplication)
For Articles:
  • reader (npm) OR trafilatura (pip)
  • Falls back to basic curl if neither available
For PDFs:
  • curl (built-in)
  • pdftotext (optional - from poppler package)
    • Install:
      brew install poppler
      (macOS)
    • Install:
      apt install poppler-utils
      (Linux)
For Planning:
  • No additional requirements (uses built-in tools)
此技能统筹其他技能,因此需要:
YouTube相关
  • yt-dlp(自动安装)
  • Python 3(用于去重)
文章相关
  • reader(npm包)或trafilatura(pip包)
  • 若两者都没有,会回退到基础curl命令
PDF相关
  • curl(系统内置)
  • pdftotext(可选,来自poppler包)
    • 安装:
      brew install poppler
      (macOS)
    • 安装:
      apt install poppler-utils
      (Linux)
计划相关
  • 无额外要求(使用内置工具)

Philosophy

设计理念

Tapestry weaves learning content into action.
The unified workflow ensures you never just consume content - you always create an implementation plan. This transforms passive learning into active building.
Extract → Plan → Ship → Learn → Next.
That's the Tapestry way.
Tapestry将学习内容转化为行动。
统一的工作流确保你不会只停留在内容消费阶段——你总会生成一个落地计划。这将被动学习转化为主动实践。
提取→计划→落地→学习→迭代。
这就是Tapestry的方式。