Initial commit
This commit is contained in:
110
commands/next.md
Normal file
110
commands/next.md
Normal 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
85
commands/random.md
Normal 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
80
commands/series.md
Normal 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
141
commands/stats.md
Normal 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
125
commands/vibes.md
Normal 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
|
||||
Reference in New Issue
Block a user