pressship 0.1.2 → 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.
Files changed (43) hide show
  1. package/.claude/skills/wordpress-plugin-publish/SKILL.md +153 -0
  2. package/README.md +285 -280
  3. package/assets/logo-new.png +0 -0
  4. package/assets/pressship-dark.png +0 -0
  5. package/assets/pressship-square-dark.png +0 -0
  6. package/assets/pressship-square.png +0 -0
  7. package/assets/pressship-symbol-dark.png +0 -0
  8. package/assets/pressship-symbol.png +0 -0
  9. package/assets/pressship-wordmark-dark.png +0 -0
  10. package/assets/pressship-wordmark.png +0 -0
  11. package/assets/pressship.png +0 -0
  12. package/dist/cli.js +40 -2
  13. package/dist/cli.js.map +1 -1
  14. package/dist/package/ignore.js +2 -0
  15. package/dist/package/ignore.js.map +1 -1
  16. package/dist/plugin/demo.d.ts +44 -0
  17. package/dist/plugin/demo.js +207 -0
  18. package/dist/plugin/demo.js.map +1 -0
  19. package/dist/plugin/info.d.ts +84 -0
  20. package/dist/plugin/info.js +209 -0
  21. package/dist/plugin/info.js.map +1 -0
  22. package/dist/plugin/list.d.ts +24 -0
  23. package/dist/plugin/list.js +174 -0
  24. package/dist/plugin/list.js.map +1 -0
  25. package/dist/svn/credentials.d.ts +9 -0
  26. package/dist/svn/credentials.js +94 -0
  27. package/dist/svn/credentials.js.map +1 -0
  28. package/dist/svn/get.d.ts +45 -0
  29. package/dist/svn/get.js +139 -0
  30. package/dist/svn/get.js.map +1 -0
  31. package/dist/svn/release.d.ts +1 -0
  32. package/dist/svn/release.js +90 -13
  33. package/dist/svn/release.js.map +1 -1
  34. package/dist/svn/subversion.d.ts +18 -0
  35. package/dist/svn/subversion.js +171 -0
  36. package/dist/svn/subversion.js.map +1 -0
  37. package/dist/utils/paths.d.ts +1 -0
  38. package/dist/utils/paths.js +3 -0
  39. package/dist/utils/paths.js.map +1 -1
  40. package/dist/wordpress-org/publish.d.ts +1 -0
  41. package/dist/wordpress-org/publish.js +4 -2
  42. package/dist/wordpress-org/publish.js.map +1 -1
  43. package/package.json +6 -1
package/README.md CHANGED
@@ -1,477 +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>WordPress.org plugin publishing, but closer to <code>npm publish</code>.</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 make WordPress plugin publishing feel closer to npm package publishing:
30
+ ---
31
+
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/).
33
+
34
+ It keeps WordPress.org-specific behavior **explicit** and makes everything around it **quiet**.
20
35
 
21
36
  ```bash
22
- npx pressship login
23
- npx pressship publish ./my-plugin --dry-run
24
37
  npx pressship publish ./my-plugin
25
38
  ```
26
39
 
27
40
  ## Why Pressship?
28
41
 
29
- 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.
30
43
 
31
- 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.
32
45
 
33
- ## Features
34
-
35
- - Browser-based WordPress.org login with saved local session state.
36
- - `whoami` and `logout` commands for session management.
37
- - Plugin discovery from WordPress plugin headers.
38
- - `readme.txt` parsing and local validation.
39
- - WordPress.org readme validator automation.
40
- - WordPress-installable zip generation.
41
- - npm-style `publish` and `pack` commands.
42
- - Managed WordPress.org Plugin Check setup and execution.
43
- - Current WordPress.org submission state inspection.
44
- - Pending-plugin reupload support via the WordPress.org developer page.
45
- - SVN release workflow for approved plugins.
46
- - Repeatable ignore globs and `.pressshipignore` support.
47
- - Colorful CLI output with progress indicators.
48
-
49
- ## Quick Start
46
+ ## Quick start
50
47
 
51
48
  ```bash
52
- # Authenticate with WordPress.org.
49
+ # 1. Authenticate with WordPress.org
53
50
  npx pressship login
54
51
 
55
- # Confirm the saved account.
52
+ # 2. (Optional) Verify the saved session
56
53
  npx pressship whoami
57
54
 
58
- # Inspect current submitted plugin state.
59
- npx pressship status ./my-plugin
60
-
61
- # Validate and package without uploading or committing.
55
+ # 3. Validate, package, and check without uploading
62
56
  npx pressship publish ./my-plugin --dry-run
63
57
 
64
- # Submit for review, reupload a pending plugin, or release an approved plugin.
58
+ # 4. Submit for review or release an approved plugin
65
59
  npx pressship publish ./my-plugin
66
60
  ```
67
61
 
68
- 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.
69
63
 
70
- ```bash
71
- npx pressship submit ./my-plugin
72
- npx pressship release ./my-plugin --slug my-plugin --username WpOrgUser
73
- ```
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.
74
76
 
75
77
  ## Requirements
76
78
 
77
- - Node.js 20 or newer.
78
- - A WordPress.org account.
79
- - Internet access for first-run browser and Plugin Check setup.
80
- - PHP for Pressship's managed Plugin Check environment when system WP-CLI is unavailable.
81
- - `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.
84
+
85
+ Playwright Chromium is installed automatically the first time browser automation runs.
86
+
87
+ ## Commands
88
+
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. |
104
+
105
+ Get help for any command:
82
106
 
83
- Pressship installs Playwright Chromium automatically when browser automation first needs it.
107
+ ```bash
108
+ pressship <command> --help
109
+ ```
84
110
 
85
- ## Command Overview
111
+ ## Authentication
86
112
 
87
113
  ```bash
88
114
  pressship login
89
- pressship whoami [--json]
90
- pressship logout
91
- pressship status [plugin-path-or-slug] [--json]
92
- pressship version <patch|minor|major> [plugin-path]
93
- pressship pack [plugin-path] [options]
94
- pressship publish [plugin-path] [options]
95
- pressship submit [plugin-path] [options]
96
- pressship release [plugin-path] [options]
97
115
  ```
98
116
 
99
- ## Login 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.
100
118
 
101
119
  ```bash
102
- pressship login
120
+ pressship whoami # Print the active account
121
+ pressship whoami --json # Machine-readable output
122
+ pressship logout # Remove the local session
103
123
  ```
104
124
 
105
- 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.
125
+ > Pressship never reads, transmits, or stores your WordPress.org password.
106
126
 
107
- Pressship does not store your WordPress.org password.
127
+ ## Publishing
108
128
 
109
- Useful commands:
129
+ `publish` is the modern, opinionated happy path. It inspects your plugin and routes to the right flow:
130
+
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.
110
135
 
111
136
  ```bash
112
- pressship whoami
113
- pressship whoami --json
114
- pressship logout
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
115
143
  ```
116
144
 
117
- ## Status Flow
145
+ Need fine-grained control? Use the explicit subcommands `submit` and `release`.
146
+
147
+ ## Packaging
118
148
 
119
149
  ```bash
120
- pressship status
121
- pressship status ./my-plugin
122
- pressship status my-plugin
123
- pressship status my-plugin --json
150
+ pressship pack ./my-plugin
124
151
  ```
125
152
 
126
- `status` reads the logged-in WordPress.org developer page and reports the current state of submitted plugins.
153
+ Validates the plugin, runs Plugin Check, and writes `{slug}.zip` without uploading. Useful for CI artifacts or manual uploads.
127
154
 
128
- For pending submissions it can show:
155
+ ```bash
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
160
+ ```
129
161
 
130
- - Review status.
131
- - Assigned slug.
132
- - Plugin ID.
133
- - Submitted zip filename.
134
- - Submitted version.
135
- - Upload date.
136
- - Plugin Check URL.
137
- - Whether slug change is available.
138
- - Whether updated zip upload is available.
162
+ ### Ignore rules
139
163
 
140
- When given a local plugin path, Pressship discovers the plugin headers and uses the inferred slug/name to find the matching WordPress.org submission.
164
+ Default exclusions: `.git`, `.gitignore`, `.github`, `.DS_Store`, `.idea`, `.vscode`, `.env*`, `node_modules`, `dist`, `build`, `coverage`, `tests`, `*.log`, `*.zip`.
141
165
 
142
- Example output:
166
+ Add per-project exclusions in a `.pressshipignore` file (same syntax as `.gitignore`):
143
167
 
144
- ```text
145
- Pressmind
146
- Status Awaiting Review — This plugin has not yet been reviewed.
147
- Slug pressmind
148
- Submitted May 14, 2026
149
- Plugin ID 313331
150
- Reupload available
151
- Slug change available
152
- File pressmind.zip
153
- Version 0.0.3
168
+ ```gitignore
169
+ assets/**/*.mp4
170
+ docs/raw/**
171
+ playground/**
154
172
  ```
155
173
 
156
- ## Version Flow
174
+ Or pass `--ignore <glob>` directly (repeat as needed):
157
175
 
158
176
  ```bash
159
- pressship version patch
160
- pressship version minor ./my-plugin
161
- pressship version major ./my-plugin
177
+ pressship publish ./my-plugin --ignore "assets/**/*.mp4" --ignore "docs/raw/**"
162
178
  ```
163
179
 
164
- `version` bumps local plugin metadata, similar to `npm version`.
165
-
166
- It updates:
167
-
168
- - The main plugin file `Version:` header.
169
- - The `Stable tag:` value in `readme.txt`, when a readme exists.
170
-
171
- Examples:
180
+ ## Listing WordPress.org plugins
172
181
 
173
182
  ```bash
174
- # 1.2.3 -> 1.2.4
175
- pressship version patch
176
-
177
- # 1.2.3 -> 1.3.0
178
- pressship version minor ./my-plugin
179
-
180
- # 1.2.3 -> 2.0.0
181
- 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
182
187
  ```
183
188
 
184
- ## 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
185
192
 
186
193
  ```bash
187
- 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
188
199
  ```
189
200
 
190
- `publish` is the npm-style 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.
191
202
 
192
- - Use `submit` when a matching WordPress.org review submission is pending or reuploadable.
193
- - Use `release` when the plugin has an approved WordPress.org SVN repository and no pending review submission is found.
194
- - 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.
195
204
 
196
- Useful options:
205
+ ## Inspecting submission state
197
206
 
198
207
  ```bash
199
- pressship publish ./my-plugin --dry-run
200
- pressship publish ./my-plugin --submit
201
- pressship publish ./my-plugin --release --username WpOrgUser
202
- pressship publish ./my-plugin --skip-plugin-check
203
- pressship publish ./my-plugin --skip-readme-validator
204
- pressship publish ./my-plugin --wp-path /path/to/wordpress
205
- pressship publish ./my-plugin --ignore "assets/**/*.mp4"
206
- 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
207
212
  ```
208
213
 
209
- Use `--submit` for the review-upload flow and `--release` for the approved-plugin SVN flow when you want to be explicit.
210
-
211
- ## Pack Flow
214
+ Sample output:
212
215
 
213
- ```bash
214
- 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
215
226
  ```
216
227
 
217
- `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, similar to `npm pack`.
218
-
219
- Useful options:
228
+ ## Plugin metadata
220
229
 
221
230
  ```bash
222
- pressship pack ./my-plugin --output-dir ./build
223
- pressship pack ./my-plugin --ignore "assets/**/*.mp4"
224
- pressship pack ./my-plugin --skip-readme-validator
225
- pressship pack ./my-plugin --wp-path /path/to/wordpress
226
- pressship pack ./my-plugin --no-validate
227
- 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
228
235
  ```
229
236
 
230
- 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.
231
238
 
232
- ## Submit Flow
239
+ ## Version bumping
233
240
 
234
241
  ```bash
235
- 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
236
245
  ```
237
246
 
238
- `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.
239
248
 
240
- 1. Discover the plugin main file.
241
- 2. Parse WordPress plugin headers.
242
- 3. Parse and validate `readme.txt`.
243
- 4. Validate `readme.txt` with the WordPress.org readme validator.
244
- 5. Build a WordPress-installable zip.
245
- 6. Stage package contents for Plugin Check.
246
- 7. Run the official WordPress.org Plugin Check.
247
- 8. Ask for confirmation when blocking findings are reported.
248
- 9. Upload the zip to WordPress.org.
249
+ ## Playground demos
249
250
 
250
- 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
+ ```
251
255
 
252
- 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.
253
257
 
254
258
  ```bash
255
- pressship submit ./my-plugin --dry-run
256
- pressship submit ./my-plugin --skip-plugin-check
257
- pressship submit ./my-plugin --skip-readme-validator
258
- pressship submit ./my-plugin --wp-path /path/to/wordpress
259
- pressship submit ./my-plugin --ignore "assets/**/*.mp4"
260
- pressship submit ./my-plugin --ignore "assets/**/*.mp4" --ignore "docs/raw/**"
261
- pressship submit ./my-plugin --output-dir ./build
262
- 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
263
263
  ```
264
264
 
265
+ The Playground server keeps running until you stop it with `Ctrl+C`.
266
+
265
267
  ## Managed Plugin Check
266
268
 
267
- 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:
268
270
 
269
- 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.
270
277
 
271
- - Use system WP-CLI when available.
272
- - Download `wp-cli.phar` when system WP-CLI is unavailable.
273
- - Download WordPress core.
274
- - Create a managed `wp-config.php`.
275
- - Install SQLite Database Integration for a local database-free setup.
276
- - Run `wp core install` against the SQLite-backed local WordPress install.
277
- - Download the WordPress.org Plugin Check plugin.
278
- - Load Plugin Check with the required WP-CLI bootstrap file.
278
+ All cached under `~/.config/pressship/`.
279
279
 
280
- This means most users can run:
280
+ If you'd rather use your own install:
281
281
 
282
282
  ```bash
283
- pressship submit ./my-plugin --dry-run
283
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
284
284
  ```
285
285
 
286
- without manually installing WordPress, WP-CLI, MySQL, or the Plugin Check plugin.
287
-
288
- If you already have a local WordPress install with Plugin Check available, pass it explicitly:
286
+ Or skip Plugin Check entirely:
289
287
 
290
288
  ```bash
291
- pressship submit ./my-plugin --wp-path /path/to/wordpress
289
+ pressship publish ./my-plugin --skip-plugin-check
292
290
  ```
293
291
 
294
- ## Release Flow
292
+ ## Releasing through SVN
293
+
294
+ For approved plugins:
295
295
 
296
296
  ```bash
297
- pressship release ./my-plugin --slug my-plugin --username WpOrgUser
297
+ pressship release ./my-plugin
298
298
  ```
299
299
 
300
- WordPress.org initial review uses a zip upload. Approved plugin releases use SVN. Pressship keeps those workflows separate. `release` is equivalent to `publish --release`.
301
-
302
- `release` will:
300
+ Pressship will:
303
301
 
304
302
  1. Checkout or update `https://plugins.svn.wordpress.org/<slug>`.
305
303
  2. Sync packaged plugin files into `trunk/`.
306
- 3. Create `tags/<version>` from trunk.
307
- 4. Show `svn status`.
308
- 5. Ask for confirmation.
309
- 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
+ ```
310
314
 
311
- 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.
312
316
 
313
317
  ```bash
314
318
  pressship release ./my-plugin --slug my-plugin
315
319
  pressship release ./my-plugin --version 1.2.3
316
320
  pressship release ./my-plugin --username WpOrgUser
317
321
  pressship release ./my-plugin --message "Release 1.2.3"
318
- pressship release ./my-plugin --ignore "assets/**/*.mp4"
319
322
  pressship release ./my-plugin --dry-run
320
323
  pressship release ./my-plugin --yes
324
+ pressship release ./my-plugin --no-install-svn
321
325
  ```
322
326
 
323
- ## Packaging Rules
324
-
325
- Pressship creates a zip with one top-level plugin folder, matching the format expected by WordPress plugin upload.
326
-
327
- It excludes common development artifacts by default:
327
+ ## Agent skill
328
328
 
329
- - `.git`
330
- - `.gitignore`
331
- - `.github`
332
- - `.DS_Store`
333
- - `.idea`
334
- - `.vscode`
335
- - `.env`
336
- - `.env.*`
337
- - `node_modules`
338
- - `dist`
339
- - `build`
340
- - `coverage`
341
- - `tests`
342
- - `*.log`
343
- - `*.zip`
344
- - `.pressshipignore`
345
- - legacy `.pressportignore`
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.
346
330
 
347
- Add a `.pressshipignore` file in your plugin directory for project-specific exclusions:
348
-
349
- ```gitignore
350
- assets/**/*.mp4
351
- docs/raw/**
352
- playground/**
331
+ ```bash
332
+ npx skills add f/pressship --skill wordpress-plugin-publish -a codex
353
333
  ```
354
334
 
355
- You can also ignore files per command:
335
+ Replace `codex` with another supported agent name, e.g. `claude-code`. List available skills first:
356
336
 
357
337
  ```bash
358
- pressship submit ./my-plugin --ignore "assets/**/*.mp4"
359
- pressship publish ./my-plugin --ignore "assets/**/*.mp4"
360
- pressship pack ./my-plugin --ignore "assets/**/*.mp4"
361
- pressship release ./my-plugin --ignore "assets/**/*.mp4"
338
+ npx skills add f/pressship --list
362
339
  ```
363
340
 
364
- ## Configuration And Cache
341
+ ## Configuration
365
342
 
366
343
  Pressship stores local state under your user config directory:
367
344
 
368
- ```text
345
+ ```
369
346
  ~/.config/pressship/
370
347
  ```
371
348
 
372
- This includes:
349
+ Contents:
373
350
 
374
- - WordPress.org browser session storage.
375
- - Debug screenshots for failed browser automation.
376
- - Managed Plugin Check cache.
377
- - Managed WordPress core and SQLite setup.
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
378
356
 
379
- You can override the config directory:
357
+ Override the location:
380
358
 
381
359
  ```bash
382
360
  PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship status
383
361
  ```
384
362
 
385
- For migration compatibility, `PRESSPORT_CONFIG_DIR` is still accepted as a fallback.
363
+ > `PRESSPORT_CONFIG_DIR` is still respected as a legacy fallback.
386
364
 
387
- ## Troubleshooting
365
+ ## Documentation
388
366
 
389
- ### Browser Runtime Missing
367
+ Full docs live at **<https://pressship.org>**.
390
368
 
391
- Pressship installs Chromium automatically. If that fails, run:
369
+ The source is in [`website/`](./website) and runs as a standard Docusaurus site:
392
370
 
393
371
  ```bash
394
- 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
395
375
  ```
396
376
 
397
- For local development:
377
+ GitHub Pages deployment is wired up in [`.github/workflows/docs.yml`](.github/workflows/docs.yml).
378
+
379
+ ## Development
398
380
 
399
381
  ```bash
400
- npm run browsers:install
382
+ npm install
383
+ npm run dev -- --help # Run the CLI locally
384
+ npm run typecheck
385
+ npm test
386
+ npm run build
401
387
  ```
402
388
 
403
- ### Not Logged In
404
-
405
- Run:
389
+ Try local commands without publishing the package:
406
390
 
407
391
  ```bash
408
- pressship login
409
- 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
410
396
  ```
411
397
 
412
- If the saved session is stale:
398
+ Package smoke test:
413
399
 
414
400
  ```bash
415
- pressship logout
416
- pressship login
401
+ npm pack --dry-run
417
402
  ```
418
403
 
419
- ### Plugin Check Setup Problems
404
+ ## Troubleshooting
420
405
 
421
- 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>
422
408
 
423
- To bypass Plugin Check:
409
+ Pressship installs Chromium automatically. If that fails:
424
410
 
425
411
  ```bash
426
- pressship submit ./my-plugin --skip-plugin-check
412
+ npx playwright install chromium
427
413
  ```
414
+ </details>
428
415
 
429
- To use your own WordPress install:
416
+ <details>
417
+ <summary><strong>Session expired or not logged in</strong></summary>
430
418
 
431
419
  ```bash
432
- pressship submit ./my-plugin --wp-path /path/to/wordpress
420
+ pressship logout
421
+ pressship login
433
422
  ```
423
+ </details>
434
424
 
435
- ### WordPress.org Form Changes
425
+ <details>
426
+ <summary><strong>Plugin Check setup problems</strong></summary>
436
427
 
437
- 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.
438
-
439
- ## Development
428
+ The managed environment needs PHP and internet access on first run. To bypass:
440
429
 
441
430
  ```bash
442
- npm install
443
- npm run dev -- --help
444
- npm run typecheck
445
- npm test
446
- npm run build
431
+ pressship publish ./my-plugin --skip-plugin-check
447
432
  ```
448
433
 
449
- Run local commands without publishing:
434
+ To use your own WordPress install:
450
435
 
451
436
  ```bash
452
- npm run dev -- login
453
- npm run dev -- whoami
454
- npm run dev -- status
455
- npm run dev -- pack ./my-plugin
456
- npm run dev -- publish ./my-plugin --dry-run
457
- npm run dev -- submit ./my-plugin --dry-run
458
- npm run dev -- release ./my-plugin --dry-run
437
+ pressship publish ./my-plugin --wp-path /path/to/wordpress
459
438
  ```
439
+ </details>
460
440
 
461
- Package smoke test:
441
+ <details>
442
+ <summary><strong>WordPress.org form changes</strong></summary>
462
443
 
463
- ```bash
464
- npm pack --dry-run
465
- ```
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>
446
+
447
+ ## Security
448
+
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.
454
+
455
+ ## Contributing
456
+
457
+ Issues, ideas, and pull requests are welcome. Please open an issue first for larger changes so we can discuss the direction.
458
+
459
+ When opening a PR, please:
460
+
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.
464
+
465
+ ## Acknowledgements
466
+
467
+ Pressship is built on the work of many people and projects:
468
+
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
466
475
 
467
- ## Security Notes
476
+ ## Disclaimer
468
477
 
469
- - Pressship does not store your WordPress.org password.
470
- - Login is completed in a real browser.
471
- - Pressship stores Playwright browser session state locally.
472
- - `logout` removes Pressship's saved local browser session.
473
- - `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.
474
479
 
475
480
  ## License
476
481
 
477
- MIT
482
+ [MIT](LICENSE) © Pressship contributors