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.
- package/.claude/skills/wordpress-plugin-publish/SKILL.md +153 -0
- package/README.md +285 -280
- package/assets/logo-new.png +0 -0
- package/assets/pressship-dark.png +0 -0
- package/assets/pressship-square-dark.png +0 -0
- package/assets/pressship-square.png +0 -0
- package/assets/pressship-symbol-dark.png +0 -0
- package/assets/pressship-symbol.png +0 -0
- package/assets/pressship-wordmark-dark.png +0 -0
- package/assets/pressship-wordmark.png +0 -0
- package/assets/pressship.png +0 -0
- package/dist/cli.js +40 -2
- package/dist/cli.js.map +1 -1
- package/dist/package/ignore.js +2 -0
- package/dist/package/ignore.js.map +1 -1
- package/dist/plugin/demo.d.ts +44 -0
- package/dist/plugin/demo.js +207 -0
- package/dist/plugin/demo.js.map +1 -0
- package/dist/plugin/info.d.ts +84 -0
- package/dist/plugin/info.js +209 -0
- package/dist/plugin/info.js.map +1 -0
- package/dist/plugin/list.d.ts +24 -0
- package/dist/plugin/list.js +174 -0
- package/dist/plugin/list.js.map +1 -0
- package/dist/svn/credentials.d.ts +9 -0
- package/dist/svn/credentials.js +94 -0
- package/dist/svn/credentials.js.map +1 -0
- package/dist/svn/get.d.ts +45 -0
- package/dist/svn/get.js +139 -0
- package/dist/svn/get.js.map +1 -0
- package/dist/svn/release.d.ts +1 -0
- package/dist/svn/release.js +90 -13
- package/dist/svn/release.js.map +1 -1
- package/dist/svn/subversion.d.ts +18 -0
- package/dist/svn/subversion.js +171 -0
- package/dist/svn/subversion.js.map +1 -0
- package/dist/utils/paths.d.ts +1 -0
- package/dist/utils/paths.js +3 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/wordpress-org/publish.d.ts +1 -0
- package/dist/wordpress-org/publish.js +4 -2
- package/dist/wordpress-org/publish.js.map +1 -1
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -1,477 +1,482 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/pressship-square-dark.png">
|
|
4
|
+
<img src="assets/pressship-square.png" alt="Pressship" width="120" />
|
|
5
|
+
</picture>
|
|
3
6
|
</p>
|
|
4
7
|
|
|
8
|
+
<h1 align="center">Pressship</h1>
|
|
9
|
+
|
|
5
10
|
<p align="center">
|
|
6
|
-
|
|
11
|
+
<em>WordPress.org plugin publishing, from the terminal.</em>
|
|
7
12
|
</p>
|
|
8
13
|
|
|
9
14
|
<p align="center">
|
|
10
|
-
<a href="https://nodejs.org/"><img alt="Node.js 20+" src="https://img.shields.io/badge/node-%3E%3D20-
|
|
11
|
-
<a href="https://
|
|
12
|
-
<a href="
|
|
15
|
+
<a href="https://nodejs.org/"><img alt="Node.js 20+" src="https://img.shields.io/badge/node-%3E%3D20-1e293b?logo=node.js&logoColor=white&style=flat-square" /></a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/pressship"><img alt="npm" src="https://img.shields.io/npm/v/pressship?color=3858e9&logo=npm&logoColor=white&style=flat-square" /></a>
|
|
17
|
+
<a href="https://wordpress.org/plugins/developers/"><img alt="WordPress.org" src="https://img.shields.io/badge/WordPress.org-plugin%20directory-21759b?logo=wordpress&logoColor=white&style=flat-square" /></a>
|
|
18
|
+
<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-3858e9?style=flat-square" /></a>
|
|
19
|
+
<a href="https://github.com/f/pressship"><img alt="GitHub stars" src="https://img.shields.io/github/stars/f/pressship?style=flat-square&logo=github&color=1e293b" /></a>
|
|
13
20
|
</p>
|
|
14
21
|
|
|
15
22
|
<p align="center">
|
|
16
|
-
<
|
|
23
|
+
<a href="#quick-start">Quick start</a> ·
|
|
24
|
+
<a href="#commands">Commands</a> ·
|
|
25
|
+
<a href="#managed-plugin-check">Managed Plugin Check</a> ·
|
|
26
|
+
<a href="#agent-skill">Agent skill</a> ·
|
|
27
|
+
<a href="https://pressship.org">Docs</a>
|
|
17
28
|
</p>
|
|
18
29
|
|
|
19
|
-
|
|
30
|
+
---
|
|
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
|
|
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
|
-
|
|
44
|
+
If you've used `npm publish`, this should feel familiar.
|
|
32
45
|
|
|
33
|
-
##
|
|
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
|
-
#
|
|
52
|
+
# 2. (Optional) Verify the saved session
|
|
56
53
|
npx pressship whoami
|
|
57
54
|
|
|
58
|
-
#
|
|
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
|
|
58
|
+
# 4. Submit for review or release an approved plugin
|
|
65
59
|
npx pressship publish ./my-plugin
|
|
66
60
|
```
|
|
67
61
|
|
|
68
|
-
|
|
62
|
+
That's it. Pressship handles browser-based login, packaging, readme validation, Plugin Check, and routing between submission and SVN release.
|
|
69
63
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
78
|
-
- A WordPress.org account
|
|
79
|
-
- Internet access for first-run browser and Plugin Check setup
|
|
80
|
-
- PHP
|
|
81
|
-
-
|
|
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
|
-
|
|
107
|
+
```bash
|
|
108
|
+
pressship <command> --help
|
|
109
|
+
```
|
|
84
110
|
|
|
85
|
-
##
|
|
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
|
-
|
|
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
|
|
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
|
|
125
|
+
> Pressship never reads, transmits, or stores your WordPress.org password.
|
|
106
126
|
|
|
107
|
-
|
|
127
|
+
## Publishing
|
|
108
128
|
|
|
109
|
-
|
|
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
|
|
113
|
-
pressship
|
|
114
|
-
pressship
|
|
137
|
+
pressship publish ./my-plugin # Pick the right flow automatically
|
|
138
|
+
pressship publish ./my-plugin --dry-run # Validate + package, no upload
|
|
139
|
+
pressship publish ./my-plugin --submit # Force review submission
|
|
140
|
+
pressship publish ./my-plugin --release # Force SVN release
|
|
141
|
+
pressship publish ./my-plugin --yes # Skip confirmation prompts
|
|
142
|
+
pressship publish ./my-plugin --release --no-install-svn
|
|
115
143
|
```
|
|
116
144
|
|
|
117
|
-
|
|
145
|
+
Need fine-grained control? Use the explicit subcommands `submit` and `release`.
|
|
146
|
+
|
|
147
|
+
## Packaging
|
|
118
148
|
|
|
119
149
|
```bash
|
|
120
|
-
pressship
|
|
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
|
-
|
|
153
|
+
Validates the plugin, runs Plugin Check, and writes `{slug}.zip` — without uploading. Useful for CI artifacts or manual uploads.
|
|
127
154
|
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
+
Default exclusions: `.git`, `.gitignore`, `.github`, `.DS_Store`, `.idea`, `.vscode`, `.env*`, `node_modules`, `dist`, `build`, `coverage`, `tests`, `*.log`, `*.zip`.
|
|
141
165
|
|
|
142
|
-
|
|
166
|
+
Add per-project exclusions in a `.pressshipignore` file (same syntax as `.gitignore`):
|
|
143
167
|
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
174
|
+
Or pass `--ignore <glob>` directly (repeat as needed):
|
|
157
175
|
|
|
158
176
|
```bash
|
|
159
|
-
pressship
|
|
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
|
-
|
|
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
|
-
#
|
|
175
|
-
pressship
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
`
|
|
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
|
-
|
|
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
|
-
|
|
205
|
+
## Inspecting submission state
|
|
197
206
|
|
|
198
207
|
```bash
|
|
199
|
-
pressship
|
|
200
|
-
pressship
|
|
201
|
-
pressship
|
|
202
|
-
pressship
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
## Pack Flow
|
|
214
|
+
Sample output:
|
|
212
215
|
|
|
213
|
-
```
|
|
214
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
Useful options:
|
|
228
|
+
## Plugin metadata
|
|
220
229
|
|
|
221
230
|
```bash
|
|
222
|
-
pressship
|
|
223
|
-
pressship
|
|
224
|
-
pressship
|
|
225
|
-
pressship
|
|
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
|
-
|
|
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
|
-
##
|
|
239
|
+
## Version bumping
|
|
233
240
|
|
|
234
241
|
```bash
|
|
235
|
-
pressship
|
|
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
|
-
`
|
|
247
|
+
Updates the `Version:` header in the main plugin file **and** the `Stable tag:` in `readme.txt` together.
|
|
239
248
|
|
|
240
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
256
|
-
pressship
|
|
257
|
-
pressship
|
|
258
|
-
pressship
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
280
|
+
If you'd rather use your own install:
|
|
281
281
|
|
|
282
282
|
```bash
|
|
283
|
-
pressship
|
|
283
|
+
pressship publish ./my-plugin --wp-path /path/to/wordpress
|
|
284
284
|
```
|
|
285
285
|
|
|
286
|
-
|
|
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
|
|
289
|
+
pressship publish ./my-plugin --skip-plugin-check
|
|
292
290
|
```
|
|
293
291
|
|
|
294
|
-
##
|
|
292
|
+
## Releasing through SVN
|
|
293
|
+
|
|
294
|
+
For approved plugins:
|
|
295
295
|
|
|
296
296
|
```bash
|
|
297
|
-
pressship release ./my-plugin
|
|
297
|
+
pressship release ./my-plugin
|
|
298
298
|
```
|
|
299
299
|
|
|
300
|
-
|
|
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.
|
|
307
|
-
4.
|
|
308
|
-
5.
|
|
309
|
-
6. Commit
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
335
|
+
Replace `codex` with another supported agent name, e.g. `claude-code`. List available skills first:
|
|
356
336
|
|
|
357
337
|
```bash
|
|
358
|
-
|
|
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
|
|
341
|
+
## Configuration
|
|
365
342
|
|
|
366
343
|
Pressship stores local state under your user config directory:
|
|
367
344
|
|
|
368
|
-
```
|
|
345
|
+
```
|
|
369
346
|
~/.config/pressship/
|
|
370
347
|
```
|
|
371
348
|
|
|
372
|
-
|
|
349
|
+
Contents:
|
|
373
350
|
|
|
374
|
-
- WordPress.org browser session storage
|
|
375
|
-
-
|
|
376
|
-
-
|
|
377
|
-
- Managed WordPress core
|
|
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
|
-
|
|
357
|
+
Override the location:
|
|
380
358
|
|
|
381
359
|
```bash
|
|
382
360
|
PRESSSHIP_CONFIG_DIR=/tmp/pressship pressship status
|
|
383
361
|
```
|
|
384
362
|
|
|
385
|
-
|
|
363
|
+
> `PRESSPORT_CONFIG_DIR` is still respected as a legacy fallback.
|
|
386
364
|
|
|
387
|
-
##
|
|
365
|
+
## Documentation
|
|
388
366
|
|
|
389
|
-
|
|
367
|
+
Full docs live at **<https://pressship.org>**.
|
|
390
368
|
|
|
391
|
-
|
|
369
|
+
The source is in [`website/`](./website) and runs as a standard Docusaurus site:
|
|
392
370
|
|
|
393
371
|
```bash
|
|
394
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
404
|
-
|
|
405
|
-
Run:
|
|
389
|
+
Try local commands without publishing the package:
|
|
406
390
|
|
|
407
391
|
```bash
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
398
|
+
Package smoke test:
|
|
413
399
|
|
|
414
400
|
```bash
|
|
415
|
-
|
|
416
|
-
pressship login
|
|
401
|
+
npm pack --dry-run
|
|
417
402
|
```
|
|
418
403
|
|
|
419
|
-
|
|
404
|
+
## Troubleshooting
|
|
420
405
|
|
|
421
|
-
|
|
406
|
+
<details>
|
|
407
|
+
<summary><strong>Browser runtime missing</strong></summary>
|
|
422
408
|
|
|
423
|
-
|
|
409
|
+
Pressship installs Chromium automatically. If that fails:
|
|
424
410
|
|
|
425
411
|
```bash
|
|
426
|
-
|
|
412
|
+
npx playwright install chromium
|
|
427
413
|
```
|
|
414
|
+
</details>
|
|
428
415
|
|
|
429
|
-
|
|
416
|
+
<details>
|
|
417
|
+
<summary><strong>Session expired or not logged in</strong></summary>
|
|
430
418
|
|
|
431
419
|
```bash
|
|
432
|
-
pressship
|
|
420
|
+
pressship logout
|
|
421
|
+
pressship login
|
|
433
422
|
```
|
|
423
|
+
</details>
|
|
434
424
|
|
|
435
|
-
|
|
425
|
+
<details>
|
|
426
|
+
<summary><strong>Plugin Check setup problems</strong></summary>
|
|
436
427
|
|
|
437
|
-
The
|
|
438
|
-
|
|
439
|
-
## Development
|
|
428
|
+
The managed environment needs PHP and internet access on first run. To bypass:
|
|
440
429
|
|
|
441
430
|
```bash
|
|
442
|
-
|
|
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
|
-
|
|
434
|
+
To use your own WordPress install:
|
|
450
435
|
|
|
451
436
|
```bash
|
|
452
|
-
|
|
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
|
-
|
|
441
|
+
<details>
|
|
442
|
+
<summary><strong>WordPress.org form changes</strong></summary>
|
|
462
443
|
|
|
463
|
-
|
|
464
|
-
|
|
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
|
-
##
|
|
476
|
+
## Disclaimer
|
|
468
477
|
|
|
469
|
-
|
|
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
|