pressship 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +282 -356
- package/assets/logo-new.png +0 -0
- package/assets/pressship-dark.png +0 -0
- package/assets/pressship-square-dark.png +0 -0
- package/assets/pressship-square.png +0 -0
- package/assets/pressship-symbol-dark.png +0 -0
- package/assets/pressship-symbol.png +0 -0
- package/assets/pressship-wordmark-dark.png +0 -0
- package/assets/pressship-wordmark.png +0 -0
- package/assets/pressship.png +0 -0
- package/dist/cli.js +22 -2
- package/dist/cli.js.map +1 -1
- package/dist/package/ignore.js +4 -0
- package/dist/package/ignore.js.map +1 -1
- package/dist/plugin/discover.d.ts +8 -0
- package/dist/plugin/discover.js +27 -1
- package/dist/plugin/discover.js.map +1 -1
- package/dist/plugin/list.d.ts +24 -0
- package/dist/plugin/list.js +174 -0
- package/dist/plugin/list.js.map +1 -0
- package/dist/svn/credentials.d.ts +9 -0
- package/dist/svn/credentials.js +94 -0
- package/dist/svn/credentials.js.map +1 -0
- package/dist/svn/get.d.ts +45 -0
- package/dist/svn/get.js +139 -0
- package/dist/svn/get.js.map +1 -0
- package/dist/svn/release.d.ts +2 -0
- package/dist/svn/release.js +113 -18
- package/dist/svn/release.js.map +1 -1
- package/dist/svn/subversion.d.ts +18 -0
- package/dist/svn/subversion.js +171 -0
- package/dist/svn/subversion.js.map +1 -0
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.js +3 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/wordpress-org/publish.d.ts +2 -0
- package/dist/wordpress-org/publish.js +16 -8
- package/dist/wordpress-org/publish.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,573 +1,499 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/pressship-square-dark.png">
|
|
4
|
+
<img src="assets/pressship-square.png" alt="Pressship" width="120" />
|
|
5
|
+
</picture>
|
|
3
6
|
</p>
|
|
4
7
|
|
|
8
|
+
<h1 align="center">Pressship</h1>
|
|
9
|
+
|
|
5
10
|
<p align="center">
|
|
6
|
-
|
|
11
|
+
<em>WordPress.org plugin publishing, from the terminal.</em>
|
|
7
12
|
</p>
|
|
8
13
|
|
|
9
14
|
<p align="center">
|
|
10
|
-
<a href="https://nodejs.org/"><img alt="Node.js 20+" src="https://img.shields.io/badge/node-%3E%3D20-
|
|
11
|
-
<a href="https://
|
|
12
|
-
<a href="
|
|
15
|
+
<a href="https://nodejs.org/"><img alt="Node.js 20+" src="https://img.shields.io/badge/node-%3E%3D20-1e293b?logo=node.js&logoColor=white&style=flat-square" /></a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/pressship"><img alt="npm" src="https://img.shields.io/npm/v/pressship?color=3858e9&logo=npm&logoColor=white&style=flat-square" /></a>
|
|
17
|
+
<a href="https://wordpress.org/plugins/developers/"><img alt="WordPress.org" src="https://img.shields.io/badge/WordPress.org-plugin%20directory-21759b?logo=wordpress&logoColor=white&style=flat-square" /></a>
|
|
18
|
+
<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-3858e9?style=flat-square" /></a>
|
|
19
|
+
<a href="https://github.com/f/pressship"><img alt="GitHub stars" src="https://img.shields.io/github/stars/f/pressship?style=flat-square&logo=github&color=1e293b" /></a>
|
|
13
20
|
</p>
|
|
14
21
|
|
|
15
22
|
<p align="center">
|
|
16
|
-
<
|
|
23
|
+
<a href="#quick-start">Quick start</a> ·
|
|
24
|
+
<a href="#commands">Commands</a> ·
|
|
25
|
+
<a href="#managed-plugin-check">Managed Plugin Check</a> ·
|
|
26
|
+
<a href="#agent-skill">Agent skill</a> ·
|
|
27
|
+
<a href="https://pressship.org">Docs</a>
|
|
17
28
|
</p>
|
|
18
29
|
|
|
19
|
-
|
|
30
|
+
---
|
|
20
31
|
|
|
21
|
-
|
|
22
|
-
npx pressship login
|
|
23
|
-
npx pressship publish ./my-plugin --dry-run
|
|
24
|
-
npx pressship publish ./my-plugin
|
|
25
|
-
```
|
|
32
|
+
Pressship is a modern command-line tool for the entire WordPress.org plugin publishing lifecycle — validating, packaging, submitting for review, releasing through SVN, inspecting submission state, and even booting your plugin in [WordPress Playground](https://wordpress.org/playground/).
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
It keeps WordPress.org-specific behavior **explicit** and makes everything around it **quiet**.
|
|
28
35
|
|
|
29
36
|
```bash
|
|
30
|
-
npx
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
For other agents, replace `codex` with the target agent name, such as `claude-code`. To inspect available skills first, run:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npx skills add f/pressship --list
|
|
37
|
+
npx pressship publish ./my-plugin
|
|
37
38
|
```
|
|
38
39
|
|
|
39
40
|
## Why Pressship?
|
|
40
41
|
|
|
41
|
-
Publishing a WordPress plugin to WordPress.org
|
|
42
|
+
Publishing a WordPress plugin to WordPress.org normally means juggling a lot of small things: the right zip layout, `readme.txt` validation, Plugin Check setup, the developer-page upload form, then SVN for releases. Pressship automates the chores while keeping the official WordPress.org review and SVN release behavior intact.
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
If you've used `npm publish`, this should feel familiar.
|
|
44
45
|
|
|
45
|
-
##
|
|
46
|
+
## Quick start
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- Plugin discovery from WordPress plugin headers.
|
|
50
|
-
- `readme.txt` parsing and local validation.
|
|
51
|
-
- WordPress.org readme validator automation.
|
|
52
|
-
- WordPress-installable zip generation.
|
|
53
|
-
- Modernized `publish` and `pack` commands.
|
|
54
|
-
- Managed WordPress.org Plugin Check setup and execution.
|
|
55
|
-
- Current WordPress.org submission state inspection.
|
|
56
|
-
- Local and hosted plugin info lookup.
|
|
57
|
-
- Local WordPress Playground demos for plugin paths or hosted slugs.
|
|
58
|
-
- Playground runtime selection from plugin WordPress/PHP requirements.
|
|
59
|
-
- Quieter Playground demos with deprecation noise suppressed.
|
|
60
|
-
- Pending-plugin reupload support via the WordPress.org developer page.
|
|
61
|
-
- SVN release workflow for approved plugins.
|
|
62
|
-
- Repeatable ignore globs and `.pressshipignore` support.
|
|
63
|
-
- Documentation site for GitHub Pages.
|
|
64
|
-
- Colorful CLI output with progress indicators.
|
|
65
|
-
|
|
66
|
-
## Quick Start
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# Authenticate with WordPress.org.
|
|
48
|
+
```bash
|
|
49
|
+
# 1. Authenticate with WordPress.org
|
|
70
50
|
npx pressship login
|
|
71
51
|
|
|
72
|
-
#
|
|
52
|
+
# 2. (Optional) Verify the saved session
|
|
73
53
|
npx pressship whoami
|
|
74
54
|
|
|
75
|
-
#
|
|
76
|
-
npx pressship status ./my-plugin
|
|
77
|
-
|
|
78
|
-
# Inspect local plugin metadata or hosted WordPress.org plugin info.
|
|
79
|
-
npx pressship info ./my-plugin
|
|
80
|
-
npx pressship info 16deza-table-cell-extras
|
|
81
|
-
|
|
82
|
-
# Open a local WordPress Playground demo.
|
|
83
|
-
npx pressship demo ./my-plugin
|
|
84
|
-
npx pressship demo 16deza-table-cell-extras
|
|
85
|
-
|
|
86
|
-
# Validate and package without uploading or committing.
|
|
55
|
+
# 3. Validate, package, and check without uploading
|
|
87
56
|
npx pressship publish ./my-plugin --dry-run
|
|
88
57
|
|
|
89
|
-
# Submit for review
|
|
58
|
+
# 4. Submit for review or release an approved plugin
|
|
90
59
|
npx pressship publish ./my-plugin
|
|
91
60
|
```
|
|
92
61
|
|
|
93
|
-
|
|
62
|
+
That's it. Pressship handles browser-based login, packaging, readme validation, Plugin Check, and routing between submission and SVN release.
|
|
94
63
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
64
|
+
## Features
|
|
65
|
+
|
|
66
|
+
- **Browser-based login** — opens `login.wordpress.org` in a real browser and saves only the session locally. Your password is never read or stored.
|
|
67
|
+
- **Smart `publish`** — automatically routes between new-plugin review submission, pending reupload, or SVN release.
|
|
68
|
+
- **Zero-setup Plugin Check** — bundles its own managed WordPress + SQLite + Plugin Check environment when you don't already have WP-CLI.
|
|
69
|
+
- **WordPress.org readme validator** — runs the official validator before you upload anything.
|
|
70
|
+
- **Submission state inspector** — reads the logged-in developer page to surface review status, slug, reupload availability, and Plugin Check links.
|
|
71
|
+
- **SVN release workflow** — handles checkout, trunk sync, tag creation, and commit.
|
|
72
|
+
- **WordPress Playground demos** — boot any local path or hosted slug in Playground using the plugin's own WP/PHP requirements.
|
|
73
|
+
- **`.pressshipignore` + glob ignores** — sensible defaults, easy per-command overrides.
|
|
74
|
+
- **Agent skill included** — a Pressship publishing skill for coding agents (Codex, Claude Code, etc.).
|
|
75
|
+
- **Beautiful terminal UX** — colored output, progress indicators, structured findings.
|
|
99
76
|
|
|
100
77
|
## Requirements
|
|
101
78
|
|
|
102
|
-
- Node.js 20
|
|
103
|
-
- A WordPress.org account
|
|
104
|
-
- Internet access for first-run browser and Plugin Check setup
|
|
105
|
-
- PHP
|
|
106
|
-
-
|
|
79
|
+
- **Node.js 20+**
|
|
80
|
+
- A **WordPress.org account**
|
|
81
|
+
- **Internet access** for first-run browser and Plugin Check setup
|
|
82
|
+
- **PHP** when Pressship needs to prepare its managed Plugin Check environment
|
|
83
|
+
- **`svn`** for approved-plugin releases and `get` checkouts. If it is missing, Pressship can detect your OS and offer to install Subversion with Homebrew, apt, dnf, yum, pacman, zypper, apk, winget, or Chocolatey.
|
|
107
84
|
|
|
108
|
-
|
|
85
|
+
Playwright Chromium is installed automatically the first time browser automation runs.
|
|
109
86
|
|
|
110
|
-
##
|
|
87
|
+
## Commands
|
|
111
88
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
pressship
|
|
115
|
-
pressship
|
|
116
|
-
pressship
|
|
117
|
-
pressship
|
|
118
|
-
pressship
|
|
119
|
-
pressship
|
|
120
|
-
pressship
|
|
121
|
-
pressship
|
|
122
|
-
pressship
|
|
123
|
-
pressship release
|
|
124
|
-
|
|
89
|
+
| Command | What it does |
|
|
90
|
+
| ------- | ------------ |
|
|
91
|
+
| `pressship login` | Open WordPress.org login in a browser and save the session. |
|
|
92
|
+
| `pressship whoami` | Show the active WordPress.org account. |
|
|
93
|
+
| `pressship logout` | Remove the saved WordPress.org session. |
|
|
94
|
+
| `pressship info` | Inspect local plugin metadata or hosted WordPress.org plugin info. |
|
|
95
|
+
| `pressship ls` | List plugins for the saved account or a public WordPress.org profile. |
|
|
96
|
+
| `pressship get` | Checkout or update a WordPress.org plugin SVN working copy. |
|
|
97
|
+
| `pressship status` | Read review state from the logged-in developer dashboard. |
|
|
98
|
+
| `pressship version <patch\|minor\|major>` | Bump the plugin header version and readme stable tag together. |
|
|
99
|
+
| `pressship pack` | Validate, run Plugin Check, and write an installable zip. |
|
|
100
|
+
| `pressship publish` | Route to submit or release based on current state. |
|
|
101
|
+
| `pressship submit` | Upload a zip to WordPress.org review (or reupload). |
|
|
102
|
+
| `pressship release` | Push an approved release through SVN trunk + tags. |
|
|
103
|
+
| `pressship demo` | Open the plugin in WordPress Playground. |
|
|
125
104
|
|
|
126
|
-
|
|
105
|
+
Get help for any command:
|
|
127
106
|
|
|
128
107
|
```bash
|
|
129
|
-
pressship
|
|
108
|
+
pressship <command> --help
|
|
130
109
|
```
|
|
131
110
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Pressship does not store your WordPress.org password.
|
|
135
|
-
|
|
136
|
-
Useful commands:
|
|
111
|
+
## Authentication
|
|
137
112
|
|
|
138
113
|
```bash
|
|
139
|
-
pressship
|
|
140
|
-
pressship whoami --json
|
|
141
|
-
pressship logout
|
|
114
|
+
pressship login
|
|
142
115
|
```
|
|
143
116
|
|
|
144
|
-
|
|
117
|
+
Opens `login.wordpress.org` in a real browser. Complete the login manually — Pressship waits until it detects a logged-in user, then saves only the browser session state.
|
|
145
118
|
|
|
146
119
|
```bash
|
|
147
|
-
pressship
|
|
148
|
-
pressship
|
|
149
|
-
pressship
|
|
150
|
-
pressship info https://wordpress.org/plugins/16deza-table-cell-extras/
|
|
151
|
-
pressship info 16deza-table-cell-extras --json
|
|
120
|
+
pressship whoami # Print the active account
|
|
121
|
+
pressship whoami --json # Machine-readable output
|
|
122
|
+
pressship logout # Remove the local session
|
|
152
123
|
```
|
|
153
124
|
|
|
154
|
-
|
|
125
|
+
> Pressship never reads, transmits, or stores your WordPress.org password.
|
|
155
126
|
|
|
156
|
-
|
|
127
|
+
## Publishing
|
|
157
128
|
|
|
158
|
-
|
|
129
|
+
`publish` is the modern, opinionated happy path. It inspects your plugin and routes to the right flow:
|
|
159
130
|
|
|
160
|
-
|
|
131
|
+
- A pending WordPress.org review submission → **reupload**.
|
|
132
|
+
- A new plugin Pressship hasn't seen → **submit for review**.
|
|
133
|
+
- An approved plugin with an SVN repository → **release**.
|
|
134
|
+
- Ambiguous? Pressship asks.
|
|
161
135
|
|
|
162
136
|
```bash
|
|
163
|
-
pressship
|
|
164
|
-
pressship
|
|
165
|
-
pressship
|
|
166
|
-
pressship
|
|
137
|
+
pressship publish ./my-plugin # Pick the right flow automatically
|
|
138
|
+
pressship publish ./my-plugin --dry-run # Validate + package, no upload
|
|
139
|
+
pressship publish ./my-plugin --submit # Force review submission
|
|
140
|
+
pressship publish ./my-plugin --release # Force SVN release
|
|
141
|
+
pressship publish ./my-plugin --yes # Skip confirmation prompts
|
|
142
|
+
pressship publish ./my-plugin --release --no-install-svn
|
|
167
143
|
```
|
|
168
144
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
Pressship uses the plugin's required WordPress and PHP versions when they are declared; pass `--wp` or `--php` to override them. It also adds a small Playground compatibility mu-plugin before activation so plugins that expect WordPress admin plugin helpers can boot cleanly. PHP deprecation notices are suppressed in demo pages, while real warnings, errors, and fatal errors remain visible.
|
|
145
|
+
Need fine-grained control? Use the explicit subcommands `submit` and `release`.
|
|
172
146
|
|
|
173
|
-
|
|
147
|
+
## Packaging
|
|
174
148
|
|
|
175
149
|
```bash
|
|
176
|
-
pressship
|
|
177
|
-
pressship demo ./my-plugin --wp 6.8 --php 8.3
|
|
178
|
-
pressship demo ./my-plugin --reset
|
|
179
|
-
pressship demo ./my-plugin --skip-browser
|
|
150
|
+
pressship pack ./my-plugin
|
|
180
151
|
```
|
|
181
152
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
## Status Flow
|
|
153
|
+
Validates the plugin, runs Plugin Check, and writes `{slug}.zip` — without uploading. Useful for CI artifacts or manual uploads.
|
|
185
154
|
|
|
186
155
|
```bash
|
|
187
|
-
pressship
|
|
188
|
-
pressship
|
|
189
|
-
pressship
|
|
190
|
-
pressship
|
|
156
|
+
pressship pack ./my-plugin --output-dir ./build
|
|
157
|
+
pressship pack ./my-plugin --ignore "assets/**/*.mp4"
|
|
158
|
+
pressship pack ./my-plugin --no-validate
|
|
159
|
+
pressship pack ./my-plugin --json
|
|
191
160
|
```
|
|
192
161
|
|
|
193
|
-
|
|
162
|
+
### Ignore rules
|
|
194
163
|
|
|
195
|
-
|
|
164
|
+
Default exclusions: `.git`, `.gitignore`, `.github`, `.DS_Store`, `.idea`, `.vscode`, `.env*`, `.pressship-svn`, `node_modules`, `dist`, `build`, `coverage`, `tests`, `*.log`, `*.zip`.
|
|
196
165
|
|
|
197
|
-
-
|
|
198
|
-
- Assigned slug.
|
|
199
|
-
- Plugin ID.
|
|
200
|
-
- Submitted zip filename.
|
|
201
|
-
- Submitted version.
|
|
202
|
-
- Upload date.
|
|
203
|
-
- Plugin Check URL.
|
|
204
|
-
- Whether slug change is available.
|
|
205
|
-
- Whether updated zip upload is available.
|
|
166
|
+
Add per-project exclusions in a `.pressshipignore` file (same syntax as `.gitignore`):
|
|
206
167
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
```text
|
|
212
|
-
Pressmind
|
|
213
|
-
Status Awaiting Review — This plugin has not yet been reviewed.
|
|
214
|
-
Slug pressmind
|
|
215
|
-
Submitted May 14, 2026
|
|
216
|
-
Plugin ID 313331
|
|
217
|
-
Reupload available
|
|
218
|
-
Slug change available
|
|
219
|
-
File pressmind.zip
|
|
220
|
-
Version 0.0.3
|
|
168
|
+
```gitignore
|
|
169
|
+
assets/**/*.mp4
|
|
170
|
+
docs/raw/**
|
|
171
|
+
playground/**
|
|
221
172
|
```
|
|
222
173
|
|
|
223
|
-
|
|
174
|
+
Or pass `--ignore <glob>` directly (repeat as needed):
|
|
224
175
|
|
|
225
176
|
```bash
|
|
226
|
-
pressship
|
|
227
|
-
pressship version minor ./my-plugin
|
|
228
|
-
pressship version major ./my-plugin
|
|
177
|
+
pressship publish ./my-plugin --ignore "assets/**/*.mp4" --ignore "docs/raw/**"
|
|
229
178
|
```
|
|
230
179
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
It updates:
|
|
234
|
-
|
|
235
|
-
- The main plugin file `Version:` header.
|
|
236
|
-
- The `Stable tag:` value in `readme.txt`, when a readme exists.
|
|
237
|
-
|
|
238
|
-
Examples:
|
|
180
|
+
## Listing WordPress.org plugins
|
|
239
181
|
|
|
240
182
|
```bash
|
|
241
|
-
#
|
|
242
|
-
pressship
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
pressship version minor ./my-plugin
|
|
246
|
-
|
|
247
|
-
# 1.2.3 -> 2.0.0
|
|
248
|
-
pressship version major ./my-plugin
|
|
183
|
+
pressship ls # Saved account, including SVN committer plugins
|
|
184
|
+
pressship ls fatihkadirakin # Public profile plugins for a username
|
|
185
|
+
pressship ls --public # Force the public profile view
|
|
186
|
+
pressship ls --json
|
|
249
187
|
```
|
|
250
188
|
|
|
251
|
-
|
|
189
|
+
`ls` reads WordPress.org's plugin author archive. Public archives show plugins where the user is listed as a contributor. When you run `pressship ls` for the saved logged-in account, WordPress.org also includes plugins where that account has SVN committer access.
|
|
190
|
+
|
|
191
|
+
## Getting a plugin SVN working copy
|
|
252
192
|
|
|
253
193
|
```bash
|
|
254
|
-
pressship
|
|
194
|
+
pressship get list-all-urls
|
|
195
|
+
pressship get list-all-urls ./plugins/list-all-urls
|
|
196
|
+
pressship get https://wordpress.org/plugins/list-all-urls/ ./list-all-urls
|
|
197
|
+
pressship get list-all-urls --json
|
|
198
|
+
pressship get list-all-urls --no-install-svn
|
|
255
199
|
```
|
|
256
200
|
|
|
257
|
-
`
|
|
201
|
+
`get` checks out `https://plugins.svn.wordpress.org/<slug>` into the destination directory. If the destination already contains an SVN working copy, Pressship runs `svn update` instead. After checkout or update, it prints repository details such as revision, last changed revision, trunk/assets availability, and tag count.
|
|
202
|
+
|
|
203
|
+
If `svn` is not available, Pressship detects your operating system and package manager, then asks before installing Subversion. Use `--no-install-svn` to skip the installer helper and fail with manual instructions.
|
|
258
204
|
|
|
259
|
-
|
|
260
|
-
- Use `release` when the plugin has an approved WordPress.org SVN repository and no pending review submission is found.
|
|
261
|
-
- Ask whether to submit or release when Pressship cannot confidently choose.
|
|
205
|
+
### Editing an approved plugin from SVN
|
|
262
206
|
|
|
263
|
-
|
|
207
|
+
WordPress.org SVN working copies keep editable plugin code in `trunk/`, and published versions in `tags/<version>/`. A typical release flow is:
|
|
264
208
|
|
|
265
209
|
```bash
|
|
266
|
-
pressship
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
pressship
|
|
270
|
-
pressship publish
|
|
271
|
-
pressship publish ./my-plugin --wp-path /path/to/wordpress
|
|
272
|
-
pressship publish ./my-plugin --ignore "assets/**/*.mp4"
|
|
273
|
-
pressship publish ./my-plugin --yes
|
|
210
|
+
pressship get my-plugin ./my-plugin
|
|
211
|
+
cd ./my-plugin
|
|
212
|
+
# edit files in trunk/
|
|
213
|
+
pressship version patch
|
|
214
|
+
pressship publish
|
|
274
215
|
```
|
|
275
216
|
|
|
276
|
-
|
|
217
|
+
When Pressship runs from the SVN checkout root, it treats `trunk/` as the plugin directory, bumps the version there, and routes `publish` to the SVN release flow.
|
|
277
218
|
|
|
278
|
-
##
|
|
219
|
+
## Inspecting submission state
|
|
279
220
|
|
|
280
221
|
```bash
|
|
281
|
-
pressship
|
|
222
|
+
pressship status # All submitted plugins
|
|
223
|
+
pressship status ./my-plugin # Match by local plugin
|
|
224
|
+
pressship status my-plugin # Match by slug
|
|
225
|
+
pressship status my-plugin --json
|
|
282
226
|
```
|
|
283
227
|
|
|
284
|
-
|
|
228
|
+
Sample output:
|
|
285
229
|
|
|
286
|
-
|
|
230
|
+
```
|
|
231
|
+
Pressmind
|
|
232
|
+
Status Awaiting Review — This plugin has not yet been reviewed.
|
|
233
|
+
Slug pressmind
|
|
234
|
+
Submitted May 14, 2026
|
|
235
|
+
Plugin ID 313331
|
|
236
|
+
Reupload available
|
|
237
|
+
Slug change available
|
|
238
|
+
File pressmind.zip
|
|
239
|
+
Version 0.0.3
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Plugin metadata
|
|
287
243
|
|
|
288
244
|
```bash
|
|
289
|
-
pressship
|
|
290
|
-
pressship
|
|
291
|
-
pressship
|
|
292
|
-
pressship
|
|
293
|
-
pressship pack ./my-plugin --no-validate
|
|
294
|
-
pressship pack ./my-plugin --json
|
|
245
|
+
pressship info # Current directory
|
|
246
|
+
pressship info ./my-plugin # Local path
|
|
247
|
+
pressship info 16deza-table-cell-extras # Hosted slug
|
|
248
|
+
pressship info ./my-plugin --json
|
|
295
249
|
```
|
|
296
250
|
|
|
297
|
-
|
|
251
|
+
For local plugins, Pressship parses headers and readme metadata. For hosted plugins it queries the official WordPress.org plugin info API.
|
|
298
252
|
|
|
299
|
-
##
|
|
253
|
+
## Version bumping
|
|
300
254
|
|
|
301
255
|
```bash
|
|
302
|
-
pressship
|
|
256
|
+
pressship version patch # 1.2.3 → 1.2.4
|
|
257
|
+
pressship version minor # 1.2.3 → 1.3.0
|
|
258
|
+
pressship version major # 1.2.3 → 2.0.0
|
|
303
259
|
```
|
|
304
260
|
|
|
305
|
-
`
|
|
261
|
+
Updates the `Version:` header in the main plugin file **and** the `Stable tag:` in `readme.txt` together.
|
|
306
262
|
|
|
307
|
-
|
|
308
|
-
2. Parse WordPress plugin headers.
|
|
309
|
-
3. Parse and validate `readme.txt`.
|
|
310
|
-
4. Validate `readme.txt` with the WordPress.org readme validator.
|
|
311
|
-
5. Build a WordPress-installable zip.
|
|
312
|
-
6. Stage package contents for Plugin Check.
|
|
313
|
-
7. Run the official WordPress.org Plugin Check.
|
|
314
|
-
8. Ask for confirmation when blocking findings are reported.
|
|
315
|
-
9. Upload the zip to WordPress.org.
|
|
263
|
+
## Playground demos
|
|
316
264
|
|
|
317
|
-
|
|
265
|
+
```bash
|
|
266
|
+
pressship demo ./my-plugin # Mount local plugin into Playground
|
|
267
|
+
pressship demo 16deza-table-cell-extras # Install hosted plugin from WP.org
|
|
268
|
+
```
|
|
318
269
|
|
|
319
|
-
|
|
270
|
+
Pressship boots a local [WordPress Playground](https://wordpress.org/playground/) server with the plugin installed and activated. For local paths the plugin directory is mounted, so code changes are immediately reflected.
|
|
320
271
|
|
|
321
272
|
```bash
|
|
322
|
-
pressship
|
|
323
|
-
pressship
|
|
324
|
-
pressship
|
|
325
|
-
pressship
|
|
326
|
-
pressship submit ./my-plugin --ignore "assets/**/*.mp4"
|
|
327
|
-
pressship submit ./my-plugin --ignore "assets/**/*.mp4" --ignore "docs/raw/**"
|
|
328
|
-
pressship submit ./my-plugin --output-dir ./build
|
|
329
|
-
pressship submit ./my-plugin --yes
|
|
273
|
+
pressship demo ./my-plugin --port 9401
|
|
274
|
+
pressship demo ./my-plugin --wp 6.8 --php 8.3
|
|
275
|
+
pressship demo ./my-plugin --reset
|
|
276
|
+
pressship demo ./my-plugin --skip-browser
|
|
330
277
|
```
|
|
331
278
|
|
|
279
|
+
The Playground server keeps running until you stop it with `Ctrl+C`.
|
|
280
|
+
|
|
332
281
|
## Managed Plugin Check
|
|
333
282
|
|
|
334
|
-
By default, Pressship
|
|
283
|
+
By default, Pressship runs the official [WordPress.org Plugin Check](https://wordpress.org/plugins/plugin-check/) against your plugin before uploading. If you don't already have WP-CLI installed, Pressship sets up its own managed environment automatically:
|
|
335
284
|
|
|
336
|
-
|
|
285
|
+
1. Detects (or downloads) WP-CLI.
|
|
286
|
+
2. Downloads WordPress core.
|
|
287
|
+
3. Sets up SQLite Database Integration (no MySQL required).
|
|
288
|
+
4. Runs `wp core install` against the SQLite-backed site.
|
|
289
|
+
5. Installs the WordPress.org Plugin Check plugin.
|
|
290
|
+
6. Bootstraps it with the correct `--require` flag.
|
|
337
291
|
|
|
338
|
-
|
|
339
|
-
- Download `wp-cli.phar` when system WP-CLI is unavailable.
|
|
340
|
-
- Download WordPress core.
|
|
341
|
-
- Create a managed `wp-config.php`.
|
|
342
|
-
- Install SQLite Database Integration for a local database-free setup.
|
|
343
|
-
- Run `wp core install` against the SQLite-backed local WordPress install.
|
|
344
|
-
- Download the WordPress.org Plugin Check plugin.
|
|
345
|
-
- Load Plugin Check with the required WP-CLI bootstrap file.
|
|
292
|
+
All cached under `~/.config/pressship/`.
|
|
346
293
|
|
|
347
|
-
|
|
294
|
+
If you'd rather use your own install:
|
|
348
295
|
|
|
349
296
|
```bash
|
|
350
|
-
pressship
|
|
297
|
+
pressship publish ./my-plugin --wp-path /path/to/wordpress
|
|
351
298
|
```
|
|
352
299
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
If you already have a local WordPress install with Plugin Check available, pass it explicitly:
|
|
300
|
+
Or skip Plugin Check entirely:
|
|
356
301
|
|
|
357
302
|
```bash
|
|
358
|
-
pressship
|
|
303
|
+
pressship publish ./my-plugin --skip-plugin-check
|
|
359
304
|
```
|
|
360
305
|
|
|
361
|
-
##
|
|
306
|
+
## Releasing through SVN
|
|
307
|
+
|
|
308
|
+
For approved plugins:
|
|
362
309
|
|
|
363
310
|
```bash
|
|
364
|
-
pressship release ./my-plugin
|
|
311
|
+
pressship release ./my-plugin
|
|
365
312
|
```
|
|
366
313
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
`release` will:
|
|
314
|
+
Pressship will:
|
|
370
315
|
|
|
371
316
|
1. Checkout or update `https://plugins.svn.wordpress.org/<slug>`.
|
|
372
|
-
2.
|
|
373
|
-
3.
|
|
374
|
-
4.
|
|
375
|
-
5.
|
|
376
|
-
6.
|
|
317
|
+
2. Confirm the local version has not already been released as `tags/<version>`.
|
|
318
|
+
3. Sync packaged plugin files into `trunk/`.
|
|
319
|
+
4. Sync `.wordpress-org/` assets into the SVN `assets/` directory when that folder exists.
|
|
320
|
+
5. Create `tags/<version>` from `trunk/`.
|
|
321
|
+
6. Show `svn status` and ask before committing.
|
|
322
|
+
7. Commit with `--no-auth-cache` and a generated WordPress.org SVN password.
|
|
323
|
+
|
|
324
|
+
If the SVN tag already exists, Pressship stops with a “No version change detected” message instead of publishing the same version again.
|
|
325
|
+
|
|
326
|
+
For commits, Pressship uses the saved WordPress.org login to infer your SVN username. If no SVN password is saved yet, it points you to your WordPress.org SVN password page:
|
|
377
327
|
|
|
378
|
-
|
|
328
|
+
```text
|
|
329
|
+
https://profiles.wordpress.org/<username>/profile/edit/group/3/?screen=svn-password
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Generate the password there, paste it into Pressship once, and it will be stored locally under `~/.config/pressship/svn-credentials.json` for future releases.
|
|
379
333
|
|
|
380
334
|
```bash
|
|
381
335
|
pressship release ./my-plugin --slug my-plugin
|
|
382
336
|
pressship release ./my-plugin --version 1.2.3
|
|
383
337
|
pressship release ./my-plugin --username WpOrgUser
|
|
384
338
|
pressship release ./my-plugin --message "Release 1.2.3"
|
|
385
|
-
pressship release ./my-plugin --ignore "assets/**/*.mp4"
|
|
386
339
|
pressship release ./my-plugin --dry-run
|
|
387
340
|
pressship release ./my-plugin --yes
|
|
341
|
+
pressship release ./my-plugin --no-install-svn
|
|
388
342
|
```
|
|
389
343
|
|
|
390
|
-
##
|
|
391
|
-
|
|
392
|
-
Pressship creates a zip with one top-level plugin folder, matching the format expected by WordPress plugin upload.
|
|
393
|
-
|
|
394
|
-
It excludes common development artifacts by default:
|
|
344
|
+
## Agent skill
|
|
395
345
|
|
|
396
|
-
-
|
|
397
|
-
- `.gitignore`
|
|
398
|
-
- `.github`
|
|
399
|
-
- `.DS_Store`
|
|
400
|
-
- `.idea`
|
|
401
|
-
- `.vscode`
|
|
402
|
-
- `.env`
|
|
403
|
-
- `.env.*`
|
|
404
|
-
- `node_modules`
|
|
405
|
-
- `dist`
|
|
406
|
-
- `build`
|
|
407
|
-
- `coverage`
|
|
408
|
-
- `tests`
|
|
409
|
-
- `*.log`
|
|
410
|
-
- `*.zip`
|
|
411
|
-
- `.pressshipignore`
|
|
412
|
-
- legacy `.pressportignore`
|
|
346
|
+
Pressship ships with a publishing skill for coding agents (Codex, Claude Code, etc.). It teaches your agent to publish WordPress plugins cautiously — dry-run first, state-aware, with a final review step before any upload.
|
|
413
347
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
```gitignore
|
|
417
|
-
assets/**/*.mp4
|
|
418
|
-
docs/raw/**
|
|
419
|
-
playground/**
|
|
348
|
+
```bash
|
|
349
|
+
npx skills add f/pressship --skill wordpress-plugin-publish -a codex
|
|
420
350
|
```
|
|
421
351
|
|
|
422
|
-
|
|
352
|
+
Replace `codex` with another supported agent name, e.g. `claude-code`. List available skills first:
|
|
423
353
|
|
|
424
354
|
```bash
|
|
425
|
-
|
|
426
|
-
pressship publish ./my-plugin --ignore "assets/**/*.mp4"
|
|
427
|
-
pressship pack ./my-plugin --ignore "assets/**/*.mp4"
|
|
428
|
-
pressship release ./my-plugin --ignore "assets/**/*.mp4"
|
|
355
|
+
npx skills add f/pressship --list
|
|
429
356
|
```
|
|
430
357
|
|
|
431
|
-
## Configuration
|
|
358
|
+
## Configuration
|
|
432
359
|
|
|
433
360
|
Pressship stores local state under your user config directory:
|
|
434
361
|
|
|
435
|
-
```
|
|
362
|
+
```
|
|
436
363
|
~/.config/pressship/
|
|
437
364
|
```
|
|
438
365
|
|
|
439
|
-
|
|
366
|
+
Contents:
|
|
440
367
|
|
|
441
|
-
- WordPress.org browser session storage
|
|
442
|
-
-
|
|
443
|
-
-
|
|
444
|
-
- Managed WordPress core
|
|
445
|
-
- Generated Playground demo blueprints
|
|
368
|
+
- WordPress.org browser session storage
|
|
369
|
+
- Saved WordPress.org SVN passwords for release commits
|
|
370
|
+
- Debug screenshots from failed browser automation
|
|
371
|
+
- Managed Plugin Check cache (WP-CLI phar, WordPress core, SQLite, Plugin Check plugin)
|
|
372
|
+
- Generated Playground demo blueprints
|
|
446
373
|
|
|
447
|
-
|
|
374
|
+
Override the location:
|
|
448
375
|
|
|
449
376
|
```bash
|
|
450
377
|
PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship status
|
|
451
378
|
```
|
|
452
379
|
|
|
453
|
-
|
|
380
|
+
> `PRESSPORT_CONFIG_DIR` is still respected as a legacy fallback.
|
|
454
381
|
|
|
455
|
-
##
|
|
382
|
+
## Documentation
|
|
456
383
|
|
|
457
|
-
|
|
384
|
+
Full docs live at **<https://pressship.org>**.
|
|
458
385
|
|
|
459
|
-
|
|
386
|
+
The source is in [`website/`](./website) and runs as a standard Docusaurus site:
|
|
460
387
|
|
|
461
388
|
```bash
|
|
462
|
-
|
|
389
|
+
npm run docs:dev # Local dev server
|
|
390
|
+
npm run docs:build # Production build
|
|
391
|
+
npm run docs:serve # Preview production build
|
|
463
392
|
```
|
|
464
393
|
|
|
465
|
-
|
|
394
|
+
GitHub Pages deployment is wired up in [`.github/workflows/docs.yml`](.github/workflows/docs.yml).
|
|
395
|
+
|
|
396
|
+
## Development
|
|
466
397
|
|
|
467
398
|
```bash
|
|
468
|
-
|
|
399
|
+
npm install
|
|
400
|
+
npm run dev -- --help # Run the CLI locally
|
|
401
|
+
npm run typecheck
|
|
402
|
+
npm test
|
|
403
|
+
npm run build
|
|
469
404
|
```
|
|
470
405
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
Run:
|
|
406
|
+
Try local commands without publishing the package:
|
|
474
407
|
|
|
475
408
|
```bash
|
|
476
|
-
|
|
477
|
-
|
|
409
|
+
npm run dev -- login
|
|
410
|
+
npm run dev -- whoami
|
|
411
|
+
npm run dev -- pack ./my-plugin
|
|
412
|
+
npm run dev -- publish ./my-plugin --dry-run
|
|
478
413
|
```
|
|
479
414
|
|
|
480
|
-
|
|
415
|
+
Package smoke test:
|
|
481
416
|
|
|
482
417
|
```bash
|
|
483
|
-
|
|
484
|
-
pressship login
|
|
418
|
+
npm pack --dry-run
|
|
485
419
|
```
|
|
486
420
|
|
|
487
|
-
|
|
421
|
+
## Troubleshooting
|
|
488
422
|
|
|
489
|
-
|
|
423
|
+
<details>
|
|
424
|
+
<summary><strong>Browser runtime missing</strong></summary>
|
|
490
425
|
|
|
491
|
-
|
|
426
|
+
Pressship installs Chromium automatically. If that fails:
|
|
492
427
|
|
|
493
428
|
```bash
|
|
494
|
-
|
|
429
|
+
npx playwright install chromium
|
|
495
430
|
```
|
|
431
|
+
</details>
|
|
496
432
|
|
|
497
|
-
|
|
433
|
+
<details>
|
|
434
|
+
<summary><strong>Session expired or not logged in</strong></summary>
|
|
498
435
|
|
|
499
436
|
```bash
|
|
500
|
-
pressship
|
|
437
|
+
pressship logout
|
|
438
|
+
pressship login
|
|
501
439
|
```
|
|
440
|
+
</details>
|
|
502
441
|
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
The 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.
|
|
506
|
-
|
|
507
|
-
## Documentation Site
|
|
508
|
-
|
|
509
|
-
The documentation site lives in `website/`.
|
|
442
|
+
<details>
|
|
443
|
+
<summary><strong>Plugin Check setup problems</strong></summary>
|
|
510
444
|
|
|
511
|
-
|
|
445
|
+
The managed environment needs PHP and internet access on first run. To bypass:
|
|
512
446
|
|
|
513
447
|
```bash
|
|
514
|
-
|
|
448
|
+
pressship publish ./my-plugin --skip-plugin-check
|
|
515
449
|
```
|
|
516
450
|
|
|
517
|
-
|
|
451
|
+
To use your own WordPress install:
|
|
518
452
|
|
|
519
453
|
```bash
|
|
520
|
-
|
|
454
|
+
pressship publish ./my-plugin --wp-path /path/to/wordpress
|
|
521
455
|
```
|
|
456
|
+
</details>
|
|
522
457
|
|
|
523
|
-
|
|
458
|
+
<details>
|
|
459
|
+
<summary><strong>WordPress.org form changes</strong></summary>
|
|
524
460
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
```
|
|
461
|
+
The submission flow is 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 `~/.config/pressship/debug/`.
|
|
462
|
+
</details>
|
|
528
463
|
|
|
529
|
-
|
|
464
|
+
## Security
|
|
530
465
|
|
|
531
|
-
|
|
466
|
+
- Pressship **never stores your WordPress.org password**.
|
|
467
|
+
- Login is completed in a real browser by you.
|
|
468
|
+
- Playwright browser session state is stored locally for WordPress.org browser automation.
|
|
469
|
+
- If you run an SVN release, Pressship can store the generated WordPress.org SVN password locally so future commits can run non-interactively.
|
|
470
|
+
- `pressship logout` removes the local browser session; it does **not** revoke other active WordPress.org sessions.
|
|
532
471
|
|
|
533
|
-
|
|
534
|
-
Install dependencies with your preferred Node package manager, then run:
|
|
472
|
+
## Contributing
|
|
535
473
|
|
|
536
|
-
|
|
537
|
-
- `typecheck`
|
|
538
|
-
- `test`
|
|
539
|
-
- `build`
|
|
540
|
-
- `docs:build`
|
|
541
|
-
```
|
|
474
|
+
Issues, ideas, and pull requests are welcome. Please open an issue first for larger changes so we can discuss the direction.
|
|
542
475
|
|
|
543
|
-
|
|
476
|
+
When opening a PR, please:
|
|
544
477
|
|
|
545
|
-
|
|
546
|
-
Run
|
|
478
|
+
- Add or update relevant tests (`npm test`).
|
|
479
|
+
- Run `npm run typecheck` and `npm run build`.
|
|
480
|
+
- Keep new commands consistent with the existing CLI patterns.
|
|
547
481
|
|
|
548
|
-
|
|
549
|
-
- `whoami`
|
|
550
|
-
- `status`
|
|
551
|
-
- `pack ./my-plugin`
|
|
552
|
-
- `publish ./my-plugin --dry-run`
|
|
553
|
-
- `submit ./my-plugin --dry-run`
|
|
554
|
-
- `release ./my-plugin --dry-run`
|
|
555
|
-
```
|
|
482
|
+
## Acknowledgements
|
|
556
483
|
|
|
557
|
-
|
|
484
|
+
Pressship is built on the work of many people and projects:
|
|
558
485
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
486
|
+
- [WordPress.org](https://wordpress.org/) and the plugin review team
|
|
487
|
+
- [WP-CLI](https://wp-cli.org/) and [Plugin Check](https://github.com/WordPress/plugin-check)
|
|
488
|
+
- [SQLite Database Integration](https://github.com/WordPress/sqlite-database-integration)
|
|
489
|
+
- [WordPress Playground](https://wordpress.org/playground/)
|
|
490
|
+
- [Playwright](https://playwright.dev/) for browser automation
|
|
491
|
+
- [Docusaurus](https://docusaurus.io/) for the documentation site
|
|
562
492
|
|
|
563
|
-
##
|
|
493
|
+
## Disclaimer
|
|
564
494
|
|
|
565
|
-
|
|
566
|
-
- Login is completed in a real browser.
|
|
567
|
-
- Pressship stores Playwright browser session state locally.
|
|
568
|
-
- `logout` removes Pressship's saved local browser session.
|
|
569
|
-
- `logout` does not revoke other active WordPress.org sessions.
|
|
495
|
+
**Pressship is an independent, community project.** It is not affiliated with, endorsed by, or sponsored by WordPress, WordPress.org, the WordPress Foundation, or Automattic. The WordPress® trademark is the property of the WordPress Foundation.
|
|
570
496
|
|
|
571
497
|
## License
|
|
572
498
|
|
|
573
|
-
MIT
|
|
499
|
+
[MIT](LICENSE) © Pressship contributors
|