Compare commits
33 Commits
rule-0.0.6
...
json-0.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 5399c9bffb | |||
| 6113432a14 | |||
| 952cf00413 | |||
| 34b9933046 | |||
| e5fe7d07a5 | |||
| c987d8e258 | |||
| 3f2d2bb4c9 | |||
| 04a3ad721c | |||
| 590924254e | |||
| 67511fc649 | |||
| 093134d36c | |||
| ffeb3ce338 | |||
| 52b171c7af | |||
| a386f57c21 | |||
| 3ca2afbb4b | |||
| b5a2966ada | |||
| 74a4fce0ca | |||
| 8fc97bde02 | |||
| 2d75b2e80e | |||
| f088c4e9ff | |||
| 8a1cf909d4 | |||
| 33e785d22a | |||
| d16cec176b | |||
| 8744bee2dd | |||
| 5f4d33f3ca | |||
| 767d3051a7 | |||
| b2e62dc60c | |||
| b0399a4e48 | |||
| ec2ab2f365 | |||
| fd4e67d4f7 | |||
| 3cb3160731 | |||
| dbcafd2869 | |||
| 3ecb2c9d66 |
+546
-80
@@ -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
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
# Config
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `STOCKFISH_PATH` **required** — modules/bot/python/nnue.py
|
||||
+30
-30
@@ -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
@@ -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
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# Middleware
|
||||
|
||||
## custom
|
||||
- generate — `modules/bot/python/src/generate.py`
|
||||
@@ -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>
|
||||
@@ -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
|
||||
@@ -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)_
|
||||
@@ -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
|
||||
|
||||
@@ -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_
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'"
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 -Dquarkus.native.enabled=true -Dquarkus.package.jar.enabled=false --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 }}
|
||||
@@ -38,6 +38,11 @@ bin/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
graphify-out/
|
||||
.graphify_*.json
|
||||
|
||||
### Keys ###
|
||||
**/keys/private.pem
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
|
||||
Generated
+2
@@ -8,3 +8,5 @@
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
|
||||
sonarlint.xml
|
||||
|
||||
Generated
+133
@@ -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>
|
||||
Generated
+1
-1
@@ -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>
|
||||
Generated
+18
File diff suppressed because one or more lines are too long
Generated
+9
-2
@@ -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>
|
||||
|
||||
Generated
+2
-1
@@ -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>
|
||||
Generated
+1
-1
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/
|
||||
@@ -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 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.
|
||||
- **Immutable state as primary model:** GameContext (api) holds board, history, player state—immutable 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.
|
||||
@@ -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 | 50–200ms | Primary |
|
||||
| **Redis heartbeat expiry** | `{prefix}:instances:{instanceId}` TTL=5s | 5–7s | 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
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: draw
|
||||
seq: 2
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: export
|
||||
seq: 6
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: game
|
||||
seq: 3
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 *"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: import
|
||||
seq: 5
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
meta {
|
||||
name: move
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "1",
|
||||
"name": "NowChess API",
|
||||
"type": "collection",
|
||||
"ignore": []
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
vars {
|
||||
baseUrl: http://localhost:8080
|
||||
wsBaseUrl: ws://localhost:8084
|
||||
ioBaseUrl: http://localhost:8081
|
||||
}
|
||||
@@ -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"}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: export
|
||||
seq: 2
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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 *"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
meta {
|
||||
name: import
|
||||
seq: 1
|
||||
}
|
||||
+91
-2
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
/usr/bin/python
|
||||
@@ -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
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
@@ -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
@@ -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
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
@@ -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
@@ -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
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -1 +0,0 @@
|
||||
{"nodes": [{"id": "settings_gradle", "label": "settings.gradle.kts", "file_type": "code", "source_file": "settings.gradle.kts", "source_location": "L1"}], "edges": []}
|
||||
-1
@@ -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
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
@@ -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
@@ -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
@@ -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}]}
|
||||
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
-1
@@ -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
Reference in New Issue
Block a user