File size: 19,918 Bytes
4f625d4 c1c3381 4f625d4 c1c3381 6829252 c1c3381 6829252 c1c3381 6829252 c1c3381 4f625d4 5f8a848 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 6829252 4f625d4 6829252 4f625d4 6829252 c1c3381 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 6829252 5f8a848 4f625d4 6829252 4f625d4 6829252 4f625d4 6829252 4f625d4 6829252 c1c3381 4f625d4 6829252 4f625d4 6829252 c1c3381 6829252 c1c3381 6829252 4f625d4 6829252 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 6829252 4f625d4 6829252 4f625d4 6829252 4f625d4 c1c3381 6829252 4f625d4 6829252 4f625d4 6829252 4f625d4 6829252 c1c3381 4f625d4 c1c3381 4f625d4 c1c3381 4f625d4 c1c3381 6829252 c1c3381 6829252 c1c3381 4f625d4 6829252 c1c3381 6829252 c1c3381 5f8a848 c1c3381 4f625d4 c1c3381 4f625d4 6829252 4f625d4 6829252 c1c3381 4f625d4 6829252 c1c3381 4f625d4 6829252 c1c3381 6829252 c1c3381 5f8a848 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# Wrdler - Project Context
## Project Overview
Wrdler is a simplified vocabulary puzzle game based on BattleWords, with these key differences:
- **8x6 grid** (instead of 12x12)
- **One word per row, horizontal only** (no vertical words)
- **No scope/radar visualization**
- **2 free letter guesses at game start** (all instances of chosen letters are revealed)
**Current Version:** 0.0.4
**Repository:** https://github.com/Oncorporation/Wrdler.git
**Live Demo:** [DEPLOYMENT_URL_HERE]
## Recent Changes
**v0.0.4 (Current):**
- β
Version updated in `__init__.py` to 0.0.4
- β
Documentation synchronized across all files
- β
Project structure validated and consistent
- β
All Phase 1 requirements complete (7 sprints)
- β
100% test coverage (25/25 tests passing)
- **Status: Ready for deployment!** π
**v0.0.2-0.0.3 (Previous):**
- β
All 7 sprints complete (12.75 hours development time)
- β
Core data models updated for rectangular 8Γ6 grid
- β
Generator refactored for horizontal-only, one-per-row placement
- β
Radar/scope visualization removed (~217 lines)
- β
Free letter selection UI with circular green gradient buttons
- β
Grid UI updated for 8Γ6 display with responsive layout
- β
Comprehensive integration testing suite
- β
Complete documentation (GAMEPLAY_GUIDE.md)
- β
Fixed duplicate rendering call bug
- β
PWA support with service worker and manifest
## Core Gameplay
- 8x6 grid with 6 hidden words (one per row, horizontal only)
- **Word composition:** 2 four-letter words, 2 five-letter words, 2 six-letter words
- No scope/radar visualization
- Players start by choosing 2 letters; all instances are revealed
- Players click cells to reveal letters or empty spaces
- After revealing a letter, players can guess words
- Scoring: word length + bonus for unrevealed letters
- Game ends when all words are guessed or all word letters are revealed
- Incorrect guess history with optional display (enabled by default)
- 10 incorrect guess limit per game
- **β
IMPLEMENTED:** Challenge Mode with game sharing via short URLs
- **β
IMPLEMENTED:** Remote storage via Hugging Face datasets
- **β
IMPLEMENTED:** PWA install support (v0.2.28+)
- **PLANNED:** Local persistent storage for game results and high scores (v0.3.0)
### Scoring Tiers
- **Fantastic:** 42+ points
- **Great:** 38-41 points
- **Good:** 34-37 points
- **Keep practicing:** < 34 points
## Technical Architecture
### Technology Stack
- **Framework:** Streamlit 1.51.0
- **Language:** Python 3.12.8 (requires >=3.12, <3.13)
- **Visualization:** Matplotlib (>=3.8)
- **HTTP Requests:** requests (>=2.31.0)
- **Remote Storage:** huggingface_hub (>=0.20.0)
- **Environment:** python-dotenv (>=1.0.0)
- **Testing:** Pytest
- **Package Manager:** UV or pip
### Project Structure
```
wrdler/
βββ app.py # Streamlit entry point
βββ wrdler/ # Main package
β βββ __init__.py # Version: 0.0.4
β βββ models.py # Data models (Coord, Word, Puzzle, GameState)
β βββ generator.py # Puzzle generation with deterministic seeding
β βββ logic.py # Game mechanics (reveal, guess, scoring)
β βββ ui.py # Streamlit UI
β βββ word_loader.py # Word list management
β βββ audio.py # Background music system
β βββ sounds.py # Sound effects management
β βββ generate_sounds.py # Sound generation utilities
β βββ game_storage.py # HF game storage wrapper
β βββ version_info.py # Version display
β βββ modules/ # Shared utility modules (from OpenBadge)
β β βββ __init__.py # Module exports
β β βββ storage.py # HuggingFace storage & URL shortener
β β βββ storage.md # Storage module documentation
β β βββ constants.py # Storage-related constants (trimmed)
β β βββ file_utils.py # File utility functions
β βββ words/ # Word list files
β βββ classic.txt # Default word list
β βββ fourth_grade.txt # Elementary word list
β βββ wordlist.txt # Full word list
βββ tests/ # Unit tests
β βββ test_sprint6_integration.py # Comprehensive integration tests
βββ specs/ # Documentation
β βββ specs.md # Game specifications
β βββ requirements.md # Implementation requirements
β βββ wrdler_implementation_plan.md # Sprint planning summary
βββ static/ # PWA assets
β βββ manifest.json # PWA manifest
β βββ service-worker.js # Service worker for offline caching
β βββ icons/ # App icons
βββ .env # Environment variables (HF credentials)
βββ pyproject.toml # Project metadata
βββ requirements.txt # Dependencies
βββ uv.lock # UV lock file
βββ Dockerfile # Container deployment
βββ README.md # User-facing documentation
βββ CLAUDE.md # This file - project context for Claude
βββ GAMEPLAY_GUIDE.md # User guide with tips and strategies
βββ RELEASE_NOTES_v0.0.4.md # Complete release documentation
```
## Key Features
### Game Modes
1. **Classic Mode:** Allows consecutive guessing after correct answers
2. **Too Easy Mode:** Single guess per reveal
### Audio & Visual Effects
- **Background Music:** Toggleable ocean-themed background music with volume control
- **Sound Effects:** Hit/miss/correct/incorrect guess sounds with volume control
- **Ocean Theme:** Gradient animated background with wave effects
- **Incorrect Guess History:** Visual display of wrong guesses (toggleable in settings)
### β
Challenge Mode & Remote Storage (v0.2.20+)
- **Game ID System:** Short URL-based challenge sharing
- Format: `?game_id=<sid>` in URL (shortened URL reference)
- Each player gets different random words from the same wordlist
- Enables fair challenges between players
- Stored in Hugging Face dataset repository
- **Remote Storage via HuggingFace Hub:**
- Per-game settings JSON in `games/{uid}/settings.json`
- Shortened URL mapping in `shortener.json`
- Multi-user leaderboards with score, time, and difficulty tracking
- Results sorted by: highest score β fastest time β highest difficulty
- **Challenge Features:**
- Submit results to existing challenges
- Create new challenges from any completed game
- Top 5 leaderboard display in Challenge Mode banner
- Optional player names (defaults to "Anonymous")
- Word list difficulty calculation and display (v0.2.29)
- "Show Challenge Share Links" toggle (default OFF) to control URL visibility (v0.2.27)
### β
Progressive Web App (PWA) Support (v0.2.28+)
- **PWA Installation:** App is installable as a Progressive Web App on desktop and mobile
- Service worker for basic offline caching of static assets
- Manifest.json with app metadata and icons
- Platform-specific installation instructions in INSTALL_GUIDE.md
- No gameplay logic changes required
- Works offline for basic functionality
### PLANNED: Local Player Storage (v0.3.0)
- **Local Storage:**
- Location: `~/.wrdler/data/`
- Files: `game_results.json`, `highscores.json`
- Privacy-first: no cloud dependency, offline-capable
- **Personal High Scores:**
- Top 100 scores tracked automatically on local machine
- Filterable by wordlist and game mode
- High score sidebar expander display
- **Player Statistics:**
- Games played, average score, best score
- Fastest completion time
- Per-player history on local device
### Puzzle Generation
- Horizontal-only word placement (one per row in 8Γ6 grid)
- **Word length distribution:** Each puzzle contains exactly 2 four-letter words, 2 five-letter words, and 2 six-letter words
- Deterministic seeding support for reproducible puzzles
- No word spacing configuration (fixed one word per row)
- Validation ensures no overlaps, proper bounds, correct word distribution
### UI Components (v0.0.2 - Implemented)
- **Game Grid:** Interactive 8Γ6 button grid (48 cells) with responsive layout
- **Free Letter Selection:** Circular green gradient buttons (2 at game start)
- **Score Panel:** Real-time scoring with client-side JavaScript timer
- **Settings Sidebar:**
- Word list picker (classic, fourth_grade, wordlist)
- Game mode selector (Classic, Too Easy)
- Audio volume controls (music and effects separate)
- Toggle for incorrect guess history display
- Player name input
- "Show Challenge Share Links" toggle (default OFF)
- Enable/disable sound effects checkbox
- Enable/disable background music checkbox
- **Theme System:** Ocean gradient background with CSS animations
- **Game Over Dialog:** Final score display with tier ranking
- **Incorrect Guess Display:** Shows history of wrong guesses with count
- **Challenge Mode UI:**
- Challenge Mode banner with leaderboard (top 5 players)
- Share challenge button in game over dialog
- Submit result or create new challenge options
- Word list difficulty display
- **PLANNED (v0.3.0):** Local high scores expander and personal statistics display
### Development Status
**Current Version:** v0.0.4 (Complete)
- β
All 7 sprints complete
- β
100% test coverage (25/25 tests)
- β
Ready for production deployment
- β
PWA support implemented
- β
Challenge Mode fully functional
- π Development time: ~12.75 hours (sprints 1-7)
- π Complete documentation
**Next Version:** v0.3.0 (Planned)
- π Local storage module (`wrdler/local_storage.py`)
- π Personal high score tracking (local JSON files)
- π High score sidebar UI display
- π Player statistics tracking and display
## Data Models
### Core Classes
```python
@dataclass
class Coord:
x: int # row, 0-based
y: int # col, 0-based
@dataclass
class Word:
text: str
start: Coord
direction: Direction # "H" or "V"
cells: List[Coord]
@dataclass
class Puzzle:
words: List[Word]
radar: List[Coord]
may_overlap: bool
spacer: int
uid: str # Unique identifier for caching
@dataclass
class GameState:
grid_size: int
puzzle: Puzzle
revealed: Set[Coord]
guessed: Set[str]
score: int
last_action: str
can_guess: bool
game_mode: str
points_by_word: Dict[str, int]
start_time: Optional[datetime]
end_time: Optional[datetime]
```
## Development Workflow
### Running Locally
```bash
# Install dependencies
uv pip install -r requirements.txt --link-mode=copy
# Run app
uv run streamlit run app.py
# or
streamlit run app.py
```
### Docker Deployment
```bash
docker build -t wrdler .
docker run -p 8501:8501 wrdler
```
### Testing
```bash
pytest tests/
```
### Environment Variables (for Challenge Mode)
Challenge Mode requires HuggingFace Hub access for remote storage. Create a `.env` file in the project root:
```bash
# Required for Challenge Mode
HF_API_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxx # or HF_TOKEN
HF_REPO_ID=YourUsername/YourRepo # Target HF dataset repo
SPACE_NAME=YourUsername/Wrdler # Your HF Space name
# Optional
CRYPTO_PK= # Reserved for future signing
```
**How to get your HF_API_TOKEN:**
1. Go to https://huggingface.co/settings/tokens
2. Create a new token with `write` access
3. Add to `.env` file as `HF_API_TOKEN=hf_...`
**HF_REPO_ID Structure:**
The dataset repository will contain:
- `shortener.json` - Short URL mappings
- `games/{uid}/settings.json` - Per-game challenge data
- `games/{uid}/result.json` - Optional detailed results
**Note:** The app will work without these variables but Challenge Mode features (sharing, leaderboards) will be disabled.
## Git Configuration & Deployment
**Current Branch:** main
**Purpose:** Wrdler - vocabulary puzzle game with simplified 8x6 grid
**Main Branch:** main
### Remotes
- **ONCORP (origin):** https://github.com/Oncorporation/Wrdler.git (main repository)
- **Hugging Face Spaces:** https://huggingface.co/spaces/[USERNAME]/Wrdler (live deployment)
### Deployment Platforms
1. **Hugging Face Spaces** (Primary) - Dockerfile deployment
2. **Local Development** - Streamlit run
3. **Docker** - Containerized deployment
4. **PWA** - Installable web app on any platform
## Sprint Summary (v0.0.2 - Complete)
| Sprint | Description | Time | Tests | Status |
|--------|-------------|------|-------|--------|
| Sprint 1 | Core Data Models | 3h | 13/13 β
| Complete |
| Sprint 2 | Puzzle Generator | 3h | 5/5 β
| Complete |
| Sprint 3 | Remove Radar | 0.5h | N/A | Complete |
| Sprint 4 | Free Letters UI | 2h | Manual β
| Complete |
| Sprint 5 | Grid UI Updates | 1.25h | Syntax β
| Complete |
| Sprint 6 | Integration Testing | 2h | 7/7 β
| Complete |
| Sprint 7 | Documentation | 1h | N/A | Complete |
| **Total** | **All Features** | **12.75h** | **25/25** | **Complete β
** |
**Status:** Ready for deployment! π
## Post-v0.0.2 Enhancements
### v0.2.20-0.2.29 (Challenge Mode & PWA)
- Remote storage and game sharing via HF datasets
- Multi-user leaderboards
- PWA support with offline caching
- Word list difficulty calculation
- Privacy controls for challenge sharing
- Sound effect and music system improvements
## Future Roadmap
### v0.3.0 (Next Phase)
- Local persistent storage module (`~/.wrdler/data/`)
- High score tracking and display
- Player statistics tracking
- Enhanced UI animations
### v1.0.0 (Long Term)
- Multiple difficulty levels
- Daily puzzle mode
- Internationalization (i18n)
- Performance optimizations
- Advanced word list management
## Deployment Targets
- **Hugging Face Spaces:** Primary deployment platform (Dockerfile-based)
- **Docker:** Containerized deployment for any platform
- **Local:** Development and testing
- **PWA:** Installable on desktop and mobile devices
### Privacy & Data (v0.0.4)
- **Challenge Mode:** Optional remote storage via Hugging Face datasets
- Player names optional (defaults to "Anonymous")
- Only stores: word lists, scores, times, game modes
- No PII beyond optional player name
- User controls URL visibility via "Show Challenge Share Links" toggle
- **Local Storage (v0.3.0 - Planned):**
- Location: `~/.wrdler/data/`
- Privacy-first, offline-capable
- Easy to delete
- No cloud dependency
## Notes for Claude
### Technical Implementation
- β
Project uses modern Python features (3.12.8)
- β
Requires Python >=3.12, <3.13 per pyproject.toml
- β
Heavy use of Streamlit session state for game state management
- β
Client-side JavaScript for timer updates without page refresh
- β
CSS heavily customized for ocean theme aesthetics
- β
All file paths should be absolute when working in WSL environment
- β
Game IDs are deterministic for consistent sharing
- β
8Γ6 rectangular grid (grid_rows=6, grid_cols=8)
- β
Horizontal-only word placement (one per row)
- β
Radar/scope visualization removed entirely
- β
Free letter selection UI implemented with circular buttons
- β
PWA injection via Docker build script (`inject-pwa-head.sh`)
### Key Implementation Details
- **No radar field in Puzzle dataclass** - removed in Sprint 3
- **No vertical word placement** - horizontal only ("H" direction)
- **Fixed grid dimensions** - always 8x6 (grid_cols=8, grid_rows=6)
- **One word per row** - exactly 6 words total
- **Word length requirement** - exactly 2 four-letter words, 2 five-letter words, and 2 six-letter words per puzzle
- **Free letters tracked** - `free_letters` set and `free_letters_used` counter
- **Auto-completion** - words auto-marked when all letters revealed
- **Incorrect guess limit** - maximum 10 per game
### WSL Environment Python Versions
The development environment is WSL (Windows Subsystem for Linux) with access to both native Linux and Windows Python installations:
**Native WSL (Linux):**
- `python3` β Python 3.10.12 (`/usr/bin/python3`)
- `python3.10` β Python 3.10.12
**Windows Python (accessible via WSL):**
- `python311.exe` β Python 3.11.9 (`/mnt/c/Users/cfettinger/AppData/Local/Programs/Python/Python311/`)
- `python3.13.exe` β Python 3.13.1 (`/mnt/c/ProgramData/chocolatey/bin/`)
**Note:** Windows Python executables (`.exe`) can be invoked directly from WSL and are useful for testing compatibility across Python versions. The project targets Python 3.12.8 specifically but requires >=3.12, <3.13 per pyproject.toml.
## Documentation Structure
This file (CLAUDE.md) serves as a **living context document** for AI-assisted development:
- **[specs/specs.md](specs/specs.md)** - Game rules, requirements, and feature specifications
- **[specs/requirements.md](specs/requirements.md)** - Implementation requirements and acceptance criteria
- **[GAMEPLAY_GUIDE.md](GAMEPLAY_GUIDE.md)** - User guide with tips and strategies
- **[INSTALL_GUIDE.md](INSTALL_GUIDE.md)** - PWA installation instructions
- **[README.md](README.md)** - User-facing documentation, installation guide, and complete changelog
- **[Dockerfile](Dockerfile)** - Container deployment configuration with PWA injection
- **[pyproject.toml](pyproject.toml)** - Python project metadata and dependencies
**When to use each:**
- **specs.md** - Understanding game rules and scoring system
- **requirements.md** - Implementation status and acceptance criteria
- **CLAUDE.md** - Quick reference for codebase and development context
- **GAMEPLAY_GUIDE.md** - How to play the game
- **README.md** - Public-facing info, setup instructions, and complete changelog
- **INSTALL_GUIDE.md** - Installing Wrdler as a PWA
- **Dockerfile** - Deployment configuration and container setup
## Challenge Mode & Remote Storage
- β
Challenge Mode allows sharing games via short links (`?game_id=<sid>`)
- β
Results stored in Hugging Face dataset repos via `game_storage.py`
- β
Leaderboard sorted by: highest score β fastest time β highest difficulty
- β
Multi-user challenges with top 5 display
- β
Optional sharing (controlled by "Show Challenge Share Links" toggle, default OFF)
- β
Word list difficulty calculation (v0.2.29)
- β
iframe embedding support with `&iframe_host=` parameter (v0.2.23)
## Known Issues
### Active
- β Word list loading bug: the app may not select the proper word lists in some environments. Investigate `word_loader.get_wordlist_files()` / `load_word_list()` and sidebar selection persistence to ensure the chosen file is correctly used by the generator.
### Resolved
- β
Duplicate rendering call bug (fixed in v0.0.2)
- β
Music looping on congratulations screen (fixed in v0.2.12)
- β
Sound effect and music volume wiring (fixed in v0.2.18, v0.2.19)
- β
Sonar grid alignment (removed in Sprint 3)
- β
Challenge mode link issues (fixed in v0.2.22)
## Dependencies
From `requirements.txt`:
- streamlit>=1.51.0 (primary framework)
- matplotlib>=3.8 (visualization)
- requests>=2.31.0 (HTTP requests)
- huggingface_hub>=0.20.0 (remote storage)
- python-dotenv>=1.0.0 (environment variables)
From `pyproject.toml`:
- Python >=3.12, <3.13 (strict version requirement)
## Version History Summary
- **v0.0.4** (Current) - Documentation sync, version update
- **v0.0.2-0.0.3** - All 7 sprints complete, core Wrdler features
- **v0.2.20-0.2.29** - Challenge Mode, PWA, remote storage (inherited from BattleWords)
- **v0.1.x** - Initial BattleWords releases before Wrdler fork
See README.md for complete changelog.
---
**Last Updated:** 2025-01-31
**Current Version:** 0.0.4
**Status:** Production Ready - All Features Complete β
## Test File Location
All test files must be placed in the `/tests` folder. This ensures a clean project structure and makes it easy to discover and run all tests.
|