# LoMines — План реструктуризации и улучшения качества > **Обновлено:** 2026-08-12 > **Цели:** Разбивка на подпапки (≤3 файла), лимит 150 строк/файл, Checkstyle, тестовое покрытие --- ## 📊 Текущее состояние ### Файлы >150 строк (нужен split) — 25 main + 11 test ``` MAIN (нуждаются в сплите): 209 handler/MineResetHandler.java 207 util/format/ColorUtils.java 207 command/common/LoMinesTabCompleter.java 203 integration/hologram/HologramManager.java 201 core/service/MineFileManager.java 190 gui/mine/main/MineEditItems.java 186 command/admin/StatsCommands.java 181 util/location/Cuboid.java 181 data/stats/StatsManager.java 180 gui/mine/edit/blocks/BlockMaterialSelectionGui.java 174 util/format/ChunkUtils.java 173 listener/MineEditGuiListener.java 170 core/mine/Mine.java 165 command/admin/RegionCommands.java 164 data/config/ConfigLoader.java 163 integration/worldguard/WorldGuardRegionService.java 161 data/config/MineConfig.java 161 command/admin/AdminCommands.java 160 util/block/BlockUpdateUtil.java 156 data/config/reset/ResetConfig.java 155 data/reward/RewardParser.java 155 command/admin/TeleportCommands.java 154 integration/worldguard/WorldGuardConfig.java 153 core/mine/Mines.java 151 gui/mine/edit/blocks/BlocksGui.java TEST (нуждаются в сплите): 264 core/MinesTest.java 262 data/StatsManagerTest.java 223 util/selection/SelectionTest.java 210 data/LeaderboardTest.java 191 data/config/MineConfigTest.java 181 util/LocationParserTest.java 178 util/TimeFormatterTest.java 169 data/config/reset/ResetConfigTest.java 159 data/LeaderboardCacheIntegrationTest.java 158 util/ChunkUtilsTest.java 152 command/AdminCommandsTest.java ``` ### Папки с >3 файлами (нужны подпапки) ``` 8 command/admin/ → manage/, region/, stats/, teleport/, misc/ 6 listener/ → block/, gui/, player/ 5 handler/ → reset/, block/, reward/, ui/ 5 gui/mine/holder/ → edit/, main/ (перегруппировать) 5 data/reward/ → model/, parser/ 4 util/location/ → оставить (package-info не считается) 4 util/ (root) → split ErrorHandler, MessageFormatter, ValidationUtils 4 integration/worldguard/ → config/, service/ 4 data/stats/ → model/, service/, query/ 4 core/mine/ → model/, registry/, loader/, tick/ ``` --- ## 🎯 Фазы работ ### Phase 1: Настройка Checkstyle - [ ] Создать `config/checkstyle/checkstyle.xml` с правилами: - Max line length: 150 - Max file length: 150 строк - Max method length: 30 строк - No unused imports - No wildcard imports - Indentation: 4 spaces - Javadoc style enforced - [ ] Добавить плагин checkstyle в `build.gradle.kts` - [ ] Проверить, что билд не падает (пока warnings mode) ### Phase 2: Split файлов >150 строк (main) #### 2.1 handler/MineResetHandler.java (209→~110+~90) - [ ] Выделить `PlayerTeleportHandler.java` — логика телепортации stuck players - [ ] В `MineResetHandler` остаётся: reset, resetAllRegions, onResetComplete, executeResetCommands, broadcastReset #### 2.2 util/format/ColorUtils.java (207→~70+~90+~40) - [ ] Выделить `LegacyColorConverter.java` — legacy &a → MiniMessage - [ ] Выделить `HexColorConverter.java` — &#RRGGBB → <#RRGGBB>, &x→MiniMessage - [ ] В `ColorUtils` остаётся: format(), stripColors(), toLegacy() как фасад #### 2.3 command/common/LoMinesTabCompleter.java (207→~60+~70+~70) - [ ] Выделить `SubcommandCompleter.java` — completeSecondArg, completeThirdArg - [ ] Выделить `PermissionPredicate.java` — hasPermission для всех команд - [ ] В `LoMinesTabCompleter` остаётся: onTabComplete, isLoMinesCommand, completeSubcommands, filterStartsWith, хелперы #### 2.4 integration/hologram/HologramManager.java (203→~100+~100) - [ ] Выделить `HologramRenderer.java` — рендеринг строк голограммы - [ ] В `HologramManager` остаётся: create/update/delete/toggle, управление жизненным циклом #### 2.5 core/service/MineFileManager.java (201→~100+~100) - [ ] Выделить `MineConfigWriter.java` — создание/сохранение mine.yml - [ ] В `MineFileManager` остаётся: загрузка, поиск, листинг файлов #### 2.6 gui/mine/main/MineEditItems.java (190→~95+~95) - [ ] Выделить `MineEditItemActions.java` — обработчики кликов для каждого слота - [ ] В `MineEditItems` остаётся: создание ItemStack, статические методы #### 2.7 command/admin/StatsCommands.java (186→~90+~90) - [ ] Выделить `LeaderboardRenderer.java` — форматирование и отправка топ-списка - [ ] В `StatsCommands` остаётся: парсинг аргументов, делегирование #### 2.8 util/location/Cuboid.java (181→~90+~90) - [ ] Выделить `CuboidSerializer.java` — сериализация/десериализация Cuboid - [ ] В `Cuboid` остаётся: contains, volume, пересечения, геометрия #### 2.9 data/stats/StatsManager.java (181→~90+~90) - [ ] Выделить `StatsPersistence.java` — load/save данных из файлов - [ ] В `StatsManager` остаётся: getOrCreate, increment, кэш в ConcurrentHashMap #### 2.10 gui/mine/edit/blocks/BlockMaterialSelectionGui.java (180→~90+~90) - [ ] Выделить `BlockMaterialSelector.java` — логика выбора материала - [ ] В `BlockMaterialSelectionGui` остаётся: рендеринг GUI #### 2.11 util/format/ChunkUtils.java (174→~85+~85) - [ ] Выделить `ChunkRefresher.java` — рефреш чанков - [ ] В `ChunkUtils` остаётся: определение Paper, базовые операции #### 2.12 listener/MineEditGuiListener.java (173→~85+~85) - [ ] Выделить `GuiActionHandler.java` — обработка действий в GUI - [ ] В `MineEditGuiListener` остаётся: маршрутизация событий #### 2.13 core/mine/Mine.java (170→~85+~85) - [ ] Выделить `MineState.java` — управление состоянием (блоки, тики, paused) - [ ] В `Mine` остаётся: основные методы, делегирование #### 2.14 command/admin/RegionCommands.java (165→~80+~80) - [ ] Выделить `RegionActionHandler.java` — add/remove region - [ ] В `RegionCommands` остаётся: список, инфо, парсинг #### 2.15 data/config/ConfigLoader.java (164→~80+~80) - [ ] Выделить `DefaultsMerger.java` — YAML inheritance из defaults.yml - [ ] В `ConfigLoader` остаётся: загрузка mine.yml, вызов лоадеров #### 2.16 integration/worldguard/WorldGuardRegionService.java (163→~80+~80) - [ ] Выделить `RegionTemplateRenderer.java` — рендеринг шаблонов имён - [ ] В `WorldGuardRegionService` остаётся: create/update/delete #### 2.17 data/config/MineConfig.java (161→~80+~80) - [ ] Выделить `MineConfigDefaults.java` — статические фабрики и Builder по умолчанию - [ ] В `MineConfig` остаётся: record + базовый builder #### 2.18 command/admin/AdminCommands.java (161→~80+~80) - [ ] Выделить `MineActionHandler.java` — create, delete, reset, reload - [ ] В `AdminCommands` остаётся: list, edit, парсинг #### 2.19 util/block/BlockUpdateUtil.java (160→~80+~80) - [ ] Выделить `SafeTeleportFinder.java` — findSafeTeleportLocation - [ ] В `BlockUpdateUtil` остаётся: sendBlockUpdate, sendRegionUpdate, refreshChunks #### 2.20 data/config/reset/ResetConfig.java (156→~80+~75) - [ ] Выделить `ResetConfigValidator.java` — валидация Duration, bounds - [ ] В `ResetConfig` остаётся: record + builder #### 2.21 data/reward/RewardParser.java (155→~75+~80) - [ ] Выделить `RewardEntryParser.java` — парсинг одной записи награды - [ ] В `RewardParser` остаётся: парсинг всего списка #### 2.22 command/admin/TeleportCommands.java (155→~75+~80) - [ ] Выделить `TeleportActionHandler.java` — setteleport, setspawn, clearspawn - [ ] В `TeleportCommands` остаётся: парсинг команд #### 2.23 integration/worldguard/WorldGuardConfig.java (154→~75+~75) - [ ] Выделить `RegionTemplateConfig.java` — шаблоны имён - [ ] В `WorldGuardConfig` остаётся: record, flags, members #### 2.24 core/mine/Mines.java (153→~75+~75) - [ ] Выделить `MineFinder.java` — find, findByRegion, getAll - [ ] В `Mines` остаётся: create, delete, reloadMine, updateMineConfig #### 2.25 gui/mine/edit/blocks/BlocksGui.java (151→~75+~75) - [ ] Выделить `BlockWeightEditor.java` — изменение весов блоков - [ ] В `BlocksGui` остаётся: список блоков, рендеринг ### Phase 3: Разбивка папок (max 3 файла) #### 3.1 command/admin (8 файлов) → 5 подпапок - [ ] `command/admin/manage/` — AdminCommands.java, InfoCommand.java, CopyCommand.java - [ ] `command/admin/region/` — RegionCommands.java - [ ] `command/admin/stats/` — StatsCommands.java - [ ] `command/admin/teleport/` — TeleportCommands.java - [ ] `command/admin/misc/` — MaskCommands.java, HologramCommands.java #### 3.2 listener (6 файлов) → 3 подпапки - [ ] `listener/block/` — BlockBreakListener.java - [ ] `listener/gui/` — MineEditGuiListener.java, GroupGuiListener.java - [ ] `listener/player/` — PlayerJoinListener.java, PlayerInteractListener.java #### 3.3 handler (5 файлов) → 4 подпапки - [ ] `handler/reset/` — MineResetHandler.java (+ PlayerTeleportHandler из Phase 2) - [ ] `handler/block/` — MineBlockHandler.java - [ ] `handler/reward/` — MineRewardHandler.java - [ ] `handler/ui/` — ActionBarHandler.java #### 3.4 gui/mine/holder (5 файлов) → 2 подпапки - [ ] `gui/mine/holder/main/` — MineEditGuiHolder.java - [ ] `gui/mine/holder/edit/` — BlocksGuiHolder.java, ResetGuiHolder.java, RewardsGuiHolder.java, BlockMaterialSelectionGuiHolder.java #### 3.5 data/reward (5 файлов) → 2 подпапки - [ ] `data/reward/model/` — Reward.java - [ ] `data/reward/parser/` — RewardParser.java, RewardItemParser.java, RewardCommandParser.java, RewardMaterialParser.java #### 3.6 util/location (4 файла) — оставить (с учётом package-info) - [ ] Убедиться что лимит соблюдён: BlockKeys.java, Cuboid.java, LocationParser.java, SafeTeleportUtil.java - [ ] Вынести package-info.java если мешает #### 3.7 util (root, 4 файла) — оставить - [ ] ErrorHandler.java, MessageFormatter.java, ValidationUtils.java, package-info.java — ровно 3+package-info #### 3.8 integration/worldguard (4 файла) → 2 подпапки - [ ] `integration/worldguard/config/` — WorldGuardConfig.java - [ ] `integration/worldguard/service/` — WorldGuardRegionService.java, WorldGuardFlagParser.java, WorldGuardMemberHandler.java #### 3.9 data/stats (4 файла) → 2 подпапки - [ ] `data/stats/model/` — PlayerStats.java, LeaderboardEntry.java - [ ] `data/stats/service/` — StatsManager.java, Leaderboard.java #### 3.10 core/mine (4 файла) → 3 подпапки - [ ] `core/mine/model/` — Mine.java - [ ] `core/mine/registry/` — Mines.java - [ ] `core/mine/service/` — MineLoader.java, MineTicker.java ### Phase 4: Split тестов >150 строк #### 4.1 core/MinesTest.java (264→~130+~130) - [ ] Сплитнуть на `MinesRegistryTest.java`, `MinesLifecycleTest.java` #### 4.2 data/StatsManagerTest.java (262→~130+~130) - [ ] Сплитнуть на `StatsManagerStorageTest.java`, `StatsManagerConcurrencyTest.java` #### 4.3 util/selection/SelectionTest.java (223→~110+~110) - [ ] Сплитнуть на `SelectionStateTest.java`, `SelectionBoundsTest.java` #### 4.4 data/LeaderboardTest.java (210→~105+~105) - [ ] Сплитнуть на `LeaderboardSortingTest.java`, `LeaderboardQueryTest.java` #### 4.5 data/config/MineConfigTest.java (191→~95+~95) - [ ] Сплитнуть на `MineConfigBuilderTest.java`, `MineConfigValidationTest.java` #### 4.6 util/LocationParserTest.java (181→~90+~90) - [ ] Сплитнуть на `LocationParserValidTest.java`, `LocationParserErrorTest.java` #### 4.7 util/TimeFormatterTest.java (178→~90+~90) - [ ] Сплитнуть по форматам: `TimeFormatterBasicTest.java`, `TimeFormatterEdgeTest.java` #### 4.8 data/config/reset/ResetConfigTest.java (169→~85+~85) - [ ] Сплитнуть на `ResetConfigIntervalTest.java`, `ResetConfigValidationTest.java` #### 4.9 data/LeaderboardCacheIntegrationTest.java (159→~80+~80) - [ ] Сплитнуть на `LeaderboardCacheTest.java`, `LeaderboardIntegrationTest.java` #### 4.10 util/ChunkUtilsTest.java (158→~80+~80) - [ ] Сплитнуть на `ChunkUtilsPaperTest.java`, `ChunkUtilsRefreshTest.java` #### 4.11 command/AdminCommandsTest.java (152→~75+~75) - [ ] Сплитнуть на `AdminCreateDeleteTest.java`, `AdminResetReloadTest.java` ### Phase 5: Обновление импортов - [ ] Обновить все import statements в затронутых файлах - [ ] Обновить RegistrationManager.java — новые пути классов - [ ] Обновить ComponentInitializer.java — новые пути - [ ] Проверить сборку: `./gradlew build` ### Phase 6: Проверка качества - [ ] Запустить `./gradlew check` — убедиться что checkstyle не падает - [ ] Запустить `./gradlew test` — все тесты проходят - [ ] Проверить lint — отсутствие ошибок - [ ] Финальный обзор структуры папок --- ## 📁 Целевая структура проекта ``` dev.loki.lomines/ ├── LoMinesPlugin.java # ≤120 ├── ComponentInitializer.java # ≤150 ├── RegistrationManager.java # ≤150 │ ├── command/ │ ├── common/ │ │ ├── LoMinesTabCompleter.java # ≤150 (split from 207) │ │ ├── SubcommandCompleter.java # NEW │ │ └── PermissionPredicate.java # NEW │ ├── player/ │ │ └── PlayerCommands.java │ └── admin/ │ ├── manage/ │ │ ├── AdminCommands.java # ≤150 (split from 161) │ │ ├── InfoCommand.java │ │ └── CopyCommand.java │ ├── region/ │ │ └── RegionCommands.java # ≤150 (split from 165) │ ├── stats/ │ │ ├── StatsCommands.java # ≤150 (split from 186) │ │ └── LeaderboardRenderer.java # NEW │ ├── teleport/ │ │ ├── TeleportCommands.java # ≤150 (split from 155) │ │ └── TeleportActionHandler.java # NEW │ └── misc/ │ ├── MaskCommands.java │ └── HologramCommands.java │ ├── core/ │ ├── mine/ │ │ ├── model/ │ │ │ ├── Mine.java # ≤150 (split from 170) │ │ │ └── MineState.java # NEW │ │ ├── registry/ │ │ │ ├── Mines.java # ≤150 (split from 153) │ │ │ └── MineFinder.java # NEW │ │ └── service/ │ │ ├── MineLoader.java │ │ └── MineTicker.java │ └── service/ │ ├── MineFileManager.java # ≤150 (split from 201) │ ├── MineConfigWriter.java # NEW │ ├── MineRepository.java │ └── MaskScanService.java │ ├── data/ │ ├── config/ │ │ ├── MineConfig.java # ≤150 (split from 161) │ │ ├── MineConfigDefaults.java # NEW │ │ ├── ConfigLoader.java # ≤150 (split from 164) │ │ ├── DefaultsMerger.java # NEW │ │ ├── block/ │ │ │ ├── BlockKey.java │ │ │ ├── BlockConfig.java │ │ │ └── FillMode.java │ │ ├── region/ │ │ │ └── RegionConfig.java │ │ ├── reset/ │ │ │ ├── ResetConfig.java # ≤150 (split from 156) │ │ │ └── ResetConfigValidator.java # NEW │ │ ├── reward/ │ │ │ └── RewardConfig.java │ │ ├── teleport/ │ │ │ └── TeleportConfig.java │ │ ├── spawn/ │ │ │ └── PlayerSpawnConfig.java │ │ ├── ui/ │ │ │ ├── UIConfig.java │ │ │ └── HologramConfig.java │ │ ├── parser/ │ │ │ └── ConfigParseException.java │ │ └── loader/ │ │ ├── block/BlockConfigLoader.java │ │ ├── entity/ │ │ │ ├── TeleportConfigLoader.java │ │ │ └── PlayerSpawnConfigLoader.java │ │ ├── region/ │ │ │ ├── RegionConfigLoader.java │ │ │ └── WorldGuardConfigLoader.java │ │ ├── reward/RewardConfigLoader.java │ │ └── system/ │ │ ├── ResetConfigLoader.java │ │ └── UIConfigLoader.java │ ├── stats/ │ │ ├── model/ │ │ │ ├── PlayerStats.java │ │ │ └── LeaderboardEntry.java │ │ └── service/ │ │ ├── StatsManager.java # ≤150 (split from 181) │ │ ├── StatsPersistence.java # NEW │ │ └── Leaderboard.java │ └── reward/ │ ├── model/ │ │ └── Reward.java │ └── parser/ │ ├── RewardParser.java # ≤150 (split from 155) │ ├── RewardEntryParser.java # NEW │ ├── RewardItemParser.java │ ├── RewardCommandParser.java │ └── RewardMaterialParser.java │ ├── block/ │ ├── BlockSetter.java │ ├── BukkitBlockSetter.java │ ├── OraxenBlockSetter.java.disabled │ └── ItemsAdderBlockSetter.java.disabled │ ├── handler/ │ ├── reset/ │ │ ├── MineResetHandler.java # ≤150 (split from 209) │ │ └── PlayerTeleportHandler.java # NEW │ ├── block/ │ │ └── MineBlockHandler.java │ ├── reward/ │ │ └── MineRewardHandler.java │ └── ui/ │ └── ActionBarHandler.java │ ├── listener/ │ ├── block/ │ │ └── BlockBreakListener.java │ ├── gui/ │ │ ├── MineEditGuiListener.java # ≤150 (split from 173) │ │ ├── GuiActionHandler.java # NEW │ │ └── GroupGuiListener.java │ └── player/ │ ├── PlayerJoinListener.java │ └── PlayerInteractListener.java │ ├── gui/ │ ├── common/ │ │ └── ItemStackFactory.java │ ├── confirm/ │ │ ├── ConfirmDeleteGui.java │ │ └── ConfirmDeleteGuiHolder.java │ ├── group/ │ │ ├── GroupCreateGui.java │ │ ├── GroupCreateGuiHolder.java │ │ └── GroupCreateItems.java │ └── mine/ │ ├── main/ │ │ ├── MineEditGui.java │ │ ├── MineEditItems.java # ≤150 (split from 190) │ │ └── MineEditItemActions.java # NEW │ ├── edit/ │ │ ├── blocks/ │ │ │ ├── BlocksGui.java # ≤150 (split from 151) │ │ │ ├── BlockWeightEditor.java # NEW │ │ │ ├── BlocksGuiItems.java │ │ │ ├── BlockMaterialSelectionGui.java # ≤150 (split from 180) │ │ │ └── BlockMaterialSelector.java # NEW │ │ ├── reset/ │ │ │ ├── ResetGui.java │ │ │ └── ResetGuiItems.java │ │ └── rewards/ │ │ └── RewardsGui.java │ └── holder/ │ ├── main/ │ │ └── MineEditGuiHolder.java │ └── edit/ │ ├── BlocksGuiHolder.java │ ├── ResetGuiHolder.java │ ├── RewardsGuiHolder.java │ └── BlockMaterialSelectionGuiHolder.java │ ├── integration/ │ ├── IntegrationManager.java │ ├── placeholder/ │ │ └── LoMinesPlaceholderExpansion.java │ ├── worldguard/ │ │ ├── config/ │ │ │ ├── WorldGuardConfig.java # ≤150 (split from 154) │ │ │ └── RegionTemplateConfig.java # NEW │ │ └── service/ │ │ ├── WorldGuardRegionService.java # ≤150 (split from 163) │ │ ├── RegionTemplateRenderer.java # NEW │ │ ├── WorldGuardFlagParser.java │ │ └── WorldGuardMemberHandler.java │ └── hologram/ │ ├── HologramManager.java # ≤150 (split from 203) │ ├── HologramRenderer.java # NEW │ ├── HologramProvider.java │ └── provider/ │ ├── HolographicDisplaysProvider.java │ └── DecentHologramsProvider.java │ ├── wand/ │ ├── WandParticleService.java │ ├── ParticleUtil.java │ └── group/ │ ├── GroupWandItem.java │ ├── GroupWandManager.java │ └── GroupWandSession.java │ └── util/ ├── package-info.java ├── ValidationUtils.java ├── ErrorHandler.java ├── MessageFormatter.java ├── block/ │ ├── BlockUpdateUtil.java # ≤150 (split from 160) │ └── SafeTeleportFinder.java # NEW ├── format/ │ ├── ColorUtils.java # ≤150 (split from 207) — фасад │ ├── LegacyColorConverter.java # NEW │ ├── HexColorConverter.java # NEW │ ├── ChunkUtils.java # ≤150 (split from 174) │ ├── ChunkRefresher.java # NEW │ └── TimeFormatter.java ├── location/ │ ├── BlockKeys.java │ ├── Cuboid.java # ≤150 (split from 181) │ ├── CuboidSerializer.java # NEW │ ├── LocationParser.java │ └── SafeTeleportUtil.java └── selection/ ├── MaskScanner.java ├── Selection.java └── SelectionManager.java ``` --- ## 📐 Правила (новые лимиты) | Метрика | Лимит | |---------|-------| | **Файл** | ≤150 строк | | **Папка** | ≤3 файла (package-info не считается) | | **Метод** | ≤30 строк | | **Вложенность** | ≤3 уровня | | **Импорты** | No wildcard, no unused | | **Отступы** | 4 пробела | | **Javadoc** | Обязателен для public API | --- ## 🔧 Checkstyle Будет добавлен `config/checkstyle/checkstyle.xml` с правилами: - `FileLength` — max 150 строк - `MethodLength` — max 30 строк - `LineLength` — max 150 символов - `AvoidStarImport` — запрет * - `UnusedImports` — проверка - `Indentation` — 4 spaces - `JavadocType`, `JavadocMethod` — для public - `HideUtilityClassConstructor` — утилиты с private constructor - `OneTopLevelClass` — один класс на файл Плагин в Gradle: `id("checkstyle") version "latest"` (built-in) --- ## 📊 Метрики после реструктуризации | Метрика | Сейчас | Цель | Статус | |---------|--------|------|--------| | Файлов >150 строк | **0** | 0 | ✅ | | Папок >3 файлов | **0** | 0 | ✅ | | Всего файлов | **145 main + 31 test** | ~160 main | ✅ | | Средняя длина файла | **~75** | ~75 | ✅ | | Checkstyle | **✅ Есть** | ✅ | ✅ | --- ## ✅ Реструктуризация завершена (2026-07-06) ### Phase 1: Checkstyle - `config/checkstyle/checkstyle.xml` — Google-based: 4 пробела, 150 строк/файл, 30 строк/метод, 150 символов/строка - `build.gradle.kts` — `checkstyle` плагин + `toolVersion = "13.7.0"` ### Phase 2: Split main файлов >150 строк - Создано **18 новых классов**, 0 переполненных файлов осталось ### Phase 3: Разбивка папок (≤3 файла) - 13 переполненных папок → подпапки - Все package declarations и импорты обновлены ### Phase 4: Split тестов >150 строк - 11 тестов → 25 файлов, все ≤150 строк ### Phase 5: Импорты - RegistrationManager, ComponentInitializer обновлены ### Phase 6: Финальная проверка - **0 файлов >150 строк** - **0 папок >3 файлов** - **145 main + 31 test = 176 файлов** --- ## ✅ Постреструктуризационные задачи завершены (2026-08-12) ### Docs - `ARCHITECTURE.md` полностью переписан под реальный код: `dev.loki.lomines`, `extends JavaPlugin`, без lolib/LoAPI (ранее описывал Kotlin-версию) - Удалён устаревший `core/common/package-info.java` (ссылался на `LoPlugin`, `Mines`/`Mine` в `core.common`) — пакет был пустым ### Checkstyle - `BeforeExecutionExclusionFileFilter` (исключавший `src/test`) убран — тесты теперь проверяются - `MethodLength` 80 → 30 - Исправлены нарушения: 23 в main (выделение private-методов) + 60 в test (unused imports, camelCase для тестов) ### Тесты: MockBukkit - Подключён `org.mockbukkit.mockbukkit:mockbukkit-v1.21:4.110.0` (testImplementation) - `testImplementation` paper-api приведён к `1.21.11-R0.1-SNAPSHOT` (требование MockBukkit), `compileOnly` остаётся `1.21.4` - Включены все 48 ранее отключённых тестов: `BlockKeyTest`, `BlockConfigTest`, `MineTest`, `MineConfigTest`, `MineConfigValidationTest`, `MinesTest`, `MinesLoadingTest`, `MinesLifecycleTest` - **Итог: 184 теста, 0 skipped, 0 failures** ### Багфикс - `Mines.create("TestMine")` сохранял `testmine.yml` (record нормализует имя в lowercase), но загружал `TestMine.yml` → `IOException`. Исправлено нормализацией имени в `Mines.create` (`name.toLowerCase().trim()`) ### Cleanup - Удалены `bin/` (Eclipse output, был gitignored) и `libs/` (содержал только `.gitkeep`)