From c8c204f81d3a1eb6ac8ee078246d63a3238d625f Mon Sep 17 00:00:00 2001 From: Zhongwei Li Date: Sat, 29 Nov 2025 18:49:46 +0800 Subject: [PATCH] Initial commit --- .claude-plugin/plugin.json | 12 + README.md | 3 + plugin.lock.json | 64 ++ skills/reading-teacher/SKILL.md | 848 ++++++++++++++++++ .../references/comprehension.md | 636 +++++++++++++ skills/reading-teacher/references/phonics.md | 523 +++++++++++ .../reading-teacher/references/sight_words.md | 506 +++++++++++ .../reading-teacher/scripts/generate_game.sh | 304 +++++++ .../scripts/generate_playground.sh | 302 +++++++ 9 files changed, 3198 insertions(+) create mode 100644 .claude-plugin/plugin.json create mode 100644 README.md create mode 100644 plugin.lock.json create mode 100644 skills/reading-teacher/SKILL.md create mode 100644 skills/reading-teacher/references/comprehension.md create mode 100644 skills/reading-teacher/references/phonics.md create mode 100644 skills/reading-teacher/references/sight_words.md create mode 100755 skills/reading-teacher/scripts/generate_game.sh create mode 100755 skills/reading-teacher/scripts/generate_playground.sh diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..afbfc29 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "reading-teacher", + "description": "Interactive reading teacher that instantly generates playful, engaging learning experiences for children ages 1-10. Creates visual playgrounds, phonics games, and interactive stories to build reading skills from letter recognition to comprehension.", + "version": "0.0.0-2025.11.28", + "author": { + "name": "James Rochabrun", + "email": "jamesrochabrun@gmail.com" + }, + "skills": [ + "./skills/reading-teacher" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9594557 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# reading-teacher + +Interactive reading teacher that instantly generates playful, engaging learning experiences for children ages 1-10. Creates visual playgrounds, phonics games, and interactive stories to build reading skills from letter recognition to comprehension. diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..ab36649 --- /dev/null +++ b/plugin.lock.json @@ -0,0 +1,64 @@ +{ + "$schema": "internal://schemas/plugin.lock.v1.json", + "pluginId": "gh:jamesrochabrun/skills:reading-teacher", + "normalized": { + "repo": null, + "ref": "refs/tags/v20251128.0", + "commit": "21c73ab18b8ce1694397ddb4c39fbec37f960250", + "treeHash": "b0f51d7872bab15c98e5a018d190bcce9a6e8efff7d899bce1c88f1c35ed222e", + "generatedAt": "2025-11-28T10:17:55.263112Z", + "toolVersion": "publish_plugins.py@0.2.0" + }, + "origin": { + "remote": "git@github.com:zhongweili/42plugin-data.git", + "branch": "master", + "commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390", + "repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data" + }, + "manifest": { + "name": "reading-teacher", + "description": "Interactive reading teacher that instantly generates playful, engaging learning experiences for children ages 1-10. Creates visual playgrounds, phonics games, and interactive stories to build reading skills from letter recognition to comprehension." + }, + "content": { + "files": [ + { + "path": "README.md", + "sha256": "697becc79f12812415b0859f786ccdfa8da06bd00681c97aee2d573611982d38" + }, + { + "path": ".claude-plugin/plugin.json", + "sha256": "7d3d690995f735037a6b6defabd0f04ff001151f383eda5924de85925f3376c2" + }, + { + "path": "skills/reading-teacher/SKILL.md", + "sha256": "68ec269659172c6e2ee4b994c741ff5dfc63202355aa7ee76a061b438615514b" + }, + { + "path": "skills/reading-teacher/references/phonics.md", + "sha256": "0a35c8ec6d27ba47eb53583ecfed43627f4016e166b9c57818e5343215783ad1" + }, + { + "path": "skills/reading-teacher/references/sight_words.md", + "sha256": "dead70fd53581f64855a2a818743365bb0e9463bede9fb209bc8ae2dc95a4181" + }, + { + "path": "skills/reading-teacher/references/comprehension.md", + "sha256": "1dfef05e28702fed914656616452f027fc6a5826a6bcd9040198075b89b60830" + }, + { + "path": "skills/reading-teacher/scripts/generate_playground.sh", + "sha256": "a05b696e33eaa7886605c91edada2cece9e65ae95ea3e65c0641130abebd158f" + }, + { + "path": "skills/reading-teacher/scripts/generate_game.sh", + "sha256": "cf8d653da58603ecce22ecb8c46f77f204ee24a00e10002901a211e67edd9ac9" + } + ], + "dirSha256": "b0f51d7872bab15c98e5a018d190bcce9a6e8efff7d899bce1c88f1c35ed222e" + }, + "security": { + "scannedAt": null, + "scannerVersion": null, + "flags": [] + } +} \ No newline at end of file diff --git a/skills/reading-teacher/SKILL.md b/skills/reading-teacher/SKILL.md new file mode 100644 index 0000000..d529a5e --- /dev/null +++ b/skills/reading-teacher/SKILL.md @@ -0,0 +1,848 @@ +--- +name: reading-teacher +description: Interactive reading teacher that instantly generates playful, engaging learning experiences for children ages 1-10. Creates visual playgrounds, phonics games, and interactive stories to build reading skills from letter recognition to comprehension. +--- + +# Reading Teacher + +An interactive, playful reading teacher that instantly generates engaging learning experiences through interactive artifacts, visual playgrounds, and gamified challenges for young learners. + +## What This Skill Does + +Transforms reading education into interactive, visual experiences: +- **Instant Playground Generation** - Creates interactive HTML/JS artifacts on demand +- **Age-Appropriate Content** - Tailored for ages 1-10 with developmental stages +- **Multi-Sensory Learning** - Visual, auditory, and interactive elements +- **Phonics & Sight Words** - Systematic phonics instruction and high-frequency words +- **Story Building** - Interactive story creation and comprehension +- **Gamification** - Stars, badges, rewards, and progress tracking +- **Parent/Teacher Tools** - Progress reports and customization options + +## Why This Skill Matters + +**Traditional reading instruction:** +- Limited engagement and interactivity +- One-size-fits-all approach +- Difficult to maintain young attention spans +- Limited practice opportunities +- Hard to track individual progress + +**With this skill:** +- Instant engagement through games +- Personalized to child's level +- Fun, rewarding experiences +- Unlimited practice variations +- Clear progress tracking +- Multi-sensory approach + +## Core Principles + +### 1. Developmentally Appropriate +- Age-specific content and challenges +- Scaffolded learning progression +- Appropriate complexity levels +- Sensitive to attention spans +- Celebrates every milestone + +### 2. Multi-Sensory Engagement +- Visual letter displays +- Audio pronunciation +- Interactive touch/click +- Animated feedback +- Colorful, engaging design + +### 3. Play-Based Learning +- Games over drills +- Story-driven activities +- Character companions +- Reward systems +- Celebration animations + +### 4. Systematic Instruction +- Sequential skill building +- Phonics-based approach +- High-frequency sight words +- Comprehension strategies +- Fluency development + +### 5. Positive Reinforcement +- Immediate encouragement +- Visual progress markers +- Achievement celebrations +- No negative feedback +- Growth mindset focus + +## Reading Stages Covered + +### Pre-Reading (Ages 1-3) +**Skills:** +- Letter recognition (uppercase & lowercase) +- Letter sounds (phonemic awareness) +- Environmental print awareness +- Book handling skills +- Listening comprehension + +**Activities:** +- 🔤 Alphabet song with animations +- 🎨 Letter tracing games +- 🔊 Sound matching activities +- 📚 Interactive picture books +- 🎵 Rhyming word games + +### Early Reading (Ages 3-5) +**Skills:** +- Letter-sound correspondence +- Beginning phonics (CVC words) +- Print awareness +- Simple sight words +- Picture-text connection + +**Activities:** +- 🐱 CVC word building (cat, dog, sun) +- 🎯 Sight word matching games +- 📖 Simple sentence reading +- 🧩 Word family exploration +- ✨ Rhyme time challenges + +### Beginning Readers (Ages 5-7) +**Skills:** +- Phonics patterns (blends, digraphs) +- Expanding sight word vocabulary +- Simple sentence reading +- Basic comprehension +- Fluency building + +**Activities:** +- 🌟 Digraph detective games (ch, sh, th) +- 📝 Sentence building workshops +- 📚 Decodable story readers +- 🎭 Character comprehension +- ⏱️ Fluency practice tracks + +### Developing Readers (Ages 7-10) +**Skills:** +- Advanced phonics patterns +- Multi-syllable words +- Reading comprehension strategies +- Vocabulary development +- Fluent reading + +**Activities:** +- 📖 Story comprehension challenges +- 🔍 Context clue detectives +- 📚 Chapter book companions +- ✍️ Story writing studios +- 🎯 Vocabulary builders + +## Interactive Playground Examples + +### Example 1: Letter Land Adventure (Ages 1-3) + +**User asks:** "Help my toddler learn letters" + +**Teacher generates:** +```html + + + + + + 🌈 Letter Land Adventure! + + + +
+

🌈 Letter Land Adventure!

+
+ Stars: 0 ⭐ +
+
+ +
+ A +
+ +
+ Click the letter to hear its name and sound! +
+ +
+ + + +
+ + + + + + +``` + +**Features:** +- Large, colorful letter display +- Click to hear letter name and sound +- Progress tracking with stars +- Alphabet grid showing learned letters +- Randomization for variety +- Encouraging animations +- Mobile-friendly touch interface + +### Example 2: Sight Word Safari (Ages 5-7) + +**User asks:** "Practice sight words for first grade" + +**Teacher generates:** Interactive safari game with: +- High-frequency Dolch/Fry words +- Word recognition challenges +- Sentence building activities +- Timed reading practice +- Progress badges and rewards + +### Example 3: Story Builder Studio (Ages 7-10) + +**User asks:** "Help with reading comprehension" + +**Teacher generates:** Interactive story workshop with: +- Choose-your-own-adventure format +- Comprehension questions embedded +- Vocabulary highlighting +- Character analysis tools +- Story sequencing activities + +## Gamification System + +### Rewards & Stars +- **Letter Stars** (1 star): Learn a new letter +- **Word Stars** (5 stars): Read a new word +- **Story Stars** (10 stars): Complete a story +- **Speed Stars** (3 stars): Quick recognition +- **Perfect Stars** (20 stars): 100% accuracy + +### Achievement Badges +- 🌟 **ABC Master**: Learn all 26 letters +- 📖 **First Reader**: Read first complete sentence +- 🏆 **Word Wizard**: Master 50 sight words +- 🎯 **Perfect Week**: Practice 7 days in a row +- 🚀 **Speed Reader**: Read 20 words in 1 minute +- 📚 **Story Time**: Complete 10 stories +- 🎨 **Creative Writer**: Build own story +- ⭐ **Super Star**: Earn 1000 total stars + +### Progress Tracking +- Letters learned (26 total) +- Sight words mastered +- Stories completed +- Reading streak (days) +- Time spent reading +- Accuracy percentage +- Reading level advancement + +### Celebration Animations +- Confetti for achievements +- Star explosions for correct answers +- Character animations +- Sound effects (optional) +- Progress bar fills +- Level-up animations + +## Learning Activities by Type + +### Letter Recognition +**Activities:** +- Alphabet song with animations +- Letter matching games +- Upper/lowercase pairing +- Letter tracing (touch/mouse) +- Find the letter challenges +- Letter sorting activities + +**Example Code:** +```javascript +function createLetterMatch() { + const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); + const lowercase = 'abcdefghijklmnopqrstuvwxyz'.split(''); + + // Shuffle and match pairs + const pairs = uppercase.map((u, i) => ({ + upper: u, + lower: lowercase[i], + matched: false + })); + + return pairs; +} +``` + +### Phonics Practice +**Activities:** +- Sound matching (letter to sound) +- CVC word building (cat, dog, run) +- Word families (-at, -an, -ig) +- Rhyming word games +- Blend practice (bl, cr, st) +- Digraph detection (ch, sh, th) + +**Example:** +```javascript +const wordFamilies = { + 'at': ['cat', 'bat', 'rat', 'hat', 'mat', 'sat'], + 'an': ['can', 'man', 'pan', 'ran', 'van', 'fan'], + 'ig': ['big', 'dig', 'fig', 'pig', 'wig', 'jig'] +}; + +function generateWordFamily(family) { + return wordFamilies[family].map(word => ({ + word: word, + letters: word.split(''), + sound: `/${family}/` + })); +} +``` + +### Sight Word Training +**High-Frequency Words (Dolch/Fry Lists):** + +**Pre-K:** +```javascript +const preK = ['a', 'and', 'away', 'big', 'blue', 'can', 'come', + 'down', 'find', 'for', 'funny', 'go', 'help', 'here', + 'I', 'in', 'is', 'it', 'jump', 'little', 'look', 'make', + 'me', 'my', 'not', 'one', 'play', 'red', 'run', 'said', + 'see', 'the', 'three', 'to', 'two', 'up', 'we', 'where', + 'yellow', 'you']; +``` + +**First Grade:** +```javascript +const firstGrade = ['after', 'again', 'an', 'any', 'as', 'ask', 'by', + 'could', 'every', 'fly', 'from', 'give', 'going', + 'had', 'has', 'her', 'him', 'his', 'how', 'just', + 'know', 'let', 'live', 'may', 'of', 'old', 'once', + 'open', 'over', 'put', 'round', 'some', 'stop', + 'take', 'thank', 'them', 'then', 'think', 'walk', + 'were', 'when']; +``` + +**Interactive Sight Word Game:** +```javascript +function createSightWordChallenge(wordList, timeLimit = 60) { + let score = 0; + let currentWord = ''; + let timeRemaining = timeLimit; + + function nextWord() { + currentWord = wordList[Math.floor(Math.random() * wordList.length)]; + displayWord(currentWord); + } + + function checkAnswer(userInput) { + if (userInput.toLowerCase() === currentWord.toLowerCase()) { + score++; + celebrate(); + nextWord(); + } + } + + return { nextWord, checkAnswer, score }; +} +``` + +### Reading Comprehension +**Strategies:** +- Predicting what happens next +- Identifying main characters +- Recalling story details +- Understanding cause/effect +- Making inferences +- Visualizing scenes + +**Interactive Questions:** +```javascript +const comprehensionQuestions = { + 'The Cat and the Hat': [ + { + question: 'Who are the main characters?', + type: 'multiple-choice', + options: ['Cat, Kids', 'Dog, Bird', 'Fish, Mom'], + answer: 'Cat, Kids' + }, + { + question: 'Where does the story take place?', + type: 'multiple-choice', + options: ['Outside', 'At home', 'At school'], + answer: 'At home' + }, + { + question: 'What did you like about the story?', + type: 'open-ended', + encouragement: 'Great thinking!' + } + ] +}; +``` + +### Story Building +**Components:** +- Character selection +- Setting choices +- Problem/solution structure +- Sequence of events +- Ending options +- Illustration tools + +```javascript +const storyElements = { + characters: ['🐱 Cat', '🐶 Dog', '🦊 Fox', '🐻 Bear', '🦁 Lion'], + settings: ['🏠 House', '🌳 Forest', '🏖️ Beach', '🏰 Castle', '🚀 Space'], + problems: ['Lost something', 'Made a friend', 'Went on adventure', 'Solved mystery'], + solutions: ['Found it!', 'Worked together', 'Used creativity', 'Never gave up'] +}; + +function buildStory(selections) { + return `Once upon a time, there was a ${selections.character}. + The ${selections.character} lived in a ${selections.setting}. + One day, the ${selections.character} ${selections.problem}. + In the end, ${selections.solution}!`; +} +``` + +## Parent/Teacher Tools + +### Progress Reports +```javascript +const progressReport = { + childName: 'Emma', + age: 6, + level: 'Beginning Reader', + stats: { + lettersLearned: 26, + sightWordsMastered: 45, + storiesCompleted: 12, + currentStreak: 7, + totalTimeMinutes: 240 + }, + strengths: ['Letter recognition', 'Phonics', 'Enthusiasm'], + workingOn: ['Sight words', 'Reading fluency'], + nextSteps: ['Practice high-frequency words', 'Read aloud daily'] +}; +``` + +### Customization Options +- Adjust difficulty level +- Select word lists +- Choose themes/characters +- Set time limits +- Enable/disable sound +- Track multiple children +- Export progress data + +## Technical Implementation + +### Text-to-Speech (Web Speech API) +```javascript +function speakText(text, rate = 1.0) { + if ('speechSynthesis' in window) { + const utterance = new SpeechSynthesisUtterance(text); + utterance.rate = rate; + utterance.pitch = 1.2; // Higher pitch for kids + utterance.volume = 1.0; + speechSynthesis.speak(utterance); + } else { + // Fallback: show text with pronunciation guide + showPronunciation(text); + } +} +``` + +### Interactive Word Building +```javascript +function createWordBuilder(targetWord) { + const letters = targetWord.split(''); + const scrambled = shuffle([...letters]); + + let builtWord = []; + + function addLetter(letter) { + builtWord.push(letter); + updateDisplay(); + + if (builtWord.join('') === targetWord) { + celebrate('Correct!'); + return true; + } + return false; + } + + function removeLetter() { + builtWord.pop(); + updateDisplay(); + } + + return { addLetter, removeLetter, scrambled }; +} +``` + +### Reading Fluency Timer +```javascript +class FluencyTracker { + constructor(text) { + this.text = text; + this.wordCount = text.split(' ').length; + this.startTime = null; + this.endTime = null; + } + + start() { + this.startTime = Date.now(); + } + + stop() { + this.endTime = Date.now(); + return this.calculate(); + } + + calculate() { + const seconds = (this.endTime - this.startTime) / 1000; + const minutes = seconds / 60; + const wpm = Math.round(this.wordCount / minutes); + + return { + wordsPerMinute: wpm, + timeSeconds: seconds, + wordCount: this.wordCount, + rating: this.getRating(wpm) + }; + } + + getRating(wpm) { + // Age-appropriate WPM benchmarks + if (wpm >= 100) return '🏆 Excellent!'; + if (wpm >= 70) return '⭐ Great job!'; + if (wpm >= 50) return '👍 Good work!'; + return '💪 Keep practicing!'; + } +} +``` + +## Reference Materials + +All included in `/references`: +- **phonics.md** - Phonics patterns, rules, and activities +- **sight_words.md** - Dolch and Fry word lists by level +- **comprehension.md** - Reading strategies and question types +- **stories.md** - Decodable texts and story templates + +## Scripts + +All in `/scripts`: +- **generate_playground.sh** - Create interactive reading playground +- **generate_game.sh** - Build phonics or sight word game +- **generate_story.sh** - Create interactive story + +## Best Practices + +### DO: +✅ Use large, clear fonts (minimum 24pt for beginners) +✅ Include audio pronunciation +✅ Provide immediate positive feedback +✅ Use colorful, engaging visuals +✅ Celebrate every success +✅ Keep sessions short (5-15 minutes) +✅ Make it playful and fun +✅ Track progress visibly + +### DON'T: +❌ Use complex vocabulary +❌ Show negative feedback +❌ Make activities too long +❌ Use small or hard-to-read text +❌ Skip audio support +❌ Make it feel like work +❌ Overwhelm with too many choices +❌ Forget to celebrate progress + +## Example Interactions + +**Toddler (Age 2):** +> "Teach my toddler the alphabet" + +*Generates: Interactive Letter Land with clickable letters, sounds, animations, and tracking* + +**Kindergarten (Age 5):** +> "Help with CVC words" + +*Generates: Word family game with cat, bat, rat - drag-and-drop letter building with sounds* + +**First Grade (Age 6):** +> "Practice sight words" + +*Generates: Sight Word Safari with timed challenges, sentences, and progress badges* + +**Second Grade (Age 7):** +> "Reading comprehension practice" + +*Generates: Interactive story with embedded questions, vocabulary help, and rewards* + +## Summary + +This skill transforms reading education by: +- **Instant Engagement** - Generates playgrounds immediately +- **Multi-Sensory** - Visual, audio, interactive elements +- **Developmentally Appropriate** - Age 1-10 coverage +- **Systematic** - Phonics-based progression +- **Gamified** - Stars, badges, celebrations +- **Effective** - Research-based methods +- **Fun** - Play-based learning + +**"Every child can learn to read with the right support and encouragement."** 📚 + +--- + +**Usage:** Ask for help with any reading skill - letter recognition, phonics, sight words, comprehension - and get an instant, interactive learning experience tailored to your child's level! diff --git a/skills/reading-teacher/references/comprehension.md b/skills/reading-teacher/references/comprehension.md new file mode 100644 index 0000000..109e5e2 --- /dev/null +++ b/skills/reading-teacher/references/comprehension.md @@ -0,0 +1,636 @@ +# Reading Comprehension Reference + +Strategies, question types, and interactive activities for developing reading comprehension. + +## Comprehension Strategies + +### Before Reading +```javascript +const beforeReadingStrategies = { + preview: { + name: 'Preview the Text', + steps: [ + 'Look at title and pictures', + 'Read headings and subheadings', + 'Predict what story is about', + 'Ask: What do I already know about this topic?' + ], + prompt: 'What do you think this story will be about?' + }, + + purpose: { + name: 'Set a Purpose', + steps: [ + 'Why am I reading this?', + 'What do I want to learn?', + 'How will I use this information?' + ], + prompt: 'What do you want to find out from this story?' + }, + + vocabulary: { + name: 'Preview Key Words', + steps: [ + 'Identify unfamiliar words', + 'Look at context', + 'Check pictures for clues', + 'Make predictions about meanings' + ], + prompt: 'Are there any new words? What might they mean?' + } +}; +``` + +### During Reading +```javascript +const duringReadingStrategies = { + visualize: { + name: 'Make Mental Pictures', + prompt: 'What do you see in your mind?', + activity: 'Draw what you\'re imagining' + }, + + question: { + name: 'Ask Questions', + prompts: [ + 'What is happening?', + 'Why did that happen?', + 'What will happen next?', + 'How does the character feel?' + ] + }, + + connect: { + name: 'Make Connections', + types: { + textToSelf: 'Has this happened to you?', + textToText: 'Does this remind you of another story?', + textToWorld: 'Where have you seen this in real life?' + } + }, + + clarify: { + name: 'Fix Confusions', + strategies: [ + 'Reread the sentence', + 'Read ahead for clues', + 'Look at pictures', + 'Sound out unfamiliar words', + 'Ask for help' + ] + }, + + predict: { + name: 'Make Predictions', + prompt: 'What do you think will happen next?', + check: 'Was your prediction correct?' + } +}; +``` + +### After Reading +```javascript +const afterReadingStrategies = { + summarize: { + name: 'Retell the Story', + framework: { + beginning: 'How did the story start?', + middle: 'What happened?', + end: 'How did it end?' + } + }, + + mainIdea: { + name: 'Find the Main Idea', + questions: [ + 'What is the story mostly about?', + 'What is the most important part?', + 'What did you learn?' + ] + }, + + evaluate: { + name: 'Think About the Story', + questions: [ + 'Did you like it? Why?', + 'What was your favorite part?', + 'Would you recommend this to a friend?', + 'What would you change?' + ] + } +}; +``` + +## Question Types + +### Literal Questions (Right There) +```javascript +const literalQuestions = { + who: 'Who is the main character?', + what: 'What happened in the story?', + when: 'When did this take place?', + where: 'Where does the story happen?', + how: 'How did the character solve the problem?', + + examples: [ + 'What color was the cat?', + 'Where did Tom go?', + 'Who helped Sally?', + 'When did they leave?' + ] +}; +``` + +### Inferential Questions (Think & Search) +```javascript +const inferentialQuestions = { + why: 'Why did the character do that?', + cause: 'What caused this to happen?', + effect: 'What happened because of...?', + feeling: 'How do you think the character felt?', + motive: 'Why did the character want...?', + + examples: [ + 'Why was the girl sad?', + 'How did the boy feel when...?', + 'What made the dog run away?', + 'Why didn\'t they tell anyone?' + ] +}; +``` + +### Evaluative Questions (Author & Me) +```javascript +const evaluativeQuestions = { + opinion: 'What do you think about...?', + judgment: 'Did the character make a good choice?', + alternative: 'What would you have done?', + theme: 'What lesson does this teach?', + + examples: [ + 'Was it right for her to...?', + 'What would you do in this situation?', + 'Do you agree with the character?', + 'What is the author trying to tell us?' + ] +}; +``` + +### Creative Questions (On My Own) +```javascript +const creativeQuestions = { + extend: 'What might happen next?', + change: 'How would the story be different if...?', + relate: 'How is this like your life?', + imagine: 'What if the character had...?', + + examples: [ + 'What would happen if the ending was different?', + 'How would you feel if you were the character?', + 'What other adventures might they have?', + 'If you could change one thing, what would it be?' + ] +}; +``` + +## Story Elements + +### Character Analysis +```javascript +const characterAnalysis = { + traits: { + prompt: 'What is the character like?', + evidence: 'How do you know?', + categories: ['brave', 'kind', 'funny', 'smart', 'curious', 'helpful'] + }, + + feelings: { + prompt: 'How does the character feel?', + changes: 'How do their feelings change?', + emotions: ['happy', 'sad', 'angry', 'scared', 'excited', 'surprised'] + }, + + actions: { + prompt: 'What does the character do?', + motives: 'Why do they do it?' + }, + + relationships: { + prompt: 'Who are the other characters?', + connections: 'How do they interact?' + } +}; +``` + +### Setting +```javascript +const settingAnalysis = { + where: { + prompt: 'Where does the story take place?', + details: 'Describe the place' + }, + + when: { + prompt: 'When does the story happen?', + clues: ['time of day', 'season', 'past/present/future'] + }, + + importance: { + prompt: 'Does the setting matter to the story?', + question: 'Would the story be different in a different place/time?' + } +}; +``` + +### Plot Structure +```javascript +const plotStructure = { + beginning: { + name: 'Introduction', + elements: ['characters', 'setting', 'situation'], + question: 'How does the story start?' + }, + + middle: { + name: 'Problem/Conflict', + elements: ['challenge', 'obstacle', 'quest'], + question: 'What problem do the characters face?' + }, + + climax: { + name: 'Turning Point', + elements: ['most exciting part', 'biggest challenge'], + question: 'What is the most important moment?' + }, + + end: { + name: 'Resolution', + elements: ['solution', 'outcome', 'lesson'], + question: 'How is the problem solved?' + } +}; +``` + +## Interactive Comprehension Activities + +### Story Map +```javascript +function createStoryMap() { + return { + title: '', + characters: { + main: [], + supporting: [] + }, + setting: { + where: '', + when: '' + }, + plot: { + beginning: '', + problem: '', + events: [], + solution: '', + ending: '' + }, + + display: function() { + return ` + 📖 ${this.title} + 👥 Characters: ${this.characters.main.join(', ')} + 📍 Setting: ${this.setting.where} (${this.setting.when}) + + Story: + Beginning: ${this.plot.beginning} + Problem: ${this.plot.problem} + Events: ${this.plot.events.join(' → ')} + Solution: ${this.plot.solution} + Ending: ${this.plot.ending} + `; + } + }; +} +``` + +### Question Generator +```javascript +function generateComprehensionQuestions(story, level) { + const questions = []; + + // Literal questions (ages 5-7) + if (level <= 2) { + questions.push({ + type: 'literal', + question: `Who is the main character in "${story.title}"?`, + answer: story.characters.main[0], + difficulty: 'easy' + }); + + questions.push({ + type: 'literal', + question: `Where does the story take place?`, + answer: story.setting.where, + difficulty: 'easy' + }); + } + + // Inferential questions (ages 7-9) + if (level >= 2) { + questions.push({ + type: 'inferential', + question: `Why do you think the character...?`, + answer: null, // Open-ended + difficulty: 'medium' + }); + + questions.push({ + type: 'inferential', + question: `How did the character feel when...?`, + answer: null, + difficulty: 'medium' + }); + } + + // Evaluative questions (ages 9+) + if (level >= 3) { + questions.push({ + type: 'evaluative', + question: `What would you have done differently?`, + answer: null, + difficulty: 'hard' + }); + } + + return questions; +} +``` + +### Cloze Reading (Fill in the Blank) +```javascript +function createClozeActivity(text, difficulty = 'medium') { + const words = text.split(' '); + const blanks = []; + + // Remove every Nth word based on difficulty + const interval = difficulty === 'easy' ? 10 : difficulty === 'medium' ? 7 : 5; + + const modified = words.map((word, index) => { + if (index % interval === 0 && word.length > 3) { + blanks.push({ + position: index, + word: word, + hint: word[0] + '_'.repeat(word.length - 1) + }); + return '______'; + } + return word; + }); + + return { + original: text, + modified: modified.join(' '), + blanks: blanks, + + check: function(userAnswers) { + let correct = 0; + userAnswers.forEach((answer, i) => { + if (answer.toLowerCase() === blanks[i].word.toLowerCase()) { + correct++; + } + }); + return { + correct: correct, + total: blanks.length, + percentage: Math.round((correct / blanks.length) * 100) + }; + }, + + getHint: function(blankIndex) { + return blanks[blankIndex].hint; + } + }; +} +``` + +### Sequence Activity +```javascript +function createSequenceActivity(events) { + const shuffled = shuffle([...events]); + + return { + events: events, + scrambled: shuffled, + userOrder: [], + + check: function() { + return { + correct: JSON.stringify(this.userOrder) === JSON.stringify(events), + correctOrder: events, + userOrder: this.userOrder + }; + }, + + hint: function() { + return `The story starts with: "${events[0]}"`; + } + }; +} +``` + +### Vocabulary in Context +```javascript +function createVocabularyActivity(text, targetWords) { + return targetWords.map(word => { + const sentence = findSentenceWith(text, word); + const context = getContext(text, word); + + return { + word: word, + sentence: sentence, + beforeContext: context.before, + afterContext: context.after, + + questions: [ + { + type: 'multiple-choice', + question: `What does "${word}" mean in this sentence?`, + options: generateDefinitionOptions(word), + answer: getCorrectDefinition(word) + }, + { + type: 'context-clue', + question: 'Which words help you understand the meaning?', + answer: getContextClues(sentence, word) + } + ], + + practice: { + blank: sentence.replace(word, '______'), + wordBank: [word, ...generateSimilarWords(word)], + correctWord: word + } + }; + }); +} +``` + +## Comprehension Games + +### Story Detective +```javascript +class StoryDetective { + constructor(story) { + this.story = story; + this.clues = []; + this.questions = []; + this.score = 0; + } + + addClue(question, answer, location) { + this.clues.push({ + question: question, + answer: answer, + found: false, + location: location + }); + } + + checkClue(clueIndex, userAnswer) { + const clue = this.clues[clueIndex]; + + if (userAnswer.toLowerCase().includes(clue.answer.toLowerCase())) { + clue.found = true; + this.score += 10; + return { + correct: true, + message: '🔍 Clue found! +10 points', + location: clue.location + }; + } + + return { + correct: false, + hint: `Look ${clue.location}`, + message: 'Keep searching!' + }; + } + + getProgress() { + const found = this.clues.filter(c => c.found).length; + return { + found: found, + total: this.clues.length, + percentage: Math.round((found / this.clues.length) * 100), + score: this.score + }; + } +} +``` + +### Reading Race +```javascript +class ReadingRace { + constructor(passage, questionsPerCheckpoint = 3) { + this.passage = passage; + this.checkpoints = this.createCheckpoints(questionsPerCheckpoint); + this.currentCheckpoint = 0; + this.startTime = null; + this.endTime = null; + } + + start() { + this.startTime = Date.now(); + } + + answerQuestion(answer) { + const checkpoint = this.checkpoints[this.currentCheckpoint]; + const question = checkpoint.questions[checkpoint.currentQuestion]; + + const correct = this.checkAnswer(answer, question.answer); + + if (correct) { + checkpoint.correct++; + checkpoint.currentQuestion++; + + if (checkpoint.currentQuestion >= checkpoint.questions.length) { + this.currentCheckpoint++; + return { + checkpointComplete: true, + message: `🏁 Checkpoint ${this.currentCheckpoint} complete!` + }; + } + } + + return { correct: correct }; + } + + finish() { + this.endTime = Date.now(); + const time = (this.endTime - this.startTime) / 1000; // seconds + + return { + time: time, + checkpoints: this.checkpoints.length, + accuracy: this.calculateAccuracy(), + rating: this.getRating(time, this.calculateAccuracy()) + }; + } +} +``` + +## Progress Tracking + +### Comprehension Skills Tracker +```javascript +class ComprehensionTracker { + constructor() { + this.skills = { + literal: { attempts: 0, correct: 0 }, + inferential: { attempts: 0, correct: 0 }, + evaluative: { attempts: 0, correct: 0 }, + vocabulary: { attempts: 0, correct: 0 }, + sequencing: { attempts: 0, correct: 0 }, + mainIdea: { attempts: 0, correct: 0 }, + causeEffect: { attempts: 0, correct: 0 } + }; + } + + record(skillType, correct) { + this.skills[skillType].attempts++; + if (correct) this.skills[skillType].correct++; + } + + getSkillLevel(skillType) { + const skill = this.skills[skillType]; + if (skill.attempts === 0) return 'Not Started'; + + const accuracy = skill.correct / skill.attempts; + + if (accuracy >= 0.9) return 'Mastered'; + if (accuracy >= 0.7) return 'Proficient'; + if (accuracy >= 0.5) return 'Developing'; + return 'Needs Practice'; + } + + getReport() { + return Object.entries(this.skills).map(([name, data]) => ({ + skill: name, + level: this.getSkillLevel(name), + accuracy: data.attempts > 0 ? Math.round((data.correct / data.attempts) * 100) : 0, + attempts: data.attempts + })); + } +} +``` + +## Summary + +Reading comprehension tools provide: +- Before, during, and after reading strategies +- Multiple question types (literal, inferential, evaluative, creative) +- Story element analysis (character, setting, plot) +- Interactive activities (story maps, cloze, sequencing) +- Comprehension games +- Progress tracking + +Use these patterns to create effective comprehension practice! diff --git a/skills/reading-teacher/references/phonics.md b/skills/reading-teacher/references/phonics.md new file mode 100644 index 0000000..56f8044 --- /dev/null +++ b/skills/reading-teacher/references/phonics.md @@ -0,0 +1,523 @@ +# Phonics Reference + +Systematic phonics instruction patterns and interactive activities. + +## Phonemic Awareness (Pre-Reading) + +### Sound Recognition +```javascript +const letterSounds = { + // Consonants + 'B': 'buh', 'C': 'kuh', 'D': 'duh', 'F': 'fuh', 'G': 'guh', + 'H': 'huh', 'J': 'juh', 'K': 'kuh', 'L': 'luh', 'M': 'muh', + 'N': 'nuh', 'P': 'puh', 'Q': 'kwuh', 'R': 'ruh', 'S': 'sss', + 'T': 'tuh', 'V': 'vuh', 'W': 'wuh', 'X': 'ks', 'Y': 'yuh', 'Z': 'zzz', + + // Vowels (short sounds) + 'A': 'ah (like apple)', 'E': 'eh (like egg)', + 'I': 'ih (like igloo)', 'O': 'ah (like octopus)', + 'U': 'uh (like umbrella)' +}; +``` + +### Rhyming Words +```javascript +const rhymePatterns = { + 'at': { + words: ['cat', 'bat', 'rat', 'hat', 'mat', 'sat', 'fat', 'pat'], + emoji: '🐱', + color: '#FF6B9D' + }, + 'an': { + words: ['can', 'man', 'pan', 'ran', 'van', 'fan', 'tan', 'ban'], + emoji: '👨', + color: '#4ECDC4' + }, + 'ig': { + words: ['big', 'dig', 'fig', 'pig', 'wig', 'jig'], + emoji: '🐷', + color: '#FFE66D' + }, + 'op': { + words: ['hop', 'mop', 'pop', 'top', 'stop', 'shop', 'drop'], + emoji: '🛑', + color: '#A8E6CF' + }, + 'ug': { + words: ['bug', 'hug', 'mug', 'rug', 'tug', 'jug', 'dug'], + emoji: '🐛', + color: '#FF8B94' + } +}; + +function createRhymeGame(pattern) { + const { words, emoji, color } = rhymePatterns[pattern]; + + return { + pattern: pattern, + words: words, + display: words.map(w => `${emoji} ${w}`), + checkRhyme: (word) => word.endsWith(pattern) + }; +} +``` + +## CVC Words (Consonant-Vowel-Consonant) + +### Short Vowel Sounds +```javascript +const cvcWords = { + 'a': [ + 'cat', 'bat', 'rat', 'hat', 'mat', 'sat', 'pat', 'fat', + 'can', 'man', 'pan', 'ran', 'van', 'fan', 'tan', 'ban', + 'bag', 'rag', 'tag', 'wag', 'sag', 'lag', + 'cap', 'map', 'tap', 'nap', 'gap', 'lap', 'rap', + 'dad', 'mad', 'sad', 'bad', 'had', 'pad' + ], + + 'e': [ + 'bed', 'red', 'led', 'fed', 'wed', + 'hen', 'pen', 'ten', 'den', 'men', + 'pet', 'net', 'set', 'wet', 'get', 'let', 'met', 'vet', + 'leg', 'peg', 'beg' + ], + + 'i': [ + 'big', 'dig', 'fig', 'pig', 'wig', 'jig', + 'bin', 'fin', 'pin', 'tin', 'win', 'din', + 'bit', 'fit', 'hit', 'kit', 'pit', 'sit', 'lit', + 'dip', 'hip', 'lip', 'rip', 'sip', 'tip', 'zip' + ], + + 'o': [ + 'dog', 'fog', 'log', 'hog', 'jog', + 'dot', 'hot', 'lot', 'not', 'pot', 'cot', 'got', + 'hop', 'mop', 'pop', 'top', 'stop', + 'box', 'fox', 'ox' + ], + + 'u': [ + 'bug', 'hug', 'mug', 'rug', 'tug', 'jug', 'dug', + 'bun', 'fun', 'run', 'sun', 'gun', + 'bus', 'pus', 'us', + 'but', 'cut', 'hut', 'nut', 'put' + ] +}; + +function generateCVCPractice(vowel, count = 5) { + const words = cvcWords[vowel]; + const selected = shuffle(words).slice(0, count); + + return selected.map(word => ({ + word: word, + letters: word.split(''), + vowel: vowel, + consonants: word.split('').filter(l => l !== vowel), + image: getWordImage(word) + })); +} +``` + +### Word Building Activity +```javascript +function createWordBuilder(targetWord) { + const letters = targetWord.split(''); + const allLetters = 'abcdefghijklmnopqrstuvwxyz'.split(''); + + // Create letter bank with correct letters plus distractors + const distractors = shuffle(allLetters.filter(l => !letters.includes(l))).slice(0, 3); + const letterBank = shuffle([...letters, ...distractors]); + + return { + target: targetWord, + letters: letterBank, + positions: Array(letters.length).fill(''), + + checkWord: function(builtWord) { + return builtWord === targetWord; + }, + + givHint: function() { + const firstLetter = letters[0]; + return `The word starts with "${firstLetter}"`; + } + }; +} +``` + +## Consonant Blends + +### Beginning Blends (2-letter) +```javascript +const beginningBlends = { + 'bl': ['blue', 'black', 'block', 'blend', 'bless', 'bleed'], + 'cl': ['clap', 'clam', 'class', 'climb', 'clock', 'close'], + 'fl': ['flag', 'flap', 'flat', 'flip', 'flock', 'flow'], + 'gl': ['glad', 'glass', 'glow', 'glue', 'globe'], + 'pl': ['plan', 'plant', 'play', 'please', 'plug', 'plum'], + 'sl': ['slam', 'slap', 'slip', 'slow', 'slug'], + + 'br': ['brain', 'branch', 'brave', 'bread', 'brick', 'bring'], + 'cr': ['crab', 'crack', 'crash', 'crib', 'crop', 'cross'], + 'dr': ['drag', 'drain', 'draw', 'dream', 'dress', 'drill'], + 'fr': ['frame', 'fresh', 'friend', 'frog', 'front', 'fruit'], + 'gr': ['grab', 'grade', 'grain', 'grass', 'green', 'grow'], + 'pr': ['pray', 'press', 'pretty', 'price', 'print', 'prize'], + 'tr': ['track', 'train', 'trash', 'tree', 'trick', 'truck'], + + 'sc': ['scale', 'scare', 'school', 'score', 'scout'], + 'sk': ['skate', 'sketch', 'ski', 'skill', 'skip', 'sky'], + 'sm': ['small', 'smart', 'smell', 'smile', 'smoke'], + 'sn': ['snack', 'snail', 'snake', 'snap', 'snow'], + 'sp': ['space', 'spark', 'speak', 'spell', 'spend', 'spin'], + 'st': ['stack', 'stamp', 'stand', 'star', 'start', 'stop'], + 'sw': ['swam', 'swap', 'sweep', 'sweet', 'swim', 'swing'] +}; +``` + +### Ending Blends +```javascript +const endingBlends = { + 'nd': ['and', 'band', 'hand', 'land', 'sand', 'stand', 'wind'], + 'ng': ['bang', 'king', 'long', 'ring', 'sing', 'song', 'wing'], + 'nk': ['bank', 'drink', 'pink', 'sink', 'tank', 'think', 'wink'], + 'nt': ['ant', 'bent', 'went', 'hunt', 'plant', 'sent', 'want'], + 'mp': ['camp', 'jump', 'lamp', 'pump', 'stamp'], + 'sk': ['ask', 'desk', 'mask', 'risk', 'task'], + 'st': ['best', 'fast', 'just', 'last', 'must', 'rest', 'test'] +}; +``` + +### Blend Practice Game +```javascript +function createBlendGame(blendType, blend) { + const words = beginningBlends[blend] || endingBlends[blend]; + + return { + blend: blend, + words: words, + sound: `"${blend}"`, + + displayWord: function(word) { + const parts = word.split(blend); + return { + before: parts[0], + blend: blend, + after: parts[1] || parts[0], + highlight: blend + }; + }, + + createChallenge: function() { + const correctWord = words[Math.floor(Math.random() * words.length)]; + const otherBlends = Object.keys(beginningBlends).filter(b => b !== blend); + const wrongBlend = otherBlends[Math.floor(Math.random() * otherBlends.length)]; + const wrongWord = beginningBlends[wrongBlend][0]; + + return { + question: `Which word has the "${blend}" sound?`, + options: shuffle([correctWord, wrongWord]), + answer: correctWord + }; + } + }; +} +``` + +## Digraphs + +### Consonant Digraphs +```javascript +const digraphs = { + 'ch': { + sound: 'ch (as in cheese)', + words: ['chain', 'chair', 'chalk', 'chap', 'chat', 'check', 'cheese', + 'chess', 'chest', 'chick', 'child', 'chill', 'chip', 'chop'], + emoji: '🧀' + }, + + 'sh': { + sound: 'sh (as in ship)', + words: ['shade', 'shake', 'shame', 'shape', 'share', 'shark', 'sharp', + 'sheep', 'shelf', 'shell', 'shine', 'ship', 'shirt', 'shop'], + emoji: '🚢' + }, + + 'th': { + sound: 'th (as in think)', + words: ['thank', 'that', 'them', 'then', 'there', 'these', 'thick', + 'thin', 'thing', 'think', 'third', 'this', 'thorn', 'three'], + emoji: '🤔' + }, + + 'wh': { + sound: 'wh (as in whale)', + words: ['whale', 'what', 'wheat', 'wheel', 'when', 'where', + 'which', 'while', 'whip', 'white', 'why'], + emoji: '🐋' + }, + + 'ph': { + sound: 'f (as in phone)', + words: ['phone', 'photo', 'phrase', 'physical'], + emoji: '📞' + } +}; +``` + +### Vowel Digraphs +```javascript +const vowelDigraphs = { + 'ai': { + sound: 'long a (as in rain)', + words: ['brain', 'chain', 'gain', 'mail', 'main', 'nail', 'pain', + 'rail', 'rain', 'sail', 'tail', 'train', 'wait'], + emoji: '🌧️' + }, + + 'ay': { + sound: 'long a (as in play)', + words: ['day', 'hay', 'jay', 'lay', 'may', 'pay', 'play', + 'ray', 'say', 'stay', 'tray', 'way'], + emoji: '🎮' + }, + + 'ea': { + sound: 'long e (as in eat)', + words: ['beach', 'bean', 'clean', 'dream', 'eat', 'leaf', 'mean', + 'meat', 'peas', 'read', 'seal', 'steam', 'teach', 'team'], + emoji: '🍃' + }, + + 'ee': { + sound: 'long e (as in tree)', + words: ['bee', 'feed', 'feel', 'free', 'green', 'knee', 'need', + 'seed', 'see', 'sleep', 'street', 'tree', 'three', 'wheel'], + emoji: '🌳' + }, + + 'oa': { + sound: 'long o (as in boat)', + words: ['boat', 'coat', 'float', 'goat', 'load', 'road', + 'soap', 'soak', 'toad', 'toast'], + emoji: '🚤' + }, + + 'ow': { + sound: 'long o (as in snow)', + words: ['blow', 'bow', 'flow', 'glow', 'grow', 'know', + 'low', 'mow', 'row', 'show', 'slow', 'snow'], + emoji: '❄️' + }, + + 'oo': { + sound: 'oo (as in moon)', + words: ['boom', 'boo', 'cool', 'food', 'moon', 'noon', + 'pool', 'room', 'soon', 'spoon', 'zoo'], + emoji: '🌙' + } +}; +``` + +## Silent Letters + +### Silent E (Magic E) +```javascript +const magicE = { + 'a_e': { + pattern: 'a + consonant + e', + sound: 'long a', + pairs: [ + { short: 'cap', long: 'cape' }, + { short: 'hat', long: 'hate' }, + { short: 'mad', long: 'made' }, + { short: 'tap', long: 'tape' }, + { short: 'can', long: 'cane' }, + { short: 'pan', long: 'pane' }, + { short: 'plan', long: 'plane' } + ] + }, + + 'i_e': { + pattern: 'i + consonant + e', + sound: 'long i', + pairs: [ + { short: 'bit', long: 'bite' }, + { short: 'kit', long: 'kite' }, + { short: 'pin', long: 'pine' }, + { short: 'rip', long: 'ripe' }, + { short: 'dim', long: 'dime' }, + { short: 'slid', long: 'slide' } + ] + }, + + 'o_e': { + pattern: 'o + consonant + e', + sound: 'long o', + pairs: [ + { short: 'hop', long: 'hope' }, + { short: 'not', long: 'note' }, + { short: 'rob', long: 'robe' }, + { short: 'rod', long: 'rode' }, + { short: 'con', long: 'cone' } + ] + }, + + 'u_e': { + pattern: 'u + consonant + e', + sound: 'long u', + pairs: [ + { short: 'cub', long: 'cube' }, + { short: 'cut', long: 'cute' }, + { short: 'tub', long: 'tube' }, + { short: 'us', long: 'use' } + ] + } +}; + +function createMagicEGame(vowel) { + const pattern = `${vowel}_e`; + const pairs = magicE[pattern].pairs; + + return { + pattern: pattern, + explanation: `Adding 'e' makes the ${vowel} say its name!`, + + showTransformation: function(pair) { + return { + before: `${pair.short} (short ${vowel})`, + after: `${pair.long} (long ${vowel})`, + animation: `${pair.short} → ${pair.long}` + }; + }, + + quiz: function() { + const pair = pairs[Math.floor(Math.random() * pairs.length)]; + return { + question: `Add magic 'e' to "${pair.short}"`, + answer: pair.long + }; + } + }; +} +``` + +### Other Silent Letters +```javascript +const silentLetters = { + 'silent k': { + words: ['knee', 'knife', 'knight', 'knit', 'knock', 'know'], + rule: 'K is silent before N' + }, + 'silent w': { + words: ['wrap', 'wrist', 'write', 'wrong', 'wreck'], + rule: 'W is silent before R' + }, + 'silent b': { + words: ['bomb', 'climb', 'comb', 'crumb', 'lamb', 'thumb'], + rule: 'B is silent after M' + }, + 'silent h': { + words: ['honest', 'honor', 'hour'], + rule: 'H is silent in some words' + }, + 'silent gh': { + words: ['high', 'light', 'night', 'right', 'fight', 'sight'], + rule: 'GH is silent in -ight words' + } +}; +``` + +## Interactive Phonics Activities + +### Sound Sorting Game +```javascript +function createSoundSortingGame(targetSound) { + const withSound = getWordsWithSound(targetSound); + const withoutSound = getRandomWords(5); + + return { + targetSound: targetSound, + allWords: shuffle([...withSound, ...withoutSound]), + + checkWord: function(word) { + return word.includes(targetSound); + }, + + feedback: function(word, userChoice) { + const correct = this.checkWord(word); + if (userChoice === correct) { + return { correct: true, message: `✓ Yes! "${word}" has "${targetSound}"` }; + } else { + return { correct: false, message: `Try again! Listen for "${targetSound}"` }; + } + } + }; +} +``` + +### Word Family Builder +```javascript +function buildWordFamily(ending) { + const consonants = 'bcdfghjklmnpqrstvwxyz'.split(''); + + const words = consonants + .map(c => c + ending) + .filter(word => isRealWord(word)); + + return { + family: `-${ending}`, + words: words, + pattern: `_${ending}`, + + display: function() { + return words.map(word => ({ + word: word, + highlight: ending, + display: `${word[0]} + ${ending} = ${word}` + })); + }, + + createPractice: function() { + const target = words[Math.floor(Math.random() * words.length)]; + const missing = target[0]; + + return { + question: `_${ending} = ${target}`, + answer: missing, + word: target + }; + } + }; +} +``` + +## Pronunciation Guides + +### Visual Phonics Symbols +```javascript +const phonicsSymbols = { + shortA: { symbol: 'ă', example: 'apple', mouth: '😮' }, + longA: { symbol: 'ā', example: 'ape', mouth: '😁' }, + shortE: { symbol: 'ĕ', example: 'egg', mouth: '😐' }, + longE: { symbol: 'ē', example: 'eat', mouth: '😊' }, + shortI: { symbol: 'ĭ', example: 'igloo', mouth: '🙂' }, + longI: { symbol: 'ī', example: 'ice', mouth: '😲' }, + shortO: { symbol: 'ŏ', example: 'octopus', mouth: '😯' }, + longO: { symbol: 'ō', example: 'open', mouth: '😮' }, + shortU: { symbol: 'ŭ', example: 'umbrella', mouth: '😐' }, + longU: { symbol: 'ū', example: 'use', mouth: '😗' } +}; +``` + +## Summary + +Phonics patterns provide: +- Systematic sound-letter correspondence +- Progressive skill building +- Interactive practice activities +- Visual and auditory learning +- Game-based engagement +- Clear pronunciation guides + +Use these patterns to create effective phonics playgrounds! diff --git a/skills/reading-teacher/references/sight_words.md b/skills/reading-teacher/references/sight_words.md new file mode 100644 index 0000000..6a9cff3 --- /dev/null +++ b/skills/reading-teacher/references/sight_words.md @@ -0,0 +1,506 @@ +# Sight Words Reference + +Comprehensive sight word lists organized by level (Dolch and Fry lists). + +## What Are Sight Words? + +Sight words are high-frequency words that appear often in text. Many don't follow regular phonics patterns, so children learn to recognize them instantly "by sight." + +**Why They Matter:** +- 50-75% of all text consists of these words +- Essential for reading fluency +- Enable focus on content, not decoding +- Build reading confidence + +## Dolch Sight Words + +### Pre-Kindergarten (40 words) + +```javascript +const dolchPreK = [ + 'a', 'and', 'away', 'big', 'blue', 'can', 'come', 'down', + 'find', 'for', 'funny', 'go', 'help', 'here', 'I', 'in', + 'is', 'it', 'jump', 'little', 'look', 'make', 'me', 'my', + 'not', 'one', 'play', 'red', 'run', 'said', 'see', 'the', + 'three', 'to', 'two', 'up', 'we', 'where', 'yellow', 'you' +]; + +const preKByCategory = { + colors: ['blue', 'red', 'yellow'], + numbers: ['one', 'two', 'three'], + actions: ['come', 'down', 'find', 'go', 'help', 'jump', 'look', 'make', 'play', 'run', 'see'], + descriptive: ['big', 'funny', 'little'], + pronouns: ['I', 'it', 'me', 'my', 'we', 'you'], + prepositions: ['in', 'to', 'up'], + other: ['a', 'and', 'away', 'can', 'for', 'here', 'is', 'not', 'said', 'the', 'where'] +}; +``` + +### Kindergarten (52 words) + +```javascript +const dolchKindergarten = [ + 'all', 'am', 'are', 'at', 'ate', 'be', 'black', 'brown', + 'but', 'came', 'did', 'do', 'eat', 'four', 'get', 'good', + 'have', 'he', 'into', 'like', 'must', 'new', 'no', 'now', + 'on', 'our', 'out', 'please', 'pretty', 'ran', 'ride', 'saw', + 'say', 'she', 'so', 'soon', 'that', 'there', 'they', 'this', + 'too', 'under', 'want', 'was', 'well', 'went', 'what', 'white', + 'who', 'will', 'with', 'yes' +]; +``` + +### First Grade (41 words) + +```javascript +const dolchFirstGrade = [ + 'after', 'again', 'an', 'any', 'as', 'ask', 'by', 'could', + 'every', 'fly', 'from', 'give', 'giving', 'had', 'has', 'her', + 'him', 'his', 'how', 'just', 'know', 'let', 'live', 'may', + 'of', 'old', 'once', 'open', 'over', 'put', 'round', 'some', + 'stop', 'take', 'thank', 'them', 'then', 'think', 'walk', 'were', + 'when' +]; +``` + +### Second Grade (46 words) + +```javascript +const dolchSecondGrade = [ + 'always', 'around', 'because', 'been', 'before', 'best', 'both', + 'buy', 'call', 'cold', 'does', 'don\'t', 'fast', 'first', 'five', + 'found', 'gave', 'goes', 'green', 'its', 'made', 'many', 'off', + 'or', 'pull', 'read', 'right', 'sing', 'sit', 'sleep', 'tell', + 'their', 'these', 'those', 'upon', 'us', 'use', 'very', 'wash', + 'which', 'why', 'wish', 'work', 'would', 'write', 'your' +]; +``` + +### Third Grade (41 words) + +```javascript +const dolchThirdGrade = [ + 'about', 'better', 'bring', 'carry', 'clean', 'cut', 'done', + 'draw', 'drink', 'eight', 'fall', 'far', 'full', 'got', 'grow', + 'hold', 'hot', 'hurt', 'if', 'keep', 'kind', 'laugh', 'light', + 'long', 'much', 'myself', 'never', 'only', 'own', 'pick', 'seven', + 'shall', 'show', 'six', 'small', 'start', 'ten', 'today', 'together', + 'try', 'warm' +]; +``` + +### Dolch Nouns (95 words) + +```javascript +const dolchNouns = [ + 'apple', 'baby', 'back', 'ball', 'bear', 'bed', 'bell', 'bird', + 'birthday', 'boat', 'box', 'boy', 'bread', 'brother', 'cake', 'car', + 'cat', 'chair', 'chicken', 'children', 'Christmas', 'coat', 'corn', + 'cow', 'day', 'dog', 'doll', 'door', 'duck', 'egg', 'eye', 'farm', + 'farmer', 'father', 'feet', 'fire', 'fish', 'floor', 'flower', 'game', + 'garden', 'girl', 'goodbye', 'grass', 'ground', 'hand', 'head', 'hill', + 'home', 'horse', 'house', 'kitty', 'leg', 'letter', 'man', 'men', + 'milk', 'money', 'morning', 'mother', 'name', 'nest', 'night', 'paper', + 'party', 'picture', 'pig', 'rabbit', 'rain', 'ring', 'robin', 'santa', + 'school', 'seed', 'sheep', 'shoe', 'sister', 'snow', 'song', 'squirrel', + 'stick', 'street', 'sun', 'table', 'thing', 'time', 'top', 'toy', + 'tree', 'watch', 'water', 'way', 'wind', 'window', 'wood' +]; +``` + +## Fry Sight Words + +### First 100 (Most Common) + +```javascript +const fryFirst100 = { + '1-25': [ + 'the', 'of', 'and', 'a', 'to', 'in', 'is', 'you', 'that', 'it', + 'he', 'was', 'for', 'on', 'are', 'as', 'with', 'his', 'they', 'I', + 'at', 'be', 'this', 'have', 'from' + ], + + '26-50': [ + 'or', 'one', 'had', 'by', 'words', 'but', 'not', 'what', 'all', 'were', + 'we', 'when', 'your', 'can', 'said', 'there', 'use', 'an', 'each', 'which', + 'she', 'do', 'how', 'their', 'if' + ], + + '51-75': [ + 'will', 'up', 'other', 'about', 'out', 'many', 'then', 'them', 'these', 'so', + 'some', 'her', 'would', 'make', 'like', 'him', 'into', 'time', 'has', 'look', + 'two', 'more', 'write', 'go', 'see' + ], + + '76-100': [ + 'number', 'no', 'way', 'could', 'people', 'my', 'than', 'first', 'water', 'been', + 'called', 'who', 'am', 'its', 'now', 'find', 'long', 'down', 'day', 'did', + 'get', 'come', 'made', 'may', 'part' + ] +}; +``` + +### Second 100 + +```javascript +const frySecond100 = { + '101-125': [ + 'over', 'new', 'sound', 'take', 'only', 'little', 'work', 'know', 'place', 'years', + 'live', 'me', 'back', 'give', 'most', 'very', 'after', 'things', 'our', 'just', + 'name', 'good', 'sentence', 'man', 'think' + ], + + '126-150': [ + 'say', 'great', 'where', 'help', 'through', 'much', 'before', 'line', 'right', 'too', + 'means', 'old', 'any', 'same', 'tell', 'boy', 'follow', 'came', 'want', 'show', + 'also', 'around', 'form', 'three', 'small' + ], + + '151-175': [ + 'set', 'put', 'end', 'does', 'another', 'well', 'large', 'must', 'big', 'even', + 'such', 'because', 'turn', 'here', 'why', 'asked', 'went', 'men', 'read', 'need', + 'land', 'different', 'home', 'us', 'move' + ], + + '176-200': [ + 'try', 'kind', 'hand', 'picture', 'again', 'change', 'off', 'play', 'spell', 'air', + 'away', 'animal', 'house', 'point', 'page', 'letter', 'mother', 'answer', 'found', 'study', + 'still', 'learn', 'should', 'America', 'world' + ] +}; +``` + +## Interactive Practice Activities + +### Sight Word Flash Cards +```javascript +function createFlashCards(wordList, timePerCard = 3000) { + let currentIndex = 0; + let correct = 0; + let total = 0; + + return { + words: shuffle(wordList), + currentWord: wordList[0], + + next: function() { + currentIndex = (currentIndex + 1) % this.words.length; + this.currentWord = this.words[currentIndex]; + return this.currentWord; + }, + + checkAnswer: function(userAnswer) { + total++; + const isCorrect = userAnswer.toLowerCase() === this.currentWord.toLowerCase(); + if (isCorrect) correct++; + + return { + correct: isCorrect, + word: this.currentWord, + score: `${correct}/${total}`, + percentage: Math.round((correct / total) * 100) + }; + }, + + getStats: function() { + return { + totalSeen: total, + totalCorrect: correct, + accuracy: total > 0 ? Math.round((correct / total) * 100) : 0 + }; + } + }; +} +``` + +### Word Search Game +```javascript +function createWordSearch(words, size = 10) { + const grid = Array(size).fill().map(() => Array(size).fill('')); + const placed = []; + + // Place words in grid + words.forEach(word => { + const direction = Math.random() < 0.5 ? 'horizontal' : 'vertical'; + const position = placeWord(grid, word, direction); + if (position) { + placed.push({ word, ...position }); + } + }); + + // Fill empty spaces with random letters + for (let i = 0; i < size; i++) { + for (let j = 0; j < size; j++) { + if (!grid[i][j]) { + grid[i][j] = String.fromCharCode(97 + Math.floor(Math.random() * 26)); + } + } + } + + return { + grid: grid, + words: words, + found: [], + + checkWord: function(selectedCells) { + const word = selectedCells.map(cell => grid[cell.row][cell.col]).join(''); + if (words.includes(word) && !this.found.includes(word)) { + this.found.push(word); + return { found: true, word: word }; + } + return { found: false }; + }, + + isComplete: function() { + return this.found.length === words.length; + } + }; +} +``` + +### Sentence Building +```javascript +function createSentenceBuilder(sightWords) { + const sentenceTemplates = [ + ['I', 'can', 'see', 'the', '{noun}'], + ['The', '{noun}', 'is', '{color}'], + ['We', 'like', 'to', '{action}'], + ['{name}', 'said', '{quote}'], + ['Look', 'at', 'the', '{adjective}', '{noun}'] + ]; + + const fillWords = { + noun: ['cat', 'dog', 'ball', 'sun', 'tree'], + color: ['red', 'blue', 'green', 'yellow'], + action: ['play', 'run', 'jump', 'read'], + name: ['Tom', 'Sue', 'Mom', 'Dad'], + quote: ['"hello"', '"stop"', '"help"'], + adjective: ['big', 'little', 'funny', 'pretty'] + }; + + return { + generate: function() { + const template = sentenceTemplates[Math.floor(Math.random() * sentenceTemplates.length)]; + const sentence = template.map(word => { + if (word.startsWith('{')) { + const type = word.slice(1, -1); + return fillWords[type][Math.floor(Math.random() * fillWords[type].length)]; + } + return word; + }); + + return { + sentence: sentence.join(' '), + words: sentence, + sightWords: sentence.filter(w => sightWords.includes(w.toLowerCase())) + }; + }, + + scramble: function() { + const { sentence, words } = this.generate(); + return { + correctOrder: words, + scrambled: shuffle([...words]), + answer: sentence + }; + } + }; +} +``` + +### Memory Match Game +```javascript +function createMemoryMatch(words) { + // Create pairs: word and image/definition + const pairs = words.map(word => [ + { type: 'word', content: word, id: `${word}-word` }, + { type: 'image', content: getWordImage(word), id: `${word}-image` } + ]).flat(); + + return { + cards: shuffle(pairs), + flipped: [], + matched: [], + + flip: function(cardId) { + if (this.flipped.length < 2 && !this.flipped.includes(cardId)) { + this.flipped.push(cardId); + + if (this.flipped.length === 2) { + return this.checkMatch(); + } + } + return { matched: false }; + }, + + checkMatch: function() { + const [id1, id2] = this.flipped; + const card1 = this.cards.find(c => c.id === id1); + const card2 = this.cards.find(c => c.id === id2); + + const word1 = id1.split('-')[0]; + const word2 = id2.split('-')[0]; + + if (word1 === word2) { + this.matched.push(id1, id2); + this.flipped = []; + return { matched: true, word: word1 }; + } + + // Reset after delay + setTimeout(() => { this.flipped = []; }, 1000); + return { matched: false }; + }, + + isComplete: function() { + return this.matched.length === this.cards.length; + } + }; +} +``` + +### Typing Practice +```javascript +function createTypingPractice(words) { + let currentWordIndex = 0; + let startTime = null; + let stats = { + correct: 0, + total: 0, + wpm: 0 + }; + + return { + currentWord: words[0], + + start: function() { + startTime = Date.now(); + }, + + check: function(typed) { + stats.total++; + const correct = typed === this.currentWord; + + if (correct) { + stats.correct++; + currentWordIndex = (currentWordIndex + 1) % words.length; + this.currentWord = words[currentWordIndex]; + } + + // Calculate WPM + const elapsed = (Date.now() - startTime) / 1000 / 60; // minutes + stats.wpm = Math.round(stats.correct / elapsed); + + return { + correct: correct, + accuracy: Math.round((stats.correct / stats.total) * 100), + wpm: stats.wpm + }; + }, + + getStats: function() { + return stats; + } + }; +} +``` + +## Word List Management + +### Adaptive Practice +```javascript +class AdaptiveSightWords { + constructor(allWords) { + this.allWords = allWords; + this.mastered = new Set(); + this.practicing = new Set(); + this.new = new Set(allWords); + } + + getNextWord() { + // 70% practicing, 20% new, 10% review mastered + const rand = Math.random(); + + if (rand < 0.7 && this.practicing.size > 0) { + return this.selectFrom(this.practicing); + } else if (rand < 0.9 && this.new.size > 0) { + const word = this.selectFrom(this.new); + this.new.delete(word); + this.practicing.add(word); + return word; + } else if (this.mastered.size > 0) { + return this.selectFrom(this.mastered); + } + + return this.selectFrom(this.allWords); + } + + recordResult(word, correct) { + if (correct) { + // Move to mastered after 3 correct in a row + if (!this.mastered.has(word)) { + this.practicing.delete(word); + this.mastered.add(word); + } + } else { + // Move back to practicing + this.mastered.delete(word); + this.practicing.add(word); + } + } + + selectFrom(set) { + const arr = Array.from(set); + return arr[Math.floor(Math.random() * arr.length)]; + } + + getProgress() { + return { + total: this.allWords.length, + mastered: this.mastered.size, + practicing: this.practicing.size, + new: this.new.size, + percentage: Math.round((this.mastered.size / this.allWords.length) * 100) + }; + } +} +``` + +## Visual Design Guidelines + +### Display Requirements +```javascript +const displaySettings = { + fontSize: { + preK: '48px', + kindergarten: '36px', + grade1: '32px', + grade2: '28px', + grade3: '24px' + }, + + colors: { + new: '#FF6B9D', // Pink - new words + practicing: '#FFE66D', // Yellow - practicing + mastered: '#4ECDC4' // Teal - mastered + }, + + timing: { + flashDuration: 3000, // 3 seconds per word + typingTimeout: 5000, // 5 seconds to type + memoryFlipDelay: 1000 // 1 second before flip back + } +}; +``` + +## Summary + +Sight word lists provide: +- Comprehensive Dolch and Fry word lists +- Grade-level organization +- Multiple practice modalities +- Adaptive learning systems +- Progress tracking +- Game-based activities + +Use these lists to create effective sight word practice! diff --git a/skills/reading-teacher/scripts/generate_game.sh b/skills/reading-teacher/scripts/generate_game.sh new file mode 100755 index 0000000..d291a9c --- /dev/null +++ b/skills/reading-teacher/scripts/generate_game.sh @@ -0,0 +1,304 @@ +#!/bin/bash + +# Reading Teacher - Game Generator +# Creates gamified reading challenges + +set -e + +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' + +print_success() { echo -e "${GREEN}✓ $1${NC}"; } +print_info() { echo -e "${BLUE}ℹ $1${NC}"; } + +prompt_select() { + local prompt="$1" + local var_name="$2" + shift 2 + local options=("$@") + echo -e "${BLUE}${prompt}${NC}" + PS3="Select (1-${#options[@]}): " + select opt in "${options[@]}"; do + if [ -n "$opt" ]; then + eval "$var_name='$opt'" + break + fi + done +} + +echo "" +echo "╔════════════════════════════════════════════════════════════╗" +echo "║ Reading Teacher - Game Generator 🎮 ║" +echo "╚════════════════════════════════════════════════════════════╝" +echo "" + +print_info "Step 1/3: Game Type" +prompt_select "What type of game?" GAME_TYPE \ + "Sight Word Speed Challenge" \ + "Phonics Matching Game" \ + "Word Building Adventure" \ + "Reading Comprehension Quiz" + +print_info "Step 2/3: Difficulty" +prompt_select "Difficulty level?" DIFFICULTY \ + "Easy (Kindergarten)" \ + "Medium (1st-2nd Grade)" \ + "Hard (3rd+ Grade)" + +print_info "Step 3/3: Output" +read -p "Game name (e.g., sight-word-game.html): " OUTPUT_FILE +OUTPUT_DIR="./reading-games" +mkdir -p "$OUTPUT_DIR" +OUTPUT_PATH="$OUTPUT_DIR/$OUTPUT_FILE" + +print_info "🎮 Generating your reading game..." + +cat > "$OUTPUT_PATH" << 'EOF' + + + + + + 📚 Reading Game Challenge + + + +
+

🎯 Sight Word Challenge

+ +
+
+
Score
+
0
+
+
+
Streak
+
0
+
+
+ +
+
60
+
the
+
+ + +
+ +
+ +
+

🎉 Time's Up!

+
0
+

+ +
+
+ + + + +EOF + +echo "" +print_success "Game created: $OUTPUT_PATH" +echo "" +print_info "🎮 To play:" +echo " open $OUTPUT_PATH" +echo "" +print_info "Game features:" +echo " ✓ 60-second challenge" +echo " ✓ Sight word practice" +echo " ✓ Streak bonuses" +echo " ✓ Keyboard controls (Space/Enter = Know, Arrow = Skip)" +echo " ✓ Progress tracking" +echo "" diff --git a/skills/reading-teacher/scripts/generate_playground.sh b/skills/reading-teacher/scripts/generate_playground.sh new file mode 100755 index 0000000..6e52be5 --- /dev/null +++ b/skills/reading-teacher/scripts/generate_playground.sh @@ -0,0 +1,302 @@ +#!/bin/bash + +# Reading Teacher - Interactive Playground Generator +# Creates instant, interactive reading learning experiences + +set -e + +# Colors +GREEN='\033[0;32m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +NC='\033[0m' + +print_success() { echo -e "${GREEN}✓ $1${NC}"; } +print_info() { echo -e "${BLUE}ℹ $1${NC}"; } + +prompt_select() { + local prompt="$1" + local var_name="$2" + shift 2 + local options=("$@") + echo -e "${BLUE}${prompt}${NC}" + PS3="Select (1-${#options[@]}): " + select opt in "${options[@]}"; do + if [ -n "$opt" ]; then + eval "$var_name='$opt'" + break + fi + done +} + +echo "" +echo "╔════════════════════════════════════════════════════════════╗" +echo "║ Reading Teacher - Playground Generator 📚 ║" +echo "╚════════════════════════════════════════════════════════════╝" +echo "" + +print_info "Step 1/4: Age Group" +prompt_select "Choose age group:" AGE_GROUP \ + "Toddler (Ages 1-3)" \ + "Preschool (Ages 3-5)" \ + "Early Elementary (Ages 5-7)" \ + "Elementary (Ages 7-10)" + +print_info "Step 2/4: Reading Skill" +case $AGE_GROUP in + "Toddler (Ages 1-3)") + prompt_select "Which skill?" SKILL \ + "Letter Recognition" \ + "Letter Sounds" \ + "Alphabet Song" + ;; + "Preschool (Ages 3-5)") + prompt_select "Which skill?" SKILL \ + "Phonics - CVC Words" \ + "Letter Matching" \ + "Rhyming Words" + ;; + "Early Elementary (Ages 5-7)") + prompt_select "Which skill?" SKILL \ + "Sight Words" \ + "Word Families" \ + "Simple Sentences" + ;; + "Elementary (Ages 7-10)") + prompt_select "Which skill?" SKILL \ + "Reading Comprehension" \ + "Vocabulary Building" \ + "Story Sequencing" + ;; +esac + +print_info "Step 3/4: Activity Type" +prompt_select "Type of activity?" ACTIVITY_TYPE \ + "Interactive Explorer" \ + "Practice Game" \ + "Timed Challenge" + +print_info "Step 4/4: Output" +read -p "Playground name (e.g., letter-land.html): " OUTPUT_FILE +OUTPUT_DIR="./reading-playgrounds" +mkdir -p "$OUTPUT_DIR" +OUTPUT_PATH="$OUTPUT_DIR/$OUTPUT_FILE" + +print_info "📚 Generating your reading playground..." + +# Generate based on skill (showing letter recognition as example) +cat > "$OUTPUT_PATH" << 'EOF' + + + + + + 📚 Reading Playground + + + +
+

🌈 Letter Land Adventure!

+
Stars: 0
+
+ +
A
+ +
+ Click the letter to hear its name and sound! +
+ +
+ + + +
+ + + + +EOF + +echo "" +print_success "Playground created: $OUTPUT_PATH" +echo "" +print_info "🚀 To use:" +echo " open $OUTPUT_PATH" +echo "" +print_info "Features:" +echo " ✓ Interactive letter display" +echo " ✓ Audio pronunciation (if supported)" +echo " ✓ Star rewards" +echo " ✓ Practice game mode" +echo " ✓ Colorful, engaging design" +echo ""