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.
Files changed (39) hide show
  1. package/README.md +282 -356
  2. package/assets/logo-new.png +0 -0
  3. package/assets/pressship-dark.png +0 -0
  4. package/assets/pressship-square-dark.png +0 -0
  5. package/assets/pressship-square.png +0 -0
  6. package/assets/pressship-symbol-dark.png +0 -0
  7. package/assets/pressship-symbol.png +0 -0
  8. package/assets/pressship-wordmark-dark.png +0 -0
  9. package/assets/pressship-wordmark.png +0 -0
  10. package/assets/pressship.png +0 -0
  11. package/dist/cli.js +22 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/package/ignore.js +4 -0
  14. package/dist/package/ignore.js.map +1 -1
  15. package/dist/plugin/discover.d.ts +8 -0
  16. package/dist/plugin/discover.js +27 -1
  17. package/dist/plugin/discover.js.map +1 -1
  18. package/dist/plugin/list.d.ts +24 -0
  19. package/dist/plugin/list.js +174 -0
  20. package/dist/plugin/list.js.map +1 -0
  21. package/dist/svn/credentials.d.ts +9 -0
  22. package/dist/svn/credentials.js +94 -0
  23. package/dist/svn/credentials.js.map +1 -0
  24. package/dist/svn/get.d.ts +45 -0
  25. package/dist/svn/get.js +139 -0
  26. package/dist/svn/get.js.map +1 -0
  27. package/dist/svn/release.d.ts +2 -0
  28. package/dist/svn/release.js +113 -18
  29. package/dist/svn/release.js.map +1 -1
  30. package/dist/svn/subversion.d.ts +18 -0
  31. package/dist/svn/subversion.js +171 -0
  32. package/dist/svn/subversion.js.map +1 -0
  33. package/dist/utils/paths.d.ts +1 -0
  34. package/dist/utils/paths.js +3 -0
  35. package/dist/utils/paths.js.map +1 -1
  36. package/dist/wordpress-org/publish.d.ts +2 -0
  37. package/dist/wordpress-org/publish.js +16 -8
  38. package/dist/wordpress-org/publish.js.map +1 -1
  39. package/package.json +2 -1
package/README.md CHANGED
@@ -1,573 +1,499 @@
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
+ If you've used `npm publish`, this should feel familiar.
44
45
 
45
- ## Features
46
+ ## Quick start
46
47
 
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
67
-
68
- ```bash
69
- # Authenticate with WordPress.org.
48
+ ```bash
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.
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
- 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.
162
+ ### Ignore rules
194
163
 
195
- For pending submissions it can show:
164
+ Default exclusions: `.git`, `.gitignore`, `.github`, `.DS_Store`, `.idea`, `.vscode`, `.env*`, `.pressship-svn`, `node_modules`, `dist`, `build`, `coverage`, `tests`, `*.log`, `*.zip`.
196
165
 
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.
166
+ Add per-project exclusions in a `.pressshipignore` file (same syntax as `.gitignore`):
206
167
 
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.
208
-
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.
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
- - 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.
205
+ ### Editing an approved plugin from SVN
262
206
 
263
- Useful options:
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 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
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
- Use `--submit` for the review-upload flow and `--release` for the approved-plugin SVN flow when you want to be explicit.
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
- ## Pack Flow
219
+ ## Inspecting submission state
279
220
 
280
221
  ```bash
281
- pressship pack ./my-plugin
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
- `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.
228
+ Sample output:
285
229
 
286
- Useful options:
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 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
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
- Use `--no-validate` only when you intentionally want to create the zip without readme validation or Plugin Check.
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
- ## Submit Flow
253
+ ## Version bumping
300
254
 
301
255
  ```bash
302
- pressship submit ./my-plugin
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
- `submit` is the explicit WordPress.org review preparation flow. It is equivalent to `publish --submit`:
261
+ Updates the `Version:` header in the main plugin file **and** the `Stable tag:` in `readme.txt` together.
306
262
 
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.
263
+ ## Playground demos
316
264
 
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.
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
- Useful options:
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 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
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 prepares its own local Plugin Check environment in your user config cache.
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
- It can automatically:
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
- - 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.
292
+ All cached under `~/.config/pressship/`.
346
293
 
347
- This means most users can run:
294
+ If you'd rather use your own install:
348
295
 
349
296
  ```bash
350
- pressship submit ./my-plugin --dry-run
297
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
351
298
  ```
352
299
 
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:
300
+ Or skip Plugin Check entirely:
356
301
 
357
302
  ```bash
358
- pressship submit ./my-plugin --wp-path /path/to/wordpress
303
+ pressship publish ./my-plugin --skip-plugin-check
359
304
  ```
360
305
 
361
- ## Release Flow
306
+ ## Releasing through SVN
307
+
308
+ For approved plugins:
362
309
 
363
310
  ```bash
364
- pressship release ./my-plugin --slug my-plugin --username WpOrgUser
311
+ pressship release ./my-plugin
365
312
  ```
366
313
 
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:
314
+ Pressship will:
370
315
 
371
316
  1. Checkout or update `https://plugins.svn.wordpress.org/<slug>`.
372
- 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.
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
- Useful options:
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
- ## 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:
344
+ ## Agent skill
395
345
 
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`
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
- Add a `.pressshipignore` file in your plugin directory for project-specific exclusions:
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
- You can also ignore files per command:
352
+ Replace `codex` with another supported agent name, e.g. `claude-code`. List available skills first:
423
353
 
424
354
  ```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"
355
+ npx skills add f/pressship --list
429
356
  ```
430
357
 
431
- ## Configuration And Cache
358
+ ## Configuration
432
359
 
433
360
  Pressship stores local state under your user config directory:
434
361
 
435
- ```text
362
+ ```
436
363
  ~/.config/pressship/
437
364
  ```
438
365
 
439
- This includes:
366
+ Contents:
440
367
 
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.
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
- You can override the config directory:
374
+ Override the location:
448
375
 
449
376
  ```bash
450
377
  PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship status
451
378
  ```
452
379
 
453
- For migration compatibility, `PRESSPORT_CONFIG_DIR` is still accepted as a fallback.
380
+ > `PRESSPORT_CONFIG_DIR` is still respected as a legacy fallback.
454
381
 
455
- ## Troubleshooting
382
+ ## Documentation
456
383
 
457
- ### Browser Runtime Missing
384
+ Full docs live at **<https://pressship.org>**.
458
385
 
459
- Pressship installs Chromium automatically. If that fails, run:
386
+ The source is in [`website/`](./website) and runs as a standard Docusaurus site:
460
387
 
461
388
  ```bash
462
- npx playwright install chromium
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
- For local development:
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
- Run the `browsers:install` package script.
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
- ### Not Logged In
472
-
473
- Run:
406
+ Try local commands without publishing the package:
474
407
 
475
408
  ```bash
476
- pressship login
477
- pressship whoami
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
- If the saved session is stale:
415
+ Package smoke test:
481
416
 
482
417
  ```bash
483
- pressship logout
484
- pressship login
418
+ npm pack --dry-run
485
419
  ```
486
420
 
487
- ### Plugin Check Setup Problems
421
+ ## Troubleshooting
488
422
 
489
- The managed Plugin Check environment is automatic, but it still needs PHP and internet access on first run.
423
+ <details>
424
+ <summary><strong>Browser runtime missing</strong></summary>
490
425
 
491
- To bypass Plugin Check:
426
+ Pressship installs Chromium automatically. If that fails:
492
427
 
493
428
  ```bash
494
- pressship submit ./my-plugin --skip-plugin-check
429
+ npx playwright install chromium
495
430
  ```
431
+ </details>
496
432
 
497
- To use your own WordPress install:
433
+ <details>
434
+ <summary><strong>Session expired or not logged in</strong></summary>
498
435
 
499
436
  ```bash
500
- pressship submit ./my-plugin --wp-path /path/to/wordpress
437
+ pressship logout
438
+ pressship login
501
439
  ```
440
+ </details>
502
441
 
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/`.
442
+ <details>
443
+ <summary><strong>Plugin Check setup problems</strong></summary>
510
444
 
511
- Run it locally:
445
+ The managed environment needs PHP and internet access on first run. To bypass:
512
446
 
513
447
  ```bash
514
- Run the `docs:dev` package script.
448
+ pressship publish ./my-plugin --skip-plugin-check
515
449
  ```
516
450
 
517
- Build the static site:
451
+ To use your own WordPress install:
518
452
 
519
453
  ```bash
520
- Run the `docs:build` package script.
454
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
521
455
  ```
456
+ </details>
522
457
 
523
- Preview the production build:
458
+ <details>
459
+ <summary><strong>WordPress.org form changes</strong></summary>
524
460
 
525
- ```bash
526
- Run the `docs:serve` package script.
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
- GitHub Pages deployment is configured in `.github/workflows/docs.yml`. In the repository settings, set Pages to use GitHub Actions as the source.
464
+ ## Security
530
465
 
531
- ## Development
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
- ```bash
534
- Install dependencies with your preferred Node package manager, then run:
472
+ ## Contributing
535
473
 
536
- - `dev -- --help`
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
- Run local commands without publishing:
476
+ When opening a PR, please:
544
477
 
545
- ```bash
546
- Run these through the `dev` package script:
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
- - `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
- ```
482
+ ## Acknowledgements
556
483
 
557
- Package smoke test:
484
+ Pressship is built on the work of many people and projects:
558
485
 
559
- ```bash
560
- Use your package manager's dry-run pack command.
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
- ## Security Notes
493
+ ## Disclaimer
564
494
 
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.
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