@majkapp/plugin-kit 3.3.0 → 3.3.2
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/bin/promptable-cli.js +71 -15
- package/dist/generator/cli.js +50 -0
- package/docs/INDEX.md +121 -2
- package/package.json +2 -2
package/bin/promptable-cli.js
CHANGED
|
@@ -16,20 +16,76 @@ const cli = createPromptable({
|
|
|
16
16
|
title: '@majkapp/plugin-kit',
|
|
17
17
|
description: 'Build MAJK plugins with functions, UI screens, and services',
|
|
18
18
|
docsDir: join(__dirname, '../docs'),
|
|
19
|
-
packageCommand: 'npx @majkapp/plugin-kit'
|
|
20
|
-
views: {
|
|
21
|
-
llm: 'INDEX.md',
|
|
22
|
-
functions: 'FUNCTIONS.md',
|
|
23
|
-
screens: 'SCREENS.md',
|
|
24
|
-
hooks: 'HOOKS.md',
|
|
25
|
-
context: 'CONTEXT.md',
|
|
26
|
-
services: 'SERVICES.md',
|
|
27
|
-
lifecycle: 'LIFECYCLE.md',
|
|
28
|
-
testing: 'TESTING.md',
|
|
29
|
-
config: 'CONFIG.md',
|
|
30
|
-
api: 'API.md',
|
|
31
|
-
full: 'FULL.md'
|
|
32
|
-
}
|
|
19
|
+
packageCommand: 'npx @majkapp/plugin-kit'
|
|
33
20
|
});
|
|
34
21
|
|
|
35
|
-
|
|
22
|
+
// Main entry point - quick start
|
|
23
|
+
cli.addCommand('--llm',
|
|
24
|
+
cli.createFullDocCommand('INDEX.md'),
|
|
25
|
+
{
|
|
26
|
+
description: 'Quick start: Build your first plugin',
|
|
27
|
+
aliases: ['--start', '--quick']
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// Function patterns
|
|
32
|
+
cli.addCommand('--functions',
|
|
33
|
+
cli.createFullDocCommand('FUNCTIONS.md'),
|
|
34
|
+
{ description: 'Function patterns with examples' }
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// Screen configuration
|
|
38
|
+
cli.addCommand('--screens',
|
|
39
|
+
cli.createFullDocCommand('SCREENS.md'),
|
|
40
|
+
{ description: 'Configure UI screens' }
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Generated React hooks
|
|
44
|
+
cli.addCommand('--hooks',
|
|
45
|
+
cli.createFullDocCommand('HOOKS.md'),
|
|
46
|
+
{ description: 'Auto-generated React hooks' }
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// Context API
|
|
50
|
+
cli.addCommand('--context',
|
|
51
|
+
cli.createFullDocCommand('CONTEXT.md'),
|
|
52
|
+
{ description: 'Context API reference' }
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// Service grouping
|
|
56
|
+
cli.addCommand('--services',
|
|
57
|
+
cli.createFullDocCommand('SERVICES.md'),
|
|
58
|
+
{ description: 'Organize functions by service' }
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
// Lifecycle hooks
|
|
62
|
+
cli.addCommand('--lifecycle',
|
|
63
|
+
cli.createFullDocCommand('LIFECYCLE.md'),
|
|
64
|
+
{ description: 'Plugin lifecycle hooks' }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Testing guide
|
|
68
|
+
cli.addCommand('--testing',
|
|
69
|
+
cli.createFullDocCommand('TESTING.md'),
|
|
70
|
+
{ description: 'Testing guide' }
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// Configuration
|
|
74
|
+
cli.addCommand('--config',
|
|
75
|
+
cli.createFullDocCommand('CONFIG.md'),
|
|
76
|
+
{ description: 'Project configuration' }
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
// API reference
|
|
80
|
+
cli.addCommand('--api',
|
|
81
|
+
cli.createFullDocCommand('API.md'),
|
|
82
|
+
{ description: 'Complete API reference' }
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Full documentation
|
|
86
|
+
cli.addCommand('--full',
|
|
87
|
+
cli.createFullDocCommand('FULL.md'),
|
|
88
|
+
{ description: 'Complete documentation' }
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
cli.run();
|
package/dist/generator/cli.js
CHANGED
|
@@ -39,6 +39,43 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
const fs = __importStar(require("fs"));
|
|
40
40
|
const child_process_1 = require("child_process");
|
|
41
41
|
const generator_1 = require("./generator");
|
|
42
|
+
// Check args BEFORE commander parses to intercept for documentation
|
|
43
|
+
const args = process.argv.slice(2);
|
|
44
|
+
// If -h or --help, let commander handle it normally (show generator help)
|
|
45
|
+
const isHelpRequest = args.includes('-h') || args.includes('--help');
|
|
46
|
+
if (!isHelpRequest) {
|
|
47
|
+
// Check if this is a documentation request
|
|
48
|
+
const llmArg = args.find(arg => arg.startsWith('--llm'));
|
|
49
|
+
const isDefaultDocs = args.length === 0; // No args = show docs by default
|
|
50
|
+
if (isDefaultDocs || llmArg) {
|
|
51
|
+
// Delegate to promptable CLI for documentation
|
|
52
|
+
const promptablePath = path.join(__dirname, '../../bin/promptable-cli.js');
|
|
53
|
+
let promptableArgs;
|
|
54
|
+
if (isDefaultDocs || llmArg === '--llm') {
|
|
55
|
+
// Default to quick start
|
|
56
|
+
promptableArgs = ['--llm'];
|
|
57
|
+
}
|
|
58
|
+
else if (llmArg && llmArg.startsWith('--llm:')) {
|
|
59
|
+
// Extract view name: --llm:functions -> --functions
|
|
60
|
+
const view = llmArg.split(':')[1];
|
|
61
|
+
promptableArgs = [`--${view}`];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
promptableArgs = ['--llm'];
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
(0, child_process_1.execSync)(`node "${promptablePath}" ${promptableArgs.join(' ')}`, {
|
|
68
|
+
stdio: 'inherit',
|
|
69
|
+
cwd: process.cwd()
|
|
70
|
+
});
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Normal commander behavior (generator commands)
|
|
42
79
|
commander_1.program
|
|
43
80
|
.name('plugin-kit')
|
|
44
81
|
.version('1.0.20')
|
|
@@ -126,6 +163,19 @@ commander_1.program
|
|
|
126
163
|
await generate();
|
|
127
164
|
}
|
|
128
165
|
});
|
|
166
|
+
// Add documentation options to help
|
|
167
|
+
commander_1.program
|
|
168
|
+
.option('--llm', 'Show plugin development documentation (quick start)')
|
|
169
|
+
.option('--llm:functions', 'Show function patterns documentation')
|
|
170
|
+
.option('--llm:screens', 'Show screen configuration documentation')
|
|
171
|
+
.option('--llm:hooks', 'Show generated hooks documentation')
|
|
172
|
+
.option('--llm:context', 'Show context API documentation')
|
|
173
|
+
.option('--llm:services', 'Show service grouping documentation')
|
|
174
|
+
.option('--llm:lifecycle', 'Show lifecycle hooks documentation')
|
|
175
|
+
.option('--llm:testing', 'Show testing guide')
|
|
176
|
+
.option('--llm:config', 'Show project configuration guide')
|
|
177
|
+
.option('--llm:api', 'Show API reference')
|
|
178
|
+
.option('--llm:full', 'Show complete reference');
|
|
129
179
|
commander_1.program.parse();
|
|
130
180
|
async function extractMetadata(entryPath) {
|
|
131
181
|
// Create a temp file for the output
|
package/docs/INDEX.md
CHANGED
|
@@ -104,11 +104,130 @@ my-plugin/
|
|
|
104
104
|
│ └── plugin/
|
|
105
105
|
│ ├── functions/unit/ # Function tests
|
|
106
106
|
│ └── ui/unit/ # UI tests with bot
|
|
107
|
-
├── vite.config.js # EXACT format required (see
|
|
108
|
-
├── package.json
|
|
107
|
+
├── vite.config.js # EXACT format required (see below)
|
|
108
|
+
├── package.json # REQUIRED: majk metadata section
|
|
109
109
|
└── tsconfig.json
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
+
## package.json (REQUIRED)
|
|
113
|
+
|
|
114
|
+
**CRITICAL:** Your package.json MUST include the `majk` metadata section and use an npm organization scope:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"name": "@yourorg/my-plugin",
|
|
119
|
+
"version": "1.0.0",
|
|
120
|
+
"description": "My awesome MAJK plugin",
|
|
121
|
+
"main": "index.js",
|
|
122
|
+
"keywords": ["majk", "plugin"],
|
|
123
|
+
"majk": {
|
|
124
|
+
"type": "in-process",
|
|
125
|
+
"entry": "index.js"
|
|
126
|
+
},
|
|
127
|
+
"scripts": {
|
|
128
|
+
"generate": "npx plugin-kit generate -e ./index.js -o ./ui/src/generated",
|
|
129
|
+
"dev": "vite",
|
|
130
|
+
"build": "tsc && npm run generate && vite build",
|
|
131
|
+
"preview": "vite preview",
|
|
132
|
+
"test": "npm run test:plugin",
|
|
133
|
+
"test:plugin": "npm run test:plugin:functions && npm run test:plugin:ui",
|
|
134
|
+
"test:plugin:functions": "npx majk-test --type functions",
|
|
135
|
+
"test:plugin:ui": "node tests/plugin/ui/unit/basic-navigation.test.js",
|
|
136
|
+
"clean": "rm -rf dist index.js index.d.ts ui/src/generated"
|
|
137
|
+
},
|
|
138
|
+
"dependencies": {
|
|
139
|
+
"@majkapp/plugin-kit": "^3.3.0",
|
|
140
|
+
"@majkapp/plugin-theme": "^1.0.0",
|
|
141
|
+
"@majkapp/plugin-ui": "^1.4.0",
|
|
142
|
+
"react": "^18.3.1",
|
|
143
|
+
"react-dom": "^18.3.1"
|
|
144
|
+
},
|
|
145
|
+
"devDependencies": {
|
|
146
|
+
"@majkapp/plugin-test": "^1.0.2",
|
|
147
|
+
"@types/react": "^18.3.1",
|
|
148
|
+
"@types/react-dom": "^18.3.1",
|
|
149
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
150
|
+
"typescript": "^5.3.3",
|
|
151
|
+
"vite": "^6.0.3"
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Package Naming (REQUIRED)
|
|
157
|
+
|
|
158
|
+
**Your plugin name MUST use an npm organization scope** (format: `@org/plugin-name`).
|
|
159
|
+
|
|
160
|
+
Replace `@yourorg` with your organization:
|
|
161
|
+
- If you have an npm organization: `@mycompany/my-plugin`
|
|
162
|
+
- If you don't have one: Use `@majkical/my-plugin`
|
|
163
|
+
|
|
164
|
+
Example: `@majkical/weather-widget`
|
|
165
|
+
|
|
166
|
+
### majk Metadata Section
|
|
167
|
+
|
|
168
|
+
The `majk` object tells MAJK how to load your plugin:
|
|
169
|
+
|
|
170
|
+
**`type`**: `"in-process"` or `"remote"`
|
|
171
|
+
- `"in-process"` - Plugin runs in MAJK's Node.js process (most common)
|
|
172
|
+
- `"remote"` - Plugin runs in separate process (for isolation)
|
|
173
|
+
|
|
174
|
+
**`entry`**: Path to compiled plugin file (relative to package root)
|
|
175
|
+
- Usually `"index.js"` (compiled from `src/index.ts`)
|
|
176
|
+
- MAJK loads this file to get your plugin definition
|
|
177
|
+
|
|
178
|
+
### Important Scripts
|
|
179
|
+
|
|
180
|
+
**`generate`** - Generate TypeScript client from plugin
|
|
181
|
+
```bash
|
|
182
|
+
npm run generate # Regenerate after adding/changing functions
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**`build`** - Complete build pipeline
|
|
186
|
+
```bash
|
|
187
|
+
npm run build # 1. Compile TS → index.js
|
|
188
|
+
# 2. Generate client
|
|
189
|
+
# 3. Build React UI → dist/
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**`test:plugin:functions`** - Test plugin functions
|
|
193
|
+
```bash
|
|
194
|
+
npm run test:plugin:functions # Run all function tests
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**`test:plugin:ui`** - Test plugin UI with bot
|
|
198
|
+
```bash
|
|
199
|
+
npm run test:plugin:ui # Run UI tests with browser automation
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## vite.config.js (REQUIRED FORMAT)
|
|
203
|
+
|
|
204
|
+
**CRITICAL:** Use this EXACT format for your vite.config.js:
|
|
205
|
+
|
|
206
|
+
```javascript
|
|
207
|
+
import { defineConfig } from 'vite';
|
|
208
|
+
import react from '@vitejs/plugin-react';
|
|
209
|
+
|
|
210
|
+
export default defineConfig({
|
|
211
|
+
plugins: [react()],
|
|
212
|
+
root: 'ui', // React source is in ui/ directory
|
|
213
|
+
base: '', // IMPORTANT: Empty string, NOT './'
|
|
214
|
+
server: {
|
|
215
|
+
port: 3000,
|
|
216
|
+
strictPort: false,
|
|
217
|
+
},
|
|
218
|
+
build: {
|
|
219
|
+
outDir: '../dist', // Build output to dist/ (parent of ui/)
|
|
220
|
+
assetsDir: 'assets',
|
|
221
|
+
emptyOutDir: true,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Why `base: ''`?**
|
|
227
|
+
- MAJK loads plugins in iframes with dynamic paths
|
|
228
|
+
- Empty base ensures assets load correctly
|
|
229
|
+
- `base: './'` will cause 404 errors for assets
|
|
230
|
+
|
|
112
231
|
## Best Practice: Decoupled Business Logic
|
|
113
232
|
|
|
114
233
|
**ALWAYS separate business logic from plugin code.** This makes testing easier and allows logic reuse.
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@majkapp/plugin-kit",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"description": "Pure plugin definition library for MAJK - outputs plugin definitions, not HTTP servers",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
|
-
"plugin-kit": "./
|
|
8
|
+
"plugin-kit": "./dist/generator/cli.js",
|
|
9
9
|
"majk-plugin-kit": "./dist/generator/cli.js"
|
|
10
10
|
},
|
|
11
11
|
"repository": {
|