Port the DemocracyCraft NexoUtilities plugin's ChestShop integration (its ChestShopItemListener + ItemManager + AliasManager) directly into the ChestShop fork, so ChestShop handles Nexo/ItemsAdder custom items natively without a separate companion plugin.
The old code hooked upstream ChestShop's ItemParseEvent / ItemStringQueryEvent event bus, which PAR-282 removed. Re-implemented against the fork's ItemService resolution seam, mirroring the existing ItemBridge static-facade pattern:
plugins/Nexo.java — static facade with parseItem(String) (sign string → Nexo ItemStack) and queryString(ItemStack, int) (Nexo item → sign string), plus the ported item logic (Nexo id via nexo:id PDC / ItemsAdder namespace, NexoItems.itemFromId, item cleaning for stable NBT, dye tags Item#red/Item#hex-RRGGBB, autographed-item passthrough, per-variant metadata codes round-tripped through the fork's ItemCodeService). Aliases + display/input prefs load from a generated nexo.yml. com.nexomc.nexo classes stay off the call path until the plugin is hooked.ItemService: nexoEnabled flag + enableNexo(); Nexo added as the first resolver in parse/queryString; reloadAliases() reloads nexo.yml.Dependencies: Nexo softdepend hook (enum + loadPlugin case) calling items.enableNexo().plugin.yml: Nexo softdepend. build.gradle.kts: com.nexomc:nexo:1.15.0 compileOnly (non-transitive) + repo.nexomc.com/releases.Verified: :chestshop:build green, Nexo not shaded, server enables cleanly with Nexo absent (no NoClassDefFound — off-path design holds), full ChestShop integration suite green (no item-resolution regression). Runtime resolution of real Nexo items needs a live server with Nexo + defined items to validate.