Files
Stefan 8ed402bbe0 feat: improve opening trainer flow and add deviation dialog
- Add tutor message guardrail to prevent rapid-fire messages
  - Track last message by move index
  - Wait for both player and opponent moves before speaking
  - Speak immediately when player deviates from theory

- Add deviation dialog with three options:
  - Continue Playing (Start Game) - transitions to game mode
  - Undo & Return to Opening - returns to theory
  - Explore This Variation - continues off-book practice

- Implement smooth game mode transition:
  - Pass opening context from trainer to game
  - Tutor welcomes player with context about their study
  - Computer makes first move if needed in starting position

- Fix generate-test-fixtures script:
  - Add safety check to prevent overwriting real data
  - Restore full opening database (12,379 openings)
  - Rebuild move index (12,377 sequences)
  - Add clear warnings about test fixtures

- Update ChessGame to accept openingContext prop
- Update Tutor to display contextual greeting in game mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-08 15:05:05 +01:00

66 lines
1.9 KiB
JSON

{
"rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2": {
"src": "eco_tsv",
"eco": "C00",
"moves": "1. e4 e6",
"name": "French Defense",
"scid": "C00a",
"aliases": {
"scid": "French",
"ct": "French Defense, General",
"chessGraph": "French Defense; C00",
"icsbot": "French Defense; C00 "
},
"isEcoRoot": true,
"wikipediaSlug": "french-defense"
},
"rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - 0 3": {
"src": "eco_tsv",
"eco": "C00",
"moves": "1. e4 e6 2. d4 d5",
"name": "French Defense",
"scid": "C00x",
"aliases": {
"scid": "French: 2.d4 d5",
"eco_js": "French Defense, 2. d4 d5",
"ct": "French Defense, Main Line"
},
"wikipediaSlug": "french-defense"
},
"rnbqkbnr/ppp2ppp/4p3/3p4/3PP3/4B3/PPP2PPP/RN1QKBNR b KQkq - 1 3": {
"src": "eco_tsv",
"eco": "C00",
"moves": "1. e4 e6 2. d4 d5 3. Be3",
"name": "French Defense: Alapin Gambit",
"scid": "C00x",
"aliases": {
"scid": "French: Alapin-Diemer Gambit (ADG)",
"chessGraph": "Alapin; Witaker Gambit, French",
"chronos": "French: Alapin variation",
"icsbot": "Alapin; Witaker Gambit, French "
},
"wikipediaSlug": "french-defense"
},
"rnbqkbnr/p1pp1ppp/4p3/1p6/3PP3/8/PPP2PPP/RNBQKBNR w KQkq - 0 3": {
"src": "eco_tsv",
"eco": "C00",
"moves": "1. e4 e6 2. d4 b5",
"name": "French Defense: Baeuerle Gambit",
"aliases": {
"chessGraph": "Baeuerle Gambit, French",
"icsbot": "Baeuerle Gambit, French "
},
"wikipediaSlug": "french-defense"
},
"rnbqkbnr/pppp1ppp/4p3/8/1P2P3/8/P1PP1PPP/RNBQKBNR b KQkq - 0 2": {
"src": "eco_tsv",
"eco": "C00",
"moves": "1. e4 e6 2. b4",
"name": "French Defense: Banzai-Leong Gambit",
"aliases": {
"chessGraph": "Banzai-Leong Gambit, French",
"icsbot": "Banzai-Leong Gambit, French "
},
"wikipediaSlug": "french-defense"
}
}