A modern CLI for preparing, validating, submitting, and releasing WordPress.org plugins from the terminal.
WordPress.org plugin publishing, but closer to npm publish.
It is designed to make WordPress plugin publishing feel closer to npm package publishing:
npx pressship login
npx pressship publish ./my-plugin --dry-run
npx pressship publish ./my-pluginPublishing a WordPress plugin to WordPress.org involves a lot of small steps: creating the right zip, validating readme.txt, running Plugin Check, logging into WordPress.org, uploading through the developer page, and later publishing releases through SVN.
Pressship automates that workflow while still using WordPress.org's existing review and release systems.
- Browser-based WordPress.org login with saved local session state.
whoamiandlogoutcommands for session management.- Plugin discovery from WordPress plugin headers.
readme.txtparsing and local validation.- WordPress.org readme validator automation.
- WordPress-installable zip generation.
- npm-style
publishandpackcommands. - Managed WordPress.org Plugin Check setup and execution.
- Current WordPress.org submission state inspection.
- Pending-plugin reupload support via the WordPress.org developer page.
- SVN release workflow for approved plugins.
- Repeatable ignore globs and
.pressshipignoresupport. - Colorful CLI output with progress indicators.
# Authenticate with WordPress.org.
npx pressship login
# Confirm the saved account.
npx pressship whoami
# Inspect current submitted plugin state.
npx pressship status ./my-plugin
# Validate and package without uploading or committing.
npx pressship publish ./my-plugin --dry-run
# Submit for review, reupload a pending plugin, or release an approved plugin.
npx pressship publish ./my-pluginYou can still use the explicit WordPress.org review and SVN flows:
npx pressship submit ./my-plugin
npx pressship release ./my-plugin --slug my-plugin --username WpOrgUser- Node.js 20 or newer.
- A WordPress.org account.
- Internet access for first-run browser and Plugin Check setup.
- PHP for Pressship's managed Plugin Check environment when system WP-CLI is unavailable.
svnfor approved-pluginpressship publish --releaseandpressship release.
Pressship installs Playwright Chromium automatically when browser automation first needs it.
pressship login
pressship whoami [--json]
pressship logout
pressship status [plugin-path-or-slug] [--json]
pressship version <patch|minor|major> [plugin-path]
pressship pack [plugin-path] [options]
pressship publish [plugin-path] [options]
pressship submit [plugin-path] [options]
pressship release [plugin-path] [options]pressship loginPressship opens login.wordpress.org in a real browser. Complete login manually, including any two-factor or account checks. Pressship waits until it detects a logged-in WordPress.org user, saves the browser session locally, and closes the browser.
Pressship does not store your WordPress.org password.
Useful commands:
pressship whoami
pressship whoami --json
pressship logoutpressship status
pressship status ./my-plugin
pressship status my-plugin
pressship status my-plugin --jsonstatus reads the logged-in WordPress.org developer page and reports the current state of submitted plugins.
For pending submissions it can show:
- Review status.
- Assigned slug.
- Plugin ID.
- Submitted zip filename.
- Submitted version.
- Upload date.
- Plugin Check URL.
- Whether slug change is available.
- Whether updated zip upload is available.
When given a local plugin path, Pressship discovers the plugin headers and uses the inferred slug/name to find the matching WordPress.org submission.
Example output:
Pressmind
Status Awaiting Review — This plugin has not yet been reviewed.
Slug pressmind
Submitted May 14, 2026
Plugin ID 313331
Reupload available
Slug change available
File pressmind.zip
Version 0.0.3
pressship version patch
pressship version minor ./my-plugin
pressship version major ./my-pluginversion bumps local plugin metadata, similar to npm version.
It updates:
- The main plugin file
Version:header. - The
Stable tag:value inreadme.txt, when a readme exists.
Examples:
# 1.2.3 -> 1.2.4
pressship version patch
# 1.2.3 -> 1.3.0
pressship version minor ./my-plugin
# 1.2.3 -> 2.0.0
pressship version major ./my-pluginpressship publish ./my-pluginpublish is the npm-style happy path. It discovers the plugin and then chooses the best WordPress.org publishing flow:
- Use
submitwhen a matching WordPress.org review submission is pending or reuploadable. - Use
releasewhen the plugin has an approved WordPress.org SVN repository and no pending review submission is found. - Ask whether to submit or release when Pressship cannot confidently choose.
Useful options:
pressship publish ./my-plugin --dry-run
pressship publish ./my-plugin --submit
pressship publish ./my-plugin --release --username WpOrgUser
pressship publish ./my-plugin --skip-plugin-check
pressship publish ./my-plugin --skip-readme-validator
pressship publish ./my-plugin --wp-path /path/to/wordpress
pressship publish ./my-plugin --ignore "assets/**/*.mp4"
pressship publish ./my-plugin --yesUse --submit for the review-upload flow and --release for the approved-plugin SVN flow when you want to be explicit.
pressship pack ./my-pluginpack validates the plugin, runs Plugin Check, and creates the WordPress-installable {slug}.zip without uploading or committing. By default, it writes the zip to the current directory, similar to npm pack.
Useful options:
pressship pack ./my-plugin --output-dir ./build
pressship pack ./my-plugin --ignore "assets/**/*.mp4"
pressship pack ./my-plugin --skip-readme-validator
pressship pack ./my-plugin --wp-path /path/to/wordpress
pressship pack ./my-plugin --no-validate
pressship pack ./my-plugin --jsonUse --no-validate only when you intentionally want to create the zip without readme validation or Plugin Check.
pressship submit ./my-pluginsubmit is the explicit WordPress.org review preparation flow. It is equivalent to publish --submit:
- Discover the plugin main file.
- Parse WordPress plugin headers.
- Parse and validate
readme.txt. - Validate
readme.txtwith the WordPress.org readme validator. - Build a WordPress-installable zip.
- Stage package contents for Plugin Check.
- Run the official WordPress.org Plugin Check.
- Ask for confirmation when blocking findings are reported.
- Upload the zip to WordPress.org.
If WordPress.org already has a pending submission matching the plugin slug or name, Pressship uses the "Upload updated plugin for review" form instead of the new-plugin form.
Useful options:
pressship submit ./my-plugin --dry-run
pressship submit ./my-plugin --skip-plugin-check
pressship submit ./my-plugin --skip-readme-validator
pressship submit ./my-plugin --wp-path /path/to/wordpress
pressship submit ./my-plugin --ignore "assets/**/*.mp4"
pressship submit ./my-plugin --ignore "assets/**/*.mp4" --ignore "docs/raw/**"
pressship submit ./my-plugin --output-dir ./build
pressship submit ./my-plugin --yesBy default, Pressship prepares its own local Plugin Check environment in your user config cache.
It can automatically:
- Use system WP-CLI when available.
- Download
wp-cli.pharwhen system WP-CLI is unavailable. - Download WordPress core.
- Create a managed
wp-config.php. - Install SQLite Database Integration for a local database-free setup.
- Run
wp core installagainst the SQLite-backed local WordPress install. - Download the WordPress.org Plugin Check plugin.
- Load Plugin Check with the required WP-CLI bootstrap file.
This means most users can run:
pressship submit ./my-plugin --dry-runwithout manually installing WordPress, WP-CLI, MySQL, or the Plugin Check plugin.
If you already have a local WordPress install with Plugin Check available, pass it explicitly:
pressship submit ./my-plugin --wp-path /path/to/wordpresspressship release ./my-plugin --slug my-plugin --username WpOrgUserWordPress.org initial review uses a zip upload. Approved plugin releases use SVN. Pressship keeps those workflows separate. release is equivalent to publish --release.
release will:
- Checkout or update
https://plugins.svn.wordpress.org/<slug>. - Sync packaged plugin files into
trunk/. - Create
tags/<version>from trunk. - Show
svn status. - Ask for confirmation.
- Commit the release.
Useful options:
pressship release ./my-plugin --slug my-plugin
pressship release ./my-plugin --version 1.2.3
pressship release ./my-plugin --username WpOrgUser
pressship release ./my-plugin --message "Release 1.2.3"
pressship release ./my-plugin --ignore "assets/**/*.mp4"
pressship release ./my-plugin --dry-run
pressship release ./my-plugin --yesPressship creates a zip with one top-level plugin folder, matching the format expected by WordPress plugin upload.
It excludes common development artifacts by default:
.git.gitignore.github.DS_Store.idea.vscode.env.env.*node_modulesdistbuildcoveragetests*.log*.zip.pressshipignore- legacy
.pressportignore
Add a .pressshipignore file in your plugin directory for project-specific exclusions:
assets/**/*.mp4
docs/raw/**
playground/**You can also ignore files per command:
pressship submit ./my-plugin --ignore "assets/**/*.mp4"
pressship publish ./my-plugin --ignore "assets/**/*.mp4"
pressship pack ./my-plugin --ignore "assets/**/*.mp4"
pressship release ./my-plugin --ignore "assets/**/*.mp4"Pressship stores local state under your user config directory:
~/.config/pressship/
This includes:
- WordPress.org browser session storage.
- Debug screenshots for failed browser automation.
- Managed Plugin Check cache.
- Managed WordPress core and SQLite setup.
You can override the config directory:
PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship statusFor migration compatibility, PRESSPORT_CONFIG_DIR is still accepted as a fallback.
Pressship installs Chromium automatically. If that fails, run:
npx playwright install chromiumFor local development:
npm run browsers:installRun:
pressship login
pressship whoamiIf the saved session is stale:
pressship logout
pressship loginThe managed Plugin Check environment is automatic, but it still needs PHP and internet access on first run.
To bypass Plugin Check:
pressship submit ./my-plugin --skip-plugin-checkTo use your own WordPress install:
pressship submit ./my-plugin --wp-path /path/to/wordpressThe WordPress.org submission and reupload flows are browser automation over the logged-in developer page, not a documented public API. If WordPress.org changes the form, Pressship fails loudly and saves a debug screenshot under the config directory.
npm install
npm run dev -- --help
npm run typecheck
npm test
npm run buildRun local commands without publishing:
npm run dev -- login
npm run dev -- whoami
npm run dev -- status
npm run dev -- pack ./my-plugin
npm run dev -- publish ./my-plugin --dry-run
npm run dev -- submit ./my-plugin --dry-run
npm run dev -- release ./my-plugin --dry-runPackage smoke test:
npm pack --dry-run- Pressship does not store your WordPress.org password.
- Login is completed in a real browser.
- Pressship stores Playwright browser session state locally.
logoutremoves Pressship's saved local browser session.logoutdoes not revoke other active WordPress.org sessions.
MIT