Releases: Drownek/plugwright
Release list
v2.0.2
Summary
This is the rename release: the project moves from Paperwright to Plugwright. Everything that was named after the old project — the npm package, Gradle plugin ID, tasks, Kotlin package, and settings — has been renamed in a coordinated bump. Alongside the rebranding, this major release includes a new task to run the test server interactively, fixes for newer Minecraft versions, and significant CI/CD improvements with NPM provenance support.
Important
Breaking change. Existing users must update their package.json, build.gradle.kts, GitHub Actions CI, and any imports/task invocations. See Migration below.
Changes
Rename (Breaking)
- NPM package renamed:
@drownek/paperwright→@drownek/plugwright. - Gradle plugin ID renamed:
io.github.drownek.paperwright→io.github.drownek.plugwright. - Gradle tasks renamed:
paperwrightClean/paperwrightTest/paperwrightInit→plugwrightClean/plugwrightTest/plugwrightInit. - Kotlin package and classes renamed:
me.drownek.paperwright.PaperwrightPlugin→me.drownek.plugwright.PlugwrightPlugin(along withExtension,TestTask, etc.). - Environment Variables:
PAPERWRIGHT_DEBUGis nowPLUGWRIGHT_DEBUG.
Features
- New Task: Added the
plugwrightRunServerGradle task. This allows you to easily spin up the test server (with plugins and environment prepared) without running the automated test suite, which is extremely useful for manual debugging and GUI testing.
Bug Fixes
- Mineflayer & Formatting: Fixed text component parsing for newer Minecraft versions by updating the underlying
mineflayerdependency. - Server Downloads: Updated the Paper API integration to correctly allow downloading newer server versions.
- Test Stability: Fixed an issue where some test cases would fail on very slow machines.
Tooling & CI
- NPM Provenance: Moved to NPM trusted publishing. The packages are now signed with provenance using stable NPM versions.
- Release Automation: Improved the
bump-version.jsscript to target explicit tags, preventing push rejections, and optimized the release workflow.
Migration
In your plugin project:
build.gradle.kts
- id("io.github.drownek.paperwright") version "1.3.3"
+ id("io.github.drownek.plugwright") version "2.0.2"
- paperwright { ... }
+ plugwright { ... }Gradle task invocations
- ./gradlew paperwrightTest
- ./gradlew paperwrightInit
- ./gradlew paperwrightClean
+ ./gradlew plugwrightTest
+ ./gradlew plugwrightInit
+ ./gradlew plugwrightCleanpackage.json
- "@drownek/paperwright": "^1.3.3"
+ "@drownek/plugwright": "^2.0.2"Test Imports
- import { test, expect } from '@drownek/paperwright';
+ import { test, expect } from '@drownek/plugwright';GitHub Actions CI
- uses: drownek/paperwright-action@v1
+ uses: drownek/plugwright-action@v1Full changelog
v1.3.3
Summary
This release includes important fixes to support newer server versions, major CI/CD workflow updates, documentation improvements, and various runner cleanups.
Changes
Runner
- Fixed text component parsing for newer server versions and updated
mineflayer. - Gated verbose DEBUG logs behind the
PAPERWRIGHT_DEBUGenvironment variable. - Replaced unicode symbols with reliable ANSI fallbacks for better terminal compatibility.
- Cleaned up unused banner methods and dropped the unused
paperwrightbin entry. - Fixed casing in
package.json.
Gradle Plugin
- Updated the Paper API to allow downloading newer server versions.
- Included
rimrafin the scaffold generated by thepaperwrightInittask.
CI/CD
- Added a complete release workflow and migrated to npm trusted publishing.
- Updated workflows to use the official Paperwright action and added working directory support.
- Bumped the Node version and ensured
gradlewis explicitly made executable.
Documentation
- Added a showcase section and CI usage guide to the README.
- Reformatted tables, added a CI badge, and fixed the broken npm version badge.
Example Plugin & Tests
- Simplified the example plugin to be more descriptive.
- Cleaned up test files by adding missing
awaits and removing unused method parameters.
Full changelog
v1.3.2
Summary
This is the rename release: the project moves from paper-e2e-test to Paperwright. Everything that was named after the old project — npm package, Gradle plugin id, tasks, Kotlin package, CLI binary — has been renamed in a coordinated bump. Also includes documentation cleanup and improvements to the version-bump tooling.
Important
Breaking change. Existing users must update their package.json, build.gradle.kts, and any imports/task invocations. See Migration below.
Changes
Rename (Breaking)
- npm package renamed:
@drownek/paper-e2e-runner→@drownek/paperwright. - Gradle plugin id renamed:
io.github.drownek.paper-e2e-test→io.github.drownek.paperwright. - Gradle tasks renamed:
paperE2EClean/paperE2ETest/paperE2EInit→paperwrightClean/paperwrightTest/paperwrightInit. - Kotlin package and classes renamed:
me.drownek.papere2e.PaperE2EPlugin→me.drownek.paperwright.PaperwrightPlugin(and the matchingExtension/TestTask/Banner). - Runner env vars / banner / settings file paths updated to the new name.
Documentation
- Fixed broken anchors, ordering, and stale links in the README.
- Removed the hardcoded version number from
Configuration.mdso it no longer drifts on each release. - Simplified examples by dropping unnecessary
awaits.
Tooling
scripts/bump-version.jsnow also rewrites version references inside thedocs/tree, so a single bump propagates everywhere.bump-versionis now interactive: prompts for the target version (pre-filled fromversion.txt), asks whether to create an annotated tag (defaults Y for stable / N for prerelease), and prompts whether to push after committing/tagging.- Version files are now committed directly via
git commit --rather thangit addof the whole tree.
Migration
In your plugin project:
build.gradle.kts
- id("io.github.drownek.paper-e2e-test") version "1.3.1"
+ id("io.github.drownek.paperwright") version "1.3.2"
- paperE2ETest { ... }
+ paperwright { ... }Gradle task invocations
- ./gradlew paperE2ETest
- ./gradlew paperE2EInit
- ./gradlew paperE2EClean
+ ./gradlew paperwrightTest
+ ./gradlew paperwrightInit
+ ./gradlew paperwrightCleansrc/test/e2e/package.json
- "@drownek/paper-e2e-runner": "^1.3.1"
+ "@drownek/paperwright": "^1.3.2"Run ./gradlew paperwrightInit against a fresh project to see the new defaults, or just diff your package.json against the template emitted there.
Full changelog
v1.3.1
Summary
This release includes documentation improvements, CI updates, and important bug fixes for the runner and API.
Changes
Gradle Plugin
- Introduced
paperE2EInittask to automate the setup of the end-to-end testing environment.
Documentation
- Migrated the entire documentation set into the repository under the
docs/directory - Added dedicated
_Sidebarand_Footerfor the documentation system. - Updated README with a streamlined Quick Start guide and prerequisites.
CI/CD
- Added a new GitHub Action (
wiki-sync.yml) to automatically keep the GitHub Wiki in sync with the repository'sdocs/folder. - Updated
ci.ymlto ensure builds run correctly on themasterbranch and added necessary write permissions for automation.
Runner
- Updated internal runner versions and dependencies to match the v1.3.1 release.
Paper E2E v1.3.0
Features
- Bot Lifecycle & Reconnection: Enhanced bot connection management and lifecycle handling.
PlayerWrappernow dynamically uses getters forinventoryandusernameto ensure accurate values even after reconnects. - New Assertions: Added
rejects.toThrowfor asserting promise rejections in tests, and added asinceoption to thetoHaveReceivedMessagematcher to tightly scope chat buffer assertions. - Stability Utilities: Added a new
waitForStableutility for asserting that a condition remains continuously true over a given duration. - Movement Threshold Adjustments: The Gradle plugin now automatically configures
spigot.ymlto increase movement thresholds (moved-wrongly-thresholdandmoved-too-quickly-multiplier), preventing the server from kicking teleporting test bots. - Server Log Validation: Added server log validation capabilities and refactored command execution buffering.
- Runner Banner: Added a styled execution banner displaying the current framework version during test runs.
Bug Fixes
- Test Leakage (Zombie Tests): Introduced an
AbortControllerand passedAbortSignalthrough theTestContextdown to all polling utilities. This instantly terminates background execution when a test times out, permanently fixing cross-test contamination. - Server Process Cleanup: Fixed zombie Java processes. The entire Paper server process tree is now forcefully and reliably killed when a Gradle task is abruptly terminated or cancelled from an IDE.
- Disconnect Hangs & Event Wiping: Eliminated 2-second teardown hangs by checking if bots are already disconnected, and removed destructive
bot.removeAllListeners()calls that broke Mineflayer's internal packet handlers during teardown. - Bot Naming: Fixed a race condition where
undefinedcould occasionally appear as a bot's username before the server handshake completed. - CI Pipeline: Fixed the CI workflow by ensuring the
runner-packageis properly built before E2E tests are executed.
Refactoring & Chore
- API Simplification: Simplified the internal test runner API and removed unused legacy code.
- Build & Typing: Added
rimraffor clean builds and introduced atypecheckscript for strict static type validation without emitting files. - GitHub Actions: Added comprehensive E2E testing workflows using GitHub Actions and updated CI environments to use Node.js 22.
- Documentation: Simplified README setup instructions to directly link to the Wiki.
- Wiki: Updated the Wiki (
Configuration.md,Getting-Started.md,GUI-Testing.md,TypeScript-Support.md) with the1.3.0version bumps and modern API usage.
Paper E2E v1.2.0
This release focuses on runner reliability, environment validation improvements, and Gradle plugin enhancements.
Bug Fixes
- Runner stability: Added a server process check before sending the stop command, preventing errors when the process is already gone
- Environment validation:
JAVA_PATHis now validated alongsideSERVER_JARandSERVER_DIRduring startup checks, catching misconfigurations early - Error output capture: Added a
stderrhandler to the server process so error output is now captured and logged instead of silently dropped - Safe shutdown: Removed a redundant
process.exit(1)call and corrected the exit code used in the safety-net shutdown path - Bot version: The Mineflayer bot now reads the Minecraft version from
MC_VERSIONenvironment variable instead of the hardcoded'1.19.4' - GuiItemLocator: Fixed internal calls to deprecated
GuiWrappermethods
Features
- Plugin download support: Gradle plugin E2E tasks (
TestE2ETask) can now download plugins as part of the task setup - MC_VERSION env var:
MC_VERSIONis now passed through as an environment variable inTestE2ETask, enabling version-aware test runs
Refactoring
- Replaced
waitAbitwithpollForAbsencefor error validation in the runner, making error-state detection more reliable and deterministic - Renamed test file extensions for consistency across the project
Chore
- Added a version bump script and aligned project versioning
Paper E2E v1.1.0
This release introduces a new reactive architecture for GUI testing, significantly improving stability when testing asynchronous inventory updates. It also adds a suite of player management utilities and improved assertion logic.
Highlights
Reactive GUI API
The framework has transitioned from a snapshot-based model to a live handle model. Previous versions relied on GuiWrapper, which captured the inventory state at a single moment in time. Version 1.1.0 introduces LiveGuiHandle and GuiItemLocator.
- Live Handles: The new
player.gui({ title })method returns a handle that maintains a reference to the currently open container. It remains valid even as items within the inventory change. - Locators: Items are now defined by query logic rather than direct reference. Locators allow tests to define an item (e.g., by name or lore) and interact with it regardless of when it appears in the inventory.
- Automatic Retries: Interactions such as
.click()and assertions now automatically wait and retry until the condition is met or a timeout is reached. This eliminates flaky tests caused by server-tick delays.
Player Lifecycle Utilities
Common administrative tasks have been standardized into the PlayerWrapper class to reduce boilerplate code in test setups:
player.makeOp()/player.deOp()player.setGameMode(mode)player.teleport(x, y, z)player.giveItem(item, count)
Changes
New API Usage
The following example demonstrates the new locator pattern compared to the legacy approach.
// New Pattern
test('admin can toggle settings', async ({ player }) => {
await player.chat('/admin menu');
// 1. Get a live handle (does not resolve items immediately)
const menu = await player.gui({ title: /Settings/ });
// 2. Define a locator
const toggleBtn = menu.locator(item => item.name === 'lever');
// 3. Assertions automatically wait for the item to appear and match the state
await expect(toggleBtn).toHaveLore('Status: OFF');
// 4. Click automatically waits for the item to be clickable
await toggleBtn.click();
// 5. Re-use the same locator to verify the state change
await expect(toggleBtn).toHaveLore('Status: ON');
});Deprecations
The snapshot-based API is now deprecated. These methods will continue to function in v1.1.0 but will emit console warnings and will be removed in a future major release.
player.waitForGui(predicate): Replaced byplayer.gui({ title }).player.waitForGuiItem(predicate): Replaced bygui.locator(predicate).player.clickGuiItem(predicate): Replaced bygui.locator(predicate).click().GuiWrapper.findItem/findAllItems: Replaced byGuiItemLocator.
Paper E2E v1.0.4
What's New
Automatic Test Environment Cleanup
- New
cleanE2Etask automatically wipes server data before tests for a clean slate - Configurable exclusion patterns to preserve essential files (server.jar, cache, libraries)
- Runs automatically before
testE2Eto ensure consistent test environments
Configuration Improvements
bukkit.ymlconfiguration now handled by the Gradle pluginconnection-throttleautomatically set to 0, eliminating need to wait few seconds between each test
Enhanced Error Reporting
- Stack traces now point directly to your test files with accurate line and column numbers
- Failed tests display clickable file URLs for instant navigation in IDEs
- Source map support for TypeScript tests shows original
.spec.tslocations - Test summary at the end of each run
Better Bot Management
- Unique bot usernames using UUID fragments prevent naming conflicts
- Improved bot cleanup between tests
Technical Changes
- Refactored stack trace utilities into dedicated module
- Improved test result tracking and reporting
- Better separation of concerns in runner logic
- Enhanced logging throughout the test lifecycle