From oh-my-study-with-me
Sets up daily Slack quiz system with GitHub Actions cron for Leitner-based spaced repetition review of study content. Use for quiz automation or spaced repetition.
npx claudepluginhub lsh1215/oh-my-study-with-me --plugin oh-my-study-with-meThis skill uses the workspace's default tool permissions.
> **⚠️ Experimental** — This skill is under active development and not yet stable. APIs, quiz schema, and grading logic may change without notice.
Generates adaptive interactive quizzes on learning topics or any subject, delivers one question at a time via AskUserQuestion tool, tracks scores and progress in ~/.claude/learning/progress/{topic}.json, provides feedback and adjusts difficulty.
Tracks study sessions with spaced repetition reminders, active recall techniques, progress dashboards, technique suggestions, and exam prep schedules.
Runs daily spaced-repetition review queue using SM-2 algorithm. Pulls due items for error patterns, vocabulary, grammar; generates exercises, evaluates responses, updates intervals. Invoke with /review.
Share bugs, ideas, or general feedback.
⚠️ Experimental — This skill is under active development and not yet stable. APIs, quiz schema, and grading logic may change without notice.
Arguments: $ARGUMENTS
To prevent forgetting what you've studied, this system sends a daily review quiz to Slack every evening at 8 PM via GitHub Actions. Using Leitner System-based spaced repetition, weaker areas are tested more frequently while well-mastered areas appear less often.
[/oh-my-study-with-me:study session]
Phase 3 Verification → Auto-generate quiz → Save to quizzes/quiz_bank.json
↓
[GitHub Actions - Daily cron at 20:00 KST]
1) Read yesterday's quiz thread (Slack API conversations.replies)
2) Keyword matching from replies → Grade correct/incorrect
3) Update quiz_bank.json Leitner Box
4) Select 1 quiz for today's review
5) Send to dedicated Slack channel
6) Auto-commit + push changes
Confirm the following items with the user:
StudyWithMe Quiz Bot (or any name you prefer)Add the following Bot Token Scopes under OAuth & Permissions:
chat:write - send messageschannels:history - read channel messages (for checking thread replies)channels:join - join channelsxoxb-#daily-quiz channel (or any name you prefer)/invite @StudyWithMe Quiz BotIn repository Settings → Secrets and variables → Actions:
SLACK_BOT_TOKEN: Bot User OAuth Token (xoxb-...)SLACK_CHANNEL_ID: Dedicated channel ID (starts with C)Confirm that the user has completed all the above items before proceeding to the next step.
quizzes/
├── quiz_bank.json # Quiz data
├── quiz_runner.py # Quiz selection + sending + grading script
└── README.md # Usage guide
{
"metadata": {
"version": 1,
"last_updated": null,
"total_quizzes": 0,
"stats": {
"total_asked": 0,
"total_correct": 0,
"total_wrong": 0
}
},
"quizzes": []
}
{
"id": "kafka-001",
"category": "Kafka",
"book": "Kafka: The Definitive Guide",
"chapter": "Ch3. Producers",
"type": "concept",
"question": "Why does Kafka use OS page cache instead of JVM heap?",
"hint": "What JVM problem is it trying to avoid?",
"answer": "A large JVM heap causes long GC pauses leading to latency, and object overhead reduces memory efficiency. The OS page cache is managed by the kernel without GC, and the cache persists even after a broker restart.",
"keywords": ["GC", "garbage", "heap", "page cache", "kernel"],
"min_keyword_match": 2,
"box": 1,
"next_review": "2026-03-02",
"times_asked": 0,
"times_correct": 0,
"last_asked": null,
"slack_message_ts": null
}
Implement the following functionality as a Python script:
"""
1. Find the most recent quiz with a slack_message_ts in quiz_bank.json.
2. Fetch the replies in that thread using Slack API conversations.replies.
3. Match keywords from user replies (not bot messages).
4. If min_keyword_match or more keywords match, mark as correct.
5. Correct → box += 1 (max 5), Incorrect → box = 1
6. Update next_review based on box:
- Box 1: +1 day, Box 2: +3 days, Box 3: +7 days, Box 4: +14 days, Box 5: +30 days
7. Reply to the Slack thread with grading result:
- Correct: "✅ Correct! [keyword match result] → Moving to Box {n}"
- Incorrect: "❌ Not quite! Answer: {answer} → Reset to Box 1"
- No reply: "⏰ No answer was submitted. → Reset to Box 1"
"""
"""
1. Filter quizzes where next_review <= today's date.
2. Priority: lower box (weaker areas) > least recently asked.
3. If no quizzes qualify, send only a "No quizzes to review today!" message.
4. Return the selected quiz.
"""
"""
Send to the dedicated channel using Slack chat.postMessage API.
Message format:
---
🧠 *Today's Review Quiz* #{times_asked + 1}
📚 {book} - {chapter}
🏷️ Type: {type} | 📦 Box {box}
> {question}
💡 *Hint*: {hint}
_Please write your answer in the thread. It will be graded tomorrow._
---
After sending:
1. Retrieve message.ts from the response and save to slack_message_ts in quiz_bank.json.
2. The answer will be revealed together when grading the next day.
"""
"""
1. check_previous_quiz() # Grade yesterday's quiz
2. quiz = select_quiz() # Select today's quiz
3. send_quiz(quiz) # Send to Slack
4. Save quiz_bank.json
"""
requests (Slack API calls)json, datetime, os.github/workflows/daily-quiz.yml:
name: Daily Quiz
on:
schedule:
# Every day at 11:00 UTC = 20:00 KST
- cron: '0 11 * * *'
workflow_dispatch: # Can also be triggered manually
jobs:
send-quiz:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: pip install requests
- name: Run quiz
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
run: python quizzes/quiz_runner.py
- name: Commit quiz bank updates
run: |
git config user.name "quiz-bot"
git config user.email "quiz-bot@github-actions"
git add quizzes/quiz_bank.json
git diff --staged --quiet || git commit -m "quiz: update quiz bank $(date +%Y-%m-%d)"
git push
In Phase 3 (Verification) of the study skill, include logic to automatically add the verification questions used during that phase to quiz_bank.json.
{category}-{sequence} (e.g., kafka-001, redis-003).Once all files are created:
python quizzes/quiz_runner.py for local testing (environment variables must be set)