Issue: Players found it difficult to click precisely on the mole text,
especially on mobile or with fast-paced gameplay.
Fix:
- Changed click event from hole.mole (text only) to hole.element (entire hole circle)
- Makes the entire circular hole clickable, not just the word
- Much easier to target, especially on small screens
- Applied to both WhackAMole and WhackAMoleHard
Changes:
- src/games/WhackAMole.js:719 - Click on hole.element instead of hole.mole
- src/games/WhackAMoleHard.js:862 - Click on hole.element instead of hole.mole
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Issue: Game failed with "No suitable content available for flashcards"
even when chapter had vocabulary data.
Root Cause:
- FlashcardLearning.init() tried window.contentLoader.getContent() first
- This synchronous utils ContentLoader might not have content yet
- Game already receives content via dependencies from GameLoader
Fix:
- Prioritize this._content (from dependencies) first
- Only fallback to window.contentLoader if no dependency content
- Content is guaranteed to be loaded by GameLoader before init()
Changes:
- src/games/FlashcardLearning.js:178 - Reversed content loading priority
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
🐛 Bug Fixed:
"Module name must be a non-empty string" errors throughout RiverRun gameplay
🔍 Root Causes:
1. Module constructor not ensuring this.name is always defined
2. EventBus.emit() calls missing required third parameter (moduleName)
3. GameLoader may instantiate modules without providing a name
🔧 Solutions Applied:
**Constructor (lines 5, 11-14):**
- Added fallback: super(name || 'river-run', ['eventBus'])
- Explicit check: if (!this.name) this.name = 'river-run'
- Guarantees this.name is always 'river-run' if undefined
**_collectWord() (line 617):**
- Added missing third parameter to emit call
- Before: emit('game:score-update', {...})
- After: emit('game:score-update', {...}, this.name)
**_endGame() (line 719):**
- Added fallback for module name in emit
- emit('game:end', {...}, this.name || 'river-run')
✅ Result:
- All EventBus validation passes
- Game works during gameplay (collecting words, scoring)
- Game Over screen works without errors
- Play Again button works correctly
🎮 Tested:
- Launch game ✅
- Collect correct words ✅
- Miss words ✅
- Game over ✅
- Replay ✅🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
🔧 Changes:
- StoryReader now handles both old/new text structures (original_language vs content)
- Fixed memory leak: properly remove global event listeners on destroy
- Added null check in _hideWordPopup() to prevent errors after DOM cleanup
- Fixed chapter list display (was showing only one chapter instead of all)
- Smart routing: only load chapter content when needed
- Use module ContentLoader for proper content loading with vocabulary
🐛 Bugs Fixed:
1. "Cannot read properties of undefined (reading 'split')" - StoryReader couldn't handle texts with 'content' field
2. "Cannot read properties of null (reading 'style')" - Event listeners firing after game cleanup
3. Chapter list showing only book ID instead of all chapters
4. Game compatibility scores dropping to 0.00 after navigation
✨ Architecture Improvements:
- Event listener cleanup follows best practices
- Proper handler reference storage for removeEventListener
- Defensive programming with null checks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add AIReportSystem.js for detailed AI response capture and report generation
- Add AIReportInterface.js UI component for report access and export
- Integrate AI reporting into LLMValidator and SmartPreviewOrchestrator
- Add missing modules to Application.js configuration (unifiedDRS, smartPreviewOrchestrator)
- Create missing content/chapters/sbs.json for book metadata
- Enhance Application.js with debug logging for module loading
- Add multi-format export capabilities (text, HTML, JSON)
- Implement automatic learning insights extraction from AI feedback
- Add session management and performance tracking for AI reports
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Major Changes:
- Moved legacy system to Legacy/ folder for archival
- Built new modular architecture with strict separation of concerns
- Created core system: Module, EventBus, ModuleLoader, Router
- Added Application bootstrap with auto-start functionality
- Implemented development server with ES6 modules support
- Created comprehensive documentation and project context
- Converted SBS-7-8 content to JSON format
- Copied all legacy games and content to new structure
New Architecture Features:
- Sealed modules with WeakMap private data
- Strict dependency injection system
- Event-driven communication only
- Inviolable responsibility patterns
- Auto-initialization without commands
- Component-based UI foundation ready
Technical Stack:
- Vanilla JS/HTML/CSS only
- ES6 modules with proper imports/exports
- HTTP development server (no file:// protocol)
- Modular CSS with component scoping
- Comprehensive error handling and debugging
Ready for Phase 2: Converting legacy modules to new architecture
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>