Compare commits

..

39 Commits

Author SHA1 Message Date
Janis 3efebd5ed0 feat(config): update application.yml to nest HTTP port configuration
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 17:58:16 +02:00
TeamCity 0229147f4d ci: bump version with Build-55 2026-04-30 15:35:40 +00:00
Janis 3a0cb92256 feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 16:45:15 +02:00
Janis 39c9e492ce feat(config): add H2 database configuration for testing environment
Build & Test (NowChessSystems) TeamCity build failed
2026-04-30 16:29:16 +02:00
Janis 2404e6164c feat(config): update application.yml for PostgreSQL and remove staging/production configurations 2026-04-30 16:14:10 +02:00
TeamCity 6a143a462a ci: bump version with Build-54 2026-04-30 09:55:43 +00:00
Janis 5399c9bffb feat(ci): read version from versions.env for native image builds
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 11:37:55 +02:00
Janis 6113432a14 feat(config): update application.yml for staging and production environments
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 10:55:20 +02:00
Janis 952cf00413 feat(docker): update COPY command in native Dockerfile to reflect new build path
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 09:37:38 +02:00
Janis 34b9933046 feat(docker): add Dockerfiles for Quarkus application in JVM and native modes
Build & Test (NowChessSystems) TeamCity build finished
2026-04-30 09:28:02 +02:00
Janis e5fe7d07a5 feat(docker): add Dockerfiles for Quarkus application in JVM and native modes
Build & Test (NowChessSystems) TeamCity build was removed from queue
2026-04-30 08:47:36 +02:00
Janis c987d8e258 feat(docker): add .dockerignore and .gitignore files for build exclusions
Build & Test (NowChessSystems) TeamCity build was queued
2026-04-30 08:41:03 +02:00
Janis 3f2d2bb4c9 feat(docker): add Dockerfiles for building Quarkus application in native and JVM modes
Build & Test (NowChessSystems) TeamCity build failed
2026-04-30 08:32:04 +02:00
Janis 04a3ad721c feat: true-microservices (#40)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #40
2026-04-29 22:06:20 +02:00
Janis 590924254e feat: true-microservices (#40)
Reviewed-on: #40
2026-04-29 22:06:01 +02:00
TeamCity 67511fc649 ci: bump version with Build-50 2026-04-22 08:21:04 +00:00
Janis 093134d36c feat(rule): Rules as a microservice (#39)
Build & Test (NowChessSystems) TeamCity build finished
Co-authored-by: LQ63 <lkhermann@web.de>
Co-authored-by: TeamCity <teamcity@service.local>
Reviewed-on: #39
2026-04-22 10:09:35 +02:00
Janis ffeb3ce338 fix: disable jar packaging in native image build
Build & Test (NowChessSystems) TeamCity build finished
2026-04-22 09:50:10 +02:00
TeamCity 52b171c7af ci: bump version with Build-46
Build & Test (NowChessSystems) TeamCity build finished
2026-04-22 06:51:59 +00:00
Janis a386f57c21 fix: IO microservice (#38)
Reviewed-on: #38
2026-04-22 08:36:54 +02:00
TeamCity 3ca2afbb4b ci: bump version with Build-45 2026-04-21 13:49:26 +00:00
Janis b5a2966ada feat: NCS-53 changed IO to MicroService for easier scaling (#37)
Reviewed-on: #37
Reviewed-by: Shahd Lala <shosho996@blackhole.local>
2026-04-21 15:38:58 +02:00
TeamCity 74a4fce0ca ci: bump version with Build-44 2026-04-21 11:13:30 +00:00
Janis 8fc97bde02 refactor: align JSON string formatting in JsonParserTest 2026-04-21 13:02:18 +02:00
shosho996 2d75b2e80e test: NCS-45 IO Test reduction (#32)
Co-authored-by: shahdlala66 <shahd.lala66@gmail.com>
Reviewed-on: #32
Co-authored-by: Shahd Lala <shosho996@blackhole.local>
Co-committed-by: Shahd Lala <shosho996@blackhole.local>
2026-04-21 12:39:19 +02:00
Janis f088c4e9ff feat: NCS-37 Quarkus integration (#35)
Reviewed-on: #35
Reviewed-by: Leon Hermann <lq@blackhole.local>
2026-04-21 12:35:20 +02:00
TeamCity 8a1cf909d4 ci: bump version with Build-43 2026-04-19 20:53:56 +00:00
Janis 33e785d22a feat: NCS-40 Rework Draw System (#34)
Reviewed-on: #34
Reviewed-by: Shahd Lala <shosho996@blackhole.local>
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-04-19 22:44:48 +02:00
TeamCity d16cec176b ci: bump version with Build-42 2026-04-19 14:01:11 +00:00
Janis 8744bee2dd feat: NCS-41 Bot Platform (#33)
Co-authored-by: Janis <janis@nowchess.de>
Reviewed-on: #33
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-04-19 15:52:08 +02:00
TeamCity 5f4d33f3ca ci: bump version with Build-41 2026-04-16 16:55:00 +00:00
Janis 767d3051a7 feat: NCS-13 Implement Threefold Repetition (#31)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #31
2026-04-16 18:49:20 +02:00
TeamCity b2e62dc60c ci: bump version with Build-40 2026-04-14 19:23:01 +00:00
Janis b0399a4e48 feat: NCS-14 implemented insufficient moves rule (#30)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #30
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-04-14 21:17:56 +02:00
TeamCity ec2ab2f365 ci: bump version with Build-39 2026-04-12 19:03:52 +00:00
Janis fd4e67d4f7 feat: NCS-25 Add linters to keep quality up (#27)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #27
Reviewed-by: Leon Hermann <lq@blackhole.local>
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-04-12 20:58:39 +02:00
TeamCity 3cb3160731 ci: bump version with Build-38 2026-04-12 17:41:12 +00:00
Janis dbcafd2869 feat: NCS-29 JSON - Cherry Picked (#28)
Build & Test (NowChessSystems) TeamCity build finished
Reviewed-on: #28
Reviewed-by: Shahd Lala <shosho996@blackhole.local>
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
2026-04-12 19:36:02 +02:00
TeamCity 3ecb2c9d66 ci: bump version with Build-37 2026-04-12 15:20:01 +00:00
651 changed files with 28210 additions and 15710 deletions
+546 -80
View File
@@ -2,8 +2,55 @@
> **Stack:** raw-http | none | unknown | scala
> 0 routes | 0 models | 0 components | 35 lib files | 0 env vars | 0 middleware
> **Token savings:** this file is ~3.700 tokens. Without it, AI exploration would cost ~18.200 tokens. **Saves ~14.500 tokens per conversation.**
> 0 routes + 40 rpc | 0 models | 0 components | 146 lib files | 1 env vars | 1 middleware
> **Token savings:** this file is ~0 tokens. Without it, AI exploration would cost ~0 tokens. **Saves ~0 tokens per conversation.**
---
# Routes
## gRPC
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
---
@@ -25,6 +72,74 @@
- function main: () -> None
- class TestCase
- _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge
- function gameIdOpt
- function declineReasonOpt
- function timeControlLimitOpt
- function timeControlIncrementOpt
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeColorConverter.scala` — class ChallengeColorConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeStatusConverter.scala` — class ChallengeStatusConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/DeclineReasonConverter.scala` — class DeclineReasonConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/TimeControl.scala` — class TimeControl
- `modules/account/src/main/scala/de/nowchess/account/domain/UserAccount.scala`
- class UserAccount
- function getBotAccounts
- class BotAccount
- class OfficialBotAccount
- `modules/account/src/main/scala/de/nowchess/account/error/AccountError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/error/ChallengeError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/filter/AlreadyLoggedInFilter.scala` — class AlreadyLoggedInFilter
- `modules/account/src/main/scala/de/nowchess/account/repository/AccountRepository.scala`
- class UserAccountRepository
- function findByUsername
- function findById
- function persist
- function findByEmail
- function findAll
- _...12 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository
- function findActiveByChallengerId
- function findActiveByDestUserId
- function findDuplicateChallenge
- function findById
- function persist
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/AccountResource.scala`
- class AccountResource
- function register
- function login
- function me
- function publicProfile
- function banUser
- _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource
- function create
- function list
- function accept
- function decline
- function cancel
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService
- function register
- function login
- function findByUsername
- function findById
- function createBotAccount
- _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService
- function create
- function accept
- function decline
- function cancel
- function listForUser
- _...1 more_
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board
- function apply
@@ -47,42 +162,279 @@
- class Square
- function fromAlgebraic
- function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — function message
- `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`
- function activeColor
- function afterMove
- function remainingMs
- function remainingMs
- function afterMove
- function remainingMs
- _...3 more_
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
- function kingSquare
- function withBoard
- function withTurn
- function withCastlingRights
- function withEnPassantSquare
- function withHalfMoveClock
- function withMove
- _...2 more_
- _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
- `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala`
- class ApiResponse
- function error
- function totalPages
- `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`
- class Command
- function execute
- function undo
- function description
- class MoveResult
- `modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala`
- class CommandInvoker
- function execute
- function undo
- function redo
- function history
- function getCurrentIndex
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`
- class RuleSet
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...6 more_
- `modules/bot/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/bot/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/bot/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/bot/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala`
- class BeansProducer
- function redissonClient
- function kubernetesClient
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- class CoordinatorConfig
- function maxGamesPerCore
- function maxDeviationPercent
- function rebalanceInterval
- function rebalanceMinInterval
- function heartbeatTtl
- _...11 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
- class CoreGrpcClient
- function shutdown
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/resource/CoordinatorResource.scala`
- class CoordinatorResource
- function listInstances
- function getMetrics
- function triggerRebalance
- function triggerFailover
- function triggerScaleUp
- _...1 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
- class AutoScaler
- function checkAndScale
- function scaleUp
- function scaleDown
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
- class CacheEvictionManager
- function setRedisPrefix
- function evictStaleGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
- class FailoverService
- function setRedisPrefix
- function onInstanceStreamDropped
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
- class HealthMonitor
- function setRedisPrefix
- function checkInstanceHealth
- function watchK8sPods
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
- class InstanceRegistry
- function setRedisPrefix
- function getInstance
- function getAllInstances
- function updateInstanceFromRedis
- function markInstanceDead
- _...1 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
- class LoadBalancer
- function setRedisPrefix
- function shouldRebalance
- function rebalance
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
- class RuleSetRestAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/client/IoServiceClient.scala`
- class IoServiceClient
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/core/src/main/scala/de/nowchess/chess/client/RuleServiceClient.scala`
- class RuleServiceClient
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...6 more_
- `modules/core/src/main/scala/de/nowchess/chess/client/StoreServiceClient.scala` — class StoreServiceClient, function getGame
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine
- function isPendingPromotion
- function board
- function turn
- function context
- function canUndo
- _...10 more_
- function pendingDrawOfferBy
- function currentClockState
- _...22 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException
- class GameNotFoundException
- class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`
- class CoreProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper
- function exportCombined
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- `modules/core/src/main/scala/de/nowchess/chess/grpc/RuleSetGrpcAdapter.scala`
- class RuleSetGrpcAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
- function context
- class Observer
@@ -91,8 +443,59 @@
- function subscribe
- function unsubscribe
- _...1 more_
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager
- function subscribeGame
- function onMessage
- function unsubscribeGame
- function batchResubscribeGames
- function unsubscribeGames
- _...3 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry
- function store
- function get
- function update
- function generateId
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
- class RedisGameRegistry
- function generateId
- function store
- function get
- function update
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala`
- class GameDtoMapper
- function statusOf
- function moveToUci
- function toPlayerDto
- function toClockDto
- function toGameStateDto
- _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`
- class GameResource
- function onGameEvent
- function createGame
- function getGame
- function resignGame
- function makeMove
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala`
- class InstanceHeartbeatService
- function onStart
- function onShutdown
- function setRedisPrefix
- function setSubscriptionCount
- function setLocalCacheSize
- _...2 more_
- `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala`
- class GameFileService
- function saveGameToFile
- function loadGameFromFile
- class FileSystemGameService
- function saveGameToFile
- function loadGameFromFile
- `modules/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala`
- class FenExporter
- function boardToFen
@@ -114,6 +517,17 @@
- function parseBoard
- function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala`
- class IoProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
- class PgnExporter
- function exportGameContext
@@ -124,39 +538,91 @@
- function importGameContext
- function parsePgn
- function parseAlgebraicMove
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala`
- class RuleSet
- `modules/io/src/main/scala/de/nowchess/io/service/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/io/src/main/scala/de/nowchess/io/service/resource/IoResource.scala`
- class IoResource
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/json/src/main/scala/de/nowchess/json/ChessJacksonModule.scala` — class ChessJacksonModule
- `modules/json/src/main/scala/de/nowchess/json/GameResultDeserializer.scala` — class GameResultDeserializer
- `modules/json/src/main/scala/de/nowchess/json/GameResultSerializer.scala` — class GameResultSerializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeDeserializer.scala` — class MoveTypeDeserializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeSerializer.scala` — class MoveTypeSerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareDeserializer.scala` — class SquareDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala`
- class ProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...4 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala`
- class DefaultRules
- function loop
- function toMoves
- function loop
- `modules/ui/src/main/scala/de/nowchess/ui/Main.scala` — class Main, function main
- `modules/ui/src/main/scala/de/nowchess/ui/gui/ChessBoardView.scala`
- class ChessBoardView
- function updateBoard
- function updateUndoRedoButtons
- function showMessage
- function showPromotionDialog
- `modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala`
- class ChessGUIApp
- class ChessGUILauncher
- function getEngine
- function launch
- `modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala` — class GUIObserver
- `modules/ui/src/main/scala/de/nowchess/ui/gui/PieceSprites.scala`
- class PieceSprites
- function loadPieceImage
- class SquareColors
- `modules/ui/src/main/scala/de/nowchess/ui/terminal/TerminalUI.scala` — class TerminalUI, function start
- `modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala` — function unicode
- `modules/ui/src/main/scala/de/nowchess/ui/utils/Renderer.scala` — class Renderer, function render
- _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
- class RedissonProducer
- function redissonClient
- function close
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala`
- class GameWritebackStreamListener
- function startListening
- function onMessage
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository
- function findByGameId
- function persist
- function merge
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource
- function onOpen
- function onMessage
- function onTextMessage
- function onClose
---
# Config
## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py
---
# Middleware
## custom
- generate — `modules/bot/python/src/generate.py`
---
@@ -164,39 +630,39 @@
## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **28** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **21** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **13** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **10** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **9** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **9** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **8** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — imported by **7** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **4** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — imported by **4** files
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` — imported by **4** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **4** files
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` — imported by **4** files
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — imported by **2** files
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — imported by **1** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`, `modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerBranchTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala` +23 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala` +16 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala` +14 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +9 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala` +8 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesStateTransitionsTest.scala` +5 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesStateTransitionsTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesTest.scala` +4 more
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineNotationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala` +4 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` +3 more
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParserCombinators.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParserFastParse.scala` +2 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more
---
+5
View File
@@ -0,0 +1,5 @@
# Config
## Environment Variables
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py
+30 -30
View File
@@ -2,36 +2,36 @@
## Most Imported Files (change these carefully)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **28** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **21** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **13** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **10** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **9** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **9** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **8** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — imported by **7** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **4** files
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — imported by **4** files
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala` — imported by **4** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **4** files
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala` — imported by **4** files
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala` — imported by **2** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — imported by **2** files
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — imported by **1** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **76** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **57** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **55** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **47** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **28** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **20** files
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala` — imported by **18** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala` — imported by **18** files
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala` — imported by **13** files
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala` — imported by **11** files
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — imported by **9** files
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` — imported by **9** files
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — imported by **8** files
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala` — imported by **7** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameMode.scala` — imported by **6** files
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala` — imported by **6** files
## Import Map (who imports what)
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`, `modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerBranchTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala` +23 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala` +16 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala` +14 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala` +9 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineGameEndingTest.scala` +8 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesStateTransitionsTest.scala` +5 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesStateTransitionsTest.scala`, `modules/rule/src/test/scala/de/nowchess/rule/DefaultRulesTest.scala` +4 more
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala``modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineNotationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineScenarioTest.scala` +4 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/EngineTestHelpers.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEnginePromotionTest.scala`, `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala` +3 more
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala``modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineIntegrationTest.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParserCombinators.scala`, `modules/io/src/main/scala/de/nowchess/io/fen/FenParserFastParse.scala` +2 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala`, `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala` +71 more
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/move/Move.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/api/src/test/scala/de/nowchess/api/move/MoveTest.scala` +52 more
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala``modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`, `modules/api/src/test/scala/de/nowchess/api/board/BoardTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +50 more
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala``modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala`, `modules/api/src/test/scala/de/nowchess/api/game/ClockStateTest.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala` +42 more
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/ClassicalBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/HybridBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +23 more
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala``modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`, `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala``modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`, `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala`, `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`, `modules/bot/src/test/scala/de/nowchess/bot/AlphaBetaSearchTest.scala` +15 more
- `modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala` +13 more
- `modules/api/src/main/scala/de/nowchess/api/game/GameResult.scala``modules/api/src/test/scala/de/nowchess/api/game/GameContextTest.scala`, `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala`, `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`, `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`, `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala` +13 more
+452 -48
View File
@@ -16,6 +16,74 @@
- function main: () -> None
- class TestCase
- _...2 more_
- `modules/account/src/main/scala/de/nowchess/account/client/CoreGameClient.scala` — class CoreGameClient, function createGame
- `modules/account/src/main/scala/de/nowchess/account/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/account/src/main/scala/de/nowchess/account/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/account/src/main/scala/de/nowchess/account/domain/Challenge.scala`
- class Challenge
- function gameIdOpt
- function declineReasonOpt
- function timeControlLimitOpt
- function timeControlIncrementOpt
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeColorConverter.scala` — class ChallengeColorConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/ChallengeStatusConverter.scala` — class ChallengeStatusConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/DeclineReasonConverter.scala` — class DeclineReasonConverter
- `modules/account/src/main/scala/de/nowchess/account/domain/TimeControl.scala` — class TimeControl
- `modules/account/src/main/scala/de/nowchess/account/domain/UserAccount.scala`
- class UserAccount
- function getBotAccounts
- class BotAccount
- class OfficialBotAccount
- `modules/account/src/main/scala/de/nowchess/account/error/AccountError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/error/ChallengeError.scala` — function message
- `modules/account/src/main/scala/de/nowchess/account/filter/AlreadyLoggedInFilter.scala` — class AlreadyLoggedInFilter
- `modules/account/src/main/scala/de/nowchess/account/repository/AccountRepository.scala`
- class UserAccountRepository
- function findByUsername
- function findById
- function persist
- function findByEmail
- function findAll
- _...12 more_
- `modules/account/src/main/scala/de/nowchess/account/repository/ChallengeRepository.scala`
- class ChallengeRepository
- function findActiveByChallengerId
- function findActiveByDestUserId
- function findDuplicateChallenge
- function findById
- function persist
- _...1 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/AccountResource.scala`
- class AccountResource
- function register
- function login
- function me
- function publicProfile
- function banUser
- _...10 more_
- `modules/account/src/main/scala/de/nowchess/account/resource/ChallengeResource.scala`
- class ChallengeResource
- function create
- function list
- function accept
- function decline
- function cancel
- `modules/account/src/main/scala/de/nowchess/account/service/AccountService.scala`
- class AccountService
- function register
- function login
- function findByUsername
- function findById
- function createBotAccount
- _...11 more_
- `modules/account/src/main/scala/de/nowchess/account/service/ChallengeService.scala`
- class ChallengeService
- function create
- function accept
- function decline
- function cancel
- function listForUser
- _...1 more_
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
- class Board
- function apply
@@ -38,42 +106,279 @@
- class Square
- function fromAlgebraic
- function offset
- `modules/api/src/main/scala/de/nowchess/api/bot/Bot.scala`
- class Bot
- function name
- function nextMove
- `modules/api/src/main/scala/de/nowchess/api/dto/ErrorEventDto.scala` — class ErrorEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameFullEventDto.scala` — class GameFullEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/dto/GameStateEventDto.scala` — class GameStateEventDto, function apply
- `modules/api/src/main/scala/de/nowchess/api/error/GameError.scala` — function message
- `modules/api/src/main/scala/de/nowchess/api/game/ClockState.scala`
- function activeColor
- function afterMove
- function remainingMs
- function remainingMs
- function afterMove
- function remainingMs
- _...3 more_
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
- function kingSquare
- function withBoard
- function withTurn
- function withCastlingRights
- function withEnPassantSquare
- function withHalfMoveClock
- function withMove
- _...2 more_
- _...4 more_
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/api/src/main/scala/de/nowchess/api/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/api/src/main/scala/de/nowchess/api/player/PlayerInfo.scala` — class PlayerId, function apply
- `modules/api/src/main/scala/de/nowchess/api/response/ApiResponse.scala`
- class ApiResponse
- function error
- function totalPages
- `modules/core/src/main/scala/de/nowchess/chess/command/Command.scala`
- class Command
- function execute
- function undo
- function description
- class MoveResult
- `modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala`
- class CommandInvoker
- function execute
- function undo
- function redo
- function history
- function getCurrentIndex
- `modules/api/src/main/scala/de/nowchess/api/rules/RuleSet.scala`
- class RuleSet
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...6 more_
- `modules/bot/python/nnue.py`
- function get_weights_dir: ()
- function get_data_dir: ()
- function list_checkpoints: ()
- function migrate_legacy_data: ()
- function show_header: ()
- function show_checkpoints_table: ()
- _...10 more_
- `modules/bot/python/src/dataset.py`
- function get_datasets_dir: () -> Path
- function next_dataset_version: () -> int
- function list_datasets: () -> List[Tuple[int, Dict]]
- function load_dataset_metadata: (version) -> Optional[Dict]
- function save_dataset_metadata: (version, metadata) -> None
- function create_dataset: (version, labeled_jsonl_path, sources, stockfish_depth) -> Path
- _...4 more_
- `modules/bot/python/src/export.py` — function export_to_nbai: (weights_file, output_file, trained_by, train_loss)
- `modules/bot/python/src/generate.py` — function play_random_game_and_collect_positions: (output_file, total_positions, samples_per_game, min_move, max_move, num_workers)
- `modules/bot/python/src/label.py` — function normalize_evaluation: (cp_value, method, scale), function label_positions_with_stockfish: (positions_file, output_file, stockfish_path, batch_size, depth, verbose, normalize, num_workers)
- `modules/bot/python/src/lichess_importer.py` — function import_lichess_evals: (input_path, output_file, max_positions, min_depth, verbose) -> int
- `modules/bot/python/src/tactical_positions_extractor.py`
- function download_and_extract_puzzle_db: (url, output_dir)
- function extract_puzzle_positions: (puzzle_csv, max_puzzles) -> Set[str]
- function load_positions_from_file: (file_path) -> Set[str]
- function merge_positions: (tactical, other, output_file)
- function extract_tactical_only: (puzzle_csv, output_file, max_puzzles) -> int
- function interactive_merge_positions: (puzzle_csv, output_file, max_puzzles)
- `modules/bot/python/src/train.py`
- function fen_to_features: (fen)
- function find_next_version: (base_name)
- function save_metadata: (weights_file, metadata)
- function train_nnue: (data_file, output_file, epochs, batch_size, lr, checkpoint, stockfish_depth, use_versioning, early_stopping_patience, weight_decay, subsample_ratio, hidden_sizes)
- function burst_train: (data_file, output_file, duration_minutes, epochs_per_season, early_stopping_patience, batch_size, lr, initial_checkpoint, stockfish_depth, use_versioning, weight_decay, subsample_ratio, hidden_sizes)
- class NNUEDataset
- _...1 more_
- `modules/bot/src/main/scala/de/nowchess/bot/BotController.scala`
- class BotController
- function getBot
- function listBots
- `modules/bot/src/main/scala/de/nowchess/bot/BotMoveRepetition.scala`
- class BotMoveRepetition
- function blockedMoves
- function repeatedMove
- function filterAllowed
- `modules/bot/src/main/scala/de/nowchess/bot/Config.scala` — class Config
- `modules/bot/src/main/scala/de/nowchess/bot/ai/Evaluation.scala`
- class Evaluation
- class CHECKMATE_SCORE
- class DRAW_SCORE
- function evaluate
- function initAccumulator
- function copyAccumulator
- _...2 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/classic/EvaluationClassic.scala`
- class EvaluationClassic
- function evaluate
- function countRay
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/EvaluationNNUE.scala` — class EvaluationNNUE, function evaluate
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NNUE.scala`
- class NNUE
- function initAccumulator
- function pushAccumulator
- function copyAccumulator
- function recomputeAccumulator
- function validateAccumulator
- _...4 more_
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiLoader.scala`
- class NbaiLoader
- function load
- function loadDefault
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiMigrator.scala` — class NbaiMigrator, function migrateFromBin
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiModel.scala`
- function toJson
- class NbaiMetadata
- function fromJson
- function str
- function num
- `modules/bot/src/main/scala/de/nowchess/bot/bots/nnue/NbaiWriter.scala` — class NbaiWriter, function write
- `modules/bot/src/main/scala/de/nowchess/bot/logic/AlphaBetaSearch.scala`
- function bestMove
- function bestMove
- function bestMoveWithTime
- function bestMoveWithTime
- function loop
- function loop
- `modules/bot/src/main/scala/de/nowchess/bot/logic/MoveOrdering.scala`
- class MoveOrdering
- class OrderingContext
- function addKillerMove
- function getKillerMoves
- function addHistory
- function getHistory
- _...3 more_
- `modules/bot/src/main/scala/de/nowchess/bot/logic/TranspositionTable.scala`
- function advance
- function probe
- function store
- function clear
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotBook.scala` — function probe, function select
- `modules/bot/src/main/scala/de/nowchess/bot/util/PolyglotHash.scala` — class PolyglotHash, function hash
- `modules/bot/src/main/scala/de/nowchess/bot/util/ZobristHash.scala`
- class ZobristHash
- function hash
- function nextHash
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/CoordinatorApp.scala` — class CoordinatorApp
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/BeansProducer.scala`
- class BeansProducer
- function redissonClient
- function kubernetesClient
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/CoordinatorConfig.scala`
- class CoordinatorConfig
- function maxGamesPerCore
- function maxDeviationPercent
- function rebalanceInterval
- function rebalanceMinInterval
- function heartbeatTtl
- _...11 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoordinatorGrpcServer.scala` — class CoordinatorGrpcServer
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/grpc/CoreGrpcClient.scala`
- class CoreGrpcClient
- function shutdown
- function batchResubscribeGames
- function unsubscribeGames
- function evictGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/resource/CoordinatorResource.scala`
- class CoordinatorResource
- function listInstances
- function getMetrics
- function triggerRebalance
- function triggerFailover
- function triggerScaleUp
- _...1 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/AutoScaler.scala`
- class AutoScaler
- function checkAndScale
- function scaleUp
- function scaleDown
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/CacheEvictionManager.scala`
- class CacheEvictionManager
- function setRedisPrefix
- function evictStaleGames
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/FailoverService.scala`
- class FailoverService
- function setRedisPrefix
- function onInstanceStreamDropped
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/HealthMonitor.scala`
- class HealthMonitor
- function setRedisPrefix
- function checkInstanceHealth
- function watchK8sPods
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/InstanceRegistry.scala`
- class InstanceRegistry
- function setRedisPrefix
- function getInstance
- function getAllInstances
- function updateInstanceFromRedis
- function markInstanceDead
- _...1 more_
- `modules/coordinator/src/main/scala/de/nowchess/coordinator/service/LoadBalancer.scala`
- class LoadBalancer
- function setRedisPrefix
- function shouldRebalance
- function rebalance
- `modules/core/src/main/scala/de/nowchess/chess/adapter/RuleSetRestAdapter.scala`
- class RuleSetRestAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/client/IoServiceClient.scala`
- class IoServiceClient
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/core/src/main/scala/de/nowchess/chess/client/RuleServiceClient.scala`
- class RuleServiceClient
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...6 more_
- `modules/core/src/main/scala/de/nowchess/chess/client/StoreServiceClient.scala` — class StoreServiceClient, function getGame
- `modules/core/src/main/scala/de/nowchess/chess/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/core/src/main/scala/de/nowchess/chess/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedisConfig.scala` — class RedisConfig
- `modules/core/src/main/scala/de/nowchess/chess/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/core/src/main/scala/de/nowchess/chess/controller/Parser.scala` — class Parser, function parseMove
- `modules/core/src/main/scala/de/nowchess/chess/engine/GameEngine.scala`
- class GameEngine
- function isPendingPromotion
- function board
- function turn
- function context
- function canUndo
- _...10 more_
- function pendingDrawOfferBy
- function currentClockState
- _...22 more_
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiException.scala`
- class ApiException
- class GameNotFoundException
- class BadRequestException
- `modules/core/src/main/scala/de/nowchess/chess/exception/ApiExceptionMapper.scala` — class ApiExceptionMapper, function toResponse
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoordinatorServiceHandler.scala` — class CoordinatorServiceHandler
- `modules/core/src/main/scala/de/nowchess/chess/grpc/CoreProtoMapper.scala`
- class CoreProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/grpc/IoGrpcClientWrapper.scala`
- class IoGrpcClientWrapper
- function exportCombined
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- `modules/core/src/main/scala/de/nowchess/chess/grpc/RuleSetGrpcAdapter.scala`
- class RuleSetGrpcAdapter
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...5 more_
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
- function context
- class Observer
@@ -82,8 +387,59 @@
- function subscribe
- function unsubscribe
- _...1 more_
- `modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala` — class GameContextExport, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala` — class GameContextImport, function importGameContext
- `modules/core/src/main/scala/de/nowchess/chess/redis/C2sMessage.scala` — class C2sMessage
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisPublisher.scala` — class GameRedisPublisher, function onGameEvent
- `modules/core/src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala`
- class GameRedisSubscriberManager
- function subscribeGame
- function onMessage
- function unsubscribeGame
- function batchResubscribeGames
- function unsubscribeGames
- _...3 more_
- `modules/core/src/main/scala/de/nowchess/chess/registry/GameRegistry.scala`
- class GameRegistry
- function store
- function get
- function update
- function generateId
- `modules/core/src/main/scala/de/nowchess/chess/registry/RedisGameRegistry.scala`
- class RedisGameRegistry
- function generateId
- function store
- function get
- function update
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameDtoMapper.scala`
- class GameDtoMapper
- function statusOf
- function moveToUci
- function toPlayerDto
- function toClockDto
- function toGameStateDto
- _...1 more_
- `modules/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala`
- class GameResource
- function onGameEvent
- function createGame
- function getGame
- function resignGame
- function makeMove
- _...9 more_
- `modules/core/src/main/scala/de/nowchess/chess/service/InstanceHeartbeatService.scala`
- class InstanceHeartbeatService
- function onStart
- function onShutdown
- function setRedisPrefix
- function setSubscriptionCount
- function setLocalCacheSize
- _...2 more_
- `modules/io/src/main/scala/de/nowchess/io/GameFileService.scala`
- class GameFileService
- function saveGameToFile
- function loadGameFromFile
- class FileSystemGameService
- function saveGameToFile
- function loadGameFromFile
- `modules/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala`
- class FenExporter
- function boardToFen
@@ -105,6 +461,17 @@
- function parseBoard
- function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserSupport.scala` — function buildSquares
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoGrpcService.scala` — class IoGrpcService
- `modules/io/src/main/scala/de/nowchess/io/grpc/IoProtoMapper.scala`
- class IoProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/io/src/main/scala/de/nowchess/io/json/JsonExporter.scala` — class JsonExporter, function exportGameContext
- `modules/io/src/main/scala/de/nowchess/io/json/JsonParser.scala` — class JsonParser, function importGameContext
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala`
- class PgnExporter
- function exportGameContext
@@ -115,36 +482,73 @@
- function importGameContext
- function parsePgn
- function parseAlgebraicMove
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala`
- class RuleSet
- `modules/io/src/main/scala/de/nowchess/io/service/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/io/src/main/scala/de/nowchess/io/service/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/io/src/main/scala/de/nowchess/io/service/resource/IoResource.scala`
- class IoResource
- function importFen
- function importPgn
- function exportFen
- function exportPgn
- function exportCombined
- `modules/json/src/main/scala/de/nowchess/json/ChessJacksonModule.scala` — class ChessJacksonModule
- `modules/json/src/main/scala/de/nowchess/json/GameResultDeserializer.scala` — class GameResultDeserializer
- `modules/json/src/main/scala/de/nowchess/json/GameResultSerializer.scala` — class GameResultSerializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeDeserializer.scala` — class MoveTypeDeserializer
- `modules/json/src/main/scala/de/nowchess/json/MoveTypeSerializer.scala` — class MoveTypeSerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareDeserializer.scala` — class SquareDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeyDeserializer.scala` — class SquareKeyDeserializer
- `modules/json/src/main/scala/de/nowchess/json/SquareKeySerializer.scala` — class SquareKeySerializer
- `modules/json/src/main/scala/de/nowchess/json/SquareSerializer.scala` — class SquareSerializer
- `modules/rule/src/main/scala/de/nowchess/rules/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/rule/src/main/scala/de/nowchess/rules/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/ProtoMapper.scala`
- class ProtoMapper
- function toProtoColor
- function fromProtoColor
- function toProtoPieceType
- function fromProtoPieceType
- function toProtoMoveKind
- _...9 more_
- `modules/rule/src/main/scala/de/nowchess/rules/grpc/RuleGrpcService.scala` — class RuleGrpcService
- `modules/rule/src/main/scala/de/nowchess/rules/resource/RuleSetResource.scala`
- class RuleSetResource
- function candidateMoves
- function legalMoves
- function allLegalMoves
- function isCheck
- function isCheckmate
- _...4 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala`
- class DefaultRules
- function loop
- function toMoves
- function loop
- `modules/ui/src/main/scala/de/nowchess/ui/Main.scala` — class Main, function main
- `modules/ui/src/main/scala/de/nowchess/ui/gui/ChessBoardView.scala`
- class ChessBoardView
- function updateBoard
- function updateUndoRedoButtons
- function showMessage
- function showPromotionDialog
- `modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala`
- class ChessGUIApp
- class ChessGUILauncher
- function getEngine
- function launch
- `modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala` — class GUIObserver
- `modules/ui/src/main/scala/de/nowchess/ui/gui/PieceSprites.scala`
- class PieceSprites
- function loadPieceImage
- class SquareColors
- `modules/ui/src/main/scala/de/nowchess/ui/terminal/TerminalUI.scala` — class TerminalUI, function start
- `modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala` — function unicode
- `modules/ui/src/main/scala/de/nowchess/ui/utils/Renderer.scala` — class Renderer, function render
- _...6 more_
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — class DefaultRules, function positionOf
- `modules/store/src/main/scala/de/nowchess/store/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/store/src/main/scala/de/nowchess/store/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedisConfig.scala` — class RedisConfig
- `modules/store/src/main/scala/de/nowchess/store/config/RedissonProducer.scala`
- class RedissonProducer
- function redissonClient
- function close
- `modules/store/src/main/scala/de/nowchess/store/domain/GameRecord.scala` — class GameRecord
- `modules/store/src/main/scala/de/nowchess/store/redis/GameWritebackStreamListener.scala`
- class GameWritebackStreamListener
- function startListening
- function onMessage
- `modules/store/src/main/scala/de/nowchess/store/repository/GameRecordRepository.scala`
- class GameRecordRepository
- function findByGameId
- function persist
- function merge
- `modules/store/src/main/scala/de/nowchess/store/resource/StoreGameResource.scala` — class StoreGameResource, function getGame
- `modules/store/src/main/scala/de/nowchess/store/service/GameWritebackService.scala` — class GameWritebackService, function writeBack
- `modules/ws/src/main/scala/de/nowchess/ws/config/JacksonConfig.scala` — class JacksonConfig, function customize
- `modules/ws/src/main/scala/de/nowchess/ws/config/NativeReflectionConfig.scala` — class NativeReflectionConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedisConfig.scala` — class RedisConfig
- `modules/ws/src/main/scala/de/nowchess/ws/config/RedissonProducer.scala`
- class RedissonProducer
- function produceRedissonClient
- function shutdown
- `modules/ws/src/main/scala/de/nowchess/ws/resource/GameWebSocketResource.scala`
- class GameWebSocketResource
- function onOpen
- function onMessage
- function onTextMessage
- function onClose
+4
View File
@@ -0,0 +1,4 @@
# Middleware
## custom
- generate — `modules/bot/python/src/generate.py`
+198
View File
@@ -0,0 +1,198 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NowChessSystems — codesight report</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#0a0a0f;--card:#12121a;--border:#1e1e2e;--text:#e0e0e8;--muted:#6b6b80;--accent:#6366f1;--accent2:#22d3ee;--green:#22c55e;--orange:#f59e0b;--red:#ef4444;--pink:#ec4899}
body{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;padding:2rem;max-width:1400px;margin:0 auto;line-height:1.6}
h1{font-size:2.5rem;font-weight:800;background:linear-gradient(135deg,var(--accent),var(--accent2));-webkit-background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:.25rem}
.subtitle{color:var(--muted);font-size:1rem;margin-bottom:2rem}
.stack-badge{display:inline-block;background:var(--card);border:1px solid var(--border);border-radius:6px;padding:2px 10px;font-size:.85rem;color:var(--accent2);margin:0 4px 4px 0}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1rem;margin:2rem 0}
.stat{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:1.25rem;text-align:center}
.stat-value{font-size:2rem;font-weight:800;background:linear-gradient(135deg,var(--accent),var(--accent2));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.stat-label{color:var(--muted);font-size:.85rem;margin-top:.25rem}
.token-hero{background:linear-gradient(135deg,#1a1a2e,#16213e);border:1px solid var(--accent);border-radius:16px;padding:2rem;margin:2rem 0;text-align:center}
.token-saved{font-size:3rem;font-weight:900;color:var(--green)}
.token-detail{color:var(--muted);font-size:.9rem;margin-top:.5rem}
.section{margin:2.5rem 0}
.section h2{font-size:1.4rem;font-weight:700;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid var(--border)}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1rem}
.card{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:1rem;transition:border-color .2s}
.card:hover{border-color:var(--accent)}
.card-title{font-weight:700;font-size:1rem;margin-bottom:.5rem}
.card-meta{color:var(--muted);font-size:.8rem}
.tag{display:inline-block;background:rgba(99,102,241,.15);color:var(--accent);border-radius:4px;padding:1px 6px;font-size:.75rem;margin:1px}
.tag-auth{background:rgba(239,68,68,.15);color:var(--red)}
.tag-db{background:rgba(34,211,238,.15);color:var(--accent2)}
.tag-ai{background:rgba(236,72,153,.15);color:var(--pink)}
.tag-payment{background:rgba(245,158,11,.15);color:var(--orange)}
.tag-email{background:rgba(34,197,94,.15);color:var(--green)}
.tag-queue{background:rgba(168,85,247,.15);color:#a855f7}
.tag-cache{background:rgba(245,158,11,.15);color:var(--orange)}
.method{font-weight:700;font-size:.8rem;padding:2px 6px;border-radius:4px;margin-right:6px}
.method-GET{background:rgba(34,197,94,.2);color:var(--green)}
.method-POST{background:rgba(99,102,241,.2);color:var(--accent)}
.method-PUT{background:rgba(245,158,11,.2);color:var(--orange)}
.method-PATCH{background:rgba(245,158,11,.2);color:var(--orange)}
.method-DELETE{background:rgba(239,68,68,.2);color:var(--red)}
.method-ALL{background:rgba(107,107,128,.2);color:var(--muted)}
.route-path{font-family:'Fira Code',monospace;font-size:.9rem}
.route-contract{color:var(--muted);font-size:.8rem;font-style:italic;margin-left:.5rem}
.field{display:flex;gap:.5rem;padding:3px 0;font-size:.9rem}
.field-name{font-family:monospace;color:var(--accent2)}
.field-type{color:var(--muted);font-family:monospace}
.field-flags{display:flex;gap:3px}
.flag{font-size:.7rem;padding:0 4px;border-radius:3px;background:rgba(99,102,241,.1);color:var(--accent)}
.flag-pk{background:rgba(245,158,11,.2);color:var(--orange)}
.flag-fk{background:rgba(34,211,238,.2);color:var(--accent2)}
.flag-unique{background:rgba(236,72,153,.2);color:var(--pink)}
.hot-bar{height:8px;background:linear-gradient(90deg,var(--accent),var(--accent2));border-radius:4px;margin-top:4px}
.component-props{color:var(--muted);font-size:.85rem}
.badge-client{background:rgba(34,197,94,.15);color:var(--green);font-size:.75rem;padding:1px 6px;border-radius:4px}
.badge-server{background:rgba(99,102,241,.15);color:var(--accent);font-size:.75rem;padding:1px 6px;border-radius:4px}
.env-required{color:var(--red);font-weight:600;font-size:.8rem}
.env-default{color:var(--green);font-size:.8rem}
.footer{text-align:center;color:var(--muted);margin-top:4rem;padding-top:2rem;border-top:1px solid var(--border);font-size:.85rem}
.footer a{color:var(--accent);text-decoration:none}
table{width:100%;border-collapse:collapse}
table td,table th{padding:8px 12px;text-align:left;border-bottom:1px solid var(--border);font-size:.9rem}
table th{color:var(--muted);font-size:.8rem;font-weight:600;text-transform:uppercase}
</style>
</head>
<body>
<h1>NowChessSystems</h1>
<div class="subtitle">AI Context Map — generated by codesight</div>
<div>
<span class="stack-badge">raw-http</span>
<span class="stack-badge">unknown</span>
<span class="stack-badge">scala</span>
</div>
<div class="token-hero">
<div class="token-saved">~20,573 tokens saved</div>
<div class="token-detail">
Output: 5,297 tokens — Exploration cost without codesight: ~25,870 tokens — 149 files scanned
</div>
</div>
<div class="stats">
<div class="stat"><div class="stat-value">0</div><div class="stat-label">Routes</div></div>
<div class="stat"><div class="stat-value">0</div><div class="stat-label">Models</div></div>
<div class="stat"><div class="stat-value">0</div><div class="stat-label">Components</div></div>
<div class="stat"><div class="stat-value">63</div><div class="stat-label">Libraries</div></div>
<div class="stat"><div class="stat-value">1</div><div class="stat-label">Env Vars</div></div>
<div class="stat"><div class="stat-value">1</div><div class="stat-label">Middleware</div></div>
<div class="stat"><div class="stat-value">383</div><div class="stat-label">Import Links</div></div>
</div>
<div class="section">
<h2>Dependency Hot Files</h2>
<div class="grid">
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala</div>
<div class="card-meta">imported by 64 files</div>
<div class="hot-bar" style="width:100%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/move/Move.scala</div>
<div class="card-meta">imported by 44 files</div>
<div class="hot-bar" style="width:69%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/Square.scala</div>
<div class="card-meta">imported by 40 files</div>
<div class="hot-bar" style="width:63%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/Color.scala</div>
<div class="card-meta">imported by 35 files</div>
<div class="hot-bar" style="width:55%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/Board.scala</div>
<div class="card-meta">imported by 19 files</div>
<div class="hot-bar" style="width:30%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/Piece.scala</div>
<div class="card-meta">imported by 18 files</div>
<div class="hot-bar" style="width:28%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala</div>
<div class="card-meta">imported by 17 files</div>
<div class="hot-bar" style="width:27%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala</div>
<div class="card-meta">imported by 17 files</div>
<div class="hot-bar" style="width:27%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala</div>
<div class="card-meta">imported by 11 files</div>
<div class="hot-bar" style="width:17%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala</div>
<div class="card-meta">imported by 10 files</div>
<div class="hot-bar" style="width:16%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala</div>
<div class="card-meta">imported by 9 files</div>
<div class="hot-bar" style="width:14%"></div>
</div>
<div class="card">
<div class="card-title" style="font-size:.9rem">modules/api/src/main/scala/de/nowchess/api/game/DrawReason.scala</div>
<div class="card-meta">imported by 7 files</div>
<div class="hot-bar" style="width:11%"></div>
</div>
</div>
</div>
<div class="section">
<h2>Environment Variables</h2>
<table>
<tr><th>Variable</th><th>Status</th><th>Source</th></tr>
<tr>
<td><code>STOCKFISH_PATH</code></td>
<td><span class="env-required">required</span></td>
<td class="card-meta">modules/bot/python/nnue.py</td>
</tr>
</table>
</div>
<div class="section">
<h2>Middleware</h2>
<div class="grid">
<div class="card">
<div class="card-title">generate <span class="tag tag-custom">custom</span></div>
<div class="card-meta">modules/bot/python/src/generate.py</div>
</div>
</div>
</div>
<div class="footer">
Generated by <a href="https://github.com/Houseofmvps/codesight">codesight</a> — see your codebase clearly
</div>
</body>
</html>
+44
View File
@@ -0,0 +1,44 @@
# Routes
## gRPC
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/CoordinatorService/BatchResubscribeGames` (BatchResubscribeRequest) → BatchResubscribeResponse
- `/CoordinatorService/UnsubscribeGames` (UnsubscribeGamesRequest) → UnsubscribeGamesResponse
- `/CoordinatorService/EvictGames` (EvictGamesRequest) → EvictGamesResponse
- `/CoordinatorService/DrainInstance` (DrainInstanceRequest) → DrainInstanceResponse
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
- `/IoService/ImportFen` (ProtoImportFenRequest) → ProtoGameContext
- `/IoService/ImportPgn` (ProtoImportPgnRequest) → ProtoGameContext
- `/IoService/ExportCombined` (ProtoGameContext) → ProtoCombinedExport
- `/IoService/ExportFen` (ProtoGameContext) → ProtoStringResult
- `/IoService/ExportPgn` (ProtoGameContext) → ProtoStringResult
- `/RuleService/CandidateMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/LegalMoves` (ProtoSquareRequest) → ProtoMoveList
- `/RuleService/AllLegalMoves` (ProtoGameContext) → ProtoMoveList
- `/RuleService/IsCheck` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsCheckmate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsStalemate` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsInsufficientMaterial` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsFiftyMoveRule` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/IsThreefoldRepetition` (ProtoGameContext) → ProtoBoolResult
- `/RuleService/ApplyMove` (ProtoMoveRequest) → ProtoGameContext
- `/RuleService/PostMoveStatus` (ProtoGameContext) → ProtoPostMoveStatus
+3 -3
View File
@@ -1,6 +1,6 @@
# NowChessSystems — Wiki
_Generated 2026-04-12 — re-run `npx codesight --wiki` if the codebase has changed._
_Generated 2026-04-23 — re-run `npx codesight --wiki` if the codebase has changed._
Structural map compiled from source code via AST. No LLM — deterministic, 200ms.
@@ -15,7 +15,7 @@ Structural map compiled from source code via AST. No LLM — deterministic, 200m
- Routes: **0**
- Models: **0**
- Components: **0**
- Env vars: **0** required, **0** with defaults
- Env vars: **1** required, **0** with defaults
## How to Use
@@ -41,4 +41,4 @@ These exist in your codebase but are **not** reflected in wiki articles:
When in doubt, search the source. The wiki is a starting point, not a complete inventory.
---
_Last compiled: 2026-04-12 · 2 articles · [codesight](https://github.com/Houseofmvps/codesight)_
_Last compiled: 2026-04-23 · 2 articles · [codesight](https://github.com/Houseofmvps/codesight)_
+2
View File
@@ -3,3 +3,5 @@
History of `npx codesight --wiki` runs. Capped at 20 entries.
## [2026-04-12 14:34:19] scan | 0 routes, 0 models, 0 components → 2 articles
## [2026-04-23 11:41:43] scan | 0 routes, 0 models, 0 components → 2 articles
+15 -7
View File
@@ -4,16 +4,24 @@
**NowChessSystems** is a scala project built with raw-http.
## Scale
1 middleware layers · 1 environment variables
## High-Impact Files
Changes to these files have the widest blast radius across the codebase:
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **28** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **21** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **19** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **14** files
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala` — imported by **13** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **10** files
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala` — imported by **74** files
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala` — imported by **66** files
- `modules/api/src/main/scala/de/nowchess/api/move/Move.scala` — imported by **52** files
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — imported by **42** files
- `modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala` — imported by **27** files
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — imported by **21** files
## Required Environment Variables
- `STOCKFISH_PATH``modules/bot/python/nnue.py`
---
_Back to [index.md](./index.md) · Generated 2026-04-12_
_Back to [index.md](./index.md) · Generated 2026-04-23_
+12
View File
@@ -0,0 +1,12 @@
FROM mcr.microsoft.com/devcontainers/java:21-bookworm
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
postgresql-client \
redis-tools \
stockfish \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /home/vscode/.gradle/wrapper/dists \
&& chown -R vscode:vscode /home/vscode/.gradle
+18
View File
@@ -0,0 +1,18 @@
# Devcontainer
Dieses Setup startet den NowChess-Workspace zusammen mit Redis und PostgreSQL.
## Enthaltene Services
- `workspace` Scala/Gradle-Entwicklungscontainer
- `redis` Redis 7.4
- `postgres` PostgreSQL 16
## Wichtige Ports
- App-Services: `8080`, `8081`, `8082`, `8083`, `8084`, `8085`, `8086`, `9086`
- Redis auf dem Host: `16379`
- PostgreSQL auf dem Host: `15432`
## Einstieg
- VS Code: Ordner in einem Dev Container öffnen
- IntelliJ: Dev Container / Docker-Compose-Workspace öffnen und den `workspace`-Dienst nutzen
+39
View File
@@ -0,0 +1,39 @@
{
"name": "NowChessSystems",
"dockerComposeFile": ["docker-compose.yml"],
"service": "workspace",
"workspaceFolder": "/workspaces/NowChessSystems",
"shutdownAction": "stopCompose",
"overrideCommand": false,
"remoteUser": "vscode",
"forwardPorts": [8080, 8081, 8082, 8083, 8084, 8085, 8086, 9086],
"portsAttributes": {
"8080": {"label": "NowChess Core", "onAutoForward": "notify"},
"8081": {"label": "NowChess Io", "onAutoForward": "notify"},
"8082": {"label": "NowChess Rule", "onAutoForward": "notify"},
"8083": {"label": "NowChess Account", "onAutoForward": "notify"},
"8084": {"label": "NowChess WebSocket", "onAutoForward": "notify"},
"8085": {"label": "NowChess Store", "onAutoForward": "notify"},
"8086": {"label": "NowChess Coordinator HTTP", "onAutoForward": "notify"},
"9086": {"label": "NowChess Coordinator gRPC", "onAutoForward": "notify"}
},
"customizations": {
"vscode": {
"settings": {
"java.configuration.updateBuildConfiguration": "automatic",
"java.import.gradle.wrapper.enabled": true,
"files.watcherExclude": {
"**/build/**": true,
"**/.gradle/**": true
}
},
"extensions": [
"scala-lang.scala",
"redhat.java",
"vscjava.vscode-java-pack"
]
}
},
"postCreateCommand": "bash -lc './gradlew --no-daemon help >/dev/null'"
}
+65
View File
@@ -0,0 +1,65 @@
services:
workspace:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
command: sleep infinity
init: true
volumes:
- gradle-cache:/home/vscode/.gradle
environment:
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PREFIX: nowchess
DB_URL: jdbc:postgresql://postgres:5432/nowchess
DB_USER: nowchess
DB_PASSWORD: nowchess
CORE_SERVICE_URL: http://localhost:8080
INTERNAL_SECRET: dev-internal-secret
STOCKFISH_PATH: /usr/games/stockfish
NOWCHESS_COORDINATOR_ENABLED: "true"
dns:
- 8.8.8.8
- 1.1.1.1
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
redis:
image: docker.io/redis:7.4-alpine
command: ["redis-server", "--appendonly", "yes", "--save", "60", "1"]
ports:
- "16379:6379"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
postgres:
image: docker.io/postgres:16-alpine
environment:
POSTGRES_DB: nowchess
POSTGRES_USER: nowchess
POSTGRES_PASSWORD: nowchess
ports:
- "15432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 5s
timeout: 3s
retries: 20
start_period: 10s
volumes:
gradle-cache:
redis-data:
postgres-data:
+41
View File
@@ -0,0 +1,41 @@
# Normalize text files in the repo
* text=auto eol=lf
# Keep Windows command scripts in CRLF
*.bat text eol=crlf
*.cmd text eol=crlf
# Keep Unix shell scripts in LF
*.sh text eol=lf
# Binary assets (no EOL normalization / textual diff)
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.webp binary
*.bmp binary
*.ico binary
# ML / model / numeric artifacts
*.bin binary
*.pt binary
*.pth binary
*.onnx binary
*.h5 binary
*.hdf5 binary
*.pb binary
*.tflite binary
*.npy binary
*.npz binary
*.safetensors binary
# Firmware / hex-like artifacts
*.hex binary
# Packaged binaries
*.jar binary
*.zip binary
*.7z binary
*.gz binary
+114
View File
@@ -0,0 +1,114 @@
name: Build & Push Native Image
on:
push:
branches:
- main
workflow_dispatch:
jobs:
check-actor:
runs-on: ubuntu-latest
outputs:
allowed: ${{ steps.check.outputs.allowed }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- id: check
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "allowed=true" >> "$GITHUB_OUTPUT"
else
COMMIT_AUTHOR=$(git log -1 --format='%an')
if [[ "$COMMIT_AUTHOR" == "TeamCity" ]]; then
echo "allowed=true" >> "$GITHUB_OUTPUT"
else
echo "allowed=false" >> "$GITHUB_OUTPUT"
fi
fi
build-and-push:
needs: check-actor
if: needs.check-actor.outputs.allowed == 'true'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
strategy:
matrix:
module:
- account
- bot-platform
- coordinator
- core
- io
- official-bots
- rule
- store
- ws
steps:
- uses: actions/checkout@v4
- name: Set up GraalVM
uses: graalvm/setup-graalvm@v1
with:
java-version: '21'
distribution: 'graalvm-community'
native-image-job-reports: 'true'
- name: Cache Gradle packages
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-${{ runner.os }}-
- name: Read version from versions.env
id: version
run: |
if [ -f "modules/${{ matrix.module }}/versions.env" ]; then
source modules/${{ matrix.module }}/versions.env
VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
else
echo "version=latest" >> "$GITHUB_OUTPUT"
fi
- name: Build native binary
run: ./gradlew :modules:${{ matrix.module }}:build -x test -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false -Dquarkus.profile=deployed --no-daemon
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/now-chess/now-chess-systems/${{ matrix.module }}
tags: |
type=raw,value=${{ steps.version.outputs.version }}
type=raw,value=latest
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: modules/${{ matrix.module }}/src/main/docker/Dockerfile.native
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=${{ matrix.module }}
cache-to: type=gha,mode=max,scope=${{ matrix.module }}
+5
View File
@@ -38,6 +38,11 @@ bin/
### VS Code ###
.vscode/
graphify-out/
.graphify_*.json
### Keys ###
**/keys/private.pem
### Mac OS ###
.DS_Store
+2
View File
@@ -8,3 +8,5 @@
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
sonarlint.xml
+133
View File
@@ -0,0 +1,133 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<AndroidXmlCodeStyleSettings>
<option name="USE_CUSTOM_SETTINGS" value="true" />
</AndroidXmlCodeStyleSettings>
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<ScalaCodeStyleSettings>
<option name="FORMATTER" value="1" />
</ScalaCodeStyleSettings>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</XML>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>
+1 -1
View File
@@ -1,5 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>
+18
View File
File diff suppressed because one or more lines are too long
+9 -2
View File
@@ -5,16 +5,23 @@
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="corretto-21" />
<option name="gradleJvm" value="ms-21" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/modules" />
<option value="$PROJECT_DIR$/modules/account" />
<option value="$PROJECT_DIR$/modules/api" />
<option value="$PROJECT_DIR$/modules/bot-platform" />
<option value="$PROJECT_DIR$/modules/coordinator" />
<option value="$PROJECT_DIR$/modules/core" />
<option value="$PROJECT_DIR$/modules/io" />
<option value="$PROJECT_DIR$/modules/json" />
<option value="$PROJECT_DIR$/modules/official-bots" />
<option value="$PROJECT_DIR$/modules/rule" />
<option value="$PROJECT_DIR$/modules/ui" />
<option value="$PROJECT_DIR$/modules/security" />
<option value="$PROJECT_DIR$/modules/store" />
<option value="$PROJECT_DIR$/modules/ws" />
</set>
</option>
</GradleProjectSettings>
+2 -1
View File
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="FrameworkDetectionExcludesConfiguration">
<file type="web" url="file://$PROJECT_DIR$" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="corretto-21" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="ms-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
@@ -0,0 +1,33 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="NowChessSystems.modules.core.main" type="QuarkusRunConfigurationType" factoryName="Quarkus" nameIsGenerated="true">
<module name="NowChessSystems.modules.core.main" />
<QsGradleRunConfiguration>
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$/modules/core" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="quarkusDev" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<ExternalSystemDebugDisabled>false</ExternalSystemDebugDisabled>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<GradleProfilingDisabled>false</GradleProfilingDisabled>
<GradleCoverageDisabled>false</GradleCoverageDisabled>
<profile>dev</profile>
</QsGradleRunConfiguration>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
+1 -1
View File
@@ -5,7 +5,7 @@
<option name="deprecationWarnings" value="true" />
<option name="uncheckedWarnings" value="true" />
</profile>
<profile name="Gradle 2" modules="NowChessSystems.modules.core.main,NowChessSystems.modules.core.scoverage,NowChessSystems.modules.core.test,NowChessSystems.modules.io.main,NowChessSystems.modules.io.scoverage,NowChessSystems.modules.io.test,NowChessSystems.modules.rule.main,NowChessSystems.modules.rule.scoverage,NowChessSystems.modules.rule.test,NowChessSystems.modules.ui.main,NowChessSystems.modules.ui.scoverage,NowChessSystems.modules.ui.test">
<profile name="Gradle 2" modules="NowChessSystems.modules.account.integrationTest,NowChessSystems.modules.account.main,NowChessSystems.modules.account.native-test,NowChessSystems.modules.account.quarkus-generated-sources,NowChessSystems.modules.account.quarkus-test-generated-sources,NowChessSystems.modules.account.scoverage,NowChessSystems.modules.account.test,NowChessSystems.modules.bot-platform.integrationTest,NowChessSystems.modules.bot-platform.main,NowChessSystems.modules.bot-platform.native-test,NowChessSystems.modules.bot-platform.quarkus-generated-sources,NowChessSystems.modules.bot-platform.quarkus-test-generated-sources,NowChessSystems.modules.bot-platform.scoverage,NowChessSystems.modules.bot-platform.test,NowChessSystems.modules.bot.main,NowChessSystems.modules.bot.scoverage,NowChessSystems.modules.bot.test,NowChessSystems.modules.coordinator.integrationTest,NowChessSystems.modules.coordinator.main,NowChessSystems.modules.coordinator.native-test,NowChessSystems.modules.coordinator.quarkus-generated-sources,NowChessSystems.modules.coordinator.quarkus-test-generated-sources,NowChessSystems.modules.coordinator.scoverage,NowChessSystems.modules.coordinator.test,NowChessSystems.modules.core.integrationTest,NowChessSystems.modules.core.main,NowChessSystems.modules.core.native-test,NowChessSystems.modules.core.quarkus-generated-sources,NowChessSystems.modules.core.quarkus-test-generated-sources,NowChessSystems.modules.core.scoverage,NowChessSystems.modules.core.test,NowChessSystems.modules.io.integrationTest,NowChessSystems.modules.io.main,NowChessSystems.modules.io.native-test,NowChessSystems.modules.io.quarkus-generated-sources,NowChessSystems.modules.io.quarkus-test-generated-sources,NowChessSystems.modules.io.scoverage,NowChessSystems.modules.io.test,NowChessSystems.modules.json.main,NowChessSystems.modules.json.scoverage,NowChessSystems.modules.json.test,NowChessSystems.modules.official-bots.integrationTest,NowChessSystems.modules.official-bots.main,NowChessSystems.modules.official-bots.native-test,NowChessSystems.modules.official-bots.quarkus-generated-sources,NowChessSystems.modules.official-bots.quarkus-test-generated-sources,NowChessSystems.modules.official-bots.scoverage,NowChessSystems.modules.official-bots.test,NowChessSystems.modules.rule.integrationTest,NowChessSystems.modules.rule.main,NowChessSystems.modules.rule.native-test,NowChessSystems.modules.rule.quarkus-generated-sources,NowChessSystems.modules.rule.quarkus-test-generated-sources,NowChessSystems.modules.rule.scoverage,NowChessSystems.modules.rule.test,NowChessSystems.modules.security.main,NowChessSystems.modules.security.scoverage,NowChessSystems.modules.security.test,NowChessSystems.modules.store.integrationTest,NowChessSystems.modules.store.main,NowChessSystems.modules.store.native-test,NowChessSystems.modules.store.quarkus-generated-sources,NowChessSystems.modules.store.quarkus-test-generated-sources,NowChessSystems.modules.store.scoverage,NowChessSystems.modules.store.test,NowChessSystems.modules.ui.main,NowChessSystems.modules.ui.scoverage,NowChessSystems.modules.ui.test,NowChessSystems.modules.ws.integrationTest,NowChessSystems.modules.ws.main,NowChessSystems.modules.ws.native-test,NowChessSystems.modules.ws.quarkus-generated-sources,NowChessSystems.modules.ws.quarkus-test-generated-sources,NowChessSystems.modules.ws.scoverage,NowChessSystems.modules.ws.test">
<option name="deprecationWarnings" value="true" />
<option name="uncheckedWarnings" value="true" />
<parameters>
+15
View File
@@ -0,0 +1,15 @@
rules = [
DisableSyntax,
LeakingImplicitClassVal,
NoValInForComprehension,
ProcedureSyntax,
]
DisableSyntax.noVars = true
DisableSyntax.noThrows = true
DisableSyntax.noNulls = true
DisableSyntax.noReturns = true
DisableSyntax.noAsInstanceOf = true
DisableSyntax.noIsInstanceOf = true
DisableSyntax.noXml = true
DisableSyntax.noFinalize = true
+8
View File
@@ -0,0 +1,8 @@
version = 3.8.1
runner.dialect = scala3
maxColumn = 120
indent.main = 2
align.preset = more
trailingCommas = always
rewrite.rules = [SortImports, RedundantBraces]
rewrite.scala3.convertToNewSyntax = true
+6 -6
View File
@@ -1,7 +1,7 @@
YOU CAN:
- Edit and use the asset in any commercial or non commercial project
- Use the asset in any commercial or non commercial project
YOU CAN'T:
- Resell or distribute the asset to others
YOU CAN:
- Edit and use the asset in any commercial or non commercial project
- Use the asset in any commercial or non commercial project
YOU CAN'T:
- Resell or distribute the asset to others
- Edit and resell the asset to others - - Credits required using This link: https://fatman200.itch.io/
+31 -25
View File
@@ -9,8 +9,9 @@ Scala 3.5.1 · Gradle 9
./compile # Compile all modules — always run
./test # Run all tests
./coverage # Check coverage
./lint # Run linters
```
Try to stick to these commands for consistency.
Use consistently.
## Modules
@@ -19,35 +20,43 @@ Try to stick to these commands for consistency.
| `api` | Model / shared types | (none) |
| `core` | Primary business logic | api, rule |
| `rule` | Game rules | api |
| `bot` | Bots and AI | api,rule,io |
| `io` | Export formats | api, core |
| `ui` | Entrypoint & UI | core, io |
## Style
- Use immutable data and pure functions.
- Keep functions under 30 lines. If you need "and" to describe it, split it.
- Keep cyclomatic complexity under 15.
- Avoid comments. Let names carry intent; comment only non-obvious algorithms.
- Scan for duplicated logic before finishing. Extract it.
- Immutable data, pure functions.
- Functions under 30 lines. Need "and"? Split it.
- Cyclomatic complexity under 15.
- No comments. Names carry intent. Comment non-obvious algorithms only.
- Scan duplicated logic. Extract.
- Follow default Sonar style for Scala.
- Use `Option` or `Either` for fallible operations; avoid exceptions for control flow.
- Naming: types are PascalCase, functions/values are camelCase.
- `Option`/`Either` for fallible ops. Skip exceptions for control flow.
- Naming: types PascalCase, functions/values camelCase.
## Code Quality
- **Coverage:** 100% condition coverage required in `api`, `core`, `rule`, `io` (mandatory); `ui` exempt.
### Linters
- **scalafmt** — Enforces formatting. Check: `./gradlew spotlessScalaCheck`. Refactor: `./gradlew spotlessScalaApply`.
- **scalafix** — Enforces style, detects unused imports/code. Run: `./gradlew scalafix`.
## Architecture Decisions
- **Immutable state as primary model:** GameContext (api) holds board, history, player stateimmutable, passed through the system. Each move creates a new GameContext, enabling undo/redo without side effects.
- **Observer pattern for UI decoupling:** GameEngine publishes move/state events; CommandInvoker queues moves; UI listens to events, not polling. GameEngine never imports UI code.
- **RuleSet trait encapsulates rules:** Move generation, check, castling, en passant all in RuleSet impl. GameEngine calls rules as a black box; rules don't know about the rest of core.
- **Immutable state as primary model:** GameContext (api) holds board, history, player stateimmutable throughout. Each move new GameContext. Enables undo/redo without side effects.
- **Observer pattern for UI decoupling:** GameEngine publishes move/state events; CommandInvoker queues moves; UI listens (no polling). GameEngine never imports UI.
- **RuleSet trait encapsulates rules:** Move generation, check, castling, en passant all in RuleSet impl. GameEngine calls rules as black box; rules don't know rest of core.
- **Polyglot hash must follow spec index layout:** Piece keys use interleaved mapping `(pieceType * 2 + colorBit)` (black=0, white=1). Castling keys: `768..771`. En-passant file keys: `772..779`, XORed only if side-to-move has capturable en passant. Side-to-move key: `780` (white).
- **Alpha-beta uses sequential PV search by default:** Parallel split disabled (fixed-window futures removed pruning effectiveness). Sequential PV default. Correctness + pruning quality > speculative parallelism.
- **Search hash is updated incrementally per move:** Bot search updates Zobrist keys from parent hash with move deltas, not recomputing piece scans per node.
## Rules
- **Tests are the spec.** Never modify tests to pass; modify requirements or code. Update tests only if requirements change.
- **Tests are the spec.** Don't modify to pass. Fix requirements/code. Update only if requirements change.
- Never read build folders. Ask permission if needed.
- Keep this file up to date with any important decisions or conventions.
- Keep file current with decisions + conventions.
---
@@ -55,11 +64,9 @@ Try to stick to these commands for consistency.
### Two-Step Rule (mandatory)
**Step 1 — Orient:** Use wiki articles to find WHERE things live.
**Step 2 — Verify:** Read the actual source files listed in the wiki article BEFORE writing any code.
**Step 2 — Verify:** Read source files from wiki BEFORE coding.
Wiki articles are structural summaries extracted by AST. They show routes, models, and file locations.
They do NOT show full function logic, middleware internals, or dynamic runtime behavior.
**Never write or modify code based solely on wiki content — always read source files first.**
Wiki = structural summaries (routes, models, file locations). No function logic, middleware internals, runtime behavior. Don't code from wiki alone—read sources.
Read in order at session start:
1. `.codesight/wiki/index.md` — orientation map (~200 tokens)
@@ -67,8 +74,7 @@ Read in order at session start:
3. Domain article (e.g. `.codesight/wiki/auth.md`) → check "Source Files" section → read those files
4. `.codesight/CODESIGHT.md` — full context map for deep exploration
Routes marked `[inferred]` in wiki articles were detected via regex — verify against source before trusting.
If any source file shows ⚠ in the wiki, re-run `codesight --wiki` before proceeding.
`[inferred]` routes = regex-detected. Verify sources. ⚠ in wiki? Re-run `codesight --wiki`.
Or use the codesight MCP server for on-demand queries:
- `codesight_get_wiki_article` — read a specific wiki article by name
@@ -78,13 +84,13 @@ Or use the codesight MCP server for on-demand queries:
- `codesight_get_blast_radius --file src/lib/db.ts` — impact analysis before changes
- `codesight_get_schema --model users` — specific model details
Only open specific files after consulting codesight context. This saves ~16.893 tokens per conversation.
Consult codesight context first. Saves ~16.893 tokens/conversation.
## graphify
This project has a graphify knowledge graph at graphify-out/.
graphify knowledge graph at graphify-out/.
Rules:
- Before answering architecture or codebase questions, read graphify-out/GRAPH_REPORT.md for god nodes and community structure
- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
- After modifying code files in this session, run `python3 -c "from graphify.watch import _rebuild_code; from pathlib import Path; _rebuild_code(Path('.'))"` to keep the graph current
- Architecture/codebase questions? Read graphify-out/GRAPH_REPORT.md (god nodes, communities).
- graphify-out/wiki/index.md exists? Use it (not raw files).
- Code modified? Run `python3 -c "from graphify.watch import _rebuild_code; from pathlib import Path; _rebuild_code(Path('.'))"` to sync graph.
+99
View File
@@ -0,0 +1,99 @@
# Now-Chess
Scala 3.5.1 · Gradle 9
## Commands
```
./clean # Clear build dirs — only when necessary
./compile # Compile all modules — always run
./test # Run all tests
./coverage # Check coverage
./lint # Run linters
```
Try to stick to these commands for consistency.
## Modules
| Module | Role | Depends on |
|--------|------|-----------|
| `api` | Model / shared types | (none) |
| `core` | Primary business logic | api, rule |
| `rule` | Game rules | api |
| `bot` | Bots and AI | api,rule,io |
| `io` | Export formats | api, core |
## Style
- Use immutable data and pure functions.
- Keep functions under 30 lines. If you need "and" to describe it, split it.
- Keep cyclomatic complexity under 15.
- Avoid comments. Let names carry intent; comment only non-obvious algorithms.
- Scan for duplicated logic before finishing. Extract it.
- Follow default Sonar style for Scala.
- Use `Option` or `Either` for fallible operations; avoid exceptions for control flow.
- Naming: types are PascalCase, functions/values are camelCase.
## Code Quality
- **Coverage:** 100% condition coverage required in `api`, `core`, `rule`, `io` (mandatory); `ui` exempt.
### Linters
- **scalafmt** — enforces formatting; run `./gradlew spotlessScalaCheck` to check and `./gradlew spotlessScalaApply` to refactor.
- **scalafix** — enforces style and detects unused imports/code; run `./gradlew scalafix` to apply rules.
## Architecture Decisions
- **Immutable state as primary model:** GameContext (api) holds board, history, player state — immutable, passed through the system. Each move creates a new GameContext, enabling undo/redo without side effects.
- **Observer pattern for UI decoupling:** GameEngine publishes move/state events; CommandInvoker queues moves; UI listens to events, not polling. GameEngine never imports UI code.
- **RuleSet trait encapsulates rules:** Move generation, check, castling, en passant all in RuleSet impl. GameEngine calls rules as a black box; rules don't know about the rest of core.
- **Polyglot hash must follow spec index layout:** piece keys use interleaved mapping `(pieceType * 2 + colorBit)` with black=0/white=1, castling keys are `768..771`, en-passant file keys are `772..779` and are XORed only if side-to-move has a pawn that can capture en passant, side-to-move key is `780` for white.
- **Alpha-beta uses sequential PV search by default:** parallel split was disabled because fixed-window futures removed pruning effectiveness; correctness and pruning quality take priority over speculative parallelism.
- **Search hash is updated incrementally per move:** bot search now updates Zobrist keys from parent hash with move deltas instead of recomputing piece scans at every node.
## Rules
- **Tests are the spec.** Never modify tests to pass; modify requirements or code. Update tests only if requirements change.
- Never read build folders. Ask permission if needed.
- Keep this file up to date with any important decisions or conventions.
---
## Instructions for Claude Code
### Two-Step Rule (mandatory)
**Step 1 — Orient:** Use wiki articles to find WHERE things live.
**Step 2 — Verify:** Read the actual source files listed in the wiki article BEFORE writing any code.
Wiki articles are structural summaries extracted by AST. They show routes, models, and file locations.
They do NOT show full function logic, middleware internals, or dynamic runtime behavior.
**Never write or modify code based solely on wiki content — always read source files first.**
Read in order at session start:
1. `.codesight/wiki/index.md` — orientation map (~200 tokens)
2. `.codesight/wiki/overview.md` — architecture overview (~500 tokens)
3. Domain article (e.g. `.codesight/wiki/auth.md`) → check "Source Files" section → read those files
4. `.codesight/CODESIGHT.md` — full context map for deep exploration
Routes marked `[inferred]` in wiki articles were detected via regex — verify against source before trusting.
If any source file shows ⚠ in the wiki, re-run `codesight --wiki` before proceeding.
Or use the codesight MCP server for on-demand queries:
- `codesight_get_wiki_article` — read a specific wiki article by name
- `codesight_get_wiki_index` — get the wiki index
- `codesight_get_summary` — quick project overview
- `codesight_get_routes --prefix /api/users` — filtered routes
- `codesight_get_blast_radius --file src/lib/db.ts` — impact analysis before changes
- `codesight_get_schema --model users` — specific model details
Only open specific files after consulting codesight context. This saves ~16.893 tokens per conversation.
## graphify
This project has a graphify knowledge graph at graphify-out/.
Rules:
- Before answering architecture or codebase questions, read graphify-out/GRAPH_REPORT.md for god nodes and community structure
- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
- After modifying code files in this session, run `python3 -c "from graphify.watch import _rebuild_code; from pathlib import Path; _rebuild_code(Path('.'))"` to keep the graph current
@@ -0,0 +1,334 @@
# Plan: Add Coordinator Microservice
## Context
NowChess scales `core` horizontally via shared Redis but lacks:
- **Instance visibility**: no way to list running cores or their load
- **Load balancing**: games land randomly on cores; no rebalancing
- **Failover**: dead cores orphan subscriptions; bullet chess requires <1s recovery
- **Auto-scaling**: manual ops to add/remove cores
- **Cache management**: no eviction of stale games from core memory
Bullet chess games run on move timings of <3s. 30s failover = game lost on clock. Target: **<300ms failover**.
---
## Architecture: Sub-1s Failover
### Why Not Polling/TTL
- TTL expiry: minimum 10-30s detection
- HTTP polling 3x failure: 30s minimum
- **gRPC streaming TCP drop: 50-200ms** — use this as primary
### Primary: gRPC Bidirectional Streaming
- Core opens a **persistent bidirectional stream** (`CoreHeartbeatStream`) to coordinator on startup
- Core sends heartbeat frames every **200ms**
- Core crash = TCP RST/FIN → coordinator stream error in **~50-200ms**
- Stream also carries metadata updates (subscription count changes) in real-time
### Fallback: Redis Heartbeat + K8s Watch
- Redis heartbeat key `{prefix}:instances:{instanceId}` with **5s TTL**, refreshed every **2s**
- K8s pod watch via Kubernetes Java client (event-driven; handles pod eviction/OOMKill)
- Fallback covers: network partition (TCP stays up but core is zombie), coordinator restart gap
---
## Design
### 1. Module: `modules/coordinator`
**Language**: Scala 3.5.1, Quarkus REST + gRPC
**Ports**: HTTP 8086, gRPC 9086
**Dependencies**: Redisson, Kubernetes Java client, Quarkus gRPC
**Persistence**: None (all state in Redis)
---
### 2. Instance Registry
**Redis schema**:
```
{prefix}:instances:{instanceId}
- TTL: 5s (refreshed by core every 2s via background task)
- Value: JSON
{
"instanceId": "core-abc123",
"hostname": "core-pod-3",
"httpPort": 8080,
"grpcPort": 9080,
"subscriptionCount": 147,
"localCacheSize": 147,
"lastHeartbeat": "2026-04-26T10:15:30.123Z"
}
{prefix}:instance:{instanceId}:games
- Type: Redis Set (no TTL — managed explicitly)
- Members: all gameIds currently subscribed on this instance
```
**Core changes** (new `InstanceHeartbeatService` bean in `modules/core`):
- `@PostConstruct`: generate stable `instanceId` (hostname + random suffix); open gRPC stream to coordinator; publish Redis heartbeat; register in `{prefix}:instances:{instanceId}`
- Every 200ms: send heartbeat frame on gRPC stream (carries `subscriptionCount`)
- Every 2s: refresh Redis heartbeat bucket TTL
- `subscribeGame(gameId)`: `SADD {prefix}:instance:{instanceId}:games gameId`
- `unsubscribeGame(gameId)` / `evictGame(gameId)`: `SREM {prefix}:instance:{instanceId}:games gameId`
- `@PreDestroy`: delete Redis key + games set; close gRPC stream (clean shutdown)
---
### 3. Health Monitoring (3 signals, primary fast)
| Signal | Mechanism | Detection time | Role |
|--------|-----------|---------------|------|
| **gRPC stream drop** | TCP RST/FIN on bidirectional stream | 50200ms | Primary |
| **Redis heartbeat expiry** | `{prefix}:instances:{instanceId}` TTL=5s | 57s | Fallback |
| **K8s pod watch** | `CoreV1Api.listNamespacedPod` watch stream | ~instant (pod events) | Fallback |
**Dead decision**:
- gRPC stream drops → **immediate failover** (no confirmation needed; games must recover fast)
- Redis heartbeat expires (gRPC still up) → verify with single HTTP `/q/health` call → if fail: failover
- K8s pod NotReady (gRPC still up) → failover
---
### 4. Failover Protocol (<300ms target)
```
T+0ms Core JVM crashes / network drops
T+50ms Coordinator: gRPC stream error received
T+52ms SMEMBERS {prefix}:instance:{instanceId}:games → list of orphaned gameIds
T+55ms Distribute gameIds across healthy cores (least-loaded first)
T+60ms BatchResubscribeGames gRPC call(s) fire to healthy core(s)
T+150ms Healthy cores resubscribed; Redis s2c topics live again
T+200ms WebSocket clients reconnect; receive GameFullEventDto on CONNECTED
```
**Failover steps** (coordinator `FailoverService`):
1. On stream drop for `instanceId`:
a. Mark instance DEAD in local map
b. `SMEMBERS {prefix}:instance:{instanceId}:games`
c. Group gameIds into batches per target core (round-robin by load)
d. For each target core: call `BatchResubscribeGames(gameIds)`
e. Each target core: calls `subscribeGame(gameId)` for each (loads from Redis if not in local cache)
f. `DEL {prefix}:instance:{instanceId}:games` (cleanup)
2. Log failover event with count of games migrated + latency
---
### 5. Load Rebalancing
**Thresholds** (both must be evaluated):
1. **Absolute**: any core > 500 games → rebalance
2. **Relative**: max load > mean × 1.2 AND max - min > 50 games → rebalance
**Algorithm** (runs every 30s, min 60s between actual rebalances):
1. Read all `{prefix}:instances:*` keys → load map
2. Identify overloaded cores (exceed either threshold)
3. For each overloaded core: pick `excess = load - targetLoad` games
4. Assign excess games to underloaded cores
5. Call `UnsubscribeGames(gameIds)` on overloaded core
6. Call `BatchResubscribeGames(gameIds)` on target core
7. Overloaded core: `SREM` each game from its set
8. Target core: `SADD` each game to its set on subscribe
---
### 6. Auto-Scaling
**Metric**: avg `subscriptionCount` across all cores
**Actions**:
- avg > `scale-up-threshold` (80% of max): patch `nowchess-core` Argo Rollout `spec.replicas += 1`
- avg < `scale-down-threshold` (30% of max) AND `replicas > min-replicas`: drain one core then scale down
- Backoff: min 2-minute interval between scale events
**Argo Rollouts API**:
- CRD: `argoproj.io/v1alpha1`, Kind: `Rollout`, resource: `rollouts`
- Scale via Fabric8 `GenericKubernetesResource` patch on `spec.replicas`
- No StatefulSet — Argo Rollout owns pod lifecycle (canary/blue-green strategies respected)
- Pod watch filter: label selector `app=nowchess-core` (Rollout sets this; `rollouts-pod-template-hash` is Argo's equivalent of `pod-template-hash`)
**Drain before scale-down**:
1. Pick least-loaded core
2. Migrate all its games to other cores via `BatchResubscribeGames`
3. Call `DrainInstance(instanceId)` on that core (sets it to reject new subscriptions)
4. After drain confirmed: patch Rollout `spec.replicas -= 1`
---
### 7. Cache Eviction
**Trigger**: coordinator scans `{prefix}:game:entry:*` every 10 minutes
**Policy**: if `now - lastUpdated > 45min` AND `gameId` in any instance's games set → call `EvictGame`
**Effect**: core removes game from `localEngines` and `unsubscribeGame`, `SREM` from instance set
---
### 8. Proto: `coordinator_service.proto`
```proto
syntax = "proto3";
package de.nowchess.coordinator;
service CoordinatorService {
// Core → Coordinator: bidirectional stream for liveness
rpc HeartbeatStream(stream HeartbeatFrame) returns (stream CoordinatorCommand);
// Coordinator → Core: batch resubscribe after failover or rebalance
rpc BatchResubscribeGames(BatchResubscribeRequest) returns (BatchResubscribeResponse);
// Coordinator → Core: unsubscribe games (rebalance source)
rpc UnsubscribeGames(UnsubscribeGamesRequest) returns (UnsubscribeGamesResponse);
// Coordinator → Core: evict idle games from local cache
rpc EvictGames(EvictGamesRequest) returns (EvictGamesResponse);
// Coordinator → Core: drain instance before scale-down
rpc DrainInstance(DrainInstanceRequest) returns (DrainInstanceResponse);
}
message HeartbeatFrame {
string instanceId = 1;
string hostname = 2;
int32 httpPort = 3;
int32 grpcPort = 4;
int32 subscriptionCount = 5;
int32 localCacheSize = 6;
int64 timestampMillis = 7;
}
message CoordinatorCommand {
// Future: coordinator can push commands back (e.g., "start draining")
string type = 1;
string payload = 2;
}
message BatchResubscribeRequest {
repeated string gameIds = 1;
}
message BatchResubscribeResponse {
int32 subscribedCount = 1;
repeated string failedGameIds = 2;
}
message UnsubscribeGamesRequest {
repeated string gameIds = 1;
}
message UnsubscribeGamesResponse {
int32 unsubscribedCount = 1;
}
message EvictGamesRequest {
repeated string gameIds = 1;
}
message EvictGamesResponse {
int32 evictedCount = 1;
}
message DrainInstanceRequest {}
message DrainInstanceResponse {
int32 gamesMigrated = 0;
}
```
---
### 9. Coordinator REST API (internal)
- `GET /api/coordinator/instances` — all cores with load, health state
- `GET /api/coordinator/metrics` — load distribution, rebalance history
- `POST /api/coordinator/rebalance` — manual rebalance trigger
- `POST /api/coordinator/failover/{instanceId}` — manual failover
- `POST /api/coordinator/scale-up` / `scale-down` — manual scaling
---
### 10. Configuration
**`modules/coordinator/src/main/resources/application.yml`**:
```yaml
quarkus.application.name: nowchess-coordinator
quarkus.http.port: 8086
quarkus.grpc.server.port: 9086
nowchess.coordinator.max-games-per-core: 500
nowchess.coordinator.max-deviation-percent: 20
nowchess.coordinator.rebalance-interval: 30s
nowchess.coordinator.rebalance-min-interval: 60s
nowchess.coordinator.heartbeat-ttl: 5s
nowchess.coordinator.stream-heartbeat-interval: 200ms
nowchess.coordinator.cache-eviction-interval: 10m
nowchess.coordinator.game-idle-threshold: 45m
nowchess.coordinator.auto-scale-enabled: false
nowchess.coordinator.scale-up-threshold: 0.8
nowchess.coordinator.scale-down-threshold: 0.3
nowchess.coordinator.scale-min-replicas: 2
nowchess.coordinator.scale-max-replicas: 10
nowchess.coordinator.k8s-namespace: default
nowchess.coordinator.k8s-rollout-name: nowchess-core
nowchess.coordinator.k8s-rollout-label-selector: app=nowchess-core
quarkus.kubernetes-client.trust-certs: true
```
**Core `application.yml` additions**:
```yaml
nowchess.coordinator.host: localhost
nowchess.coordinator.grpc-port: 9086
nowchess.coordinator.stream-heartbeat-interval: 200ms
nowchess.coordinator.redis-heartbeat-interval: 2s
nowchess.coordinator.instance-id: ${HOSTNAME:local}-${quarkus.uuid}
```
---
### 11. Files to Create / Modify
**New — `modules/coordinator/`**:
```
build.gradle.kts
src/main/proto/coordinator_service.proto
src/main/resources/application.yml
src/main/scala/de/nowchess/coordinator/
resource/CoordinatorResource.scala # REST endpoints
service/InstanceRegistry.scala # Redis instance list + in-memory map
service/HealthMonitor.scala # gRPC stream watcher + Redis TTL + k8s watch
service/FailoverService.scala # dead core → BatchResubscribe
service/LoadBalancer.scala # rebalance logic
service/AutoScaler.scala # k8s StatefulSet scaling
service/CacheEvictionManager.scala # idle game eviction
grpc/CoordinatorGrpcServer.scala # CoordinatorService gRPC impl (for HeartbeatStream)
```
**Modify — `modules/core/`**:
- `build.gradle.kts` — add `coordinator_service.proto` stub, keep grpc dep
- `src/main/proto/coordinator_service.proto` — copy (or symlink) proto for stub generation
- `src/main/scala/de/nowchess/chess/redis/GameRedisSubscriberManager.scala``SADD`/`SREM` on subscribe/unsubscribe + implement `BatchResubscribeGames`, `UnsubscribeGames`, `EvictGames`, `DrainInstance` gRPC handlers
- `src/main/scala/de/nowchess/chess/` — new `InstanceHeartbeatService.scala` (startup, gRPC stream, Redis TTL refresh)
- `src/main/resources/application.yml` — coordinator connection config
**Modify — root**:
- `settings.gradle.kts` — add `include("modules/coordinator")`
---
## Verification
1. `./compile` — coordinator and core compile cleanly
2. **Stream detection**: start core + coordinator; kill core JVM (`kill -9`); coordinator logs failover within 300ms
3. **Game continuity**: active game on killed core; WebSocket client reconnects and receives game state
4. **Rebalance**: create 600 games on core-1 (2-core setup); coordinator rebalances ~100 to core-2
5. **Fallback**: disconnect gRPC stream manually but keep core alive; Redis TTL fallback triggers within 7s
6. **Cache eviction**: create idle game; coordinator calls `EvictGames` after 45min idle
7. **REST metrics**: `curl localhost:8086/api/coordinator/metrics` returns per-core load + health
8. **Restart recovery**: restart coordinator; gRPC streams re-establish from cores; state rebuilt from Redis
---
## Dependencies (new)
- `io.fabric8:kubernetes-client:6.13.0` (Fabric8 k8s client — handles Argo `Rollout` CRD via `GenericKubernetesResource`; no Argo Java SDK needed)
- Redisson — already in core, reuse via shared config
- Quarkus gRPC — already in core, reuse
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Offer Draw
type: http
seq: 1
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/offer
body: none
auth: none
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Accept Draw
type: http
seq: 2
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/accept
body: none
auth: none
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Decline Draw
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/decline
body: none
auth: none
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Claim Draw
type: http
seq: 4
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/draw/claim
body: none
auth: none
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: draw
seq: 2
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Export FEN
type: http
seq: 1
}
http {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/fen
body: none
auth: none
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Export PGN
type: http
seq: 2
}
http {
method: GET
url: {{baseUrl}}/api/board/game/{{gameId}}/export/pgn
body: none
auth: none
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: export
seq: 6
}
+27
View File
@@ -0,0 +1,27 @@
meta {
name: Create Game
type: http
seq: 1
}
http {
method: POST
url: {{baseUrl}}/api/board/game
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"white": {"id": "p1", "displayName": "Alice"},
"black": {"id": "p2", "displayName": "Bob"},
"timeControl": {
"limitSeconds": 300,
"incrementSeconds": 3
}
}
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Get Game
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/board/game/{{gameId}}
body: none
auth: none
}
vars:pre-request {
gameId: j0nPtcjl
}
+34
View File
@@ -0,0 +1,34 @@
meta {
name: Stream Game
type: ws
seq: 3
}
ws {
url: {{wsBaseUrl}}/api/board/game/{{gameId}}/ws
body: ws
auth: none
}
body:ws {
name: move
content: '''
{
"type": "MOVE",
"uci": "b1c3"
}
'''
}
body:ws {
name: ping
content: '''
{
"type": "PING"
}
'''
}
vars:pre-request {
gameId: j0nPtcjl
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Resign
type: http
seq: 4
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/resign
body: none
auth: none
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: game
seq: 3
}
+28
View File
@@ -0,0 +1,28 @@
meta {
name: Import FEN
type: http
seq: 1
}
http {
method: POST
url: {{baseUrl}}/api/board/game/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"white": {"id": "p1", "displayName": "Alice"},
"black": {"id": "p2", "displayName": "Bob"},
"timeControl": {
"limitSeconds": 300,
"incrementSeconds": 3
}
}
}
+22
View File
@@ -0,0 +1,22 @@
meta {
name: Import PGN
type: http
seq: 2
}
http {
method: POST
url: {{baseUrl}}/api/board/game/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"pgn": "1. e4 e5 2. Nf3 Nc6 *"
}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: import
seq: 5
}
+15
View File
@@ -0,0 +1,15 @@
meta {
name: Make Move
type: http
seq: 1
}
post {
url: {{baseUrl}}/api/board/game/{{gameId}}/move/b1c3
body: none
auth: none
}
vars:pre-request {
gameId: Yg200tOF
}
+19
View File
@@ -0,0 +1,19 @@
meta {
name: Get Legal Moves
type: http
seq: 2
}
get {
url: {{baseUrl}}/api/board/game/{{gameId}}/moves
body: none
auth: none
}
params:query {
square: e2
}
vars:pre-request {
gameId: COy3oigz
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Undo Move
type: http
seq: 3
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/undo
body: none
auth: none
}
+12
View File
@@ -0,0 +1,12 @@
meta {
name: Redo Move
type: http
seq: 4
}
http {
method: POST
url: {{baseUrl}}/api/board/game/{{gameId}}/redo
body: none
auth: none
}
+3
View File
@@ -0,0 +1,3 @@
meta {
name: move
}
+6
View File
@@ -0,0 +1,6 @@
{
"version": "1",
"name": "NowChess API",
"type": "collection",
"ignore": []
}
View File
+5
View File
@@ -0,0 +1,5 @@
vars {
baseUrl: http://localhost:8080
wsBaseUrl: ws://localhost:8084
ioBaseUrl: http://localhost:8081
}
+100
View File
@@ -0,0 +1,100 @@
meta {
name: Export FEN
type: http
seq: 1
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/fen
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"board": {
"a1": {"color": "White", "pieceType": "Rook"},
"b1": {"color": "White", "pieceType": "Knight"},
"c1": {"color": "White", "pieceType": "Bishop"},
"d1": {"color": "White", "pieceType": "Queen"},
"e1": {"color": "White", "pieceType": "King"},
"f1": {"color": "White", "pieceType": "Bishop"},
"g1": {"color": "White", "pieceType": "Knight"},
"h1": {"color": "White", "pieceType": "Rook"},
"a2": {"color": "White", "pieceType": "Pawn"},
"b2": {"color": "White", "pieceType": "Pawn"},
"c2": {"color": "White", "pieceType": "Pawn"},
"d2": {"color": "White", "pieceType": "Pawn"},
"e2": {"color": "White", "pieceType": "Pawn"},
"f2": {"color": "White", "pieceType": "Pawn"},
"g2": {"color": "White", "pieceType": "Pawn"},
"h2": {"color": "White", "pieceType": "Pawn"},
"a7": {"color": "Black", "pieceType": "Pawn"},
"b7": {"color": "Black", "pieceType": "Pawn"},
"c7": {"color": "Black", "pieceType": "Pawn"},
"d7": {"color": "Black", "pieceType": "Pawn"},
"e7": {"color": "Black", "pieceType": "Pawn"},
"f7": {"color": "Black", "pieceType": "Pawn"},
"g7": {"color": "Black", "pieceType": "Pawn"},
"h7": {"color": "Black", "pieceType": "Pawn"},
"a8": {"color": "Black", "pieceType": "Rook"},
"b8": {"color": "Black", "pieceType": "Knight"},
"c8": {"color": "Black", "pieceType": "Bishop"},
"d8": {"color": "Black", "pieceType": "Queen"},
"e8": {"color": "Black", "pieceType": "King"},
"f8": {"color": "Black", "pieceType": "Bishop"},
"g8": {"color": "Black", "pieceType": "Knight"},
"h8": {"color": "Black", "pieceType": "Rook"}
},
"turn": "White",
"castlingRights": {
"whiteKingSide": true,
"whiteQueenSide": true,
"blackKingSide": true,
"blackQueenSide": true
},
"enPassantSquare": null,
"halfMoveClock": 0,
"moves": [],
"result": null,
"initialBoard": {
"a1": {"color": "White", "pieceType": "Rook"},
"b1": {"color": "White", "pieceType": "Knight"},
"c1": {"color": "White", "pieceType": "Bishop"},
"d1": {"color": "White", "pieceType": "Queen"},
"e1": {"color": "White", "pieceType": "King"},
"f1": {"color": "White", "pieceType": "Bishop"},
"g1": {"color": "White", "pieceType": "Knight"},
"h1": {"color": "White", "pieceType": "Rook"},
"a2": {"color": "White", "pieceType": "Pawn"},
"b2": {"color": "White", "pieceType": "Pawn"},
"c2": {"color": "White", "pieceType": "Pawn"},
"d2": {"color": "White", "pieceType": "Pawn"},
"e2": {"color": "White", "pieceType": "Pawn"},
"f2": {"color": "White", "pieceType": "Pawn"},
"g2": {"color": "White", "pieceType": "Pawn"},
"h2": {"color": "White", "pieceType": "Pawn"},
"a7": {"color": "Black", "pieceType": "Pawn"},
"b7": {"color": "Black", "pieceType": "Pawn"},
"c7": {"color": "Black", "pieceType": "Pawn"},
"d7": {"color": "Black", "pieceType": "Pawn"},
"e7": {"color": "Black", "pieceType": "Pawn"},
"f7": {"color": "Black", "pieceType": "Pawn"},
"g7": {"color": "Black", "pieceType": "Pawn"},
"h7": {"color": "Black", "pieceType": "Pawn"},
"a8": {"color": "Black", "pieceType": "Rook"},
"b8": {"color": "Black", "pieceType": "Knight"},
"c8": {"color": "Black", "pieceType": "Bishop"},
"d8": {"color": "Black", "pieceType": "Queen"},
"e8": {"color": "Black", "pieceType": "King"},
"f8": {"color": "Black", "pieceType": "Bishop"},
"g8": {"color": "Black", "pieceType": "Knight"},
"h8": {"color": "Black", "pieceType": "Rook"}
}
}
}
+100
View File
@@ -0,0 +1,100 @@
meta {
name: Export PGN
type: http
seq: 2
}
http {
method: POST
url: {{ioBaseUrl}}/io/export/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"board": {
"a1": {"color": "White", "pieceType": "Rook"},
"b1": {"color": "White", "pieceType": "Knight"},
"c1": {"color": "White", "pieceType": "Bishop"},
"d1": {"color": "White", "pieceType": "Queen"},
"e1": {"color": "White", "pieceType": "King"},
"f1": {"color": "White", "pieceType": "Bishop"},
"g1": {"color": "White", "pieceType": "Knight"},
"h1": {"color": "White", "pieceType": "Rook"},
"a2": {"color": "White", "pieceType": "Pawn"},
"b2": {"color": "White", "pieceType": "Pawn"},
"c2": {"color": "White", "pieceType": "Pawn"},
"d2": {"color": "White", "pieceType": "Pawn"},
"e2": {"color": "White", "pieceType": "Pawn"},
"f2": {"color": "White", "pieceType": "Pawn"},
"g2": {"color": "White", "pieceType": "Pawn"},
"h2": {"color": "White", "pieceType": "Pawn"},
"a7": {"color": "Black", "pieceType": "Pawn"},
"b7": {"color": "Black", "pieceType": "Pawn"},
"c7": {"color": "Black", "pieceType": "Pawn"},
"d7": {"color": "Black", "pieceType": "Pawn"},
"e7": {"color": "Black", "pieceType": "Pawn"},
"f7": {"color": "Black", "pieceType": "Pawn"},
"g7": {"color": "Black", "pieceType": "Pawn"},
"h7": {"color": "Black", "pieceType": "Pawn"},
"a8": {"color": "Black", "pieceType": "Rook"},
"b8": {"color": "Black", "pieceType": "Knight"},
"c8": {"color": "Black", "pieceType": "Bishop"},
"d8": {"color": "Black", "pieceType": "Queen"},
"e8": {"color": "Black", "pieceType": "King"},
"f8": {"color": "Black", "pieceType": "Bishop"},
"g8": {"color": "Black", "pieceType": "Knight"},
"h8": {"color": "Black", "pieceType": "Rook"}
},
"turn": "White",
"castlingRights": {
"whiteKingSide": true,
"whiteQueenSide": true,
"blackKingSide": true,
"blackQueenSide": true
},
"enPassantSquare": null,
"halfMoveClock": 0,
"moves": [],
"result": null,
"initialBoard": {
"a1": {"color": "White", "pieceType": "Rook"},
"b1": {"color": "White", "pieceType": "Knight"},
"c1": {"color": "White", "pieceType": "Bishop"},
"d1": {"color": "White", "pieceType": "Queen"},
"e1": {"color": "White", "pieceType": "King"},
"f1": {"color": "White", "pieceType": "Bishop"},
"g1": {"color": "White", "pieceType": "Knight"},
"h1": {"color": "White", "pieceType": "Rook"},
"a2": {"color": "White", "pieceType": "Pawn"},
"b2": {"color": "White", "pieceType": "Pawn"},
"c2": {"color": "White", "pieceType": "Pawn"},
"d2": {"color": "White", "pieceType": "Pawn"},
"e2": {"color": "White", "pieceType": "Pawn"},
"f2": {"color": "White", "pieceType": "Pawn"},
"g2": {"color": "White", "pieceType": "Pawn"},
"h2": {"color": "White", "pieceType": "Pawn"},
"a7": {"color": "Black", "pieceType": "Pawn"},
"b7": {"color": "Black", "pieceType": "Pawn"},
"c7": {"color": "Black", "pieceType": "Pawn"},
"d7": {"color": "Black", "pieceType": "Pawn"},
"e7": {"color": "Black", "pieceType": "Pawn"},
"f7": {"color": "Black", "pieceType": "Pawn"},
"g7": {"color": "Black", "pieceType": "Pawn"},
"h7": {"color": "Black", "pieceType": "Pawn"},
"a8": {"color": "Black", "pieceType": "Rook"},
"b8": {"color": "Black", "pieceType": "Knight"},
"c8": {"color": "Black", "pieceType": "Bishop"},
"d8": {"color": "Black", "pieceType": "Queen"},
"e8": {"color": "Black", "pieceType": "King"},
"f8": {"color": "Black", "pieceType": "Bishop"},
"g8": {"color": "Black", "pieceType": "Knight"},
"h8": {"color": "Black", "pieceType": "Rook"}
}
}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: export
seq: 2
}
+22
View File
@@ -0,0 +1,22 @@
meta {
name: Import FEN
type: http
seq: 1
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/fen
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
}
}
+22
View File
@@ -0,0 +1,22 @@
meta {
name: Import PGN
type: http
seq: 2
}
http {
method: POST
url: {{ioBaseUrl}}/io/import/pgn
body: json
auth: none
}
headers {
Content-Type: application/json
}
body:json {
{
"pgn": "1. e4 e5 2. Nf3 Nc6 *"
}
}
+4
View File
@@ -0,0 +1,4 @@
meta {
name: import
seq: 1
}
+91 -2
View File
@@ -1,11 +1,72 @@
plugins {
id("org.sonarqube") version "7.2.3.7755"
id("org.scoverage") version "8.1" apply false
id("com.diffplug.spotless") version "8.4.0" apply false
id("io.github.cosmicsilence.scalafix") version "0.2.6" apply false
}
group = "de.nowchess"
version = "1.0-SNAPSHOT"
// Canonical coverage exclusions — glob patterns consumed by Sonar directly;
// converted to scoverage regexes via globToScoverageRegex for instrumentation-time exclusion.
val coverageExclusions = listOf(
// UI renders JavaFX components; headless test environments cannot exercise rendering paths
"modules/api/**",
// FastParse macro-generated combinators produce synthetic branches that scoverage marks as uncovered
"modules/io/src/main/scala/de/nowchess/io/fen/FenParserFastParse*",
// NNUE inference pipeline — coverage requires a trained model file not present in CI
"**/bot/**/NNUE.scala",
"**/bot/**/NNUEBot.scala",
"**/bot/**/EvaluationNNUE.scala",
// NBAI binary format loader/writer — error paths require crafted corrupt files; migrator is a one-shot tool
"**/bot/**/NbaiLoader.scala",
"**/bot/**/NbaiModel.scala",
"**/bot/**/NbaiMigrator.scala",
"**/bot/**/NbaiWriter.scala",
// PolyglotBook — binary I/O and dead-code guards (bit-masked fields can never exceed valid range)
"**/bot/**/PolyglotBook.scala",
"**/bot/**/MoveOrdering.scala",
"**/bot/**/AlphaBetaSearch.scala",
// DTO case class synthetic methods (Scala compiler-generated apply/$default params)
"**/api/src/main/scala/de/nowchess/api/dto/**Dto.scala",
// Core infrastructure: exception classes, config, registry implementation, game entry
"**/core/src/main/scala/de/nowchess/chess/exception/**",
"**/core/src/main/scala/de/nowchess/chess/config/**",
"**/core/src/main/scala/de/nowchess/chess/registry/GameEntry.scala",
"**/core/src/main/scala/de/nowchess/chess/registry/GameRegistryImpl.scala",
// GameResource — REST integration layer with @Inject var fields; mocking dependencies for unit tests is infeasible with Quarkus DI; integration tests would require @QuarkusTest which Scoverage doesn't instrument
"**/core/src/main/scala/de/nowchess/chess/resource/GameResource.scala",
// IoResource — same rationale as GameResource; @QuarkusTest not instrumented by Scoverage
"**/io/src/main/scala/de/nowchess/io/service/resource/IoResource.scala",
// JacksonConfig — Quarkus lifecycle hook, no testable logic beyond ObjectMapper registration
"**/io/src/main/scala/de/nowchess/io/service/config/JacksonConfig.scala",
//RuleSetRestAdapter - Quarkus integration of rule into core, only testable with Quarkus tests
"**/core/src/main/de/nowchess/chess/adapter/RuleSetRestAdapter.scala",
// AccountResource / ChallengeResource — REST integration layer; @QuarkusTest not instrumented by Scoverage
"**/account/src/main/scala/de/nowchess/account/resource/**",
// JacksonConfig / NativeReflectionConfig — Quarkus lifecycle hooks, no testable logic
"**/account/src/main/scala/de/nowchess/account/config/**",
// WebSocket service — infrastructure CDI beans (RedisConfig)
"**/ws/src/main/scala/de/nowchess/ws/config/**",
// GameWebSocketResource in core — replaced by ws module
"**/core/src/main/scala/de/nowchess/chess/resource/GameWebSocketResource.scala",
// Coordinator infrastructure — gRPC, microservice orchestration
"**/coordinator/src/main/scala/**",
)
// Converts a Sonar-style glob to a scoverage regex (matched against full source path).
// Order matters: protect ** before converting lone *, escape dots last.
fun globToScoverageRegex(glob: String): String =
glob
.replace("**", "^@")
.replace("*", "[^/]*")
.replace(".", "\\.")
.replace("^@", ".*")
.let { ".*$it" }
extra["SCOVERAGE_EXCLUDED"] = coverageExclusions.map(::globToScoverageRegex)
sonar {
properties {
property("sonar.projectKey", "Now-Chess-Systems")
@@ -20,21 +81,49 @@ sonar {
}.joinToString(",")
property("sonar.scala.coverage.reportPaths", scoverageReports)
property("sonar.coverage.exclusions", coverageExclusions.joinToString(","))
}
}
val versions = mapOf(
"QUARKUS_SCALA3" to "1.0.0",
"SCALA3" to "3.5.1",
"SCALA_LIBRARY" to "2.13.18",
"SCALA_LIBRARY" to "2.13.16",
"SCALATEST" to "3.2.19",
"SCALATEST_JUNIT" to "0.1.11",
"SCOVERAGE" to "2.1.1",
"SCALAFX" to "21.0.0-R32",
"JAVAFX" to "21.0.1",
"JUNIT_BOM" to "5.13.4",
"ONNXRUNTIME" to "1.19.2",
"SCALA_PARSER_COMBINATORS" to "2.4.0",
"FASTPARSE" to "3.0.2"
"FASTPARSE" to "3.0.2",
"JACKSON" to "2.17.2",
"JACKSON_SCALA" to "2.17.2"
)
extra["VERSIONS"] = versions
subprojects {
apply(plugin = "com.diffplug.spotless")
pluginManager.withPlugin("scala") {
configure<com.diffplug.gradle.spotless.SpotlessExtension> {
scala {
scalafmt().configFile(rootProject.file(".scalafmt.conf"))
}
}
apply(plugin = "io.github.cosmicsilence.scalafix")
configure<io.github.cosmicsilence.scalafix.ScalafixExtension> {
configFile.set(rootProject.file(".scalafix.conf"))
}
// Disable SemanticDB config for the scoverage source set — it sets -sourceroot to
// the root project dir, which conflicts with scoverage's own -sourceroot and causes
// reportTestScoverage to fail with "No source root found".
tasks.matching { it.name in setOf("configSemanticDBScoverage", "checkScalafixScoverage", "checkScalafixTest") }.configureEach {
enabled = false
}
}
}
Regular → Executable
View File
-776
View File
@@ -1,776 +0,0 @@
openapi: 3.0.3
info:
title: NowChess API
description: |
REST API for the NowChess application. Designed to feel familiar to users
of the [lichess API](https://lichess.org/api).
## Authentication
Most endpoints require a Bearer token:
```
Authorization: Bearer <token>
```
Authentication is reserved for future implementation — endpoints are currently
open unless noted otherwise.
## Move notation
Moves are expressed in **UCI notation**: `{from}{to}[promotion]`
- Normal move: `e2e4`
- Capture: `d5e6`
- Promotion: `e7e8q` (q=queen, r=rook, b=bishop, n=knight)
- Castling: `e1g1` (kingside white), `e1c1` (queenside white)
## Streaming
Endpoints that support streaming return **NDJSON** (newline-delimited JSON).
Request them with:
```
Accept: application/x-ndjson
```
Each line of the response is a complete JSON object. Empty lines are
keep-alive heartbeats.
## Rate limiting
Requests that exceed the rate limit receive `429 Too Many Requests`.
Honour the `Retry-After` response header and wait before retrying.
version: 1.0.0
contact:
name: NowChess
license:
name: MIT
servers:
- url: http://localhost:8080
description: Local development server
tags:
- name: game
description: Create and manage chess games
- name: move
description: Make moves and navigate game history
- name: draw
description: Draw offers and claims
- name: import
description: Load a game from FEN or PGN
- name: export
description: Export a game as FEN or PGN
paths:
# ---------------------------------------------------------------------------
# Game lifecycle
# ---------------------------------------------------------------------------
/api/board/game:
post:
operationId: createGame
tags: [game]
summary: Create a new game
description: |
Creates a new chess game starting from the initial position.
Returns the full game state including the generated `gameId`.
security:
- bearerAuth: []
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/CreateGameRequest'
responses:
'201':
description: Game created
content:
application/json:
schema:
$ref: '#/components/schemas/GameFull'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}:
get:
operationId: getGame
tags: [game]
summary: Get game state
description: Returns the full current state of a game.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: Current game state
content:
application/json:
schema:
$ref: '#/components/schemas/GameFull'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/stream:
get:
operationId: streamGame
tags: [game]
summary: Stream game events
description: |
Opens a persistent NDJSON stream for a game. The first object sent is
a `gameFull` event containing the complete game state. Subsequent
objects are `gameState` events sent whenever the game changes (move
made, draw offered, game over, etc.).
Empty lines are heartbeats to keep the connection alive.
Connect with:
```
Accept: application/x-ndjson
```
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: NDJSON event stream
content:
application/x-ndjson:
schema:
oneOf:
- $ref: '#/components/schemas/GameFullEvent'
- $ref: '#/components/schemas/GameStateEvent'
- $ref: '#/components/schemas/ErrorEvent'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/resign:
post:
operationId: resignGame
tags: [game]
summary: Resign the game
description: The active player resigns. The game ends immediately.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: Resignation accepted
content:
application/json:
schema:
$ref: '#/components/schemas/OkResponse'
'400':
$ref: '#/components/responses/BadRequest'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
# ---------------------------------------------------------------------------
# Move-making
# ---------------------------------------------------------------------------
/api/board/game/{gameId}/move/{uci}:
post:
operationId: makeMove
tags: [move]
summary: Make a move
description: |
Submit a move in UCI notation. The move must be legal for the side
currently to move.
For promotion moves include the target piece as the fifth character:
`e7e8q`, `a2a1r`, etc.
If the move results in a pawn reaching the back rank and no promotion
character is supplied, the game enters `promotionPending` status and
the move is not yet applied — resubmit with the promotion character.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
- name: uci
in: path
required: true
description: Move in UCI notation (e.g. `e2e4`, `e7e8q`)
schema:
type: string
pattern: '^[a-h][1-8][a-h][1-8][qrbn]?$'
example: e2e4
responses:
'200':
description: Move applied — returns updated game state
content:
application/json:
schema:
$ref: '#/components/schemas/GameState'
'400':
$ref: '#/components/responses/BadRequest'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/moves:
get:
operationId: getLegalMoves
tags: [move]
summary: Get legal moves
description: |
Returns all legal moves for the side currently to move.
Optionally filter to moves originating from a single square.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
- name: square
in: query
required: false
description: Filter to moves from this square (e.g. `e2`)
schema:
type: string
pattern: '^[a-h][1-8]$'
example: e2
responses:
'200':
description: List of legal moves
content:
application/json:
schema:
$ref: '#/components/schemas/LegalMovesResponse'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/undo:
post:
operationId: undoMove
tags: [move]
summary: Undo the last move
description: Reverts the most recent move. Returns the updated game state.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: Move undone
content:
application/json:
schema:
$ref: '#/components/schemas/GameState'
'400':
description: No moves to undo
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/redo:
post:
operationId: redoMove
tags: [move]
summary: Redo a previously undone move
description: Re-applies the next move in the undo stack. Returns the updated game state.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: Move redone
content:
application/json:
schema:
$ref: '#/components/schemas/GameState'
'400':
description: No moves to redo
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
# ---------------------------------------------------------------------------
# Draw handling
# ---------------------------------------------------------------------------
/api/board/game/{gameId}/draw/{action}:
post:
operationId: drawAction
tags: [draw]
summary: Offer, accept, decline, or claim a draw
description: |
Perform a draw-related action:
| Action | Description |
|-----------|-------------|
| `offer` | Offer a draw to the opponent |
| `accept` | Accept the opponent's draw offer |
| `decline` | Decline the opponent's draw offer |
| `claim` | Claim a draw under the fifty-move rule (only valid when `status` is `fiftyMoveAvailable`) |
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
- name: action
in: path
required: true
schema:
type: string
enum: [offer, accept, decline, claim]
responses:
'200':
description: Action accepted
content:
application/json:
schema:
$ref: '#/components/schemas/OkResponse'
'400':
$ref: '#/components/responses/BadRequest'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
# ---------------------------------------------------------------------------
# Import
# ---------------------------------------------------------------------------
/api/board/game/import/fen:
post:
operationId: importFen
tags: [import]
summary: Load a position from FEN
description: |
Creates a new game from a FEN string. The game starts at the position
described by the FEN; move history prior to that position is not
available.
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ImportFenRequest'
responses:
'201':
description: Game created from FEN
content:
application/json:
schema:
$ref: '#/components/schemas/GameFull'
'400':
$ref: '#/components/responses/BadRequest'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/import/pgn:
post:
operationId: importPgn
tags: [import]
summary: Load a game from PGN
description: |
Creates a new game by replaying all moves in a PGN string. The game
starts at the position after the final move in the PGN; undo is
available for every replayed move.
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ImportPgnRequest'
responses:
'201':
description: Game created from PGN
content:
application/json:
schema:
$ref: '#/components/schemas/GameFull'
'400':
$ref: '#/components/responses/BadRequest'
'429':
$ref: '#/components/responses/TooManyRequests'
# ---------------------------------------------------------------------------
# Export
# ---------------------------------------------------------------------------
/api/board/game/{gameId}/export/fen:
get:
operationId: exportFen
tags: [export]
summary: Export current position as FEN
description: Returns the FEN string representing the current board position.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: FEN string
content:
text/plain:
schema:
type: string
example: rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
/api/board/game/{gameId}/export/pgn:
get:
operationId: exportPgn
tags: [export]
summary: Export game as PGN
description: Returns the full PGN for the game including headers and move text.
security:
- bearerAuth: []
parameters:
- $ref: '#/components/parameters/gameId'
responses:
'200':
description: PGN text
content:
application/x-chess-pgn:
schema:
type: string
example: |
[Event "NowChess game"]
[White "Player1"]
[Black "Player2"]
[Result "*"]
1. e4 e5 2. Nf3 *
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
# =============================================================================
# Components
# =============================================================================
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'Personal access token — `Authorization: Bearer <token>`'
parameters:
gameId:
name: gameId
in: path
required: true
description: 8-character alphanumeric game ID (e.g. `Qa7FJNk2`)
schema:
type: string
pattern: '^[A-Za-z0-9]{8}$'
example: Qa7FJNk2
responses:
BadRequest:
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
Unauthorized:
description: Missing or invalid authentication token
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
NotFound:
description: Game not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
TooManyRequests:
description: Rate limit exceeded — see `Retry-After` header
headers:
Retry-After:
description: Seconds to wait before retrying
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
schemas:
# -------------------------------------------------------------------------
# Requests
# -------------------------------------------------------------------------
CreateGameRequest:
type: object
description: Parameters for creating a new game. All fields are optional.
properties:
white:
$ref: '#/components/schemas/PlayerInfo'
black:
$ref: '#/components/schemas/PlayerInfo'
ImportFenRequest:
type: object
required: [fen]
properties:
fen:
type: string
description: Complete FEN string (6 fields)
example: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1
white:
$ref: '#/components/schemas/PlayerInfo'
black:
$ref: '#/components/schemas/PlayerInfo'
ImportPgnRequest:
type: object
required: [pgn]
properties:
pgn:
type: string
description: PGN text (headers and move list)
example: "1. e4 e5 2. Nf3 Nc6 *"
# -------------------------------------------------------------------------
# Game state
# -------------------------------------------------------------------------
GameFull:
type: object
description: Complete game information including players and current state.
required: [gameId, white, black, state]
properties:
gameId:
type: string
description: Unique 8-character game identifier
example: Qa7FJNk2
white:
$ref: '#/components/schemas/PlayerInfo'
black:
$ref: '#/components/schemas/PlayerInfo'
state:
$ref: '#/components/schemas/GameState'
GameState:
type: object
description: |
The current game state. Included in `GameFull` and returned by move
endpoints and stream events.
required: [fen, pgn, turn, status, moves, undoAvailable, redoAvailable]
properties:
fen:
type: string
description: FEN string for the current position
example: rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1
pgn:
type: string
description: PGN move text for the full game so far
example: "1. e4"
turn:
type: string
enum: [white, black]
description: The side to move
status:
$ref: '#/components/schemas/GameStatus'
winner:
type: string
enum: [white, black]
description: Set when `status` is `checkmate` or `resign`
nullable: true
moves:
type: array
description: All moves played so far, in UCI notation
items:
type: string
example: [e2e4, e7e5, g1f3]
undoAvailable:
type: boolean
description: Whether `POST /undo` is currently valid
redoAvailable:
type: boolean
description: Whether `POST /redo` is currently valid
GameStatus:
type: string
description: |
Current game status:
| Value | Meaning |
|-------|---------|
| `started` | Game in progress, no special condition |
| `check` | Side to move is in check |
| `checkmate` | Side to move is checkmated — game over |
| `stalemate` | Side to move has no legal moves, not in check — game over (draw) |
| `resign` | A player resigned — game over |
| `draw` | Draw agreed or claimed — game over |
| `drawOffered` | Waiting for the opponent to accept or decline a draw offer |
| `fiftyMoveAvailable` | Fifty-move rule threshold reached; active player may claim draw |
| `promotionPending` | A pawn reached the back rank; awaiting promotion piece selection |
| `insufficientMaterial` | Neither side has enough pieces to deliver checkmate — game over (draw) |
enum:
- started
- check
- checkmate
- stalemate
- resign
- draw
- drawOffered
- fiftyMoveAvailable
- promotionPending
- insufficientMaterial
# -------------------------------------------------------------------------
# Moves
# -------------------------------------------------------------------------
LegalMovesResponse:
type: object
required: [moves]
properties:
moves:
type: array
items:
$ref: '#/components/schemas/LegalMove'
LegalMove:
type: object
required: [from, to, uci, moveType]
properties:
from:
type: string
description: Origin square in algebraic notation
example: e2
to:
type: string
description: Destination square in algebraic notation
example: e4
uci:
type: string
description: Full move in UCI notation
example: e2e4
moveType:
$ref: '#/components/schemas/MoveType'
promotion:
type: string
enum: [queen, rook, bishop, knight]
description: Target piece for promotion moves
nullable: true
MoveType:
type: string
description: Classification of the move
enum:
- normal
- capture
- castleKingside
- castleQueenside
- enPassant
- promotion
# -------------------------------------------------------------------------
# Streaming events
# -------------------------------------------------------------------------
GameFullEvent:
type: object
description: |
First event on a game stream. Contains the complete game snapshot.
required: [type, game]
properties:
type:
type: string
enum: [gameFull]
game:
$ref: '#/components/schemas/GameFull'
GameStateEvent:
type: object
description: |
Emitted on a game stream whenever the game state changes (move played,
draw offered, game over, etc.).
required: [type, state]
properties:
type:
type: string
enum: [gameState]
state:
$ref: '#/components/schemas/GameState'
ErrorEvent:
type: object
description: Emitted on a game stream when an error occurs.
required: [type, error]
properties:
type:
type: string
enum: [error]
error:
$ref: '#/components/schemas/ApiError'
# -------------------------------------------------------------------------
# Shared types
# -------------------------------------------------------------------------
PlayerInfo:
type: object
required: [id, displayName]
properties:
id:
type: string
description: Unique player identifier
example: player1
displayName:
type: string
description: Human-readable display name
example: Alice
OkResponse:
type: object
required: [ok]
properties:
ok:
type: boolean
enum: [true]
ApiError:
type: object
required: [code, message]
properties:
code:
type: string
description: Machine-readable error code
example: INVALID_MOVE
message:
type: string
description: Human-readable error description
example: e2e5 is not a legal move
field:
type: string
description: Request field that caused the error, if applicable
example: uci
nullable: true
+6
View File
@@ -0,0 +1,6 @@
# Gradle properties
quarkusPluginId=io.quarkus
quarkusPluginVersion=3.32.4
quarkusPlatformGroupId=io.quarkus.platform
quarkusPlatformArtifactId=quarkus-bom
quarkusPlatformVersion=3.32.4
+1 -1
View File
@@ -1,6 +1,6 @@
#Sat Mar 21 14:37:06 CET 2026
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-396
View File
@@ -1,396 +0,0 @@
{
"nodes": [
{
"id": "claude_md_project_instructions",
"label": "Now-Chess Project Instructions (CLAUDE.md)",
"file_type": "document",
"source_file": "CLAUDE.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "agents_md_config",
"label": "Agents Configuration (AGENTS.md)",
"file_type": "document",
"source_file": "AGENTS.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "api_changelog",
"label": "API Module Changelog",
"file_type": "document",
"source_file": "modules/api/CHANGELOG.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_changelog",
"label": "UI Module Changelog",
"file_type": "document",
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "rule_changelog",
"label": "Rule Module Changelog",
"file_type": "document",
"source_file": "modules/rule/CHANGELOG.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "io_changelog",
"label": "IO Module Changelog",
"file_type": "document",
"source_file": "modules/io/CHANGELOG.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "core_changelog",
"label": "Core Module Changelog",
"file_type": "document",
"source_file": "modules/core/CHANGELOG.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "bot_python_readme",
"label": "Bot Python Module README",
"file_type": "document",
"source_file": "modules/bot/python/README.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "bot_python_requirements",
"label": "Bot Python Requirements",
"file_type": "document",
"source_file": "modules/bot/python/requirements.txt",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "bot_python_positions",
"label": "Bot Python Positions Dataset",
"file_type": "document",
"source_file": "modules/bot/python/data/positions.txt",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "security_doc",
"label": "Security Documentation",
"file_type": "document",
"source_file": "docs/Security.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "claude_skills_doc",
"label": "Claude Skills Documentation",
"file_type": "document",
"source_file": "docs/Claude-Skills.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "idea_doc",
"label": "Idea Documentation",
"file_type": "document",
"source_file": "docs/idea.md",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "arabian_chess_license",
"label": "Arabian Chess License",
"file_type": "document",
"source_file": "ARABIAN CHESS/license.txt",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_board_sprite_black",
"label": "UI Board Square Black Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/board/board_square_black.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_board_sprite_white",
"label": "UI Board Square White Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/board/board_square_white.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_board_sprite_bottom",
"label": "UI Board Bottom Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/board/board_bottom.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_piece_sprite_black_rook",
"label": "UI Black Rook Piece Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/pieces/black_rook.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_piece_sprite_white_pawn",
"label": "UI White Pawn Piece Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/pieces/white_pawn.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_piece_sprite_white_knight",
"label": "UI White Knight Piece Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/pieces/white_knight.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
},
{
"id": "ui_piece_sprite_black_knight",
"label": "UI Black Knight Piece Sprite",
"file_type": "image",
"source_file": "modules/ui/src/main/resources/sprites/pieces/black_knight.png",
"source_location": null,
"source_url": null,
"captured_at": null,
"author": null,
"contributor": null
}
],
"edges": [
{
"source": "claude_md_project_instructions",
"target": "agents_md_config",
"relation": "references",
"confidence": "EXTRACTED",
"confidence_score": 1.0,
"source_file": "CLAUDE.md",
"source_location": null,
"weight": 1.0
},
{
"source": "bot_python_readme",
"target": "bot_python_requirements",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.85,
"source_file": "modules/bot/python/README.md",
"source_location": null,
"weight": 1.0
},
{
"source": "bot_python_readme",
"target": "bot_python_positions",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.8,
"source_file": "modules/bot/python/README.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_board_sprite_black",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_board_sprite_white",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_piece_sprite_black_rook",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_piece_sprite_white_pawn",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_piece_sprite_white_knight",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_piece_sprite_black_knight",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "ui_changelog",
"target": "ui_board_sprite_bottom",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.75,
"source_file": "modules/ui/CHANGELOG.md",
"source_location": null,
"weight": 1.0
},
{
"source": "claude_skills_doc",
"target": "agents_md_config",
"relation": "references",
"confidence": "INFERRED",
"confidence_score": 0.7,
"source_file": "docs/Claude-Skills.md",
"source_location": null,
"weight": 1.0
}
],
"hyperedges": [
{
"id": "module_changelogs",
"label": "Module Changelog Documentation",
"nodes": [
"api_changelog",
"ui_changelog",
"rule_changelog",
"io_changelog",
"core_changelog"
],
"relation": "form",
"confidence": "EXTRACTED",
"confidence_score": 1.0,
"source_file": "modules"
},
{
"id": "ui_sprite_assets",
"label": "UI Sprite Asset Collection",
"nodes": [
"ui_board_sprite_black",
"ui_board_sprite_white",
"ui_board_sprite_bottom",
"ui_piece_sprite_black_rook",
"ui_piece_sprite_white_pawn",
"ui_piece_sprite_white_knight",
"ui_piece_sprite_black_knight"
],
"relation": "participate_in",
"confidence": "EXTRACTED",
"confidence_score": 1.0,
"source_file": "modules/ui/src/main/resources/sprites"
},
{
"id": "bot_python_components",
"label": "Bot Python Implementation Components",
"nodes": [
"bot_python_readme",
"bot_python_requirements",
"bot_python_positions"
],
"relation": "participate_in",
"confidence": "EXTRACTED",
"confidence_score": 1.0,
"source_file": "modules/bot/python"
}
],
"input_tokens": 0,
"output_tokens": 0
}
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
/usr/bin/python
-413
View File
@@ -1,413 +0,0 @@
# Graph Report - . (2026-04-12)
## Corpus Check
- 78 files · ~273,497 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 480 nodes · 549 edges · 74 communities detected
- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS
- Token cost: 0 input · 0 output
## God Nodes (most connected - your core abstractions)
1. `DefaultRules` - 35 edges
2. `GameEngine` - 29 edges
3. `ChessBoardView` - 17 edges
4. `FenParserFastParse` - 17 edges
5. `FenParserCombinators` - 16 edges
6. `PgnParser` - 14 edges
7. `FenParser` - 9 edges
8. `CommandInvoker` - 9 edges
9. `GameContext` - 8 edges
10. `FenExporter` - 7 edges
## Surprising Connections (you probably didn't know these)
- None detected - all connections are within the same source files.
## Communities
### Community 0 - "Community 0"
Cohesion: 0.11
Nodes (2): CastlingMove, DefaultRules
### Community 1 - "Community 1"
Cohesion: 0.09
Nodes (17): ClassGap, _compact_ranges(), _find_scoverage_xml(), format_agent(), format_json(), format_markdown(), format_module_gaps(), main() (+9 more)
### Community 2 - "Community 2"
Cohesion: 0.11
Nodes (2): GameEngine, PendingPromotion
### Community 3 - "Community 3"
Cohesion: 0.09
Nodes (4): FenParserCombinators, EmptyToken, FenParserSupport, PieceToken
### Community 4 - "Community 4"
Cohesion: 0.14
Nodes (9): format_module(), load_module(), main(), ModuleResult, parse_suite_xml(), run(), SuiteResult, TestCase (+1 more)
### Community 5 - "Community 5"
Cohesion: 0.2
Nodes (1): ChessBoardView
### Community 6 - "Community 6"
Cohesion: 0.15
Nodes (1): FenParserFastParse
### Community 7 - "Community 7"
Cohesion: 0.12
Nodes (7): InvalidFormat, InvalidMove, MoveCommand, MoveResult, QuitCommand, ResetCommand, Successful
### Community 8 - "Community 8"
Cohesion: 0.12
Nodes (12): BoardResetEvent, CheckDetectedEvent, CheckmateEvent, DrawClaimedEvent, FiftyMoveRuleAvailableEvent, InvalidMoveEvent, MoveExecutedEvent, MoveRedoneEvent (+4 more)
### Community 9 - "Community 9"
Cohesion: 0.26
Nodes (2): PgnGame, PgnParser
### Community 10 - "Community 10"
Cohesion: 0.15
Nodes (3): candidateMoves(), GameEngineIntegrationTest, legalMoves()
### Community 11 - "Community 11"
Cohesion: 0.14
Nodes (1): GameEnginePromotionTest
### Community 12 - "Community 12"
Cohesion: 0.15
Nodes (2): EngineTestHelpers, MockObserver
### Community 13 - "Community 13"
Cohesion: 0.17
Nodes (3): CommandInvokerBranchTest, ConditionalFailCommand, FailingCommand
### Community 14 - "Community 14"
Cohesion: 0.36
Nodes (1): FenParser
### Community 15 - "Community 15"
Cohesion: 0.22
Nodes (1): CommandInvoker
### Community 16 - "Community 16"
Cohesion: 0.31
Nodes (5): applyMove(), Board, removed(), updated(), withMove()
### Community 17 - "Community 17"
Cohesion: 0.22
Nodes (1): GameContext
### Community 18 - "Community 18"
Cohesion: 0.25
Nodes (6): ApiError, ApiResponse, Failure, PagedResponse, Pagination, Success
### Community 19 - "Community 19"
Cohesion: 0.43
Nodes (1): FenExporter
### Community 20 - "Community 20"
Cohesion: 0.29
Nodes (1): CastlingRights
### Community 21 - "Community 21"
Cohesion: 0.4
Nodes (2): ChessGUIApp, ChessGUILauncher
### Community 22 - "Community 22"
Cohesion: 0.5
Nodes (2): offset(), Square
### Community 23 - "Community 23"
Cohesion: 0.4
Nodes (2): PlayerId, PlayerInfo
### Community 24 - "Community 24"
Cohesion: 0.5
Nodes (2): PieceSprites, SquareColors
### Community 25 - "Community 25"
Cohesion: 0.6
Nodes (1): TerminalUI
### Community 26 - "Community 26"
Cohesion: 0.6
Nodes (1): PgnExporter
### Community 27 - "Community 27"
Cohesion: 0.67
Nodes (1): GUIObserver
### Community 28 - "Community 28"
Cohesion: 0.5
Nodes (1): DefaultRulesStateTransitionsTest
### Community 29 - "Community 29"
Cohesion: 0.5
Nodes (2): EndingMockObserver, GameEngineGameEndingTest
### Community 30 - "Community 30"
Cohesion: 0.5
Nodes (2): GameEngineLoadGameTest, MockObserver
### Community 31 - "Community 31"
Cohesion: 0.5
Nodes (1): CommandInvokerTest
### Community 32 - "Community 32"
Cohesion: 0.67
Nodes (1): Parser
### Community 33 - "Community 33"
Cohesion: 0.67
Nodes (0):
### Community 34 - "Community 34"
Cohesion: 0.67
Nodes (1): Main
### Community 35 - "Community 35"
Cohesion: 0.67
Nodes (1): Renderer
### Community 36 - "Community 36"
Cohesion: 0.67
Nodes (1): PgnExporterTest
### Community 37 - "Community 37"
Cohesion: 0.67
Nodes (1): FenExporterTest
### Community 38 - "Community 38"
Cohesion: 0.67
Nodes (1): GameEngineNotationTest
### Community 39 - "Community 39"
Cohesion: 0.67
Nodes (1): MoveCommandTest
### Community 40 - "Community 40"
Cohesion: 1.0
Nodes (1): PieceTest
### Community 41 - "Community 41"
Cohesion: 1.0
Nodes (1): PieceTypeTest
### Community 42 - "Community 42"
Cohesion: 1.0
Nodes (1): SquareTest
### Community 43 - "Community 43"
Cohesion: 1.0
Nodes (1): CastlingRightsTest
### Community 44 - "Community 44"
Cohesion: 1.0
Nodes (1): BoardTest
### Community 45 - "Community 45"
Cohesion: 1.0
Nodes (1): ColorTest
### Community 46 - "Community 46"
Cohesion: 1.0
Nodes (1): MoveTest
### Community 47 - "Community 47"
Cohesion: 1.0
Nodes (1): GameContextTest
### Community 48 - "Community 48"
Cohesion: 1.0
Nodes (1): ApiResponseTest
### Community 49 - "Community 49"
Cohesion: 1.0
Nodes (1): PlayerInfoTest
### Community 50 - "Community 50"
Cohesion: 1.0
Nodes (0):
### Community 51 - "Community 51"
Cohesion: 1.0
Nodes (1): Piece
### Community 52 - "Community 52"
Cohesion: 1.0
Nodes (1): Move
### Community 53 - "Community 53"
Cohesion: 1.0
Nodes (1): RendererAndUnicodeTest
### Community 54 - "Community 54"
Cohesion: 1.0
Nodes (0):
### Community 55 - "Community 55"
Cohesion: 1.0
Nodes (1): DefaultRulesTest
### Community 56 - "Community 56"
Cohesion: 1.0
Nodes (1): PgnParserTest
### Community 57 - "Community 57"
Cohesion: 1.0
Nodes (1): PgnValidatorTest
### Community 58 - "Community 58"
Cohesion: 1.0
Nodes (1): FenParserCombinatorsTest
### Community 59 - "Community 59"
Cohesion: 1.0
Nodes (1): FenParserTest
### Community 60 - "Community 60"
Cohesion: 1.0
Nodes (1): FenParserFastParseTest
### Community 61 - "Community 61"
Cohesion: 1.0
Nodes (1): ParserTest
### Community 62 - "Community 62"
Cohesion: 1.0
Nodes (1): GameEngineOutcomesTest
### Community 63 - "Community 63"
Cohesion: 1.0
Nodes (1): GameEngineSpecialMovesTest
### Community 64 - "Community 64"
Cohesion: 1.0
Nodes (1): GameEngineScenarioTest
### Community 65 - "Community 65"
Cohesion: 1.0
Nodes (1): CommandTest
### Community 66 - "Community 66"
Cohesion: 1.0
Nodes (0):
### Community 67 - "Community 67"
Cohesion: 1.0
Nodes (0):
### Community 68 - "Community 68"
Cohesion: 1.0
Nodes (0):
### Community 69 - "Community 69"
Cohesion: 1.0
Nodes (0):
### Community 70 - "Community 70"
Cohesion: 1.0
Nodes (0):
### Community 71 - "Community 71"
Cohesion: 1.0
Nodes (1): Strip the package prefix from the full method path.
### Community 72 - "Community 72"
Cohesion: 1.0
Nodes (1): Lines that are branch points and have at least one uncovered branch statement.
### Community 73 - "Community 73"
Cohesion: 1.0
Nodes (0):
## Knowledge Gaps
- **55 isolated node(s):** `PieceTest`, `PieceTypeTest`, `SquareTest`, `CastlingRightsTest`, `BoardTest` (+50 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **Thin community `Community 40`** (2 nodes): `PieceTest.scala`, `PieceTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 41`** (2 nodes): `PieceTypeTest.scala`, `PieceTypeTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 42`** (2 nodes): `SquareTest.scala`, `SquareTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 43`** (2 nodes): `CastlingRightsTest.scala`, `CastlingRightsTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 44`** (2 nodes): `BoardTest.scala`, `BoardTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 45`** (2 nodes): `ColorTest.scala`, `ColorTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 46`** (2 nodes): `MoveTest.scala`, `MoveTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 47`** (2 nodes): `GameContextTest.scala`, `GameContextTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 48`** (2 nodes): `ApiResponseTest.scala`, `ApiResponseTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 49`** (2 nodes): `PlayerInfoTest.scala`, `PlayerInfoTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 50`** (2 nodes): `PieceType.scala`, `label()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 51`** (2 nodes): `Piece.scala`, `Piece`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 52`** (2 nodes): `Move.scala`, `Move`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 53`** (2 nodes): `RendererAndUnicodeTest.scala`, `RendererAndUnicodeTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 54`** (2 nodes): `PieceUnicode.scala`, `unicode()`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 55`** (2 nodes): `DefaultRulesTest.scala`, `DefaultRulesTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 56`** (2 nodes): `PgnParserTest.scala`, `PgnParserTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 57`** (2 nodes): `PgnValidatorTest.scala`, `PgnValidatorTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 58`** (2 nodes): `FenParserCombinatorsTest.scala`, `FenParserCombinatorsTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 59`** (2 nodes): `FenParserTest.scala`, `FenParserTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 60`** (2 nodes): `FenParserFastParseTest.scala`, `FenParserFastParseTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 61`** (2 nodes): `ParserTest.scala`, `ParserTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 62`** (2 nodes): `GameEngineOutcomesTest.scala`, `GameEngineOutcomesTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 63`** (2 nodes): `GameEngineSpecialMovesTest.scala`, `GameEngineSpecialMovesTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 64`** (2 nodes): `GameEngineScenarioTest.scala`, `GameEngineScenarioTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 65`** (2 nodes): `CommandTest.scala`, `CommandTest`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 66`** (1 nodes): `build.gradle.kts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 67`** (1 nodes): `settings.gradle.kts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 68`** (1 nodes): `RuleSet.scala`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 69`** (1 nodes): `GameContextImport.scala`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 70`** (1 nodes): `GameContextExport.scala`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 71`** (1 nodes): `Strip the package prefix from the full method path.`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 72`** (1 nodes): `Lines that are branch points and have at least one uncovered branch statement.`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 73`** (1 nodes): `test_counter.py`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `FenParserFastParse` connect `Community 6` to `Community 3`?**
_High betweenness centrality (0.004) - this node is a cross-community bridge._
- **What connects `PieceTest`, `PieceTypeTest`, `SquareTest` to the rest of the system?**
_55 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.11 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.09 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?**
_Cohesion score 0.11 - nodes in this community are weakly interconnected._
- **Should `Community 3` be split into smaller, more focused modules?**
_Cohesion score 0.09 - nodes in this community are weakly interconnected._
- **Should `Community 4` be split into smaller, more focused modules?**
_Cohesion score 0.14 - nodes in this community are weakly interconnected._
@@ -1 +0,0 @@
{"nodes": [{"id": "commandinvokertest", "label": "CommandInvokerTest.scala", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L1"}, {"id": "commandinvokertest_commandinvokertest", "label": "CommandInvokerTest", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L8"}, {"id": "commandinvokertest_commandinvokertest_sq", "label": ".sq()", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L10"}, {"id": "commandinvokertest_commandinvokertest_createmovecommand", "label": ".createMoveCommand()", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L12"}], "edges": [{"source": "commandinvokertest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "commandinvokertest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "commandinvokertest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L5", "weight": 1.0}, {"source": "commandinvokertest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L6", "weight": 1.0}, {"source": "commandinvokertest", "target": "commandinvokertest_commandinvokertest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L8", "weight": 1.0}, {"source": "commandinvokertest_commandinvokertest", "target": "commandinvokertest_commandinvokertest_sq", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L10", "weight": 1.0}, {"source": "commandinvokertest_commandinvokertest", "target": "commandinvokertest_commandinvokertest_createmovecommand", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/command/CommandInvokerTest.scala", "source_location": "L12", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "build_gradle", "label": "build.gradle.kts", "file_type": "code", "source_file": "modules/ui/build.gradle.kts", "source_location": "L1"}], "edges": []}
@@ -1 +0,0 @@
{"nodes": [{"id": "nnuebot", "label": "NNUEBot.scala", "file_type": "code", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L1"}, {"id": "nnuebot_nnuebot", "label": "NNUEBot", "file_type": "code", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L12"}, {"id": "nnuebot_nnuebot_nextmove", "label": ".nextMove()", "file_type": "code", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L23"}], "edges": [{"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L3", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L4", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L5", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L6", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L7", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L8", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L9", "weight": 1.0}, {"source": "nnuebot", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L10", "weight": 1.0}, {"source": "nnuebot", "target": "nnuebot_nnuebot", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L12", "weight": 1.0}, {"source": "nnuebot_nnuebot", "target": "nnuebot_nnuebot_nextmove", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/bots/NNUEBot.scala", "source_location": "L23", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "pgnexporter", "label": "PgnExporter.scala", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L1"}, {"id": "pgnexporter_pgnexporter", "label": "PgnExporter", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L9"}, {"id": "pgnexporter_pgnexporter_exportgamecontext", "label": ".exportGameContext()", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L12"}, {"id": "pgnexporter_pgnexporter_exportgame", "label": ".exportGame()", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L23"}, {"id": "pgnexporter_pgnexporter_movetoalgebraic", "label": ".moveToAlgebraic()", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L53"}], "edges": [{"source": "pgnexporter", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L3", "weight": 1.0}, {"source": "pgnexporter", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L4", "weight": 1.0}, {"source": "pgnexporter", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L5", "weight": 1.0}, {"source": "pgnexporter", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L6", "weight": 1.0}, {"source": "pgnexporter", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L7", "weight": 1.0}, {"source": "pgnexporter", "target": "pgnexporter_pgnexporter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L9", "weight": 1.0}, {"source": "pgnexporter_pgnexporter", "target": "pgnexporter_pgnexporter_exportgamecontext", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L12", "weight": 1.0}, {"source": "pgnexporter_pgnexporter", "target": "pgnexporter_pgnexporter_exportgame", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L23", "weight": 1.0}, {"source": "pgnexporter_pgnexporter", "target": "pgnexporter_pgnexporter_movetoalgebraic", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L53", "weight": 1.0}, {"source": "pgnexporter_pgnexporter_exportgamecontext", "target": "pgnexporter_pgnexporter_exportgame", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L20", "weight": 1.0}, {"source": "pgnexporter_pgnexporter_exportgame", "target": "pgnexporter_pgnexporter_movetoalgebraic", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/pgn/PgnExporter.scala", "source_location": "L32", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "piece", "label": "Piece.scala", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/board/Piece.scala", "source_location": "L1"}, {"id": "piece_piece", "label": "Piece", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/board/Piece.scala", "source_location": "L4"}], "edges": [{"source": "piece", "target": "piece_piece", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/board/Piece.scala", "source_location": "L4", "weight": 1.0}, {"source": "piece", "target": "piece_piece", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/board/Piece.scala", "source_location": "L6", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "commandinvoker", "label": "CommandInvoker.scala", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L1"}, {"id": "commandinvoker_commandinvoker", "label": "CommandInvoker", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L4"}, {"id": "commandinvoker_commandinvoker_execute", "label": ".execute()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L11"}, {"id": "commandinvoker_commandinvoker_undo", "label": ".undo()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L24"}, {"id": "commandinvoker_commandinvoker_redo", "label": ".redo()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L37"}, {"id": "commandinvoker_commandinvoker_history", "label": ".history()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L50"}, {"id": "commandinvoker_commandinvoker_getcurrentindex", "label": ".getCurrentIndex()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L55"}, {"id": "commandinvoker_commandinvoker_clear", "label": ".clear()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L60"}, {"id": "commandinvoker_commandinvoker_canundo", "label": ".canUndo()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L66"}, {"id": "commandinvoker_commandinvoker_canredo", "label": ".canRedo()", "file_type": "code", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L71"}], "edges": [{"source": "commandinvoker", "target": "commandinvoker_commandinvoker", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L4", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_execute", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L11", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_undo", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L24", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_redo", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L37", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_history", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L50", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_getcurrentindex", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L55", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_clear", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L60", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_canundo", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L66", "weight": 1.0}, {"source": "commandinvoker_commandinvoker", "target": "commandinvoker_commandinvoker_canredo", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L71", "weight": 1.0}, {"source": "commandinvoker_commandinvoker_redo", "target": "commandinvoker_commandinvoker_execute", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/core/src/main/scala/de/nowchess/chess/command/CommandInvoker.scala", "source_location": "L40", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "squaretest", "label": "SquareTest.scala", "file_type": "code", "source_file": "modules/api/src/test/scala/de/nowchess/api/board/SquareTest.scala", "source_location": "L1"}, {"id": "squaretest_squaretest", "label": "SquareTest", "file_type": "code", "source_file": "modules/api/src/test/scala/de/nowchess/api/board/SquareTest.scala", "source_location": "L6"}], "edges": [{"source": "squaretest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/board/SquareTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "squaretest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/board/SquareTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "squaretest", "target": "squaretest_squaretest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/board/SquareTest.scala", "source_location": "L6", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "guiobserver", "label": "GUIObserver.scala", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L1"}, {"id": "guiobserver_guiobserver", "label": "GUIObserver", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L13"}, {"id": "guiobserver_guiobserver_ongameevent", "label": ".onGameEvent()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L15"}, {"id": "guiobserver_guiobserver_showalert", "label": ".showAlert()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L73"}], "edges": [{"source": "guiobserver", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L3", "weight": 1.0}, {"source": "guiobserver", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L4", "weight": 1.0}, {"source": "guiobserver", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L5", "weight": 1.0}, {"source": "guiobserver", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L6", "weight": 1.0}, {"source": "guiobserver", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L7", "weight": 1.0}, {"source": "guiobserver", "target": "guiobserver_guiobserver", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L13", "weight": 1.0}, {"source": "guiobserver_guiobserver", "target": "guiobserver_guiobserver_ongameevent", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L15", "weight": 1.0}, {"source": "guiobserver_guiobserver", "target": "guiobserver_guiobserver_showalert", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L73", "weight": 1.0}, {"source": "guiobserver_guiobserver_ongameevent", "target": "guiobserver_guiobserver_showalert", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/GUIObserver.scala", "source_location": "L31", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "gamecontextexport", "label": "GameContextExport.scala", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala", "source_location": "L1"}], "edges": [{"source": "gamecontextexport", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala", "source_location": "L3", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "apiresponsetest", "label": "ApiResponseTest.scala", "file_type": "code", "source_file": "modules/api/src/test/scala/de/nowchess/api/response/ApiResponseTest.scala", "source_location": "L1"}, {"id": "apiresponsetest_apiresponsetest", "label": "ApiResponseTest", "file_type": "code", "source_file": "modules/api/src/test/scala/de/nowchess/api/response/ApiResponseTest.scala", "source_location": "L6"}], "edges": [{"source": "apiresponsetest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/response/ApiResponseTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "apiresponsetest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/response/ApiResponseTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "apiresponsetest", "target": "apiresponsetest_apiresponsetest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/test/scala/de/nowchess/api/response/ApiResponseTest.scala", "source_location": "L6", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "gameenginewithbottest", "label": "GameEngineWithBotTest.scala", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L1"}, {"id": "gameenginewithbottest_gameenginewithbottest", "label": "GameEngineWithBotTest", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L14"}, {"id": "gameenginewithbottest_ongameevent", "label": "onGameEvent()", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L29"}], "edges": [{"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L5", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L6", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L7", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L8", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L9", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L10", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "scala", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L11", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "scala", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L12", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "gameenginewithbottest_gameenginewithbottest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L14", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "gameenginewithbottest_ongameevent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L29", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "gameenginewithbottest_ongameevent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L75", "weight": 1.0}, {"source": "gameenginewithbottest", "target": "gameenginewithbottest_ongameevent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineWithBotTest.scala", "source_location": "L99", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "botdifficultytest", "label": "BotDifficultyTest.scala", "file_type": "code", "source_file": "modules/bot/src/test/scala/de/nowchess/bot/BotDifficultyTest.scala", "source_location": "L1"}, {"id": "botdifficultytest_botdifficultytest", "label": "BotDifficultyTest", "file_type": "code", "source_file": "modules/bot/src/test/scala/de/nowchess/bot/BotDifficultyTest.scala", "source_location": "L6"}], "edges": [{"source": "botdifficultytest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/test/scala/de/nowchess/bot/BotDifficultyTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "botdifficultytest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/src/test/scala/de/nowchess/bot/BotDifficultyTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "botdifficultytest", "target": "botdifficultytest_botdifficultytest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/bot/src/test/scala/de/nowchess/bot/BotDifficultyTest.scala", "source_location": "L6", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "gameengineloadgametest", "label": "GameEngineLoadGameTest.scala", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L1"}, {"id": "gameengineloadgametest_gameengineloadgametest", "label": "GameEngineLoadGameTest", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L14"}, {"id": "gameengineloadgametest_mockobserver", "label": "MockObserver", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L40"}, {"id": "gameengineloadgametest_mockobserver_ongameevent", "label": ".onGameEvent()", "file_type": "code", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L42"}], "edges": [{"source": "gameengineloadgametest", "target": "scala", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L3", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L4", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L5", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L6", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L7", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L8", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L9", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L10", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L11", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "org", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L12", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "gameengineloadgametest_gameengineloadgametest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L14", "weight": 1.0}, {"source": "gameengineloadgametest", "target": "gameengineloadgametest_mockobserver", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L40", "weight": 1.0}, {"source": "gameengineloadgametest_mockobserver", "target": "gameengineloadgametest_mockobserver_ongameevent", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/core/src/test/scala/de/nowchess/chess/engine/GameEngineLoadGameTest.scala", "source_location": "L42", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "gamecontextimport", "label": "GameContextImport.scala", "file_type": "code", "source_file": "modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala", "source_location": "L1"}], "edges": [{"source": "gamecontextimport", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala", "source_location": "L3", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "settings_gradle", "label": "settings.gradle.kts", "file_type": "code", "source_file": "settings.gradle.kts", "source_location": "L1"}], "edges": []}
@@ -1 +0,0 @@
{"nodes": [{"id": "generate", "label": "generate.py", "file_type": "code", "source_file": "modules/bot/python/src/generate.py", "source_location": "L1"}, {"id": "generate_worker_generate_games", "label": "_worker_generate_games()", "file_type": "code", "source_file": "modules/bot/python/src/generate.py", "source_location": "L13"}, {"id": "generate_play_random_game_and_collect_positions", "label": "play_random_game_and_collect_positions()", "file_type": "code", "source_file": "modules/bot/python/src/generate.py", "source_location": "L64"}, {"id": "generate_rationale_14", "label": "Generate games for one worker. Returns: list of FENs generated by t", "file_type": "rationale", "source_file": "modules/bot/python/src/generate.py", "source_location": "L14"}, {"id": "generate_rationale_72", "label": "Generate positions using multiprocessing with multiple workers. Args:", "file_type": "rationale", "source_file": "modules/bot/python/src/generate.py", "source_location": "L72"}], "edges": [{"source": "generate", "target": "chess", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L4", "weight": 1.0}, {"source": "generate", "target": "random", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L5", "weight": 1.0}, {"source": "generate", "target": "sys", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L6", "weight": 1.0}, {"source": "generate", "target": "pathlib", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L7", "weight": 1.0}, {"source": "generate", "target": "tqdm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L8", "weight": 1.0}, {"source": "generate", "target": "multiprocessing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L9", "weight": 1.0}, {"source": "generate", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L10", "weight": 1.0}, {"source": "generate", "target": "time", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L11", "weight": 1.0}, {"source": "generate", "target": "generate_worker_generate_games", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L13", "weight": 1.0}, {"source": "generate", "target": "generate_play_random_game_and_collect_positions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L64", "weight": 1.0}, {"source": "generate", "target": "argparse", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L144", "weight": 1.0}, {"source": "generate_rationale_14", "target": "generate_worker_generate_games", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L14", "weight": 1.0}, {"source": "generate_rationale_72", "target": "generate_play_random_game_and_collect_positions", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "modules/bot/python/src/generate.py", "source_location": "L72", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "config", "label": "Config.scala", "file_type": "code", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/Config.scala", "source_location": "L1"}, {"id": "config_config", "label": "Config", "file_type": "code", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/Config.scala", "source_location": "L3"}], "edges": [{"source": "config", "target": "config_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/bot/src/main/scala/de/nowchess/bot/Config.scala", "source_location": "L3", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "pieceunicode", "label": "PieceUnicode.scala", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala", "source_location": "L1"}, {"id": "pieceunicode_unicode", "label": "unicode()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala", "source_location": "L6"}], "edges": [{"source": "pieceunicode", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala", "source_location": "L3", "weight": 1.0}, {"source": "pieceunicode", "target": "pieceunicode_unicode", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/utils/PieceUnicode.scala", "source_location": "L6", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "test_counter", "label": "test_counter.py", "file_type": "code", "source_file": "jacoco-reporter/test_counter.py", "source_location": "L1"}], "edges": [{"source": "test_counter", "target": "glob", "relation": "imports", "confidence": "EXTRACTED", "source_file": "jacoco-reporter/test_counter.py", "source_location": "L1", "weight": 1.0}, {"source": "test_counter", "target": "re", "relation": "imports", "confidence": "EXTRACTED", "source_file": "jacoco-reporter/test_counter.py", "source_location": "L1", "weight": 1.0}]}
@@ -1 +0,0 @@
{"nodes": [{"id": "gamecontext", "label": "GameContext.scala", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L1"}, {"id": "gamecontext_gamecontext", "label": "GameContext", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L9"}, {"id": "gamecontext_gamecontext_withboard", "label": ".withBoard()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L18"}, {"id": "gamecontext_gamecontext_withturn", "label": ".withTurn()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L21"}, {"id": "gamecontext_gamecontext_withcastlingrights", "label": ".withCastlingRights()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L24"}, {"id": "gamecontext_gamecontext_withenpassantsquare", "label": ".withEnPassantSquare()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L27"}, {"id": "gamecontext_gamecontext_withhalfmoveclock", "label": ".withHalfMoveClock()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L30"}, {"id": "gamecontext_gamecontext_withmove", "label": ".withMove()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L33"}, {"id": "gamecontext_gamecontext_initial", "label": ".initial()", "file_type": "code", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L37"}], "edges": [{"source": "gamecontext", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L3", "weight": 1.0}, {"source": "gamecontext", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L4", "weight": 1.0}, {"source": "gamecontext", "target": "gamecontext_gamecontext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L9", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withboard", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L18", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withturn", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L21", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withcastlingrights", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L24", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withenpassantsquare", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L27", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withhalfmoveclock", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L30", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_withmove", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L33", "weight": 1.0}, {"source": "gamecontext", "target": "gamecontext_gamecontext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L35", "weight": 1.0}, {"source": "gamecontext_gamecontext", "target": "gamecontext_gamecontext_initial", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L37", "weight": 1.0}, {"source": "gamecontext_gamecontext_initial", "target": "gamecontext_gamecontext", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala", "source_location": "L37", "weight": 1.0}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
{"nodes": [{"id": "chessgui", "label": "ChessGUI.scala", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L1"}, {"id": "chessgui_chessguiapp", "label": "ChessGUIApp", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L14"}, {"id": "chessgui_chessguiapp_start", "label": ".start()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L16"}, {"id": "chessgui_chessguilauncher", "label": "ChessGUILauncher", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L51"}, {"id": "chessgui_chessguilauncher_getengine", "label": ".getEngine()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L54"}, {"id": "chessgui_chessguilauncher_launch", "label": ".launch()", "file_type": "code", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L56"}], "edges": [{"source": "chessgui", "target": "javafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L3", "weight": 1.0}, {"source": "chessgui", "target": "javafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L4", "weight": 1.0}, {"source": "chessgui", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L5", "weight": 1.0}, {"source": "chessgui", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L6", "weight": 1.0}, {"source": "chessgui", "target": "scalafx", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L7", "weight": 1.0}, {"source": "chessgui", "target": "de", "relation": "imports", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L8", "weight": 1.0}, {"source": "chessgui", "target": "chessgui_chessguiapp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L14", "weight": 1.0}, {"source": "chessgui_chessguiapp", "target": "chessgui_chessguiapp_start", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L16", "weight": 1.0}, {"source": "chessgui", "target": "chessgui_chessguilauncher", "relation": "contains", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L51", "weight": 1.0}, {"source": "chessgui_chessguilauncher", "target": "chessgui_chessguilauncher_getengine", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L54", "weight": 1.0}, {"source": "chessgui_chessguilauncher", "target": "chessgui_chessguilauncher_launch", "relation": "method", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L56", "weight": 1.0}, {"source": "chessgui_chessguilauncher_launch", "target": "chessgui_chessguiapp_start", "relation": "calls", "confidence": "EXTRACTED", "source_file": "modules/ui/src/main/scala/de/nowchess/ui/gui/ChessGUI.scala", "source_location": "L63", "weight": 1.0}]}

Some files were not shown because too many files have changed in this diff Show More