@jezweb/jezpress-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # JezPress CLI
2
+
3
+ CLI and MCP server for managing JezPress plugins on the update server.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @jezweb/jezpress-cli
9
+ ```
10
+
11
+ ## Authentication
12
+
13
+ Login with your Jezweb Google account:
14
+
15
+ ```bash
16
+ jezpress login
17
+ ```
18
+
19
+ This opens a browser for Google OAuth authentication. Only `@jezweb.net` and `@jezweb.com.au` email domains are permitted.
20
+
21
+ Your token is stored in `~/.jezpress-token` and expires after 30 days.
22
+
23
+ ## CLI Commands
24
+
25
+ ### Authentication
26
+
27
+ ```bash
28
+ jezpress login # Log in with Google account
29
+ jezpress logout # Remove stored token
30
+ jezpress whoami # Show current user and owned plugins
31
+ ```
32
+
33
+ ### Plugin Management
34
+
35
+ ```bash
36
+ jezpress plugins list # List all plugins
37
+ jezpress plugins list --mine # List only your plugins
38
+ jezpress plugins get <slug> # Get plugin details
39
+ ```
40
+
41
+ ### Plugin Creation & Updates (Owner Only)
42
+
43
+ ```bash
44
+ # Create a new plugin (you become the owner)
45
+ jezpress plugins create my-plugin --name "My Plugin"
46
+
47
+ # Update plugin metadata
48
+ jezpress plugins update my-plugin --tested-wp 6.7
49
+
50
+ # Upload a new version
51
+ jezpress plugins upload my-plugin ./dist/my-plugin.zip --version 1.2.0
52
+ ```
53
+
54
+ ## MCP Server (Claude Code Integration)
55
+
56
+ Add to your `~/.claude/settings.json`:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "jezpress": {
62
+ "command": "jezpress-mcp"
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ### Available MCP Tools
69
+
70
+ - `whoami` - Get current user info
71
+ - `list_plugins` - List all plugins
72
+ - `get_plugin` - Get plugin details
73
+ - `create_plugin` - Create a new plugin
74
+ - `update_plugin` - Update plugin metadata
75
+ - `upload_version` - Upload a new version
76
+
77
+ ## Security
78
+
79
+ - OAuth via Google (same SSO as rest of Jezweb)
80
+ - JWT tokens with 30-day expiry
81
+ - Only `@jezweb.net` and `@jezweb.com.au` emails allowed
82
+ - Plugin ownership tracked by creator email
83
+ - Devs can only modify their own plugins
84
+ - All operations logged with dev email
85
+
86
+ ## License
87
+
88
+ Proprietary - Jezweb internal use only.
package/dist/auth.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Start OAuth login flow
3
+ * Opens browser for Google OAuth, waits for callback with token
4
+ */
5
+ export declare function login(): Promise<{
6
+ email: string;
7
+ name: string;
8
+ }>;
9
+ /**
10
+ * Check if currently logged in with valid token
11
+ */
12
+ export declare function checkAuth(): {
13
+ loggedIn: boolean;
14
+ email?: string;
15
+ name?: string;
16
+ expiresIn?: string;
17
+ };
18
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA2EtE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCpG"}
package/dist/auth.js ADDED
@@ -0,0 +1,118 @@
1
+ import { createServer } from 'node:http';
2
+ import { AUTH_SERVER, saveToken, isTokenExpired, getToken, decodeToken } from './config.js';
3
+ import open from 'open';
4
+ const CALLBACK_PORT = 19283; // Random high port for OAuth callback
5
+ /**
6
+ * Start OAuth login flow
7
+ * Opens browser for Google OAuth, waits for callback with token
8
+ */
9
+ export async function login() {
10
+ return new Promise((resolve, reject) => {
11
+ // Create local server to receive callback
12
+ const server = createServer((req, res) => {
13
+ const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
14
+ if (url.pathname === '/callback') {
15
+ const token = url.searchParams.get('token');
16
+ if (token) {
17
+ // Save token
18
+ saveToken(token);
19
+ // Decode to get user info
20
+ const payload = decodeToken(token);
21
+ // Send success response
22
+ res.writeHead(200, { 'Content-Type': 'text/html' });
23
+ res.end(`
24
+ <!DOCTYPE html>
25
+ <html>
26
+ <head>
27
+ <title>JezPress CLI - Logged In</title>
28
+ <style>
29
+ body { font-family: system-ui; background: #0a0a0a; color: #fafafa;
30
+ display: flex; align-items: center; justify-content: center;
31
+ min-height: 100vh; margin: 0; }
32
+ .box { background: #18181b; padding: 2rem; border-radius: 8px; text-align: center; }
33
+ h1 { color: #10b981; margin-top: 0; }
34
+ p { color: #a1a1aa; }
35
+ </style>
36
+ </head>
37
+ <body>
38
+ <div class="box">
39
+ <h1>Logged In</h1>
40
+ <p>You can close this window and return to the terminal.</p>
41
+ </div>
42
+ </body>
43
+ </html>
44
+ `);
45
+ // Close server and resolve
46
+ server.close();
47
+ if (payload) {
48
+ resolve({ email: payload.email, name: payload.name });
49
+ }
50
+ else {
51
+ reject(new Error('Failed to decode token'));
52
+ }
53
+ }
54
+ else {
55
+ res.writeHead(400, { 'Content-Type': 'text/html' });
56
+ res.end('<h1>Error: No token received</h1>');
57
+ server.close();
58
+ reject(new Error('No token received'));
59
+ }
60
+ }
61
+ else {
62
+ res.writeHead(404);
63
+ res.end('Not found');
64
+ }
65
+ });
66
+ server.listen(CALLBACK_PORT, '127.0.0.1', () => {
67
+ // Open browser with auth URL
68
+ const authUrl = `${AUTH_SERVER}/cli-auth?port=${CALLBACK_PORT}`;
69
+ console.log('\nOpening browser for authentication...');
70
+ console.log(`If browser doesn't open, visit: ${authUrl}\n`);
71
+ open(authUrl);
72
+ });
73
+ // Timeout after 5 minutes
74
+ setTimeout(() => {
75
+ server.close();
76
+ reject(new Error('Login timed out after 5 minutes'));
77
+ }, 5 * 60 * 1000);
78
+ });
79
+ }
80
+ /**
81
+ * Check if currently logged in with valid token
82
+ */
83
+ export function checkAuth() {
84
+ const token = getToken();
85
+ if (!token) {
86
+ return { loggedIn: false };
87
+ }
88
+ if (isTokenExpired(token)) {
89
+ return { loggedIn: false };
90
+ }
91
+ const payload = decodeToken(token);
92
+ if (!payload) {
93
+ return { loggedIn: false };
94
+ }
95
+ // Calculate time until expiry
96
+ const expiresAt = new Date(payload.exp * 1000);
97
+ const now = new Date();
98
+ const diffMs = expiresAt.getTime() - now.getTime();
99
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
100
+ let expiresIn;
101
+ if (diffDays > 1) {
102
+ expiresIn = `${diffDays} days`;
103
+ }
104
+ else if (diffDays === 1) {
105
+ expiresIn = '1 day';
106
+ }
107
+ else {
108
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
109
+ expiresIn = `${diffHours} hours`;
110
+ }
111
+ return {
112
+ loggedIn: true,
113
+ email: payload.email,
114
+ name: payload.name,
115
+ expiresIn,
116
+ };
117
+ }
118
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { login, checkAuth } from './auth.js';
4
+ import { deleteToken } from './config.js';
5
+ import * as api from './client.js';
6
+ import { existsSync } from 'node:fs';
7
+ const program = new Command();
8
+ program
9
+ .name('jezpress')
10
+ .description('CLI for managing JezPress plugins on the update server')
11
+ .version('1.0.0');
12
+ // ============================================================
13
+ // Auth Commands
14
+ // ============================================================
15
+ program
16
+ .command('login')
17
+ .description('Log in with your Jezweb Google account')
18
+ .action(async () => {
19
+ try {
20
+ console.log('Starting login...');
21
+ const user = await login();
22
+ console.log(`\nLogged in as ${user.name} (${user.email})`);
23
+ }
24
+ catch (error) {
25
+ console.error('Login failed:', error.message);
26
+ process.exit(1);
27
+ }
28
+ });
29
+ program
30
+ .command('logout')
31
+ .description('Log out and remove stored token')
32
+ .action(() => {
33
+ deleteToken();
34
+ console.log('Logged out successfully');
35
+ });
36
+ program
37
+ .command('whoami')
38
+ .description('Show current user info and owned plugins')
39
+ .action(async () => {
40
+ // First check local auth
41
+ const auth = checkAuth();
42
+ if (!auth.loggedIn) {
43
+ console.error('Not logged in. Run `jezpress login` first.');
44
+ process.exit(1);
45
+ }
46
+ try {
47
+ const data = await api.whoami();
48
+ console.log(`\nLogged in as: ${data.user.name}`);
49
+ console.log(`Email: ${data.user.email}`);
50
+ console.log(`Token expires in: ${auth.expiresIn}`);
51
+ console.log(`\nPlugins owned (${data.plugins_owned.length}):`);
52
+ if (data.plugins_owned.length === 0) {
53
+ console.log(' (none)');
54
+ }
55
+ else {
56
+ data.plugins_owned.forEach((slug) => {
57
+ console.log(` - ${slug}`);
58
+ });
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error('Error:', error.message);
63
+ process.exit(1);
64
+ }
65
+ });
66
+ // ============================================================
67
+ // Plugin Commands
68
+ // ============================================================
69
+ const plugins = program
70
+ .command('plugins')
71
+ .description('Manage plugins');
72
+ plugins
73
+ .command('list')
74
+ .description('List all plugins')
75
+ .option('--mine', 'Only show plugins you own')
76
+ .action(async (options) => {
77
+ try {
78
+ const pluginsList = await api.listPlugins();
79
+ let filtered = pluginsList;
80
+ if (options.mine) {
81
+ filtered = pluginsList.filter((p) => p.is_owner);
82
+ }
83
+ console.log(`\nPlugins (${filtered.length}):\n`);
84
+ if (filtered.length === 0) {
85
+ console.log(' (none)');
86
+ return;
87
+ }
88
+ filtered.forEach((p) => {
89
+ const ownerMark = p.is_owner ? ' (yours)' : '';
90
+ console.log(` ${p.slug} v${p.current_version}${ownerMark}`);
91
+ console.log(` Name: ${p.name}`);
92
+ console.log(` Updated: ${p.last_updated}`);
93
+ console.log('');
94
+ });
95
+ }
96
+ catch (error) {
97
+ console.error('Error:', error.message);
98
+ process.exit(1);
99
+ }
100
+ });
101
+ plugins
102
+ .command('get <slug>')
103
+ .description('Get plugin details')
104
+ .action(async (slug) => {
105
+ try {
106
+ const data = await api.getPlugin(slug);
107
+ const p = data.plugin;
108
+ console.log(`\n${p.name} (${p.slug})\n`);
109
+ console.log(`Version: ${p.current_version}`);
110
+ console.log(`Type: ${p.type}`);
111
+ console.log(`Author: ${p.author}`);
112
+ console.log(`Requires PHP: ${p.requires_php}`);
113
+ console.log(`Requires WP: ${p.requires_wp}`);
114
+ console.log(`Tested WP: ${p.tested_wp}`);
115
+ console.log(`License required: ${p.requires_license ? 'Yes' : 'No'}`);
116
+ console.log(`Last updated: ${p.last_updated}`);
117
+ console.log(`Owner: ${p.owner_email || 'unassigned'}`);
118
+ console.log(`You own this: ${p.is_owner ? 'Yes' : 'No'}`);
119
+ console.log(`\nAvailable versions: ${data.available_versions.join(', ') || 'none'}`);
120
+ console.log(`Total downloads: ${data.download_stats?.total || 0}`);
121
+ }
122
+ catch (error) {
123
+ console.error('Error:', error.message);
124
+ process.exit(1);
125
+ }
126
+ });
127
+ plugins
128
+ .command('create <slug>')
129
+ .description('Create a new plugin (you become the owner)')
130
+ .requiredOption('--name <name>', 'Plugin display name')
131
+ .option('--version <version>', 'Initial version', '1.0.0')
132
+ .option('--type <type>', 'Type: plugin or theme', 'plugin')
133
+ .option('--no-license', 'Plugin does not require license')
134
+ .option('--author <author>', 'Author name', 'Jezweb')
135
+ .action(async (slug, options) => {
136
+ try {
137
+ const plugin = await api.createPlugin({
138
+ slug,
139
+ name: options.name,
140
+ version: options.version,
141
+ type: options.type,
142
+ requiresLicense: options.license !== false,
143
+ author: options.author,
144
+ });
145
+ console.log(`\nPlugin created: ${plugin.slug}`);
146
+ console.log(`Name: ${plugin.name}`);
147
+ console.log(`Version: ${plugin.current_version}`);
148
+ console.log(`Owner: ${plugin.owner_email}`);
149
+ console.log('\nNext: Upload a version with `jezpress plugins upload`');
150
+ }
151
+ catch (error) {
152
+ console.error('Error:', error.message);
153
+ process.exit(1);
154
+ }
155
+ });
156
+ plugins
157
+ .command('update <slug>')
158
+ .description('Update plugin metadata (owner only)')
159
+ .option('--name <name>', 'Update display name')
160
+ .option('--tested-wp <version>', 'Update tested WP version')
161
+ .option('--requires-wp <version>', 'Update minimum WP version')
162
+ .option('--requires-php <version>', 'Update minimum PHP version')
163
+ .action(async (slug, options) => {
164
+ try {
165
+ const updates = {};
166
+ if (options.name)
167
+ updates.name = options.name;
168
+ if (options.testedWp)
169
+ updates.tested_wp = options.testedWp;
170
+ if (options.requiresWp)
171
+ updates.requires_wp = options.requiresWp;
172
+ if (options.requiresPhp)
173
+ updates.requires_php = options.requiresPhp;
174
+ if (Object.keys(updates).length === 0) {
175
+ console.error('No updates provided. Use --name, --tested-wp, etc.');
176
+ process.exit(1);
177
+ }
178
+ const plugin = await api.updatePlugin(slug, updates);
179
+ console.log(`\nPlugin updated: ${plugin.slug}`);
180
+ console.log(`Name: ${plugin.name}`);
181
+ console.log(`Tested WP: ${plugin.tested_wp}`);
182
+ }
183
+ catch (error) {
184
+ console.error('Error:', error.message);
185
+ process.exit(1);
186
+ }
187
+ });
188
+ plugins
189
+ .command('upload <slug> <zipFile>')
190
+ .description('Upload a new plugin version (owner only)')
191
+ .requiredOption('--version <version>', 'Version number (e.g., 1.2.0)')
192
+ .action(async (slug, zipFile, options) => {
193
+ // Check file exists
194
+ if (!existsSync(zipFile)) {
195
+ console.error(`File not found: ${zipFile}`);
196
+ process.exit(1);
197
+ }
198
+ try {
199
+ console.log(`Uploading ${zipFile} as version ${options.version}...`);
200
+ const result = await api.uploadVersion(slug, options.version, zipFile);
201
+ console.log(`\n${result.message}`);
202
+ console.log(`Size: ${(result.size_bytes / 1024).toFixed(1)} KB`);
203
+ }
204
+ catch (error) {
205
+ console.error('Error:', error.message);
206
+ process.exit(1);
207
+ }
208
+ });
209
+ // Parse and run
210
+ program.parse();
211
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,GAAG,EAAE;IACX,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,yBAAyB;IACzB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAClC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D,MAAM,OAAO,GAAG,OAAO;KACpB,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAEjC,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,QAAQ,EAAE,2BAA2B,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,QAAQ,GAAG,WAAW,CAAC;QAE3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC;QAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,eAAe,GAAG,SAAS,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,4CAA4C,CAAC;KACzD,cAAc,CAAC,eAAe,EAAE,qBAAqB,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,OAAO,CAAC;KACzD,MAAM,CAAC,eAAe,EAAE,uBAAuB,EAAE,QAAQ,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,iCAAiC,CAAC;KACzD,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC;YACpC,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAA0B;YACxC,eAAe,EAAE,OAAO,CAAC,OAAO,KAAK,KAAK;YAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;KAC9C,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;KAC3D,MAAM,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;KAC9D,MAAM,CAAC,0BAA0B,EAAE,4BAA4B,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC9C,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC3D,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACjE,IAAI,OAAO,CAAC,WAAW;YAAE,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;QAEpE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,0CAA0C,CAAC;KACvD,cAAc,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACvC,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,eAAe,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAChB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,78 @@
1
+ interface Plugin {
2
+ slug: string;
3
+ name: string;
4
+ type: string;
5
+ current_version: string;
6
+ requires_license: boolean;
7
+ last_updated: string;
8
+ owner_email?: string;
9
+ is_owner?: boolean;
10
+ }
11
+ interface PluginDetail extends Plugin {
12
+ author: string;
13
+ requires_php: string;
14
+ requires_wp: string;
15
+ tested_wp: string;
16
+ sections?: {
17
+ description: string;
18
+ changelog: string;
19
+ };
20
+ }
21
+ interface WhoamiResponse {
22
+ user: {
23
+ email: string;
24
+ name: string;
25
+ };
26
+ plugins_owned: string[];
27
+ }
28
+ interface PluginResponse {
29
+ plugin: PluginDetail;
30
+ available_versions: string[];
31
+ download_stats: {
32
+ total: number;
33
+ };
34
+ }
35
+ /**
36
+ * Get current user info
37
+ */
38
+ export declare function whoami(): Promise<WhoamiResponse>;
39
+ /**
40
+ * List all plugins
41
+ */
42
+ export declare function listPlugins(): Promise<Plugin[]>;
43
+ /**
44
+ * Get plugin details
45
+ */
46
+ export declare function getPlugin(slug: string): Promise<PluginResponse>;
47
+ /**
48
+ * Create new plugin
49
+ */
50
+ export declare function createPlugin(options: {
51
+ slug: string;
52
+ name: string;
53
+ version?: string;
54
+ type?: 'plugin' | 'theme';
55
+ requiresLicense?: boolean;
56
+ author?: string;
57
+ }): Promise<PluginDetail>;
58
+ /**
59
+ * Update plugin metadata
60
+ */
61
+ export declare function updatePlugin(slug: string, updates: {
62
+ name?: string;
63
+ current_version?: string;
64
+ requires_license?: boolean;
65
+ author?: string;
66
+ requires_php?: string;
67
+ requires_wp?: string;
68
+ tested_wp?: string;
69
+ }): Promise<PluginDetail>;
70
+ /**
71
+ * Upload plugin version
72
+ */
73
+ export declare function uploadVersion(slug: string, version: string, zipPath: string): Promise<{
74
+ message: string;
75
+ size_bytes: number;
76
+ }>;
77
+ export {};
78
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AASA,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAa,SAAQ,MAAM;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,UAAU,cAAc;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAMD,UAAU,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAyCD;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAEtD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAErE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,YAAY,CAAC,CAUxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,YAAY,CAAC,CAOxB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BlD"}
package/dist/client.js ADDED
@@ -0,0 +1,97 @@
1
+ import { UPDATE_SERVER, getToken } from './config.js';
2
+ import { readFileSync } from 'node:fs';
3
+ /**
4
+ * Make authenticated API request
5
+ */
6
+ async function apiRequest(method, path, body) {
7
+ const token = getToken();
8
+ if (!token) {
9
+ throw new Error('Not logged in. Run `jezpress login` first.');
10
+ }
11
+ const headers = {
12
+ 'Authorization': `Bearer ${token}`,
13
+ };
14
+ let requestBody;
15
+ if (body !== undefined) {
16
+ headers['Content-Type'] = 'application/json';
17
+ requestBody = JSON.stringify(body);
18
+ }
19
+ const response = await fetch(`${UPDATE_SERVER}/api/dev${path}`, {
20
+ method,
21
+ headers,
22
+ body: requestBody,
23
+ });
24
+ const data = await response.json();
25
+ if (!response.ok || !data.success) {
26
+ throw new Error(data.message || data.error || 'Request failed');
27
+ }
28
+ return data;
29
+ }
30
+ /**
31
+ * Get current user info
32
+ */
33
+ export async function whoami() {
34
+ return apiRequest('GET', '/whoami');
35
+ }
36
+ /**
37
+ * List all plugins
38
+ */
39
+ export async function listPlugins() {
40
+ const data = await apiRequest('GET', '/plugins');
41
+ return data.plugins;
42
+ }
43
+ /**
44
+ * Get plugin details
45
+ */
46
+ export async function getPlugin(slug) {
47
+ return apiRequest('GET', `/plugins/${encodeURIComponent(slug)}`);
48
+ }
49
+ /**
50
+ * Create new plugin
51
+ */
52
+ export async function createPlugin(options) {
53
+ const data = await apiRequest('POST', '/plugins', {
54
+ slug: options.slug,
55
+ name: options.name,
56
+ current_version: options.version || '1.0.0',
57
+ type: options.type || 'plugin',
58
+ requires_license: options.requiresLicense ?? true,
59
+ author: options.author || 'Jezweb',
60
+ });
61
+ return data.plugin;
62
+ }
63
+ /**
64
+ * Update plugin metadata
65
+ */
66
+ export async function updatePlugin(slug, updates) {
67
+ const data = await apiRequest('PATCH', `/plugins/${encodeURIComponent(slug)}`, updates);
68
+ return data.plugin;
69
+ }
70
+ /**
71
+ * Upload plugin version
72
+ */
73
+ export async function uploadVersion(slug, version, zipPath) {
74
+ const token = getToken();
75
+ if (!token) {
76
+ throw new Error('Not logged in. Run `jezpress login` first.');
77
+ }
78
+ // Read the ZIP file
79
+ const zipData = readFileSync(zipPath);
80
+ const response = await fetch(`${UPDATE_SERVER}/api/dev/plugins/${encodeURIComponent(slug)}/upload?version=${encodeURIComponent(version)}`, {
81
+ method: 'POST',
82
+ headers: {
83
+ 'Authorization': `Bearer ${token}`,
84
+ 'Content-Type': 'application/zip',
85
+ },
86
+ body: zipData,
87
+ });
88
+ const data = await response.json();
89
+ if (!response.ok || !data.success) {
90
+ throw new Error(data.message || data.error || 'Upload failed');
91
+ }
92
+ return {
93
+ message: data.message,
94
+ size_bytes: data.size_bytes,
95
+ };
96
+ }
97
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export declare const AUTH_SERVER = "https://auth.jezpress.com";
2
+ export declare const UPDATE_SERVER = "https://updates.jezpress.com";
3
+ export declare const TOKEN_FILE: string;
4
+ /**
5
+ * Get stored CLI token
6
+ */
7
+ export declare function getToken(): string | null;
8
+ /**
9
+ * Save CLI token
10
+ */
11
+ export declare function saveToken(token: string): void;
12
+ /**
13
+ * Delete stored token
14
+ */
15
+ export declare function deleteToken(): void;
16
+ /**
17
+ * Decode JWT payload (without verification)
18
+ */
19
+ export declare function decodeToken(token: string): {
20
+ email: string;
21
+ name: string;
22
+ exp: number;
23
+ } | null;
24
+ /**
25
+ * Check if token is expired
26
+ */
27
+ export declare function isTokenExpired(token: string): boolean;
28
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,aAAa,iCAAiC,CAAC;AAC5D,eAAO,MAAM,UAAU,QAAqC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CASxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB9F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAIrD"}
package/dist/config.js ADDED
@@ -0,0 +1,63 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ export const AUTH_SERVER = 'https://auth.jezpress.com';
5
+ export const UPDATE_SERVER = 'https://updates.jezpress.com';
6
+ export const TOKEN_FILE = join(homedir(), '.jezpress-token');
7
+ /**
8
+ * Get stored CLI token
9
+ */
10
+ export function getToken() {
11
+ if (!existsSync(TOKEN_FILE)) {
12
+ return null;
13
+ }
14
+ try {
15
+ return readFileSync(TOKEN_FILE, 'utf-8').trim();
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * Save CLI token
23
+ */
24
+ export function saveToken(token) {
25
+ writeFileSync(TOKEN_FILE, token, { mode: 0o600 });
26
+ }
27
+ /**
28
+ * Delete stored token
29
+ */
30
+ export function deleteToken() {
31
+ if (existsSync(TOKEN_FILE)) {
32
+ unlinkSync(TOKEN_FILE);
33
+ }
34
+ }
35
+ /**
36
+ * Decode JWT payload (without verification)
37
+ */
38
+ export function decodeToken(token) {
39
+ try {
40
+ const parts = token.split('.');
41
+ if (parts.length !== 3)
42
+ return null;
43
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
44
+ return {
45
+ email: payload.email,
46
+ name: payload.name,
47
+ exp: payload.exp,
48
+ };
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Check if token is expired
56
+ */
57
+ export function isTokenExpired(token) {
58
+ const payload = decodeToken(token);
59
+ if (!payload)
60
+ return true;
61
+ return payload.exp < Math.floor(Date.now() / 1000);
62
+ }
63
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,8BAA8B,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,UAAU,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACrD,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACrD,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":""}
package/dist/mcp.js ADDED
@@ -0,0 +1,312 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import * as api from './client.js';
6
+ import { checkAuth } from './auth.js';
7
+ const server = new Server({
8
+ name: 'jezpress',
9
+ version: '1.0.0',
10
+ }, {
11
+ capabilities: {
12
+ tools: {},
13
+ },
14
+ });
15
+ // Define available tools
16
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
17
+ return {
18
+ tools: [
19
+ {
20
+ name: 'whoami',
21
+ description: 'Get current user info and list of owned plugins',
22
+ inputSchema: {
23
+ type: 'object',
24
+ properties: {},
25
+ required: [],
26
+ },
27
+ },
28
+ {
29
+ name: 'list_plugins',
30
+ description: 'List all plugins. Use mine_only=true to filter to only plugins you own.',
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ mine_only: {
35
+ type: 'boolean',
36
+ description: 'Only show plugins owned by you',
37
+ },
38
+ },
39
+ required: [],
40
+ },
41
+ },
42
+ {
43
+ name: 'get_plugin',
44
+ description: 'Get detailed information about a specific plugin',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ slug: {
49
+ type: 'string',
50
+ description: 'Plugin slug',
51
+ },
52
+ },
53
+ required: ['slug'],
54
+ },
55
+ },
56
+ {
57
+ name: 'create_plugin',
58
+ description: 'Create a new plugin. You will become the owner.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ slug: {
63
+ type: 'string',
64
+ description: 'Plugin slug (unique identifier)',
65
+ },
66
+ name: {
67
+ type: 'string',
68
+ description: 'Plugin display name',
69
+ },
70
+ version: {
71
+ type: 'string',
72
+ description: 'Initial version (default: 1.0.0)',
73
+ },
74
+ type: {
75
+ type: 'string',
76
+ enum: ['plugin', 'theme'],
77
+ description: 'Plugin type (default: plugin)',
78
+ },
79
+ requires_license: {
80
+ type: 'boolean',
81
+ description: 'Whether plugin requires a license (default: true)',
82
+ },
83
+ author: {
84
+ type: 'string',
85
+ description: 'Author name (default: Jezweb)',
86
+ },
87
+ },
88
+ required: ['slug', 'name'],
89
+ },
90
+ },
91
+ {
92
+ name: 'update_plugin',
93
+ description: 'Update plugin metadata. You must own the plugin.',
94
+ inputSchema: {
95
+ type: 'object',
96
+ properties: {
97
+ slug: {
98
+ type: 'string',
99
+ description: 'Plugin slug',
100
+ },
101
+ name: {
102
+ type: 'string',
103
+ description: 'New display name',
104
+ },
105
+ tested_wp: {
106
+ type: 'string',
107
+ description: 'WordPress version tested up to',
108
+ },
109
+ requires_wp: {
110
+ type: 'string',
111
+ description: 'Minimum WordPress version required',
112
+ },
113
+ requires_php: {
114
+ type: 'string',
115
+ description: 'Minimum PHP version required',
116
+ },
117
+ },
118
+ required: ['slug'],
119
+ },
120
+ },
121
+ {
122
+ name: 'upload_version',
123
+ description: 'Upload a new version of a plugin. You must own the plugin. Provide the full path to the ZIP file.',
124
+ inputSchema: {
125
+ type: 'object',
126
+ properties: {
127
+ slug: {
128
+ type: 'string',
129
+ description: 'Plugin slug',
130
+ },
131
+ version: {
132
+ type: 'string',
133
+ description: 'Version number (e.g., 1.2.0)',
134
+ },
135
+ zip_path: {
136
+ type: 'string',
137
+ description: 'Full path to the ZIP file',
138
+ },
139
+ },
140
+ required: ['slug', 'version', 'zip_path'],
141
+ },
142
+ },
143
+ ],
144
+ };
145
+ });
146
+ // Handle tool calls
147
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
148
+ const { name, arguments: args } = request.params;
149
+ // Check auth for all operations
150
+ const auth = checkAuth();
151
+ if (!auth.loggedIn) {
152
+ return {
153
+ content: [
154
+ {
155
+ type: 'text',
156
+ text: 'Error: Not logged in. Please run `jezpress login` in your terminal first to authenticate.',
157
+ },
158
+ ],
159
+ };
160
+ }
161
+ try {
162
+ switch (name) {
163
+ case 'whoami': {
164
+ const data = await api.whoami();
165
+ return {
166
+ content: [
167
+ {
168
+ type: 'text',
169
+ text: JSON.stringify({
170
+ user: data.user,
171
+ plugins_owned: data.plugins_owned,
172
+ token_expires_in: auth.expiresIn,
173
+ }, null, 2),
174
+ },
175
+ ],
176
+ };
177
+ }
178
+ case 'list_plugins': {
179
+ const plugins = await api.listPlugins();
180
+ let filtered = plugins;
181
+ if (args?.mine_only) {
182
+ filtered = plugins.filter((p) => p.is_owner);
183
+ }
184
+ return {
185
+ content: [
186
+ {
187
+ type: 'text',
188
+ text: JSON.stringify(filtered, null, 2),
189
+ },
190
+ ],
191
+ };
192
+ }
193
+ case 'get_plugin': {
194
+ const { slug } = args;
195
+ const data = await api.getPlugin(slug);
196
+ return {
197
+ content: [
198
+ {
199
+ type: 'text',
200
+ text: JSON.stringify({
201
+ plugin: data.plugin,
202
+ available_versions: data.available_versions,
203
+ download_stats: data.download_stats,
204
+ }, null, 2),
205
+ },
206
+ ],
207
+ };
208
+ }
209
+ case 'create_plugin': {
210
+ const { slug, name: pluginName, version, type, requires_license, author } = args;
211
+ const plugin = await api.createPlugin({
212
+ slug,
213
+ name: pluginName,
214
+ version,
215
+ type,
216
+ requiresLicense: requires_license,
217
+ author,
218
+ });
219
+ return {
220
+ content: [
221
+ {
222
+ type: 'text',
223
+ text: JSON.stringify({
224
+ message: 'Plugin created successfully',
225
+ plugin,
226
+ }, null, 2),
227
+ },
228
+ ],
229
+ };
230
+ }
231
+ case 'update_plugin': {
232
+ const { slug, name: pluginName, tested_wp, requires_wp, requires_php } = args;
233
+ const updates = {};
234
+ if (pluginName)
235
+ updates.name = pluginName;
236
+ if (tested_wp)
237
+ updates.tested_wp = tested_wp;
238
+ if (requires_wp)
239
+ updates.requires_wp = requires_wp;
240
+ if (requires_php)
241
+ updates.requires_php = requires_php;
242
+ if (Object.keys(updates).length === 0) {
243
+ return {
244
+ content: [
245
+ {
246
+ type: 'text',
247
+ text: 'Error: No updates provided. Specify at least one of: name, tested_wp, requires_wp, requires_php',
248
+ },
249
+ ],
250
+ };
251
+ }
252
+ const plugin = await api.updatePlugin(slug, updates);
253
+ return {
254
+ content: [
255
+ {
256
+ type: 'text',
257
+ text: JSON.stringify({
258
+ message: 'Plugin updated successfully',
259
+ plugin,
260
+ }, null, 2),
261
+ },
262
+ ],
263
+ };
264
+ }
265
+ case 'upload_version': {
266
+ const { slug, version, zip_path } = args;
267
+ const result = await api.uploadVersion(slug, version, zip_path);
268
+ return {
269
+ content: [
270
+ {
271
+ type: 'text',
272
+ text: JSON.stringify({
273
+ message: result.message,
274
+ size_bytes: result.size_bytes,
275
+ }, null, 2),
276
+ },
277
+ ],
278
+ };
279
+ }
280
+ default:
281
+ return {
282
+ content: [
283
+ {
284
+ type: 'text',
285
+ text: `Unknown tool: ${name}`,
286
+ },
287
+ ],
288
+ };
289
+ }
290
+ }
291
+ catch (error) {
292
+ return {
293
+ content: [
294
+ {
295
+ type: 'text',
296
+ text: `Error: ${error.message}`,
297
+ },
298
+ ],
299
+ };
300
+ }
301
+ });
302
+ // Start the server
303
+ async function main() {
304
+ const transport = new StdioServerTransport();
305
+ await server.connect(transport);
306
+ console.error('JezPress MCP server running');
307
+ }
308
+ main().catch((error) => {
309
+ console.error('Failed to start MCP server:', error);
310
+ process.exit(1);
311
+ });
312
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@jezweb/jezpress-cli",
3
+ "version": "1.0.0",
4
+ "description": "CLI and MCP server for managing JezPress plugins on the update server",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "jezpress": "./dist/cli.js",
9
+ "jezpress-mcp": "./dist/mcp.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc -w",
14
+ "start": "node dist/cli.js",
15
+ "mcp": "node dist/mcp.js"
16
+ },
17
+ "keywords": ["jezpress", "wordpress", "plugin", "cli", "mcp"],
18
+ "author": "Jezweb",
19
+ "license": "UNLICENSED",
20
+ "private": false,
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.0.0",
26
+ "commander": "^13.0.0",
27
+ "open": "^10.1.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.10.2",
31
+ "typescript": "^5.7.2"
32
+ }
33
+ }