@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 +88 -0
- package/dist/auth.d.ts +18 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +118 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +211 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +78 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +97 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +312 -0
- package/dist/mcp.js.map +1 -0
- package/package.json +33 -0
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
|
package/dist/auth.js.map
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA0CvC;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,IAAY,EACZ,IAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,eAAe,EAAE,UAAU,KAAK,EAAE;KACnC,CAAC;IAEF,IAAI,WAA+B,CAAC;IAEpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,WAAW,IAAI,EAAE,EAAE;QAC9D,MAAM;QACN,OAAO;QACP,IAAI,EAAE,WAAW;KAClB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;IAEtD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,OAAO,UAAU,CAAiB,KAAK,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAkB,KAAK,EAAE,UAAU,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,OAAO,UAAU,CAAiB,KAAK,EAAE,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAOlC;IACC,MAAM,IAAI,GAAG,MAAM,UAAU,CAA2B,MAAM,EAAE,UAAU,EAAE;QAC1E,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO;QAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ;QAC9B,gBAAgB,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;QACjD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,QAAQ;KACnC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAQhD;IACC,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,OAAO,EACP,YAAY,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACtC,OAAO,CACR,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,OAAe,EACf,OAAe;IAEf,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,aAAa,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAC5G;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,KAAK,EAAE;YAClC,cAAc,EAAE,iBAAiB;SAClC;QACD,IAAI,EAAE,OAAO;KACd,CACF,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2C,CAAC;IAE5E,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAiB;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAoB;KACtC,CAAC;AACJ,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/mcp.js.map
ADDED
|
@@ -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
|
+
}
|