pressship 0.1.3 → 0.1.4

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 CHANGED
@@ -1,573 +1,482 @@
1
1
  <p align="center">
2
- <img src="assets/pressship.png" alt="Pressship" width="400">
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
- A modern CLI for preparing, validating, submitting, and releasing WordPress.org plugins from the terminal.
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-339933?logo=node.js&logoColor=white"></a>
11
- <a href="https://wordpress.org/plugins/developers/"><img alt="WordPress.org Plugin Directory" src="https://img.shields.io/badge/WordPress.org-plugin%20directory-3858e9?logo=wordpress&logoColor=white"></a>
12
- <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-blue.svg"></a>
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
- <strong>A modernized publishing workflow for WordPress.org plugins.</strong>
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
- It is designed to modernize WordPress plugin publishing while keeping WordPress.org review and SVN release behavior explicit:
30
+ ---
20
31
 
21
- ```bash
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
- If you use agent skills, install Pressship's publishing workflow skill:
34
+ It keeps WordPress.org-specific behavior **explicit** and makes everything around it **quiet**.
28
35
 
29
36
  ```bash
30
- npx skills add f/pressship --skill wordpress-plugin-publish -a codex
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 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.
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
- Pressship automates that workflow while still using WordPress.org's existing review and release systems.
44
-
45
- ## Features
44
+ If you've used `npm publish`, this should feel familiar.
46
45
 
47
- - Browser-based WordPress.org login with saved local session state.
48
- - `whoami` and `logout` commands for session management.
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
46
+ ## Quick start
67
47
 
68
48
  ```bash
69
- # Authenticate with WordPress.org.
49
+ # 1. Authenticate with WordPress.org
70
50
  npx pressship login
71
51
 
72
- # Confirm the saved account.
52
+ # 2. (Optional) Verify the saved session
73
53
  npx pressship whoami
74
54
 
75
- # Inspect current submitted plugin state.
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, reupload a pending plugin, or release an approved plugin.
58
+ # 4. Submit for review or release an approved plugin
90
59
  npx pressship publish ./my-plugin
91
60
  ```
92
61
 
93
- You can still use the explicit WordPress.org review and SVN flows:
62
+ That's it. Pressship handles browser-based login, packaging, readme validation, Plugin Check, and routing between submission and SVN release.
94
63
 
95
- ```bash
96
- npx pressship submit ./my-plugin
97
- npx pressship release ./my-plugin --slug my-plugin --username WpOrgUser
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 or newer.
103
- - A WordPress.org account.
104
- - Internet access for first-run browser and Plugin Check setup.
105
- - PHP for Pressship's managed Plugin Check environment when system WP-CLI is unavailable.
106
- - `svn` for approved-plugin `pressship publish --release` and `pressship release`.
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
- Pressship installs Playwright Chromium automatically when browser automation first needs it.
85
+ Playwright Chromium is installed automatically the first time browser automation runs.
109
86
 
110
- ## Command Overview
87
+ ## Commands
111
88
 
112
- ```bash
113
- pressship login
114
- pressship whoami [--json]
115
- pressship logout
116
- pressship info [slug-or-path] [--json]
117
- pressship demo [slug-or-path] [options]
118
- pressship status [plugin-path-or-slug] [--json]
119
- pressship version <patch|minor|major> [plugin-path]
120
- pressship pack [plugin-path] [options]
121
- pressship publish [plugin-path] [options]
122
- pressship submit [plugin-path] [options]
123
- pressship release [plugin-path] [options]
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
- ## Login Flow
105
+ Get help for any command:
127
106
 
128
107
  ```bash
129
- pressship login
108
+ pressship <command> --help
130
109
  ```
131
110
 
132
- Pressship 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.
133
-
134
- Pressship does not store your WordPress.org password.
135
-
136
- Useful commands:
111
+ ## Authentication
137
112
 
138
113
  ```bash
139
- pressship whoami
140
- pressship whoami --json
141
- pressship logout
114
+ pressship login
142
115
  ```
143
116
 
144
- ## Info Flow
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 info
148
- pressship info ./my-plugin
149
- pressship info 16deza-table-cell-extras
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
- `info` shows detailed metadata for a local plugin path or hosted WordPress.org plugin. With no argument, it inspects the current directory.
125
+ > Pressship never reads, transmits, or stores your WordPress.org password.
155
126
 
156
- For local plugins it reports headers and readme metadata, including version, main file, readme path, text domain, requirements, stable tag, tags, contributors, and description.
127
+ ## Publishing
157
128
 
158
- For hosted plugins it uses the public WordPress.org plugin info API and reports version, author, requirements, active installs, last updated date, rating, support status, tags, description, and download URL.
129
+ `publish` is the modern, opinionated happy path. It inspects your plugin and routes to the right flow:
159
130
 
160
- ## Demo Flow
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 demo
164
- pressship demo ./my-plugin
165
- pressship demo 16deza-table-cell-extras
166
- pressship demo https://wordpress.org/plugins/16deza-table-cell-extras/
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
- `demo` starts a local WordPress Playground server with the plugin loaded and activated. For local paths, Pressship mounts the plugin directory into Playground so local code changes are available. For hosted slugs or WordPress.org plugin URLs, Pressship creates a Blueprint that installs and activates the plugin from the WordPress.org directory.
145
+ Need fine-grained control? Use the explicit subcommands `submit` and `release`.
170
146
 
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.
172
-
173
- Useful options:
147
+ ## Packaging
174
148
 
175
149
  ```bash
176
- pressship demo ./my-plugin --port 9401
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
- Under the hood, `demo` uses the official `@wp-playground/cli` package. The Playground server keeps running until you stop it with `Ctrl+C`.
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 status
188
- pressship status ./my-plugin
189
- pressship status my-plugin
190
- pressship status my-plugin --json
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
- `status` reads the logged-in WordPress.org developer page and reports the current state of submitted plugins.
194
-
195
- For pending submissions it can show:
162
+ ### Ignore rules
196
163
 
197
- - Review status.
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.
164
+ Default exclusions: `.git`, `.gitignore`, `.github`, `.DS_Store`, `.idea`, `.vscode`, `.env*`, `node_modules`, `dist`, `build`, `coverage`, `tests`, `*.log`, `*.zip`.
206
165
 
207
- When given a local plugin path, Pressship discovers the plugin headers and uses the inferred slug/name to find the matching WordPress.org submission.
166
+ Add per-project exclusions in a `.pressshipignore` file (same syntax as `.gitignore`):
208
167
 
209
- Example output:
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
- ## Version Flow
174
+ Or pass `--ignore <glob>` directly (repeat as needed):
224
175
 
225
176
  ```bash
226
- pressship version patch
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
- `version` bumps local plugin metadata from the command line.
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
- # 1.2.3 -> 1.2.4
242
- pressship version patch
243
-
244
- # 1.2.3 -> 1.3.0
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
- ## Publish Flow
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 publish ./my-plugin
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
- `publish` is the modernized happy path. It discovers the plugin and then chooses the best WordPress.org publishing flow:
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.
258
202
 
259
- - Use `submit` when a matching WordPress.org review submission is pending or reuploadable.
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.
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.
262
204
 
263
- Useful options:
205
+ ## Inspecting submission state
264
206
 
265
207
  ```bash
266
- pressship publish ./my-plugin --dry-run
267
- pressship publish ./my-plugin --submit
268
- pressship publish ./my-plugin --release --username WpOrgUser
269
- pressship publish ./my-plugin --skip-plugin-check
270
- pressship publish ./my-plugin --skip-readme-validator
271
- pressship publish ./my-plugin --wp-path /path/to/wordpress
272
- pressship publish ./my-plugin --ignore "assets/**/*.mp4"
273
- pressship publish ./my-plugin --yes
208
+ pressship status # All submitted plugins
209
+ pressship status ./my-plugin # Match by local plugin
210
+ pressship status my-plugin # Match by slug
211
+ pressship status my-plugin --json
274
212
  ```
275
213
 
276
- Use `--submit` for the review-upload flow and `--release` for the approved-plugin SVN flow when you want to be explicit.
277
-
278
- ## Pack Flow
214
+ Sample output:
279
215
 
280
- ```bash
281
- pressship pack ./my-plugin
216
+ ```
217
+ Pressmind
218
+ Status Awaiting Review — This plugin has not yet been reviewed.
219
+ Slug pressmind
220
+ Submitted May 14, 2026
221
+ Plugin ID 313331
222
+ Reupload available
223
+ Slug change available
224
+ File pressmind.zip
225
+ Version 0.0.3
282
226
  ```
283
227
 
284
- `pack` 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.
285
-
286
- Useful options:
228
+ ## Plugin metadata
287
229
 
288
230
  ```bash
289
- pressship pack ./my-plugin --output-dir ./build
290
- pressship pack ./my-plugin --ignore "assets/**/*.mp4"
291
- pressship pack ./my-plugin --skip-readme-validator
292
- pressship pack ./my-plugin --wp-path /path/to/wordpress
293
- pressship pack ./my-plugin --no-validate
294
- pressship pack ./my-plugin --json
231
+ pressship info # Current directory
232
+ pressship info ./my-plugin # Local path
233
+ pressship info 16deza-table-cell-extras # Hosted slug
234
+ pressship info ./my-plugin --json
295
235
  ```
296
236
 
297
- Use `--no-validate` only when you intentionally want to create the zip without readme validation or Plugin Check.
237
+ For local plugins, Pressship parses headers and readme metadata. For hosted plugins it queries the official WordPress.org plugin info API.
298
238
 
299
- ## Submit Flow
239
+ ## Version bumping
300
240
 
301
241
  ```bash
302
- pressship submit ./my-plugin
242
+ pressship version patch # 1.2.3 → 1.2.4
243
+ pressship version minor # 1.2.3 → 1.3.0
244
+ pressship version major # 1.2.3 → 2.0.0
303
245
  ```
304
246
 
305
- `submit` is the explicit WordPress.org review preparation flow. It is equivalent to `publish --submit`:
247
+ Updates the `Version:` header in the main plugin file **and** the `Stable tag:` in `readme.txt` together.
306
248
 
307
- 1. Discover the plugin main file.
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.
249
+ ## Playground demos
316
250
 
317
- 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.
251
+ ```bash
252
+ pressship demo ./my-plugin # Mount local plugin into Playground
253
+ pressship demo 16deza-table-cell-extras # Install hosted plugin from WP.org
254
+ ```
318
255
 
319
- Useful options:
256
+ 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
257
 
321
258
  ```bash
322
- pressship submit ./my-plugin --dry-run
323
- pressship submit ./my-plugin --skip-plugin-check
324
- pressship submit ./my-plugin --skip-readme-validator
325
- pressship submit ./my-plugin --wp-path /path/to/wordpress
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
259
+ pressship demo ./my-plugin --port 9401
260
+ pressship demo ./my-plugin --wp 6.8 --php 8.3
261
+ pressship demo ./my-plugin --reset
262
+ pressship demo ./my-plugin --skip-browser
330
263
  ```
331
264
 
265
+ The Playground server keeps running until you stop it with `Ctrl+C`.
266
+
332
267
  ## Managed Plugin Check
333
268
 
334
- By default, Pressship prepares its own local Plugin Check environment in your user config cache.
269
+ 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
270
 
336
- It can automatically:
271
+ 1. Detects (or downloads) WP-CLI.
272
+ 2. Downloads WordPress core.
273
+ 3. Sets up SQLite Database Integration (no MySQL required).
274
+ 4. Runs `wp core install` against the SQLite-backed site.
275
+ 5. Installs the WordPress.org Plugin Check plugin.
276
+ 6. Bootstraps it with the correct `--require` flag.
337
277
 
338
- - Use system WP-CLI when available.
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.
278
+ All cached under `~/.config/pressship/`.
346
279
 
347
- This means most users can run:
280
+ If you'd rather use your own install:
348
281
 
349
282
  ```bash
350
- pressship submit ./my-plugin --dry-run
283
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
351
284
  ```
352
285
 
353
- without manually installing WordPress, WP-CLI, MySQL, or the Plugin Check plugin.
354
-
355
- If you already have a local WordPress install with Plugin Check available, pass it explicitly:
286
+ Or skip Plugin Check entirely:
356
287
 
357
288
  ```bash
358
- pressship submit ./my-plugin --wp-path /path/to/wordpress
289
+ pressship publish ./my-plugin --skip-plugin-check
359
290
  ```
360
291
 
361
- ## Release Flow
292
+ ## Releasing through SVN
293
+
294
+ For approved plugins:
362
295
 
363
296
  ```bash
364
- pressship release ./my-plugin --slug my-plugin --username WpOrgUser
297
+ pressship release ./my-plugin
365
298
  ```
366
299
 
367
- WordPress.org initial review uses a zip upload. Approved plugin releases use SVN. Pressship keeps those workflows separate. `release` is equivalent to `publish --release`.
368
-
369
- `release` will:
300
+ Pressship will:
370
301
 
371
302
  1. Checkout or update `https://plugins.svn.wordpress.org/<slug>`.
372
303
  2. Sync packaged plugin files into `trunk/`.
373
- 3. Create `tags/<version>` from trunk.
374
- 4. Show `svn status`.
375
- 5. Ask for confirmation.
376
- 6. Commit the release.
304
+ 3. Sync `.wordpress-org/` assets into the SVN `assets/` directory when that folder exists.
305
+ 4. Create `tags/<version>` from `trunk/`.
306
+ 5. Show `svn status` and ask before committing.
307
+ 6. Commit with `--no-auth-cache` and a generated WordPress.org SVN password.
308
+
309
+ 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:
310
+
311
+ ```text
312
+ https://profiles.wordpress.org/<username>/profile/edit/group/3/?screen=svn-password
313
+ ```
377
314
 
378
- Useful options:
315
+ 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
316
 
380
317
  ```bash
381
318
  pressship release ./my-plugin --slug my-plugin
382
319
  pressship release ./my-plugin --version 1.2.3
383
320
  pressship release ./my-plugin --username WpOrgUser
384
321
  pressship release ./my-plugin --message "Release 1.2.3"
385
- pressship release ./my-plugin --ignore "assets/**/*.mp4"
386
322
  pressship release ./my-plugin --dry-run
387
323
  pressship release ./my-plugin --yes
324
+ pressship release ./my-plugin --no-install-svn
388
325
  ```
389
326
 
390
- ## Packaging Rules
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:
395
-
396
- - `.git`
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`
327
+ ## Agent skill
413
328
 
414
- Add a `.pressshipignore` file in your plugin directory for project-specific exclusions:
329
+ 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.
415
330
 
416
- ```gitignore
417
- assets/**/*.mp4
418
- docs/raw/**
419
- playground/**
331
+ ```bash
332
+ npx skills add f/pressship --skill wordpress-plugin-publish -a codex
420
333
  ```
421
334
 
422
- You can also ignore files per command:
335
+ Replace `codex` with another supported agent name, e.g. `claude-code`. List available skills first:
423
336
 
424
337
  ```bash
425
- pressship submit ./my-plugin --ignore "assets/**/*.mp4"
426
- pressship publish ./my-plugin --ignore "assets/**/*.mp4"
427
- pressship pack ./my-plugin --ignore "assets/**/*.mp4"
428
- pressship release ./my-plugin --ignore "assets/**/*.mp4"
338
+ npx skills add f/pressship --list
429
339
  ```
430
340
 
431
- ## Configuration And Cache
341
+ ## Configuration
432
342
 
433
343
  Pressship stores local state under your user config directory:
434
344
 
435
- ```text
345
+ ```
436
346
  ~/.config/pressship/
437
347
  ```
438
348
 
439
- This includes:
349
+ Contents:
440
350
 
441
- - WordPress.org browser session storage.
442
- - Debug screenshots for failed browser automation.
443
- - Managed Plugin Check cache.
444
- - Managed WordPress core and SQLite setup.
445
- - Generated Playground demo blueprints.
351
+ - WordPress.org browser session storage
352
+ - Saved WordPress.org SVN passwords for release commits
353
+ - Debug screenshots from failed browser automation
354
+ - Managed Plugin Check cache (WP-CLI phar, WordPress core, SQLite, Plugin Check plugin)
355
+ - Generated Playground demo blueprints
446
356
 
447
- You can override the config directory:
357
+ Override the location:
448
358
 
449
359
  ```bash
450
360
  PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship status
451
361
  ```
452
362
 
453
- For migration compatibility, `PRESSPORT_CONFIG_DIR` is still accepted as a fallback.
363
+ > `PRESSPORT_CONFIG_DIR` is still respected as a legacy fallback.
454
364
 
455
- ## Troubleshooting
365
+ ## Documentation
456
366
 
457
- ### Browser Runtime Missing
367
+ Full docs live at **<https://pressship.org>**.
458
368
 
459
- Pressship installs Chromium automatically. If that fails, run:
369
+ The source is in [`website/`](./website) and runs as a standard Docusaurus site:
460
370
 
461
371
  ```bash
462
- npx playwright install chromium
372
+ npm run docs:dev # Local dev server
373
+ npm run docs:build # Production build
374
+ npm run docs:serve # Preview production build
463
375
  ```
464
376
 
465
- For local development:
377
+ GitHub Pages deployment is wired up in [`.github/workflows/docs.yml`](.github/workflows/docs.yml).
378
+
379
+ ## Development
466
380
 
467
381
  ```bash
468
- Run the `browsers:install` package script.
382
+ npm install
383
+ npm run dev -- --help # Run the CLI locally
384
+ npm run typecheck
385
+ npm test
386
+ npm run build
469
387
  ```
470
388
 
471
- ### Not Logged In
472
-
473
- Run:
389
+ Try local commands without publishing the package:
474
390
 
475
391
  ```bash
476
- pressship login
477
- pressship whoami
392
+ npm run dev -- login
393
+ npm run dev -- whoami
394
+ npm run dev -- pack ./my-plugin
395
+ npm run dev -- publish ./my-plugin --dry-run
478
396
  ```
479
397
 
480
- If the saved session is stale:
398
+ Package smoke test:
481
399
 
482
400
  ```bash
483
- pressship logout
484
- pressship login
401
+ npm pack --dry-run
485
402
  ```
486
403
 
487
- ### Plugin Check Setup Problems
404
+ ## Troubleshooting
488
405
 
489
- The managed Plugin Check environment is automatic, but it still needs PHP and internet access on first run.
406
+ <details>
407
+ <summary><strong>Browser runtime missing</strong></summary>
490
408
 
491
- To bypass Plugin Check:
409
+ Pressship installs Chromium automatically. If that fails:
492
410
 
493
411
  ```bash
494
- pressship submit ./my-plugin --skip-plugin-check
412
+ npx playwright install chromium
495
413
  ```
414
+ </details>
496
415
 
497
- To use your own WordPress install:
416
+ <details>
417
+ <summary><strong>Session expired or not logged in</strong></summary>
498
418
 
499
419
  ```bash
500
- pressship submit ./my-plugin --wp-path /path/to/wordpress
420
+ pressship logout
421
+ pressship login
501
422
  ```
423
+ </details>
502
424
 
503
- ### WordPress.org Form Changes
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/`.
425
+ <details>
426
+ <summary><strong>Plugin Check setup problems</strong></summary>
510
427
 
511
- Run it locally:
428
+ The managed environment needs PHP and internet access on first run. To bypass:
512
429
 
513
430
  ```bash
514
- Run the `docs:dev` package script.
431
+ pressship publish ./my-plugin --skip-plugin-check
515
432
  ```
516
433
 
517
- Build the static site:
434
+ To use your own WordPress install:
518
435
 
519
436
  ```bash
520
- Run the `docs:build` package script.
437
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
521
438
  ```
439
+ </details>
522
440
 
523
- Preview the production build:
441
+ <details>
442
+ <summary><strong>WordPress.org form changes</strong></summary>
524
443
 
525
- ```bash
526
- Run the `docs:serve` package script.
527
- ```
444
+ 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/`.
445
+ </details>
528
446
 
529
- GitHub Pages deployment is configured in `.github/workflows/docs.yml`. In the repository settings, set Pages to use GitHub Actions as the source.
447
+ ## Security
530
448
 
531
- ## Development
449
+ - Pressship **never stores your WordPress.org password**.
450
+ - Login is completed in a real browser by you.
451
+ - Playwright browser session state is stored locally for WordPress.org browser automation.
452
+ - If you run an SVN release, Pressship can store the generated WordPress.org SVN password locally so future commits can run non-interactively.
453
+ - `pressship logout` removes the local browser session; it does **not** revoke other active WordPress.org sessions.
532
454
 
533
- ```bash
534
- Install dependencies with your preferred Node package manager, then run:
455
+ ## Contributing
535
456
 
536
- - `dev -- --help`
537
- - `typecheck`
538
- - `test`
539
- - `build`
540
- - `docs:build`
541
- ```
457
+ Issues, ideas, and pull requests are welcome. Please open an issue first for larger changes so we can discuss the direction.
542
458
 
543
- Run local commands without publishing:
459
+ When opening a PR, please:
544
460
 
545
- ```bash
546
- Run these through the `dev` package script:
461
+ - Add or update relevant tests (`npm test`).
462
+ - Run `npm run typecheck` and `npm run build`.
463
+ - Keep new commands consistent with the existing CLI patterns.
547
464
 
548
- - `login`
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
- ```
465
+ ## Acknowledgements
556
466
 
557
- Package smoke test:
467
+ Pressship is built on the work of many people and projects:
558
468
 
559
- ```bash
560
- Use your package manager's dry-run pack command.
561
- ```
469
+ - [WordPress.org](https://wordpress.org/) and the plugin review team
470
+ - [WP-CLI](https://wp-cli.org/) and [Plugin Check](https://github.com/WordPress/plugin-check)
471
+ - [SQLite Database Integration](https://github.com/WordPress/sqlite-database-integration)
472
+ - [WordPress Playground](https://wordpress.org/playground/)
473
+ - [Playwright](https://playwright.dev/) for browser automation
474
+ - [Docusaurus](https://docusaurus.io/) for the documentation site
562
475
 
563
- ## Security Notes
476
+ ## Disclaimer
564
477
 
565
- - Pressship does not store your WordPress.org password.
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.
478
+ **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
479
 
571
480
  ## License
572
481
 
573
- MIT
482
+ [MIT](LICENSE) © Pressship contributors