// Unified content extraction and action planning. Use when user says "tapestry <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.
| name | tapestry |
| description | Unified content extraction and action planning. Use when user says "tapestry <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. |
| allowed-tools | Bash,Read,Write |
This is the master skill that orchestrates the entire Tapestry workflow:
Activate when the user:
Keywords to watch for: tapestry, weave, plan, actionable, extract and plan, make a plan, turn into action
Patterns to detect:
youtube.com/watch?v=youtu.be/youtube.com/shorts/m.youtube.com/watch?v=Action: Use youtube-transcript skill
Patterns to detect:
http:// or https://Action: Use article-extractor skill
Patterns to detect:
.pdfContent-Type: application/pdfAction: Download and extract text
Fallback:
URL="$1"
# Check for YouTube
if [[ "$URL" =~ youtube\.com/watch || "$URL" =~ youtu\.be/ || "$URL" =~ youtube\.com/shorts ]]; then
CONTENT_TYPE="youtube"
# Check for PDF
elif [[ "$URL" =~ \.pdf$ ]]; then
CONTENT_TYPE="pdf"
# Check if URL returns PDF
elif curl -sI "$URL" | grep -i "Content-Type: application/pdf" > /dev/null; then
CONTENT_TYPE="pdf"
# Default to article
else
CONTENT_TYPE="article"
fi
echo "๐ Detected: $CONTENT_TYPE"
# Use youtube-transcript skill workflow
echo "๐บ Extracting YouTube transcript..."
# 1. Check for yt-dlp
if ! command -v yt-dlp &> /dev/null; then
echo "Installing yt-dlp..."
brew install yt-dlp
fi
# 2. Get video title
VIDEO_TITLE=$(yt-dlp --print "%(title)s" "$URL" | tr '/' '_' | tr ':' '-' | tr '?' '' | tr '"' '')
# 3. Download transcript
yt-dlp --write-auto-sub --skip-download --sub-langs en --output "temp_transcript" "$URL"
# 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"
# 5. Cleanup
rm -f temp_transcript.en.vtt
CONTENT_FILE="${VIDEO_TITLE}.txt"
echo "โ Saved transcript: $CONTENT_FILE"
# Use article-extractor skill workflow
echo "๐ Extracting article content..."
# 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"
# 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
# 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"
# Download and extract PDF
echo "๐ Downloading PDF..."
# 1. Download PDF
PDF_FILENAME=$(basename "$URL")
curl -L -o "$PDF_FILENAME" "$URL"
# 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
IMPORTANT: Always create an action plan after extracting content.
# Read the extracted content
CONTENT_FILE="[from previous step]"
# Invoke ship-learn-next skill logic:
# 1. Read the content file
# 2. Extract core actionable lessons
# 3. Create 5-rep progression plan
# 4. Save as: Ship-Learn-Next Plan - [Quest Title].md
# See ship-learn-next/SKILL.md for full details
Key points for plan creation:
Ship-Learn-Next Plan - [Brief Quest Title].mdShow 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?
#!/bin/bash
# Tapestry: Extract content + create action plan
# Usage: tapestry <URL>
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
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
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
echo "๐ Creating Ship-Learn-Next action plan..."
# [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!"
1. Unsupported URL type
2. No content extracted
3. Tools not installed
4. Empty or invalid content
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?
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?
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?
This skill orchestrates the other skills, so requires:
For YouTube:
For Articles:
For PDFs:
brew install poppler (macOS)apt install poppler-utils (Linux)For Planning:
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.