Restructured project from nested workspace pattern to flat single-repo layout. This eliminates redundant nesting and consolidates all project files under version control. ## Migration Summary **Before:** ``` alex/ (workspace, not versioned) ├── chess-game/ (git repo) │ ├── js/, css/, tests/ │ └── index.html └── docs/ (planning, not versioned) ``` **After:** ``` alex/ (git repo, everything versioned) ├── js/, css/, tests/ ├── index.html ├── docs/ (project documentation) ├── planning/ (historical planning docs) ├── .gitea/ (CI/CD) └── CLAUDE.md (configuration) ``` ## Changes Made ### Structure Consolidation - Moved all chess-game/ contents to root level - Removed redundant chess-game/ subdirectory - Flattened directory structure (eliminated one nesting level) ### Documentation Organization - Moved chess-game/docs/ → docs/ (project documentation) - Moved alex/docs/ → planning/ (historical planning documents) - Added CLAUDE.md (workspace configuration) - Added IMPLEMENTATION_PROMPT.md (original project prompt) ### Version Control Improvements - All project files now under version control - Planning documents preserved in planning/ folder - Merged .gitignore files (workspace + project) - Added .claude/ agent configurations ### File Updates - Updated .gitignore to include both workspace and project excludes - Moved README.md to root level - All import paths remain functional (relative paths unchanged) ## Benefits ✅ **Simpler Structure** - One level of nesting removed ✅ **Complete Versioning** - All documentation now in git ✅ **Standard Layout** - Matches open-source project conventions ✅ **Easier Navigation** - Direct access to all project files ✅ **CI/CD Compatible** - All workflows still functional ## Technical Validation - ✅ Node.js environment verified - ✅ Dependencies installed successfully - ✅ Dev server starts and responds - ✅ All core files present and accessible - ✅ Git repository functional ## Files Preserved **Implementation Files:** - js/ (3,517 lines of code) - css/ (4 stylesheets) - tests/ (87 test cases) - index.html - package.json **CI/CD Pipeline:** - .gitea/workflows/ci.yml - .gitea/workflows/release.yml **Documentation:** - docs/ (12+ documentation files) - planning/ (historical planning materials) - README.md **Configuration:** - jest.config.js, babel.config.cjs, playwright.config.js - .gitignore (merged) - CLAUDE.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
614 lines
15 KiB
Markdown
614 lines
15 KiB
Markdown
# Architecture Diagrams
|
|
|
|
## System Architecture Visualizations
|
|
|
|
### 1. High-Level System Architecture (C4 Level 1 - Context)
|
|
|
|
```mermaid
|
|
graph TB
|
|
User[User/Player]
|
|
ChessApp[Chess Game Application]
|
|
Storage[Browser Local Storage]
|
|
|
|
User -->|Plays chess| ChessApp
|
|
ChessApp -->|Saves games| Storage
|
|
ChessApp -->|Loads games| Storage
|
|
|
|
style ChessApp fill:#4a90e2,color:#fff
|
|
style User fill:#7ed321,color:#fff
|
|
style Storage fill:#f5a623,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 2. Container Diagram (C4 Level 2)
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "Chess Game Application"
|
|
UI[UI Layer<br/>HTML/CSS/JavaScript]
|
|
Engine[Game Engine<br/>Business Logic]
|
|
AI[AI Player<br/>Computer Opponent]
|
|
Storage[Storage Service<br/>Persistence]
|
|
end
|
|
|
|
User[User] -->|Interacts| UI
|
|
UI <-->|Commands/Events| Engine
|
|
Engine <-->|Calculate Move| AI
|
|
Engine <-->|Save/Load| Storage
|
|
|
|
style UI fill:#4a90e2,color:#fff
|
|
style Engine fill:#7ed321,color:#fff
|
|
style AI fill:#bd10e0,color:#fff
|
|
style Storage fill:#f5a623,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 3. Component Diagram (C4 Level 3)
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "Presentation Layer"
|
|
BoardView[ChessBoardView]
|
|
PieceView[ChessPieceView]
|
|
UI[UIController]
|
|
Theme[ThemeManager]
|
|
end
|
|
|
|
subgraph "Business Logic Layer"
|
|
Controller[GameController]
|
|
Engine[GameEngine]
|
|
Validator[MoveValidator]
|
|
Generator[MoveGenerator]
|
|
History[GameHistory]
|
|
end
|
|
|
|
subgraph "Data Layer"
|
|
Board[ChessBoard]
|
|
Piece[ChessPiece]
|
|
State[GameState]
|
|
end
|
|
|
|
subgraph "AI Layer"
|
|
AIPlayer[AIPlayer]
|
|
Evaluator[MoveEvaluator]
|
|
Search[SearchAlgorithm]
|
|
end
|
|
|
|
UI --> Controller
|
|
Controller --> Engine
|
|
Engine --> Validator
|
|
Engine --> Generator
|
|
Engine --> History
|
|
Engine --> Board
|
|
Board --> Piece
|
|
Engine --> State
|
|
Controller --> AIPlayer
|
|
AIPlayer --> Evaluator
|
|
AIPlayer --> Search
|
|
UI --> Theme
|
|
UI --> BoardView
|
|
UI --> PieceView
|
|
|
|
style BoardView fill:#4a90e2,color:#fff
|
|
style Engine fill:#7ed321,color:#fff
|
|
style AIPlayer fill:#bd10e0,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 4. Data Flow Diagram
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant User
|
|
participant UIController
|
|
participant GameController
|
|
participant MoveValidator
|
|
participant GameEngine
|
|
participant ChessBoard
|
|
participant GameHistory
|
|
|
|
User->>UIController: Click piece
|
|
UIController->>GameController: selectSquare(square)
|
|
GameController->>MoveValidator: getLegalMoves(square)
|
|
MoveValidator->>ChessBoard: getPiece(square)
|
|
ChessBoard-->>MoveValidator: piece
|
|
MoveValidator-->>GameController: legalMoves[]
|
|
GameController->>UIController: highlightMoves(legalMoves)
|
|
UIController-->>User: Show highlighted squares
|
|
|
|
User->>UIController: Click destination
|
|
UIController->>GameController: makeMove(from, to)
|
|
GameController->>MoveValidator: isMoveLegal(from, to)
|
|
MoveValidator-->>GameController: valid
|
|
GameController->>GameEngine: executeMove(from, to)
|
|
GameEngine->>ChessBoard: movePiece(from, to)
|
|
GameEngine->>GameHistory: addMove(move)
|
|
GameEngine->>GameController: moveExecutedEvent
|
|
GameController->>UIController: updateBoard()
|
|
UIController-->>User: Show updated board
|
|
```
|
|
|
|
---
|
|
|
|
### 5. Move Execution Flow
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([User clicks destination]) --> Validate{Is move<br/>legal?}
|
|
Validate -->|No| ShowError[Show error message]
|
|
ShowError --> End([End])
|
|
|
|
Validate -->|Yes| CheckSpecial{Special<br/>move?}
|
|
|
|
CheckSpecial -->|Castling| ExecuteCastle[Move king and rook]
|
|
CheckSpecial -->|En Passant| ExecuteEnPassant[Capture pawn diagonally]
|
|
CheckSpecial -->|Promotion| ShowPromotionDialog[Show promotion dialog]
|
|
CheckSpecial -->|Normal| ExecuteNormal[Move piece]
|
|
|
|
ExecuteCastle --> UpdateBoard[Update board state]
|
|
ExecuteEnPassant --> UpdateBoard
|
|
ShowPromotionDialog --> PromotePawn[Promote pawn to selected piece]
|
|
PromotePawn --> UpdateBoard
|
|
ExecuteNormal --> UpdateBoard
|
|
|
|
UpdateBoard --> RecordMove[Add to history]
|
|
RecordMove --> CheckGameState{Check game<br/>state}
|
|
|
|
CheckGameState -->|Check| ShowCheck[Highlight king in check]
|
|
CheckGameState -->|Checkmate| GameOver[Show game over]
|
|
CheckGameState -->|Stalemate| GameOver
|
|
CheckGameState -->|Draw| GameOver
|
|
CheckGameState -->|Continue| SwitchTurn[Switch player turn]
|
|
|
|
ShowCheck --> SwitchTurn
|
|
SwitchTurn --> CheckAI{AI<br/>player?}
|
|
|
|
CheckAI -->|Yes| AICalculate[AI calculates move]
|
|
CheckAI -->|No| End
|
|
AICalculate --> Start
|
|
GameOver --> End
|
|
|
|
style Start fill:#7ed321,color:#fff
|
|
style End fill:#d0021b,color:#fff
|
|
style GameOver fill:#f5a623,color:#fff
|
|
style UpdateBoard fill:#4a90e2,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 6. Class Diagram - Core Components
|
|
|
|
```mermaid
|
|
classDiagram
|
|
class ChessBoard {
|
|
-Square[] squares
|
|
-ChessPiece activePiece
|
|
+getSquare(file, rank) Square
|
|
+setPiece(square, piece) void
|
|
+removePiece(square) ChessPiece
|
|
+highlightSquares(squares) void
|
|
+clone() ChessBoard
|
|
+toFEN() string
|
|
}
|
|
|
|
class ChessPiece {
|
|
#PieceType type
|
|
#Color color
|
|
#Square position
|
|
#boolean hasMoved
|
|
+getPossibleMoves(board) Square[]
|
|
+getLegalMoves(board, state) Square[]
|
|
+canMoveTo(square, board) boolean
|
|
+clone() ChessPiece
|
|
}
|
|
|
|
class GameEngine {
|
|
-GameState gameState
|
|
-Color currentPlayer
|
|
-Move[] moveHistory
|
|
-GameStatus status
|
|
+initializeGame() void
|
|
+executeMove(from, to) Move
|
|
+undoMove() Move
|
|
+isCheck(color) boolean
|
|
+isCheckmate(color) boolean
|
|
+switchTurn() void
|
|
}
|
|
|
|
class MoveValidator {
|
|
-Map validationCache
|
|
+isMoveLegal(from, to, state) boolean
|
|
+isPseudoLegal(from, to, board) boolean
|
|
+wouldExposeKing(move, state) boolean
|
|
+validateCastling(move, state) boolean
|
|
+isSquareAttacked(square, color, state) boolean
|
|
}
|
|
|
|
class GameController {
|
|
-GameEngine engine
|
|
-Square selectedSquare
|
|
-GameMode mode
|
|
+handleSquareClick(square) void
|
|
+startNewGame(config) void
|
|
+makeMove(from, to) boolean
|
|
+saveGame() string
|
|
+loadGame(data) void
|
|
}
|
|
|
|
class GameHistory {
|
|
-Move[] moves
|
|
-string[] positions
|
|
-number currentIndex
|
|
+addMove(move, position) void
|
|
+undo() Move
|
|
+redo() Move
|
|
+toPGN() string
|
|
+exportJSON() string
|
|
}
|
|
|
|
class AIPlayer {
|
|
-number difficulty
|
|
-number searchDepth
|
|
+calculateMove(state) Promise~Move~
|
|
+evaluatePosition(state) number
|
|
+minimax(depth, alpha, beta, state) number
|
|
+setDifficulty(level) void
|
|
}
|
|
|
|
ChessBoard "1" *-- "64" Square
|
|
ChessBoard "1" o-- "0..32" ChessPiece
|
|
GameEngine "1" *-- "1" ChessBoard
|
|
GameEngine "1" *-- "1" GameHistory
|
|
GameEngine "1" --> "1" MoveValidator
|
|
GameController "1" --> "1" GameEngine
|
|
GameController "1" --> "0..1" AIPlayer
|
|
AIPlayer --> MoveValidator
|
|
|
|
class Pawn {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
class Knight {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
class Bishop {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
class Rook {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
class Queen {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
class King {
|
|
+getPossibleMoves(board) Square[]
|
|
}
|
|
|
|
ChessPiece <|-- Pawn
|
|
ChessPiece <|-- Knight
|
|
ChessPiece <|-- Bishop
|
|
ChessPiece <|-- Rook
|
|
ChessPiece <|-- Queen
|
|
ChessPiece <|-- King
|
|
```
|
|
|
|
---
|
|
|
|
### 7. State Machine Diagram - Game Flow
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> Initialized: New Game
|
|
|
|
Initialized --> WhiteTurn: Start
|
|
|
|
WhiteTurn --> ValidatingMove: White makes move
|
|
ValidatingMove --> WhiteTurn: Invalid move
|
|
ValidatingMove --> BlackTurn: Valid move
|
|
ValidatingMove --> WhiteCheck: Valid move (Black in check)
|
|
ValidatingMove --> Checkmate: Valid move (Black checkmated)
|
|
ValidatingMove --> Stalemate: Valid move (Stalemate)
|
|
|
|
BlackTurn --> ValidatingMove2: Black makes move
|
|
ValidatingMove2 --> BlackTurn: Invalid move
|
|
ValidatingMove2 --> WhiteTurn: Valid move
|
|
ValidatingMove2 --> BlackCheck: Valid move (White in check)
|
|
ValidatingMove2 --> Checkmate: Valid move (White checkmated)
|
|
ValidatingMove2 --> Stalemate: Valid move (Stalemate)
|
|
|
|
WhiteCheck --> ValidatingMove: White makes move
|
|
BlackCheck --> ValidatingMove2: Black makes move
|
|
|
|
WhiteTurn --> Draw: Draw offered/accepted
|
|
BlackTurn --> Draw: Draw offered/accepted
|
|
WhiteTurn --> Resignation: Black resigns
|
|
BlackTurn --> Resignation: White resigns
|
|
|
|
Checkmate --> [*]: Game Over
|
|
Stalemate --> [*]: Game Over
|
|
Draw --> [*]: Game Over
|
|
Resignation --> [*]: Game Over
|
|
```
|
|
|
|
---
|
|
|
|
### 8. Event Flow Diagram
|
|
|
|
```mermaid
|
|
graph LR
|
|
subgraph "User Events"
|
|
Click[square-clicked]
|
|
DragStart[drag-start]
|
|
DragEnd[drag-end]
|
|
end
|
|
|
|
subgraph "Game Events"
|
|
MoveExec[move-executed]
|
|
TurnChange[turn-changed]
|
|
CheckDet[check-detected]
|
|
GameOver[game-over]
|
|
end
|
|
|
|
subgraph "UI Events"
|
|
ThemeChange[theme-changed]
|
|
AnimComplete[animation-complete]
|
|
end
|
|
|
|
subgraph "AI Events"
|
|
AIThink[ai-thinking]
|
|
AIMoveReady[ai-move-ready]
|
|
end
|
|
|
|
Click --> MoveExec
|
|
DragEnd --> MoveExec
|
|
MoveExec --> TurnChange
|
|
MoveExec --> CheckDet
|
|
CheckDet --> GameOver
|
|
TurnChange --> AIThink
|
|
AIThink --> AIMoveReady
|
|
AIMoveReady --> MoveExec
|
|
MoveExec --> AnimComplete
|
|
|
|
style Click fill:#4a90e2,color:#fff
|
|
style MoveExec fill:#7ed321,color:#fff
|
|
style GameOver fill:#d0021b,color:#fff
|
|
style AIThink fill:#bd10e0,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 9. Deployment Diagram
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "User's Browser"
|
|
subgraph "HTML Document"
|
|
HTML[index.html]
|
|
end
|
|
|
|
subgraph "JavaScript Modules"
|
|
Core[Core Modules<br/>src/core/]
|
|
UI[UI Modules<br/>src/ui/]
|
|
AI[AI Modules<br/>src/ai/]
|
|
Utils[Utilities<br/>src/utils/]
|
|
end
|
|
|
|
subgraph "Assets"
|
|
CSS[Stylesheets<br/>styles/]
|
|
Images[Piece Images<br/>assets/pieces/]
|
|
Sounds[Sound Effects<br/>assets/sounds/]
|
|
end
|
|
|
|
subgraph "Browser APIs"
|
|
LocalStorage[Local Storage]
|
|
DOM[DOM API]
|
|
Canvas[Canvas/SVG]
|
|
end
|
|
end
|
|
|
|
HTML --> Core
|
|
HTML --> UI
|
|
Core --> AI
|
|
Core --> Utils
|
|
UI --> CSS
|
|
UI --> Images
|
|
UI --> Sounds
|
|
UI --> DOM
|
|
UI --> Canvas
|
|
Core --> LocalStorage
|
|
|
|
style HTML fill:#4a90e2,color:#fff
|
|
style Core fill:#7ed321,color:#fff
|
|
style AI fill:#bd10e0,color:#fff
|
|
style LocalStorage fill:#f5a623,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 10. Module Dependency Graph
|
|
|
|
```mermaid
|
|
graph TD
|
|
Main[main.js] --> GameController
|
|
Main --> UIController
|
|
|
|
GameController --> GameEngine
|
|
GameController --> AIPlayer
|
|
|
|
GameEngine --> ChessBoard
|
|
GameEngine --> MoveValidator
|
|
GameEngine --> MoveGenerator
|
|
GameEngine --> GameHistory
|
|
|
|
MoveValidator --> ChessBoard
|
|
MoveValidator --> ChessPiece
|
|
|
|
MoveGenerator --> MoveValidator
|
|
MoveGenerator --> ChessBoard
|
|
|
|
ChessBoard --> ChessPiece
|
|
ChessBoard --> Square
|
|
|
|
ChessPiece --> Pawn
|
|
ChessPiece --> Knight
|
|
ChessPiece --> Bishop
|
|
ChessPiece --> Rook
|
|
ChessPiece --> Queen
|
|
ChessPiece --> King
|
|
|
|
AIPlayer --> MoveGenerator
|
|
AIPlayer --> MoveEvaluator
|
|
|
|
UIController --> ChessBoardView
|
|
UIController --> ThemeManager
|
|
|
|
GameHistory --> NotationConverter
|
|
|
|
Utils[utils/] --> FENParser
|
|
Utils --> PGNParser
|
|
Utils --> NotationConverter
|
|
|
|
style Main fill:#7ed321,color:#fff
|
|
style GameEngine fill:#4a90e2,color:#fff
|
|
style AIPlayer fill:#bd10e0,color:#fff
|
|
style Utils fill:#f5a623,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 11. Performance Flow - Move Calculation
|
|
|
|
```mermaid
|
|
graph TD
|
|
Start([AI Turn Starts]) --> CheckCache{Move in<br/>cache?}
|
|
|
|
CheckCache -->|Yes| RetrieveCache[Retrieve cached move]
|
|
RetrieveCache --> Execute[Execute move]
|
|
|
|
CheckCache -->|No| CheckOpening{In opening<br/>book?}
|
|
|
|
CheckOpening -->|Yes| GetOpening[Get opening move]
|
|
GetOpening --> CacheResult[Cache result]
|
|
|
|
CheckOpening -->|No| GenerateMoves[Generate all legal moves]
|
|
GenerateMoves --> OrderMoves[Order moves<br/>MVV-LVA, killer moves]
|
|
OrderMoves --> SearchTree[Minimax search<br/>with alpha-beta]
|
|
|
|
SearchTree --> EvaluatePos[Evaluate positions<br/>Material, position, mobility]
|
|
EvaluatePos --> SelectBest[Select best move]
|
|
SelectBest --> CacheResult
|
|
|
|
CacheResult --> Execute
|
|
Execute --> End([Move executed])
|
|
|
|
style Start fill:#7ed321,color:#fff
|
|
style End fill:#7ed321,color:#fff
|
|
style SearchTree fill:#bd10e0,color:#fff
|
|
style CacheResult fill:#f5a623,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
### 12. Error Handling Flow
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
UserAction[User Action] --> Validate{Valid?}
|
|
|
|
Validate -->|Yes| Execute[Execute action]
|
|
Execute --> Success[Success]
|
|
|
|
Validate -->|No| ErrorType{Error<br/>Type?}
|
|
|
|
ErrorType -->|Illegal Move| ShowIllegalMove[Show illegal move message]
|
|
ErrorType -->|Invalid Input| ShowInvalidInput[Show invalid input]
|
|
ErrorType -->|Game Over| ShowGameOver[Show game is over]
|
|
ErrorType -->|Other| ShowGenericError[Show error message]
|
|
|
|
ShowIllegalMove --> PlayErrorSound[Play error sound]
|
|
ShowInvalidInput --> PlayErrorSound
|
|
ShowGameOver --> PlayErrorSound
|
|
ShowGenericError --> LogError[Log to console]
|
|
|
|
PlayErrorSound --> WaitUser[Wait for user]
|
|
LogError --> WaitUser
|
|
|
|
Success --> End([End])
|
|
WaitUser --> End
|
|
|
|
style UserAction fill:#4a90e2,color:#fff
|
|
style Execute fill:#7ed321,color:#fff
|
|
style ErrorType fill:#f5a623,color:#fff
|
|
style ShowGenericError fill:#d0021b,color:#fff
|
|
```
|
|
|
|
---
|
|
|
|
## Architecture Decision Records (ADR)
|
|
|
|
### ADR-001: Board Representation
|
|
|
|
**Decision**: Use flat array of 64 squares with optional bitboard optimization
|
|
|
|
**Rationale**:
|
|
- Simple and intuitive for rendering
|
|
- Direct mapping to algebraic notation
|
|
- Easy debugging and testing
|
|
- Bitboards available for AI optimization
|
|
|
|
**Alternatives Considered**:
|
|
- 2D array (more complex indexing)
|
|
- Pure bitboards (harder to debug)
|
|
|
|
---
|
|
|
|
### ADR-002: Event-Driven Architecture
|
|
|
|
**Decision**: Use pub/sub event system for component communication
|
|
|
|
**Rationale**:
|
|
- Loose coupling between components
|
|
- Easy to extend with plugins
|
|
- Clear data flow
|
|
- Testable in isolation
|
|
|
|
**Alternatives Considered**:
|
|
- Direct method calls (tight coupling)
|
|
- Observer pattern (more complex)
|
|
|
|
---
|
|
|
|
### ADR-003: Immutable Game State
|
|
|
|
**Decision**: GameState objects are immutable; new state created on each move
|
|
|
|
**Rationale**:
|
|
- Enables easy undo/redo
|
|
- Prevents accidental mutations
|
|
- Better for history tracking
|
|
- Simpler debugging
|
|
|
|
**Alternatives Considered**:
|
|
- Mutable state with deep copies
|
|
- Command pattern for undo
|
|
|
|
---
|
|
|
|
### ADR-004: AI in Separate Module
|
|
|
|
**Decision**: AI player is optional and completely decoupled
|
|
|
|
**Rationale**:
|
|
- Can be loaded on demand
|
|
- Doesn't bloat base game
|
|
- Can run in Web Worker
|
|
- Easy to swap implementations
|
|
|
|
**Alternatives Considered**:
|
|
- Integrated AI (larger bundle)
|
|
- Server-side AI (network dependency)
|
|
|
|
This comprehensive architecture provides a solid foundation for implementing a professional, extensible chess game.
|