Initial commit

This commit is contained in:
Zhongwei Li
2025-11-30 08:58:28 +08:00
commit e60768ac8e
10 changed files with 1020 additions and 0 deletions

110
commands/next.md Normal file
View File

@@ -0,0 +1,110 @@
---
description: Analyze my reading patterns and suggest what to read next from my TBR
---
You are helping the user decide what to read next from their Goodreads TBR list.
## Analysis Steps
Use the `analyze-goodreads-export` skill to perform the following analysis:
### 1. Analyze Recent Reading Patterns
Query the last 15 books read (sorted by date_read DESC):
- Calculate average page count of recent reads
- Identify if the user has been reading mostly long books (>600 pages)
- Look for series patterns in recent reads
- Use the `date_read` field to determine actual reading order
- Look at `my_rating` field to see what books the user liked
### 2. Check for Series Continuity
For each series found in recent reads:
- Check if there are unread books in that series on the TBR
- Prioritize the next book in sequence (series_index), especially if the previous book had a high rating
- This is important for maintaining reading momentum!
### 3. Consider Reading Fatigue
Based on recent page counts:
- If average recent reads > 600 pages: Suggest shorter books (< 300 pages)
- If average recent reads < 400 pages: User might be ready for something longer
- Look for highly-rated short books as "palate cleansers"
### 4. Check Book Age in Library
Query books by date_added:
- Find recently added books (last 30 days) that are on TBR
- Find old books (added >1 year ago) that may have been forgotten
- Use `date_added` field to determine when book was added
### 5. Filter by Quality
Prioritize books with:
- Goodreads rating >= 3.75 (if available)
- Consider page count relative to recent reading patterns
- Balance between series continuity and variety
## Output Format
Structure your response as a structured report with these categories:
```
# READING PATTERN SUMMARY
- Books read in last 30 days: X
- Average page count: Y pages
- Notable patterns: [e.g., "Completed The Carls series"]
# RECOMMENDATIONS BY CATEGORY
## 📚 SERIES CONTINUITY
Books that continue series you're currently reading:
- **Book Title** by Author
Series: Series Name #X | Pages: XXX | Rating: X.X/5 | Added: [date/age]
## 🆕 RECENTLY ADDED
Books added to your TBR in the last 30 days:
- **Book Title** by Author
Pages: XXX | Rating: X.X/5 | Added: [date]
## 💎 FORGOTTEN GEMS
Books on your TBR added over a year ago:
- **Book Title** by Author
Pages: XXX | Rating: X.X/5 | Added: [date/years ago]
## ⚡ QUICK READS
Shorter books (< 300 pages) for reading fatigue:
- **Book Title** by Author
Pages: XXX | Rating: X.X/5 | Added: [age]
## 🌟 HIGHLY RATED
Top-rated unread books from your TBR:
- **Book Title** by Author
Pages: XXX | Rating: X.X/5 | Added: [age]
```
## Important Notes
- Use `date_added` to determine when books were added to the library
- Calculate age from date_added (e.g., "2 days ago", "3 months ago", "2 years ago")
- Include 1-3 books per category (skip categories if no matches)
- ALWAYS check for incomplete series from recent reads first
- Balance series continuity with reading fatigue and variety
- Present data in a clean, scannable format
- Each category should help answer a different need: momentum, novelty, rediscovery, fatigue, or quality
- Only include books from the TBR list (where exclusive_shelf contains "to-read")
## Implementation
Write a Python script using the goodreads_lib to:
1. Get the last 15 read books
2. Analyze patterns (page count, series, ratings)
3. Query TBR for recommendations in each category
4. Format and display results
Use the Bash tool to run your Python script.

85
commands/random.md Normal file
View File

@@ -0,0 +1,85 @@
---
description: Pick a random book from TBR or library
---
You are helping the user pick a random book from their Goodreads library.
## Task
Use the `analyze-goodreads-skill` skill to pick a random book from their TBR list.
## Implementation
Write a Python script using goodreads_lib:
```python
#!/usr/bin/env python3
import sys
import random
sys.path.insert(0, '__SKILL_DIR__/scripts')
from goodreads_lib import GoodreadsLibrary
lib = GoodreadsLibrary()
# Get TBR books
tbr = lib.get_tbr_books()
if not tbr:
print("No books in your TBR!")
sys.exit(0)
# Pick random book
book = random.choice(tbr)
# Display
print("\n# 🎲 RANDOM TBR PICK\n")
print(f"**{book.title}**")
print(f"by {book.author}\n")
if book.series and book.series_index:
print(f"📚 Series: {book.series} #{book.series_index}")
if book.num_pages:
print(f"📖 Pages: {book.num_pages}")
if book.average_rating:
print(f"⭐ Goodreads Rating: {book.average_rating:.2f}/5")
if book.date_added:
from datetime import datetime
days_ago = (datetime.now() - book.date_added).days
if days_ago < 30:
print(f"🆕 Added: {days_ago} days ago")
elif days_ago < 365:
months = days_ago // 30
print(f"📅 Added: {months} months ago")
else:
years = days_ago // 365
print(f"📅 Added: {years} years ago")
print(f"\nTotal TBR books: {len(tbr)}")
```
## Output Format
```
# 🎲 RANDOM TBR PICK
**Book Title**
by Author Name
📚 Series: Series Name #X
📖 Pages: XXX
⭐ Goodreads Rating: X.XX/5
📅 Added: X months/years ago
Total TBR books: XX
```
## Important Notes
- Pick from books where `is_tbr` is True
- Display relevant metadata (series, pages, rating, date added)
- Handle missing data gracefully
- Use the Bash tool to run your Python script
- Replace `__SKILL_DIR__` with the actual skill directory path

80
commands/series.md Normal file
View File

@@ -0,0 +1,80 @@
---
description: List unfinished series and the next book to read in each
---
You are helping the user find incomplete series in their Goodreads library.
## Task
Use the `analyze-goodreads-export` skill to find series where:
- The user has read at least one book in the series
- There are still unread books in the series
- Display the next book to read in each series
## Implementation
Write a Python script using goodreads_lib:
```python
#!/usr/bin/env python3
import sys
sys.path.insert(0, '__SKILL_DIR__/scripts')
from goodreads_lib import GoodreadsLibrary
lib = GoodreadsLibrary()
# Get incomplete series
incomplete = lib.get_incomplete_series()
# Sort by series name
incomplete_sorted = sorted(incomplete.items(), key=lambda x: x[0])
# Display results
print("\n# UNFINISHED SERIES\n")
print(f"You have {len(incomplete_sorted)} incomplete series:\n")
for i, (series_name, info) in enumerate(incomplete_sorted, 1):
read = info['read_count']
total = info['total_count']
next_book = info['next_book']
print(f"{i}. **{series_name}** ({read}/{total} books read)")
if next_book:
title = next_book.title
author = next_book.author
index = next_book.series_index or '?'
pages = next_book.num_pages or '?'
rating = f"{next_book.average_rating:.2f}" if next_book.average_rating else "N/A"
print(f" Next: **{title}** by {author}")
print(f" Book #{index} | {pages} pages | Goodreads: {rating}/5\n")
else:
print(f" Next: Unable to determine\n")
```
## Output Format
```
# UNFINISHED SERIES
You have X incomplete series:
1. **Series Name** (X/Y books read)
Next: **Book Title** by Author
Book #X | XXX pages | Goodreads: X.XX/5
2. **Another Series** (X/Y books read)
Next: **Book Title** by Author
Book #X | XXX pages | Goodreads: X.XX/5
```
## Important Notes
- Series information is parsed from book titles (e.g., "Title (Series, #1)")
- Books are sorted by series_index within each series
- Only show series where at least one book has been read
- The "next" book is the first unread book in series order
- Handle missing data gracefully (pages, ratings may be missing)
- Use the Bash tool to run your Python script
- Replace `__SKILL_DIR__` with the actual skill directory path

141
commands/stats.md Normal file
View File

@@ -0,0 +1,141 @@
---
description: Show reading statistics (books per year/month, pages read, average rating, genre breakdown)
---
You are helping the user analyze their reading statistics from their Goodreads library.
## Analysis to Perform
Use the `analyze-goodreads-export` skill to gather and analyze the following statistics:
### 1. Reading Velocity
Query books read in different time periods:
- Books read this year (use `date_read.year == current_year`)
- Books read last 30 days
- Books read last 90 days
- Break down by month for current year
Calculate:
- Books per month average (current year)
- Pages per month average
- Current reading pace vs yearly average
### 2. Page Statistics
Query all read books with page counts:
- Total pages read this year
- Total pages read all time
- Average pages per book
- Longest book read
- Shortest book read
### 3. Rating Analysis
Query all read books with ratings:
- Average rating given (your `my_rating` field)
- Average Goodreads rating of books read (`average_rating` field)
- Most common rating you give
- Distribution of ratings (how many 5-star, 4-star, etc.)
### 4. Author Statistics
Query all read books:
- Most read authors (count by author name)
- Total unique authors read
### 5. Series Statistics
Query all read books with series information:
- Books read that are part of series vs standalone
- Most read series
- Number of complete series finished
### 6. To-Be-Read Statistics
Query TBR list (where `is_tbr` is True):
- Total books in TBR
- Total pages in TBR
- Average Goodreads rating of TBR
- Oldest book in TBR (by date_added)
- Books added to TBR in last 30 days
## Output Format
Present statistics in a clean, organized report:
```
# READING STATISTICS
## 📊 Reading Velocity
- **This Year**: X books (Y pages)
- **Last 30 Days**: X books (Y pages)
- **Average Pace**: X books/month, Y pages/month
### Monthly Breakdown (YYYY)
Jan: X books | Feb: X books | Mar: X books | etc.
## 📖 Page Statistics
- **Total Pages Read (All Time)**: X,XXX pages
- **Total Pages Read (This Year)**: X,XXX pages
- **Average Book Length**: XXX pages
- **Longest Book**: [Title] by [Author] (XXX pages)
- **Shortest Book**: [Title] by [Author] (XXX pages)
## ⭐ Rating Analysis
- **Your Average Rating**: X.X / 5
- **Goodreads Average of Books Read**: X.X / 5
- **Most Common Rating**: X stars
### Rating Distribution
★★★★★: XX books (XX%)
★★★★☆: XX books (XX%)
★★★☆☆: XX books (XX%)
★★☆☆☆: XX books (XX%)
★☆☆☆☆: XX books (XX%)
## ✍️ Author Statistics
- **Total Authors Read**: XX unique authors
- **Most Read Authors**:
1. [Author Name]: X books
2. [Author Name]: X books
3. [Author Name]: X books
## 📚 Series Statistics
- **Books in Series**: XX books (XX% of total)
- **Standalone Books**: XX books (XX% of total)
- **Most Read Series**:
1. [Series Name]: X books
2. [Series Name]: X books
## 📋 To-Be-Read Statistics
- **Total TBR Books**: XXX books (X,XXX pages)
- **Average TBR Rating**: X.X / 5
- **Added Recently**: XX books in last 30 days
- **Oldest Unread**: [Title] (added X years/months ago)
## 🎯 Reading Insights
[Provide 2-3 interesting insights, such as:]
- You're on track to read XX books this year
- Your reading pace has [increased/decreased] compared to last year
- You tend to rate books higher/lower than Goodreads average
- You're reading more/fewer series books than standalone
```
## Implementation
Write a Python script using goodreads_lib to:
1. Query all read books
2. Calculate statistics for each category
3. Format and display results with proper formatting
Use the Bash tool to run your Python script.
## Important Notes
- Use `date_read` field to determine if/when book was read
- Calculate percentages and averages from the data
- Present large numbers with thousand separators for readability
- Compare current year to all-time averages where interesting
- Handle missing data gracefully (some books may not have all fields)
- Round floating point values to 2 decimal places for readability

125
commands/vibes.md Normal file
View File

@@ -0,0 +1,125 @@
---
description: Find similar books in your library based on genre, author, or themes
---
You are helping the user find books similar to one they specify.
## Task
When the user asks to find books with similar "vibes" or similar to a specific book:
1. Ask them what book they want to find similar books to (if not already specified)
2. Use the `analyze-goodreads-export` skill to search for that book in their library
3. Find similar books based on:
- Same author
- Books on the same custom shelves (genre indicators)
- Similar series (if applicable)
- Similar page count
- Similar ratings
## Implementation
Write a Python script using goodreads_lib:
```python
#!/usr/bin/env python3
import sys
sys.path.insert(0, '__SKILL_DIR__/scripts')
from goodreads_lib import GoodreadsLibrary
lib = GoodreadsLibrary()
# Get the reference book (user should specify)
search_term = "BOOK_TITLE" # Replace with user's input
# Find the book
matches = [b for b in lib.books if search_term.lower() in b.title.lower()]
if not matches:
print(f"Could not find '{search_term}' in your library")
sys.exit(1)
ref_book = matches[0]
print(f"\n# BOOKS SIMILAR TO: {ref_book.title}\n")
# Find similar books
similar = []
# 1. Same author
if ref_book.author:
same_author = [b for b in lib.books
if b.author == ref_book.author
and b.book_id != ref_book.book_id
and not b.is_read]
if same_author:
print(f"## 📚 More by {ref_book.author}\n")
for book in same_author[:3]:
pages = f"{book.num_pages} pages" if book.num_pages else "? pages"
rating = f"{book.average_rating:.2f}/5" if book.average_rating else "N/A"
print(f"- **{book.title}** | {pages} | ⭐ {rating}")
print()
# 2. Same shelves (genre indicators)
if ref_book.bookshelves:
shelves = ref_book.bookshelves.split(',')
for shelf in shelves[:2]: # Check first 2 shelves
shelf = shelf.strip()
if shelf:
same_shelf = [b for b in lib.books
if shelf in b.bookshelves
and b.book_id != ref_book.book_id
and not b.is_read]
if same_shelf:
print(f"## 🏷️ Similar (from '{shelf}' shelf)\n")
for book in same_shelf[:3]:
pages = f"{book.num_pages} pages" if book.num_pages else "? pages"
rating = f"{book.average_rating:.2f}/5" if book.average_rating else "N/A"
print(f"- **{book.title}** by {book.author} | {pages} | ⭐ {rating}")
print()
# 3. Similar series (if in a series)
if ref_book.series:
series_books = lib.get_series_books(ref_book.series)
unread_in_series = [b for b in series_books if not b.is_read]
if unread_in_series:
print(f"## 📖 More in {ref_book.series}\n")
for book in unread_in_series[:3]:
idx = f"#{book.series_index}" if book.series_index else ""
pages = f"{book.num_pages} pages" if book.num_pages else "? pages"
rating = f"{book.average_rating:.2f}/5" if book.average_rating else "N/A"
print(f"- **{book.title}** {idx} | {pages} | ⭐ {rating}")
print()
```
## Output Format
```
# BOOKS SIMILAR TO: Reference Book Title
## 📚 More by Author Name
- **Book Title** | XXX pages | ⭐ X.XX/5
- **Book Title** | XXX pages | ⭐ X.XX/5
## 🏷️ Similar (from 'genre' shelf)
- **Book Title** by Author | XXX pages | ⭐ X.XX/5
- **Book Title** by Author | XXX pages | ⭐ X.XX/5
## 📖 More in Series Name
- **Book Title** #X | XXX pages | ⭐ X.XX/5
```
## Important Notes
- Ask the user which book they want to find similar books to
- Search is case-insensitive for the title
- Prioritize unread books in results
- Custom shelves can indicate genres (e.g., "mental-health", "favorites")
- Limit results to 3 per category for readability
- Handle missing data gracefully
- Use the Bash tool to run your Python script
- Replace `__SKILL_DIR__` with the actual skill directory path
- Replace `BOOK_TITLE` with the user's search term