Repository navigation
20.0.0
JPMS module boundary and public-API surface reset
ashlar-chess 20.0.0 is now a proper JPMS module with a deliberately narrow public API. This is a breaking release, and the breaks apply to plain class-path consumers too — they are package relocations, not just module encapsulation. The module name io.github.dlbbld.ashlarchess is identical to the Automatic-Module-Name shipped in 19.1.0, so adopting the named module is not itself a rename.
Breaking
- JPMS module —
module-info.javaexports only the public API:board,board.enums,fen,fen.model,pgn,san,adjudication,report,unwinnability,exceptions,bitboard(BitboardPositionas documented advanced low-level API). Every other package is internal and inaccessible to modular consumers. - Guava removed from the public API (and the library entirely) — Guava
ImmutableList/ImmutableSet/ImmutableMapreturn types are now JDKList/Set/Map. Drop Guava (and anyrequires com.google.common) from your build; ashlar-chess no longer pulls it in. - Public vocabulary consolidated into
board—LegalMove,LegalMoveKind,UciMove,MoveSpecification,Outcome,Termination,MoveCheck,InvalidMoveException,ClaimRights,ClaimableMove,DynamicPositionnow import fromio.github.dlbbld.ashlarchess.board. The base exception hierarchy (ChessApiRuntimeException,UsageException,ProgrammingMistakeException,NonePointerException,FileSystemAccessException) is in the top-levelexceptionspackage. - Implementation types are now hidden (moved into non-exported packages such as the
*.internalsubpackages,moves,squares,analyze): the move-generation engine,CastlingUtility,SquareUtility/RankUtility, the SAN/LAN generatorsMoveToSan/MoveToLan,UpdateSquare,MoveNumberFormat, and theNulls/Messagehelpers, among others. Use the public API instead (see Added). - No forced logging or utility dependency —
commons-lang3andlog4jare no longer dependencies; internal logging uses the JDK'sjava.util.logging. (org.eclipse.jdt.annotationisrequires static transitive: optional and compile-only.) - Full unwinnability verdict collapsed back to the public domain answer —
UnwinnabilityFullVerdictexposesWINNABLE,UNWINNABLE,UNDETERMINED. The proof detail lives onUnwinnabilityFullAnalysis:winnableProof()returnsWinnableProof.THEOREM/HELPMATE/NONE, andmateLine()carries the concrete UCI line for searched wins.
Added
module-info.java— moduleio.github.dlbbld.ashlarchess.- Castling geometry on
CastlingMove—kingFromSquare(Side),kingToSquare(Side),rookFromSquare(Side),rookToSquare(Side)resolve the squares a castling move touches (a castlingMoveSpecificationstoresSquare.NONEfor from/to). MoveSpecification.isCastling()— companion to the existingisPromotion().LegalMoveconveniences —isCapture(),isCastling(),isPromotion(),isEnPassant(), andenPassantCapturedPawnSquare()(the captured pawn does not stand on the move's destination square).
Internal
- Package-by-feature reset: the duplicate by-kind buckets (
model/common.model,enums/common.enums,common.exceptions) are gone; cross-cutting helpers consolidated into a single non-exportedinternalpackage; dead post-Guava code (ImmutableUtility) removed. - A module-boundary guard test fails the build if the exported package set or the javadoc
excludePackageNamesdrift from the intended public API.