Compare commits
28 Commits
core-0.5.0
...
io-0.5.0
| Author | SHA1 | Date | |
|---|---|---|---|
| dbcafd2869 | |||
| 3ecb2c9d66 | |||
| 9ad11fb97a | |||
| e158b0a7f0 | |||
| f1c9df16b6 | |||
| 9d11d25b99 | |||
| 7a045d31d7 | |||
| b518c704fa | |||
| fe8e3c0539 | |||
| 1b16adcc72 | |||
| b4bc72f7e4 | |||
| 8959c3a849 | |||
| 47032378e2 | |||
| 217f14f899 | |||
| 638139602c | |||
| 8f56a82104 | |||
| 51ffd7aac9 | |||
| 1b9eb471de | |||
| 45013c87a9 | |||
| 80518719d5 | |||
| 2d6ead7e47 | |||
| 3ff80318b4 | |||
| 9fb743d135 | |||
| 412ed986a9 | |||
| 8bbeead702 | |||
| e5e20c566e | |||
| 13bfc16cfe | |||
| 85cbf95c18 |
@@ -2,9 +2,10 @@
|
||||
name: scala-implementer
|
||||
description: "Implements Scala 3 + Quarkus REST services, domain logic, and persistence"
|
||||
tools: Read, Write, Edit, Bash, Glob
|
||||
model: sonnet
|
||||
model: inherit
|
||||
color: pink
|
||||
---
|
||||
|
||||
You do not have permissions to write tests, just source code.
|
||||
You are a Scala 3 expert specialising in Quarkus microservices.
|
||||
Always read the relevant /docs/api/ file before implementing.
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
name: test-writer
|
||||
description: "Writes QuarkusTest unit and integration tests for a service. Invoke after scala-implementer has finished."
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, NotebookEdit
|
||||
model: sonnet
|
||||
model: haiku
|
||||
color: purple
|
||||
---
|
||||
|
||||
You do not have permissions to modify the source code, just write tests.
|
||||
You write tests for Scala 3 + Quarkus services.
|
||||
|
||||
@@ -19,5 +20,4 @@ When invoked BEFORE scala-implementer (no implementation exists yet):
|
||||
|
||||
When invoked AFTER scala-implementer (implementation exists):
|
||||
Run python3 jacoco-reporter/jacoco_coverage_gaps.py modules/{service-name}/build/reports/jacoco/test/jacocoTestReport.xml --output agent
|
||||
Use the jacoco-coverage-gaps skill — close coverage gaps revealed by the report.
|
||||
To regenerate the report run the tests first.
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# Memory Index
|
||||
|
||||
## Feedback
|
||||
- [feedback_keep_structure_updated.md](feedback_keep_structure_updated.md) — Update structure memory files whenever source files are added, removed, or changed
|
||||
|
||||
## Project Structure
|
||||
- [project_structure_root.md](project_structure_root.md) — Top-level layout, modules list, VERSIONS map, navigation rules (skip `build/`, `.gradle/`, `.idea/`)
|
||||
- [project_structure_api.md](project_structure_api.md) — `modules/api`: all files and types (Board, Piece, Square, GameState, Move, ApiResponse, PlayerInfo)
|
||||
- [project_structure_core.md](project_structure_core.md) — `modules/core`: all files and types (GameContext, GameRules, MoveValidator, GameController, Parser, Renderer)
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
name: keep-structure-memory-updated
|
||||
description: Always update the project structure memory files when adding, removing, or changing source files
|
||||
type: feedback
|
||||
---
|
||||
|
||||
After any change that adds, removes, renames, or significantly alters a source file, update the relevant structure memory file:
|
||||
|
||||
- New/renamed/deleted file in `modules/api` → update `project_structure_api.md`
|
||||
- New/renamed/deleted file in `modules/core` → update `project_structure_core.md`
|
||||
- New module, dependency version change, or new top-level directory → update `project_structure_root.md`
|
||||
- New module added → create a new `project_structure_<module>.md` and add it to `MEMORY.md`
|
||||
|
||||
**Why:** Structure memories are the primary navigation aid. Stale entries cause wasted exploration.
|
||||
|
||||
**How to apply:** Treat the structure memory update as part of completing any implementation task — do it in the same session, not as a follow-up.
|
||||
@@ -1,51 +0,0 @@
|
||||
---
|
||||
name: module-api-structure
|
||||
description: File and type overview for the modules/api module (shared domain types)
|
||||
type: project
|
||||
---
|
||||
|
||||
# Module: `modules/api`
|
||||
|
||||
**Purpose:** Shared domain model — pure data types with no game logic. Depended on by `modules/core`.
|
||||
|
||||
**Gradle:** `id("scala")`, no `application` plugin. No Quarkus. Uses scoverage plugin.
|
||||
|
||||
**Package root:** `de.nowchess.api`
|
||||
|
||||
## Source files (`src/main/scala/de/nowchess/api/`)
|
||||
|
||||
### `board/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `Board.scala` | `opaque type Board = Map[Square, Piece]` — extensions: `pieceAt`, `withMove`, `pieces`; `Board.initial` sets up start position |
|
||||
| `Color.scala` | `enum Color { White, Black }` — `.opposite`, `.label` |
|
||||
| `Piece.scala` | `case class Piece(color, pieceType)` — convenience vals `WhitePawn`…`BlackKing` |
|
||||
| `PieceType.scala` | `enum PieceType { Pawn, Knight, Bishop, Rook, Queen, King }` — `.label` |
|
||||
| `Square.scala` | `enum File { A–H }`, `enum Rank { R1–R8 }`, `case class Square(file, rank)` — `.toString` algebraic, `Square.fromAlgebraic(s)` |
|
||||
|
||||
### `game/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `GameState.scala` | `case class CastlingRights(kingSide, queenSide)` + `.None`/`.Both`; `enum GameResult { WhiteWins, BlackWins, Draw }`; `enum GameStatus { NotStarted, InProgress, Finished(result) }`; `case class GameState(piecePlacement, activeColor, castlingWhite, castlingBlack, enPassantTarget, halfMoveClock, fullMoveNumber, status)` — FEN-compatible snapshot |
|
||||
|
||||
### `move/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `Move.scala` | `enum PromotionPiece { Knight, Bishop, Rook, Queen }`; `enum MoveType { Normal, CastleKingside, CastleQueenside, EnPassant, Promotion(piece) }`; `case class Move(from, to, moveType = Normal)` |
|
||||
|
||||
### `player/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `PlayerInfo.scala` | `opaque type PlayerId = String`; `case class PlayerInfo(id: PlayerId, displayName: String)` |
|
||||
|
||||
### `response/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `ApiResponse.scala` | `sealed trait ApiResponse[+A]` → `Success[A](data)` / `Failure(errors)`; `case class ApiError(code, message, field?)`; `case class Pagination(page, pageSize, totalItems)` + `.totalPages`; `case class PagedResponse[A](items, pagination)` |
|
||||
|
||||
## Test files (`src/test/scala/de/nowchess/api/`)
|
||||
Mirror of main structure — one `*Test.scala` per source file using `AnyFunSuite with Matchers`.
|
||||
|
||||
## Notes
|
||||
- `GameState` is FEN-style but `Board` (in `core`) is a `Map[Square,Piece]` — the two are separate representations
|
||||
- `CastlingRights` is defined here in `api`; the castling logic lives in `core`
|
||||
@@ -1,48 +0,0 @@
|
||||
---
|
||||
name: module-core-structure
|
||||
description: File and type overview for the modules/core module (TUI chess engine)
|
||||
type: project
|
||||
---
|
||||
|
||||
# Module: `modules/core`
|
||||
|
||||
**Purpose:** Standalone TUI chess application. All game logic, move validation, rendering. Depends on `modules/api`.
|
||||
|
||||
**Gradle:** `id("scala")` + `application` plugin. Main class: `de.nowchess.chess.Main`. Uses scoverage plugin.
|
||||
|
||||
**Package root:** `de.nowchess.chess`
|
||||
|
||||
## Source files (`src/main/scala/de/nowchess/chess/`)
|
||||
|
||||
### Root
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `Main.scala` | Entry point — prints welcome, starts `GameController.gameLoop(GameContext.initial, Color.White)` |
|
||||
|
||||
### `controller/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `GameController.scala` | `sealed trait MoveResult` ADT: `Quit`, `InvalidFormat`, `NoPiece`, `WrongColor`, `IllegalMove`, `Moved`, `MovedInCheck`, `Checkmate`, `Stalemate`; `object GameController` — `processMove(ctx, turn, raw): MoveResult` (pure), `gameLoop(ctx, turn)` (I/O loop), `applyRightsRevocation(...)` (castling rights bookkeeping) |
|
||||
| `Parser.scala` | `object Parser` — `parseMove(input): Option[(Square, Square)]` parses coordinate notation e.g. `"e2e4"` |
|
||||
|
||||
### `logic/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `GameContext.scala` | `enum CastleSide { Kingside, Queenside }`; `case class GameContext(board, whiteCastling, blackCastling)` — `.castlingFor(color)`, `.withUpdatedRights(color, rights)`; `GameContext.initial`; `extension (Board).withCastle(color, side)` moves king+rook atomically |
|
||||
| `GameRules.scala` | `enum PositionStatus { Normal, InCheck, Mated, Drawn }`; `object GameRules` — `isInCheck(board, color)`, `legalMoves(ctx, color): Set[(Square,Square)]`, `gameStatus(ctx, color): PositionStatus` |
|
||||
| `MoveValidator.scala` | `object MoveValidator` — `isLegal(board, from, to)`, `legalTargets(board, from): Set[Square]` (board-only, no castling), `legalTargets(ctx, from)` (context-aware, includes castling), `isCastle`, `castleSide`, `castlingTargets(ctx, color)` — full castling legality (empty squares, no check through transit) |
|
||||
|
||||
### `view/`
|
||||
| File | Contents |
|
||||
|------|----------|
|
||||
| `Renderer.scala` | `object Renderer` — `render(board): String` outputs ANSI-colored board with file/rank labels |
|
||||
| `PieceUnicode.scala` | `extension (Piece).unicode: String` maps each piece to its Unicode chess symbol |
|
||||
|
||||
## Test files (`src/test/scala/de/nowchess/chess/`)
|
||||
Mirror of main structure — one `*Test.scala` per source file using `AnyFunSuite with Matchers`.
|
||||
|
||||
## Key design notes
|
||||
- `MoveValidator` has two overloaded `legalTargets`: one takes `Board` (geometry only), one takes `GameContext` (adds castling)
|
||||
- `GameRules.legalMoves` filters by check — it calls `MoveValidator.legalTargets(ctx, from)` then simulates each move
|
||||
- Castling rights revocation is in `GameController.applyRightsRevocation`, triggered after every move
|
||||
- No `@QuarkusTest` — this module is a plain Scala application, not a Quarkus service
|
||||
@@ -1,55 +0,0 @@
|
||||
---
|
||||
name: project-root-structure
|
||||
description: Top-level project structure, modules list, and navigation notes for NowChessSystems
|
||||
type: project
|
||||
---
|
||||
|
||||
# NowChessSystems — Root Structure
|
||||
|
||||
## Directory layout (skip `build/`, `.gradle/`, `.idea/`)
|
||||
|
||||
```
|
||||
NowChessSystems/
|
||||
├── build.gradle.kts # Root: sonarqube plugin, VERSIONS map
|
||||
├── settings.gradle.kts # include(":modules:core", ":modules:api")
|
||||
├── gradlew / gradlew.bat
|
||||
├── CLAUDE.md # Project instructions for Claude Code
|
||||
├── .claude/
|
||||
│ ├── CLAUDE.MD # Working agreement (plan/verify/unresolved)
|
||||
│ ├── settings.json
|
||||
│ └── agents/ # architect, code-reviewer, gradle-builder, scala-implementer, test-writer
|
||||
├── docs/
|
||||
│ ├── Claude-Skills.md
|
||||
│ ├── Security.md
|
||||
│ └── unresolved.md
|
||||
├── jacoco-reporter/ # Python scripts for coverage gap reporting
|
||||
└── modules/
|
||||
├── api/ # Shared domain types (no logic)
|
||||
└── core/ # TUI chess engine + game logic
|
||||
```
|
||||
|
||||
## Modules
|
||||
|
||||
| Module | Gradle path | Purpose |
|
||||
|--------|-------------|---------|
|
||||
| `api` | `:modules:api` | Shared domain model: Board, Piece, Move, GameState, ApiResponse |
|
||||
| `core` | `:modules:core` | TUI chess app: game logic, move validation, rendering |
|
||||
|
||||
`core` depends on `api` via `implementation(project(":modules:api"))`.
|
||||
|
||||
## VERSIONS (root `build.gradle.kts`)
|
||||
|
||||
| Key | Value |
|
||||
|-----|-------|
|
||||
| `QUARKUS_SCALA3` | 1.0.0 |
|
||||
| `SCALA3` | 3.5.1 |
|
||||
| `SCALA_LIBRARY` | 2.13.18 |
|
||||
| `SCALATEST` | 3.2.19 |
|
||||
| `SCALATEST_JUNIT` | 0.1.11 |
|
||||
| `SCOVERAGE` | 2.1.1 |
|
||||
|
||||
## Navigation rules
|
||||
- **Always skip** `build/`, `.gradle/`, `.idea/` when exploring — they are generated artifacts
|
||||
- Tests use `AnyFunSuite with Matchers` (ScalaTest), not JUnit `@Test`
|
||||
- No Quarkus in current modules — Quarkus is planned for future services
|
||||
- Agent workflow: architect → scala-implementer → test-writer → gradle-builder → code-reviewer
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"enabledPlugins": {
|
||||
"superpowers@claude-plugins-official": true,
|
||||
"ui-ux-pro-max@ui-ux-pro-max-skill": true
|
||||
"superpowers@claude-plugins-official": false,
|
||||
"ui-ux-pro-max@ui-ux-pro-max-skill": false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
# NowChessSystems — AI Context Map
|
||||
|
||||
> **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.**
|
||||
|
||||
---
|
||||
|
||||
# Libraries
|
||||
|
||||
- `jacoco-reporter/scoverage_coverage_gaps.py`
|
||||
- function parse_scoverage_xml: (xml_path) -> tuple[dict, list[ClassGap]]
|
||||
- function format_agent: (project_stats, classes) -> str
|
||||
- function format_json: (project_stats, classes) -> str
|
||||
- function format_markdown: (project_stats, classes) -> str
|
||||
- function format_module_gaps: (module_name, classes, stmt_pct) -> str
|
||||
- function run_scan_modules: (modules_dir, package_filter, min_coverage) -> None
|
||||
- _...4 more_
|
||||
- `jacoco-reporter/test_gaps.py`
|
||||
- function parse_suite_xml: (xml_path) -> SuiteResult
|
||||
- function load_module: (module_dir, results_subdir) -> Optional[ModuleResult]
|
||||
- function format_module: (mod) -> str
|
||||
- function run: (modules_dir, results_subdir, module_filter) -> None
|
||||
- function main: () -> None
|
||||
- class TestCase
|
||||
- _...2 more_
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
||||
- class Board
|
||||
- function apply
|
||||
- function pieceAt
|
||||
- function updated
|
||||
- function removed
|
||||
- function withMove
|
||||
- _...2 more_
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala`
|
||||
- function hasAnyRights
|
||||
- function hasRights
|
||||
- function revokeColor
|
||||
- function revokeKingSide
|
||||
- function revokeQueenSide
|
||||
- class CastlingRights
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — function opposite, function label
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — class Piece
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — function label
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala`
|
||||
- class Square
|
||||
- function fromAlgebraic
|
||||
- function offset
|
||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
|
||||
- function withBoard
|
||||
- function withTurn
|
||||
- function withCastlingRights
|
||||
- function withEnPassantSquare
|
||||
- function withHalfMoveClock
|
||||
- function withMove
|
||||
- _...2 more_
|
||||
- `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
|
||||
- _...3 more_
|
||||
- `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_
|
||||
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
|
||||
- function context
|
||||
- class Observer
|
||||
- function onGameEvent
|
||||
- class Observable
|
||||
- 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/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala`
|
||||
- class FenExporter
|
||||
- function boardToFen
|
||||
- function gameContextToFen
|
||||
- function exportGameContext
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala`
|
||||
- class FenParser
|
||||
- function parseFen
|
||||
- function importGameContext
|
||||
- function parseBoard
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserCombinators.scala`
|
||||
- class FenParserCombinators
|
||||
- function parseFen
|
||||
- function parseBoard
|
||||
- function importGameContext
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserFastParse.scala`
|
||||
- class FenParserFastParse
|
||||
- function parseFen
|
||||
- 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/pgn/PgnExporter.scala`
|
||||
- class PgnExporter
|
||||
- function exportGameContext
|
||||
- function exportGame
|
||||
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala`
|
||||
- class PgnParser
|
||||
- function validatePgn
|
||||
- function importGameContext
|
||||
- function parsePgn
|
||||
- function parseAlgebraicMove
|
||||
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala`
|
||||
- class RuleSet
|
||||
- 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
|
||||
|
||||
---
|
||||
|
||||
# Dependency Graph
|
||||
|
||||
## 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
|
||||
|
||||
## 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
|
||||
|
||||
---
|
||||
|
||||
_Generated by [codesight](https://github.com/Houseofmvps/codesight) — see your codebase clearly_
|
||||
@@ -0,0 +1,37 @@
|
||||
# Dependency Graph
|
||||
|
||||
## 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
|
||||
|
||||
## 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
|
||||
@@ -0,0 +1,150 @@
|
||||
# Libraries
|
||||
|
||||
- `jacoco-reporter/scoverage_coverage_gaps.py`
|
||||
- function parse_scoverage_xml: (xml_path) -> tuple[dict, list[ClassGap]]
|
||||
- function format_agent: (project_stats, classes) -> str
|
||||
- function format_json: (project_stats, classes) -> str
|
||||
- function format_markdown: (project_stats, classes) -> str
|
||||
- function format_module_gaps: (module_name, classes, stmt_pct) -> str
|
||||
- function run_scan_modules: (modules_dir, package_filter, min_coverage) -> None
|
||||
- _...4 more_
|
||||
- `jacoco-reporter/test_gaps.py`
|
||||
- function parse_suite_xml: (xml_path) -> SuiteResult
|
||||
- function load_module: (module_dir, results_subdir) -> Optional[ModuleResult]
|
||||
- function format_module: (mod) -> str
|
||||
- function run: (modules_dir, results_subdir, module_filter) -> None
|
||||
- function main: () -> None
|
||||
- class TestCase
|
||||
- _...2 more_
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Board.scala`
|
||||
- class Board
|
||||
- function apply
|
||||
- function pieceAt
|
||||
- function updated
|
||||
- function removed
|
||||
- function withMove
|
||||
- _...2 more_
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/CastlingRights.scala`
|
||||
- function hasAnyRights
|
||||
- function hasRights
|
||||
- function revokeColor
|
||||
- function revokeKingSide
|
||||
- function revokeQueenSide
|
||||
- class CastlingRights
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Color.scala` — function opposite, function label
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Piece.scala` — class Piece
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala` — function label
|
||||
- `modules/api/src/main/scala/de/nowchess/api/board/Square.scala`
|
||||
- class Square
|
||||
- function fromAlgebraic
|
||||
- function offset
|
||||
- `modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala`
|
||||
- function withBoard
|
||||
- function withTurn
|
||||
- function withCastlingRights
|
||||
- function withEnPassantSquare
|
||||
- function withHalfMoveClock
|
||||
- function withMove
|
||||
- _...2 more_
|
||||
- `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
|
||||
- _...3 more_
|
||||
- `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_
|
||||
- `modules/core/src/main/scala/de/nowchess/chess/observer/Observer.scala`
|
||||
- function context
|
||||
- class Observer
|
||||
- function onGameEvent
|
||||
- class Observable
|
||||
- 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/io/src/main/scala/de/nowchess/io/fen/FenExporter.scala`
|
||||
- class FenExporter
|
||||
- function boardToFen
|
||||
- function gameContextToFen
|
||||
- function exportGameContext
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParser.scala`
|
||||
- class FenParser
|
||||
- function parseFen
|
||||
- function importGameContext
|
||||
- function parseBoard
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserCombinators.scala`
|
||||
- class FenParserCombinators
|
||||
- function parseFen
|
||||
- function parseBoard
|
||||
- function importGameContext
|
||||
- `modules/io/src/main/scala/de/nowchess/io/fen/FenParserFastParse.scala`
|
||||
- class FenParserFastParse
|
||||
- function parseFen
|
||||
- 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/pgn/PgnExporter.scala`
|
||||
- class PgnExporter
|
||||
- function exportGameContext
|
||||
- function exportGame
|
||||
- `modules/io/src/main/scala/de/nowchess/io/pgn/PgnParser.scala`
|
||||
- class PgnParser
|
||||
- function validatePgn
|
||||
- function importGameContext
|
||||
- function parsePgn
|
||||
- function parseAlgebraicMove
|
||||
- `modules/rule/src/main/scala/de/nowchess/rules/RuleSet.scala`
|
||||
- class RuleSet
|
||||
- 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
|
||||
@@ -0,0 +1,44 @@
|
||||
# NowChessSystems — Wiki
|
||||
|
||||
_Generated 2026-04-12 — re-run `npx codesight --wiki` if the codebase has changed._
|
||||
|
||||
Structural map compiled from source code via AST. No LLM — deterministic, 200ms.
|
||||
|
||||
> **How to use safely:** These articles tell you WHERE things live and WHAT exists. They do not show full implementation logic. Always read the actual source files before implementing new features or making changes. Never infer how a function works from the wiki alone.
|
||||
|
||||
## Articles
|
||||
|
||||
- [Overview](./overview.md)
|
||||
|
||||
## Quick Stats
|
||||
|
||||
- Routes: **0**
|
||||
- Models: **0**
|
||||
- Components: **0**
|
||||
- Env vars: **0** required, **0** with defaults
|
||||
|
||||
## How to Use
|
||||
|
||||
- **New session:** read `index.md` (this file) for orientation — WHERE things are
|
||||
- **Architecture question:** read `overview.md` (~500 tokens)
|
||||
- **Domain question:** read the relevant article, then **read those source files**
|
||||
- **Database question:** read `database.md`, then read the actual schema files
|
||||
- **Before implementing anything:** read the source files listed in the article
|
||||
- **Full source context:** read `.codesight/CODESIGHT.md`
|
||||
|
||||
## What the Wiki Does Not Cover
|
||||
|
||||
These exist in your codebase but are **not** reflected in wiki articles:
|
||||
- Routes registered dynamically at runtime (loops, plugin factories, `app.use(dynamicRouter)`)
|
||||
- Internal routes from npm packages (e.g. Better Auth's built-in `/api/auth/*` endpoints)
|
||||
- WebSocket and SSE handlers
|
||||
- Raw SQL tables not declared through an ORM
|
||||
- Computed or virtual fields absent from schema declarations
|
||||
- TypeScript types that are not actual database columns
|
||||
- Routes marked `[inferred]` were detected via regex and may have lower precision
|
||||
- gRPC, tRPC, and GraphQL resolvers may be partially captured
|
||||
|
||||
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)_
|
||||
@@ -0,0 +1,5 @@
|
||||
# Wiki Log
|
||||
|
||||
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
|
||||
@@ -0,0 +1,19 @@
|
||||
# NowChessSystems — Overview
|
||||
|
||||
> **Navigation aid.** This article shows WHERE things live (routes, models, files). Read actual source files before implementing new features or making changes.
|
||||
|
||||
**NowChessSystems** is a scala project built with raw-http.
|
||||
|
||||
## 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
|
||||
|
||||
---
|
||||
_Back to [index.md](./index.md) · Generated 2026-04-12_
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AndroidProjectSystem">
|
||||
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -12,6 +12,8 @@
|
||||
<option value="$PROJECT_DIR$/modules" />
|
||||
<option value="$PROJECT_DIR$/modules/api" />
|
||||
<option value="$PROJECT_DIR$/modules/core" />
|
||||
<option value="$PROJECT_DIR$/modules/io" />
|
||||
<option value="$PROJECT_DIR$/modules/rule" />
|
||||
<option value="$PROJECT_DIR$/modules/ui" />
|
||||
</set>
|
||||
</option>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="FrameworkDetectionExcludesConfiguration">
|
||||
|
||||
@@ -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.ui.main,NowChessSystems.modules.ui.scoverage,NowChessSystems.modules.ui.test">
|
||||
<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">
|
||||
<option name="deprecationWarnings" value="true" />
|
||||
<option name="uncheckedWarnings" value="true" />
|
||||
<parameters>
|
||||
|
||||
@@ -6,6 +6,16 @@
|
||||
<inspection_tool class="CommitNamingConvention" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
<component name="IssueNavigationConfiguration">
|
||||
<option name="links">
|
||||
<list>
|
||||
<IssueNavigationLink>
|
||||
<option name="issueRegexp" value="(?x)\b(CORE|NCWF|BAC|FRO|K8S|ORG|NCI|NCS)-\d+\b#YouTrack" />
|
||||
<option name="linkRegexp" value="https://knockoutwhist.youtrack.cloud/issue/$0" />
|
||||
</IssueNavigationLink>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# Project Context
|
||||
|
||||
This is a scala project using raw-http.
|
||||
|
||||
Middleware includes: custom.
|
||||
|
||||
High-impact files (most imported, changes here affect many other files):
|
||||
- modules/api/src/main/scala/de/nowchess/api/game/GameContext.scala (imported by 50 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/board/Square.scala (imported by 33 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/board/Color.scala (imported by 30 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/move/Move.scala (imported by 29 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/board/Board.scala (imported by 19 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/board/PieceType.scala (imported by 18 files)
|
||||
- modules/rule/src/main/scala/de/nowchess/rules/sets/DefaultRules.scala (imported by 17 files)
|
||||
- modules/api/src/main/scala/de/nowchess/api/board/Piece.scala (imported by 15 files)
|
||||
|
||||
Required environment variables (no defaults):
|
||||
- STOCKFISH_PATH (modules/bot/python/nnue.py)
|
||||
|
||||
Read .codesight/wiki/index.md for orientation (WHERE things live). Then read actual source files before implementing. Wiki articles are navigation aids, not implementation guides.
|
||||
Read .codesight/CODESIGHT.md for the complete AI context map including all routes, schema, components, libraries, config, middleware, and dependency graph.
|
||||
@@ -0,0 +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
|
||||
- Edit and resell the asset to others - - Credits required using This link: https://fatman200.itch.io/
|
||||
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 907 B |
|
After Width: | Height: | Size: 919 B |
|
After Width: | Height: | Size: 818 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 161 B |
|
After Width: | Height: | Size: 188 B |
|
After Width: | Height: | Size: 188 B |
|
After Width: | Height: | Size: 237 B |
|
After Width: | Height: | Size: 243 B |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 244 B |
|
After Width: | Height: | Size: 240 B |
|
After Width: | Height: | Size: 232 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 211 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 227 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 300 B |
|
After Width: | Height: | Size: 218 B |
|
After Width: | Height: | Size: 244 B |
|
After Width: | Height: | Size: 245 B |
|
After Width: | Height: | Size: 229 B |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 245 B |
|
After Width: | Height: | Size: 266 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 258 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 313 B |
|
After Width: | Height: | Size: 251 B |
|
After Width: | Height: | Size: 275 B |
|
After Width: | Height: | Size: 305 B |
|
After Width: | Height: | Size: 281 B |
|
After Width: | Height: | Size: 280 B |
@@ -1,58 +1,90 @@
|
||||
# CLAUDE.md — NowChessSystems
|
||||
# Now-Chess
|
||||
|
||||
## Stack
|
||||
Scala 3.5.x · Quarkus + quarkus-scala3 · Hibernate/Jakarta · Lanterna TUI · K8s + ArgoCD + Kargo · Frontend TBD (Vite/React/Angular/Vue)
|
||||
|
||||
### Memory
|
||||
|
||||
Your memory is saved under .claude/memory/MEMORY.md.
|
||||
|
||||
## Structure
|
||||
```
|
||||
build.gradle.kts / settings.gradle.kts # root; include(":modules:<svc>") per service
|
||||
modules/<svc>/build.gradle.kts + src/
|
||||
docs/adr/ docs/api/ docs/unresolved.md
|
||||
```
|
||||
Versions in root `extra["VERSIONS"]`; modules read via `rootProject.extra["VERSIONS"] as Map<String,String>`.
|
||||
Scala 3.5.1 · Gradle 9
|
||||
|
||||
## Commands
|
||||
```bash
|
||||
./gradlew build
|
||||
./gradlew :modules:<svc>:build|test
|
||||
./gradlew :modules:<svc>:test --tests "de.nowchess.<svc>.<Class>"
|
||||
|
||||
```
|
||||
|
||||
## Workflow
|
||||
1. **Plan** — restate requirement, list files, flag risks. Proceed unless genuine ambiguity.
|
||||
2. **Tests first** — cover only new behaviour.
|
||||
3. **Implement** — no scope creep.
|
||||
4. **Verify** — check each requirement; confirm green build.
|
||||
|
||||
## Scala/Quarkus Rules
|
||||
- `given`/`using` only (no `implicit`); `Option`/`Either`/`Try` (no `null`/`.get`)
|
||||
- `jakarta.*` only; reactive I/O (`Uni`/`Multi`), no blocking on event loop
|
||||
- Always exclude `org.scala-lang:scala-library` from Quarkus BOM
|
||||
- Unit tests: `extends AnyFunSuite with Matchers` — no `@Test`, no `: Unit`
|
||||
- Integration tests: `@QuarkusTest` + JUnit 5 — `@Test` methods need explicit `: Unit`
|
||||
|
||||
## Coverage
|
||||
Line = 100% · Branch = 100% · Method = 100% · Regression tests · document exceptions
|
||||
Check: `jacoco-reporter/scoverage_coverage_gaps.py modules/{svc}/build/reports/scoverageTest/scoverage.xml`
|
||||
⚠️ Use `scoverageTest/`, NOT `scoverage/`.
|
||||
|
||||
## Bug Fixing
|
||||
Fix failures immediately without asking. After 3 failed attempts → log in `docs/unresolved.md` + surface summary.
|
||||
|
||||
## Agents (new service)
|
||||
Sequential: architect → scala-implementer → test-writer → gradle-builder → code-reviewer (review only, no self-fix)
|
||||
Parallel: only when services are fully independent (no shared contracts/state).
|
||||
|
||||
## Unresolved (`docs/unresolved.md`)
|
||||
Append only, never delete:
|
||||
```
|
||||
## [YYYY-MM-DD] <title>
|
||||
**Requirement/Bug:** **Root Cause:** **Attempted Fixes:** **Next Step:**
|
||||
./clean # Clear build dirs — only when necessary
|
||||
./compile # Compile all modules — always run
|
||||
./test # Run all tests
|
||||
./coverage # Check coverage
|
||||
```
|
||||
Try to stick to these commands for consistency.
|
||||
|
||||
## Done Checklist
|
||||
- [ ] Plan written · files created/modified · tests green · requirements verified · unresolved logged
|
||||
## Modules
|
||||
|
||||
| Module | Role | Depends on |
|
||||
|--------|------|-----------|
|
||||
| `api` | Model / shared types | (none) |
|
||||
| `core` | Primary business logic | api, rule |
|
||||
| `rule` | Game rules | api |
|
||||
| `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.
|
||||
- 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.
|
||||
|
||||
## 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.
|
||||
|
||||
## 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
plugins {
|
||||
id("org.sonarqube") version "7.2.3.7755"
|
||||
id("org.scoverage") version "8.1" apply false
|
||||
}
|
||||
|
||||
group = "de.nowchess"
|
||||
@@ -28,7 +29,14 @@ val versions = mapOf(
|
||||
"SCALA_LIBRARY" to "2.13.18",
|
||||
"SCALATEST" to "3.2.19",
|
||||
"SCALATEST_JUNIT" to "0.1.11",
|
||||
"SCOVERAGE" to "2.1.1"
|
||||
"SCOVERAGE" to "2.1.1",
|
||||
"SCALAFX" to "21.0.0-R32",
|
||||
"JAVAFX" to "21.0.1",
|
||||
"JUNIT_BOM" to "5.13.4",
|
||||
"SCALA_PARSER_COMBINATORS" to "2.4.0",
|
||||
"FASTPARSE" to "3.0.2",
|
||||
"JACKSON" to "2.17.2",
|
||||
"JACKSON_SCALA" to "2.17.2"
|
||||
)
|
||||
extra["VERSIONS"] = versions
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
#! /usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
./gradlew classes
|
||||
@@ -0,0 +1,10 @@
|
||||
#! /usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
./gradlew test
|
||||
|
||||
if [ "$#" -eq 0 ]; then
|
||||
PYTHONUTF8=1 python3 jacoco-reporter/scoverage_coverage_gaps.py
|
||||
else
|
||||
PYTHONUTF8=1 python3 jacoco-reporter/scoverage_coverage_gaps.py "modules/$1/build/reports/scoverageTest/scoverage.xml"
|
||||
fi
|
||||
@@ -0,0 +1,776 @@
|
||||
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,396 @@
|
||||
{
|
||||
"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
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
/usr/bin/python
|
||||
@@ -0,0 +1,413 @@
|
||||
# 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._
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "build_gradle", "label": "build.gradle.kts", "file_type": "code", "source_file": "modules/ui/build.gradle.kts", "source_location": "L1"}], "edges": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "settings_gradle", "label": "settings.gradle.kts", "file_type": "code", "source_file": "settings.gradle.kts", "source_location": "L1"}], "edges": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"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}]}
|
||||