diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 0d1ff20..59fb705 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -12,6 +12,7 @@
+
diff --git a/.idea/scala_compiler.xml b/.idea/scala_compiler.xml
index e12ee29..1b2a733 100644
--- a/.idea/scala_compiler.xml
+++ b/.idea/scala_compiler.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/modules/api/src/main/scala/de/nowchess/api/game/GameState.scala b/modules/api/src/main/scala/de/nowchess/api/game/GameState.scala
deleted file mode 100644
index b6b49e8..0000000
--- a/modules/api/src/main/scala/de/nowchess/api/game/GameState.scala
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.nowchess.api.game
-
-import de.nowchess.api.board.{Color, Square}
-
-/**
- * Castling availability flags for one side.
- *
- * @param kingSide king-side castling still legally available
- * @param queenSide queen-side castling still legally available
- */
-@deprecated("Use de.nowchess.api.board.CastlingRights via GameContext.", "NCS-22")
-final case class CastlingRights(kingSide: Boolean, queenSide: Boolean)
-
-object CastlingRights:
- val None: CastlingRights = CastlingRights(kingSide = false, queenSide = false)
- val Both: CastlingRights = CastlingRights(kingSide = true, queenSide = true)
-
-/** Outcome of a finished game. */
-@deprecated("Use GameContext and derive game lifecycle from rules/engine state.", "NCS-22")
-enum GameResult:
- case WhiteWins
- case BlackWins
- case Draw
-
-/** Lifecycle state of a game. */
-@deprecated("Use GameContext and engine events for lifecycle handling.", "NCS-22")
-enum GameStatus:
- case NotStarted
- case InProgress
- case Finished(result: GameResult)
-
-/**
- * A FEN-compatible snapshot of board and game state.
- *
- * The board is represented as a FEN piece-placement string (rank 8 to rank 1,
- * separated by '/'). All other fields mirror standard FEN fields.
- *
- * @param piecePlacement FEN piece-placement field, e.g.
- * "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"
- * @param activeColor side to move
- * @param castlingWhite castling rights for White
- * @param castlingBlack castling rights for Black
- * @param enPassantTarget square behind the double-pushed pawn, if any
- * @param halfMoveClock plies since last capture or pawn advance (50-move rule)
- * @param fullMoveNumber increments after Black's move, starts at 1
- * @param status current lifecycle status of the game
- */
-@deprecated("Use GameContext for runtime state; keep GameState only for legacy compatibility.", "NCS-22")
-final case class GameState(
- piecePlacement: String,
- activeColor: Color,
- castlingWhite: CastlingRights,
- castlingBlack: CastlingRights,
- enPassantTarget: Option[Square],
- halfMoveClock: Int,
- fullMoveNumber: Int,
- status: GameStatus
-)
-
-object GameState:
- /** Standard starting position. */
- val initial: GameState = GameState(
- piecePlacement = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR",
- activeColor = Color.White,
- castlingWhite = CastlingRights.Both,
- castlingBlack = CastlingRights.Both,
- enPassantTarget = None,
- halfMoveClock = 0,
- fullMoveNumber = 1,
- status = GameStatus.InProgress
- )
diff --git a/modules/core/build.gradle.kts b/modules/core/build.gradle.kts
index 8c8fffb..637d9c3 100644
--- a/modules/core/build.gradle.kts
+++ b/modules/core/build.gradle.kts
@@ -39,6 +39,7 @@ dependencies {
}
implementation(project(":modules:api"))
+ implementation(project(":modules:io"))
implementation(project(":modules:rule"))
testImplementation(platform("org.junit:junit-bom:5.13.4"))
diff --git a/modules/io/build.gradle.kts b/modules/io/build.gradle.kts
new file mode 100644
index 0000000..c006936
--- /dev/null
+++ b/modules/io/build.gradle.kts
@@ -0,0 +1,62 @@
+plugins {
+ id("scala")
+ id("org.scoverage") version "8.1"
+}
+
+group = "de.nowchess"
+version = "1.0-SNAPSHOT"
+
+@Suppress("UNCHECKED_CAST")
+val versions = rootProject.extra["VERSIONS"] as Map
+
+repositories {
+ mavenCentral()
+}
+
+scala {
+ scalaVersion = versions["SCALA3"]!!
+}
+
+scoverage {
+ scoverageVersion.set(versions["SCOVERAGE"]!!)
+}
+
+tasks.withType {
+ scalaCompileOptions.additionalParameters = listOf("-encoding", "UTF-8")
+}
+
+dependencies {
+
+ implementation("org.scala-lang:scala3-compiler_3") {
+ version {
+ strictly(versions["SCALA3"]!!)
+ }
+ }
+ implementation("org.scala-lang:scala3-library_3") {
+ version {
+ strictly(versions["SCALA3"]!!)
+ }
+ }
+
+ implementation(project(":modules:api"))
+
+ testImplementation(platform("org.junit:junit-bom:5.13.4"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("org.scalatest:scalatest_3:${versions["SCALATEST"]!!}")
+ testImplementation("co.helmethair:scalatest-junit-runner:${versions["SCALATEST_JUNIT"]!!}")
+
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+}
+
+tasks.test {
+ useJUnitPlatform {
+ includeEngines("scalatest")
+ testLogging {
+ events("skipped", "failed")
+ }
+ }
+ finalizedBy(tasks.reportScoverage)
+}
+tasks.reportScoverage {
+ dependsOn(tasks.test)
+}
diff --git a/modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala b/modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala
new file mode 100644
index 0000000..5a8a49c
--- /dev/null
+++ b/modules/io/src/main/scala/de/nowchess/io/GameContextExport.scala
@@ -0,0 +1,9 @@
+package de.nowchess.io
+
+import de.nowchess.api.game.GameContext
+
+trait GameContextExport {
+
+ def exportGameContext(context: GameContext): String
+
+}
diff --git a/modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala b/modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala
new file mode 100644
index 0000000..fa1af99
--- /dev/null
+++ b/modules/io/src/main/scala/de/nowchess/io/GameContextImport.scala
@@ -0,0 +1,9 @@
+package de.nowchess.io
+
+import de.nowchess.api.game.GameContext
+
+trait GameContextImport {
+
+ def importGameContext(input: String): GameContext
+
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index a426435..1571957 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,2 +1,8 @@
rootProject.name = "NowChessSystems"
-include("modules:core", "modules:api", "modules:ui", "modules:rule")
\ No newline at end of file
+include(
+ "modules:core",
+ "modules:api",
+ "modules:io",
+ "modules:rule",
+ "modules:ui",
+)
\ No newline at end of file