@promptframe/cli 0.1.60 → 0.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +19 -1
  2. package/dist/development-build-worker.d.ts +2 -0
  3. package/dist/development-build-worker.d.ts.map +1 -0
  4. package/dist/development-build-worker.js +184 -0
  5. package/dist/development-build-worker.js.map +1 -0
  6. package/dist/development-build.d.ts +22 -0
  7. package/dist/development-build.d.ts.map +1 -0
  8. package/dist/development-build.js +66 -0
  9. package/dist/development-build.js.map +1 -0
  10. package/dist/development-coordinator.d.ts +26 -0
  11. package/dist/development-coordinator.d.ts.map +1 -0
  12. package/dist/development-coordinator.js +114 -0
  13. package/dist/development-coordinator.js.map +1 -0
  14. package/dist/development-css.d.ts +10 -0
  15. package/dist/development-css.d.ts.map +1 -0
  16. package/dist/development-css.js +65 -0
  17. package/dist/development-css.js.map +1 -0
  18. package/dist/development-files.d.ts +6 -0
  19. package/dist/development-files.d.ts.map +1 -0
  20. package/dist/development-files.js +70 -0
  21. package/dist/development-files.js.map +1 -0
  22. package/dist/development-process.d.ts +15 -0
  23. package/dist/development-process.d.ts.map +1 -0
  24. package/dist/development-process.js +65 -0
  25. package/dist/development-process.js.map +1 -0
  26. package/dist/development-revisions.d.ts +58 -0
  27. package/dist/development-revisions.d.ts.map +1 -0
  28. package/dist/development-revisions.js +130 -0
  29. package/dist/development-revisions.js.map +1 -0
  30. package/dist/development-validation.d.ts +22 -0
  31. package/dist/development-validation.d.ts.map +1 -0
  32. package/dist/development-validation.js +122 -0
  33. package/dist/development-validation.js.map +1 -0
  34. package/dist/development-workspace.d.ts +25 -0
  35. package/dist/development-workspace.d.ts.map +1 -0
  36. package/dist/development-workspace.js +352 -0
  37. package/dist/development-workspace.js.map +1 -0
  38. package/dist/index.js +49 -0
  39. package/dist/index.js.map +1 -1
  40. package/package.json +10 -4
@@ -0,0 +1,352 @@
1
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { existsSync, lstatSync, opendirSync, realpathSync } from 'node:fs';
3
+ import { createServer as createHttpServer } from 'node:http';
4
+ import { dirname, join, posix, relative, resolve, sep } from 'node:path';
5
+ import { createServer as createViteServer } from 'vite';
6
+ import { buildDevelopmentContents } from './development-build.js';
7
+ import { DevelopmentModuleCoordinator } from './development-coordinator.js';
8
+ import { captureDevelopmentFiles } from './development-files.js';
9
+ import { DevelopmentContents } from './development-revisions.js';
10
+ const excluded = new Set(['node_modules', 'dist', '.git', '.component-packages', '.promptframe']);
11
+ const limits = { maximumFiles: 2048, maximumBytes: 16 * 1024 * 1024 };
12
+ const lockfiles = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb'];
13
+ /** One capture includes the module and its real shared pnpm lock bytes. Source
14
+ * aliases/parent imports remain explicitly unsupported by the common policy. */
15
+ export function captureDevelopmentModule(root, module) {
16
+ if (!module.path || module.path.includes('\\') || posix.isAbsolute(module.path)
17
+ || /^[A-Za-z]:/u.test(module.path)
18
+ || posix.normalize(module.path) !== module.path || module.path.split('/').some(part => !part || part === '.' || part === '..')) {
19
+ throw new Error('development.workspace.invalid_path');
20
+ }
21
+ const base = realpathSync(root), directory = resolve(base, module.path);
22
+ for (let path = directory; path !== base; path = dirname(path)) {
23
+ if (lstatSync(path).isSymbolicLink())
24
+ throw new Error('development.capture.symlink');
25
+ }
26
+ const names = [];
27
+ let entries = 0;
28
+ const walk = (directory, prefix, depth) => {
29
+ if (depth > 32)
30
+ throw new Error('development.capture.directory_limit');
31
+ const handle = opendirSync(directory);
32
+ try {
33
+ for (let entry = handle.readSync(); entry; entry = handle.readSync()) {
34
+ if (++entries > 8192)
35
+ throw new Error('development.capture.directory_limit');
36
+ if (excluded.has(entry.name))
37
+ continue;
38
+ const path = join(directory, entry.name), name = prefix + entry.name;
39
+ if (entry.isSymbolicLink())
40
+ throw new Error('development.capture.symlink');
41
+ if (entry.isDirectory())
42
+ walk(path, name + '/', depth + 1);
43
+ else if (entry.isFile()) {
44
+ names.push(name);
45
+ if (names.length > limits.maximumFiles)
46
+ throw new Error('development.contents.file_count');
47
+ }
48
+ else
49
+ throw new Error('development.capture.not_file');
50
+ }
51
+ }
52
+ finally {
53
+ handle.closeSync();
54
+ }
55
+ };
56
+ walk(directory, '', 0);
57
+ const sharedLock = !lockfiles.some(name => names.includes(name))
58
+ && existsSync(join(base, 'pnpm-workspace.yaml')) && existsSync(join(base, 'pnpm-lock.yaml'));
59
+ const prefix = module.path + '/';
60
+ const paths = names.map(name => prefix + name);
61
+ if (sharedLock)
62
+ paths.push('pnpm-workspace.yaml', 'pnpm-lock.yaml');
63
+ paths.push('promptframe-workspace.json');
64
+ const captured = captureDevelopmentFiles(base, paths, limits);
65
+ const normalized = new DevelopmentContents(captured.readFiles().map(file => ({
66
+ path: file.path.startsWith(prefix) ? file.path.slice(prefix.length)
67
+ : file.path === 'promptframe-workspace.json' ? 'promptframe-workspace.captured.json' : file.path,
68
+ bytes: file.bytes,
69
+ })), limits);
70
+ const manifest = normalized.readFiles().find(file => file.path === 'manifest.json');
71
+ if (!manifest || JSON.parse(Buffer.from(manifest.bytes).toString()).id !== module.id) {
72
+ throw new Error('development.workspace.manifest_id_mismatch');
73
+ }
74
+ const declaration = normalized.readFiles().find(file => file.path === 'promptframe-workspace.captured.json');
75
+ const workspace = JSON.parse(Buffer.from(declaration.bytes).toString());
76
+ if (workspace.schemaVersion !== 'promptframe-workspace.v0.1.0' || !Array.isArray(workspace.components)
77
+ || !workspace.components.some(entry => entry?.id === module.id && entry.path === module.path)) {
78
+ throw new Error('development.workspace.declaration_changed');
79
+ }
80
+ return normalized;
81
+ }
82
+ /** A single root Vite watcher plus a closed HTTP surface. Vite's raw-source,
83
+ * HTML, /@fs, HMR and plugin/config serving middleware is never attached. */
84
+ export async function startDevelopmentWorkspace(options) {
85
+ const root = realpathSync(options.root), origin = new URL(options.studioOrigin);
86
+ const host = options.host ?? '127.0.0.1', port = options.port ?? 0;
87
+ if (!['http:', 'https:'].includes(origin.protocol) || origin.username || origin.password
88
+ || origin.pathname !== '/' || origin.search || origin.hash || origin.origin === 'null') {
89
+ throw new Error('development.connection.invalid_origin');
90
+ }
91
+ if (!['127.0.0.1', '::1'].includes(host) || !Number.isSafeInteger(port) || port < 0 || port > 65535) {
92
+ throw new Error('development.connection.invalid_address');
93
+ }
94
+ if (!options.modules.length || options.modules.length > 32)
95
+ throw new Error('development.registry.module_limit');
96
+ const modules = new Map(options.modules.map(module => [module.id, Object.freeze({ ...module })]));
97
+ for (const module of modules.values()) {
98
+ if (typeof module.id !== 'string' || !module.id.trim() || module.id.length > 256 || /[\u0000-\u001f]/u.test(module.id)) {
99
+ throw new Error('development.module.invalid_identity');
100
+ }
101
+ }
102
+ if (modules.size !== options.modules.length || new Set([...modules.values()].map(module => module.path)).size !== modules.size) {
103
+ throw new Error('development.registry.duplicate_module');
104
+ }
105
+ const credential = randomBytes(32).toString('hex'), connectionId = randomBytes(16).toString('hex');
106
+ const expiresAt = Date.now() + 10 * 60_000;
107
+ const controller = new AbortController(), listeners = new Set();
108
+ const pending = new Set(), resident = new Map();
109
+ let pumping, checkingId;
110
+ let closed = false, expectedHost = '', responseBytes = 0, watcherDiagnostic;
111
+ const coordinator = new DevelopmentModuleCoordinator({ maximumModules: 32,
112
+ capture(id) {
113
+ const module = modules.get(id);
114
+ if (!module)
115
+ throw new Error('development.workspace.module_missing');
116
+ return captureDevelopmentModule(root, module);
117
+ },
118
+ async build(source, compilerOptions) {
119
+ const built = await buildDevelopmentContents(source, compilerOptions);
120
+ // Include the old checked output while a replacement is still pending.
121
+ if ([...resident.values()].reduce((a, b) => a + b, 0) + built.artifacts.byteLength > 64 * 1024 * 1024) {
122
+ throw new Error('development.workspace.artifact_budget');
123
+ }
124
+ return built;
125
+ },
126
+ });
127
+ const registry = () => ({ contractVersion: 'promptframe-development.v1', connectionId,
128
+ expiresAt: new Date(expiresAt).toISOString(), watcherDiagnostic, modules: [...modules.keys()].map(id => {
129
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
130
+ const checking = pending.has(id) || checkingId === id;
131
+ return { moduleId: id, status: checking ? 'checking' : state?.status ?? 'checking',
132
+ sourceRevision: !checking || state?.status === 'checking' ? state?.sourceRevision : undefined,
133
+ diagnostic: state?.diagnostic, ...(state?.lastChecked && receipt ? { lastChecked: {
134
+ sourceRevision: state.lastChecked.sourceRevision, artifactRevision: receipt.artifacts.revision,
135
+ checkerKey: state.lastChecked.checkerKey, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
136
+ } } : {}) };
137
+ }) });
138
+ const notify = () => {
139
+ const data = `event: registry\ndata: ${JSON.stringify(registry())}\n\n`;
140
+ for (const listener of listeners) {
141
+ try {
142
+ if (!listener.write(data))
143
+ listener.destroy();
144
+ }
145
+ catch {
146
+ listener.destroy();
147
+ }
148
+ }
149
+ };
150
+ const enqueue = (id) => {
151
+ if (closed || Date.now() >= expiresAt || !modules.has(id))
152
+ return;
153
+ pending.add(id);
154
+ if (pumping)
155
+ return;
156
+ // One compiler at a time; a failing module never removes another's output.
157
+ pumping = Promise.resolve().then(async () => {
158
+ while (pending.size && !closed) {
159
+ const id = pending.values().next().value;
160
+ pending.delete(id);
161
+ checkingId = id;
162
+ const job = coordinator.refresh(id, { signal: controller.signal });
163
+ notify();
164
+ if (await job)
165
+ resident.set(id, coordinator.buildReceipt(id).artifacts.byteLength);
166
+ checkingId = undefined;
167
+ notify();
168
+ }
169
+ }).finally(() => { pumping = undefined; });
170
+ };
171
+ // Explicit reads recapture too. Watch delivery/debounce is never authority.
172
+ const observe = (onlyId) => {
173
+ const revisions = new Map();
174
+ for (const [id, module] of modules) {
175
+ if (onlyId && onlyId !== id)
176
+ continue;
177
+ try {
178
+ const current = captureDevelopmentModule(root, module), state = coordinator.state(id);
179
+ revisions.set(id, current.revision);
180
+ if (state?.sourceRevision !== current.revision)
181
+ enqueue(id);
182
+ }
183
+ catch {
184
+ const state = coordinator.state(id);
185
+ if (state?.status !== 'failed' || state.sourceRevision !== undefined)
186
+ enqueue(id);
187
+ }
188
+ }
189
+ return revisions;
190
+ };
191
+ const json = (response, status, body) => {
192
+ response.writeHead(status, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store', 'X-Content-Type-Options': 'nosniff' });
193
+ response.end(JSON.stringify(body));
194
+ };
195
+ const http = createHttpServer((request, response) => {
196
+ const reject = (status, code) => {
197
+ response.setHeader('Connection', 'close');
198
+ json(response, status, { success: false, code });
199
+ };
200
+ if (request.headers.host !== expectedHost)
201
+ return reject(403, 'development.connection.host_rejected');
202
+ if (request.headers.origin !== origin.origin)
203
+ return reject(403, 'development.connection.origin_rejected');
204
+ response.setHeader('Access-Control-Allow-Origin', origin.origin);
205
+ response.setHeader('Vary', 'Origin');
206
+ if (request.method === 'OPTIONS') {
207
+ if (request.headers['access-control-request-method'] !== 'GET'
208
+ || (request.headers['access-control-request-headers'] ?? '').toString().toLowerCase().split(',').some(header => header.trim() !== 'authorization')) {
209
+ return reject(403, 'development.connection.preflight_rejected');
210
+ }
211
+ response.writeHead(204, { 'Access-Control-Allow-Methods': 'GET', 'Access-Control-Allow-Headers': 'Authorization',
212
+ 'Access-Control-Allow-Private-Network': 'true', 'Access-Control-Max-Age': '60' });
213
+ return response.end();
214
+ }
215
+ if (request.method !== 'GET')
216
+ return reject(405, 'development.connection.read_only');
217
+ if (Date.now() >= expiresAt)
218
+ return reject(401, 'development.connection.expired');
219
+ const bearer = request.headers.authorization;
220
+ if (typeof bearer !== 'string' || !/^Bearer [a-f0-9]{64}$/u.test(bearer)
221
+ || !timingSafeEqual(Buffer.from(bearer), Buffer.from('Bearer ' + credential))) {
222
+ return reject(401, 'development.connection.credential_rejected');
223
+ }
224
+ if (!request.url?.startsWith('/') || request.url.startsWith('//') || request.url.includes('?')) {
225
+ return reject(400, 'development.connection.invalid_path');
226
+ }
227
+ if (request.url === '/__promptframe/registry') {
228
+ observe();
229
+ return json(response, 200, registry());
230
+ }
231
+ if (request.url === '/__promptframe/events') {
232
+ if (listeners.size >= 8)
233
+ return reject(503, 'development.connection.observer_limit');
234
+ observe();
235
+ response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-store' });
236
+ listeners.add(response);
237
+ response.on('close', () => listeners.delete(response));
238
+ response.on('error', () => response.destroy());
239
+ response.write(`event: registry\ndata: ${JSON.stringify(registry())}\n\n`);
240
+ return;
241
+ }
242
+ const match = /^\/__promptframe\/modules\/([^/]+)\/bundle\/([a-f0-9]{64})$/u.exec(request.url);
243
+ if (!match)
244
+ return reject(404, 'development.connection.route_missing');
245
+ let id;
246
+ try {
247
+ id = decodeURIComponent(match[1]);
248
+ }
249
+ catch {
250
+ return reject(400, 'development.connection.invalid_path');
251
+ }
252
+ if (!modules.has(id))
253
+ return reject(404, 'development.workspace.module_missing');
254
+ const revisions = observe(id);
255
+ const state = coordinator.state(id), receipt = coordinator.buildReceipt(id);
256
+ if (!state?.lastChecked || !receipt || revisions.get(id) !== receipt.sourceRevision
257
+ || receipt.artifacts.revision !== 'sha256:' + match[2]) {
258
+ return reject(409, 'development.workspace.bundle_not_current');
259
+ }
260
+ const reservation = receipt.artifacts.byteLength * 5 + 4 * 1024 * 1024;
261
+ if (responseBytes + reservation > 48 * 1024 * 1024)
262
+ return reject(503, 'development.connection.response_budget');
263
+ responseBytes += reservation;
264
+ let released = false;
265
+ const release = () => { if (!released) {
266
+ released = true;
267
+ responseBytes -= reservation;
268
+ } };
269
+ response.once('finish', release);
270
+ response.once('close', release);
271
+ try {
272
+ // A single exact bundle contains all chunks/resources: no live source or
273
+ // credential is passed into component ESM. The consumer still isolates it.
274
+ json(response, 200, { connectionId, moduleId: id, sourceRevision: receipt.sourceRevision,
275
+ artifactRevision: receipt.artifacts.revision, entries: receipt.entries, runtimeImports: receipt.runtimeImports,
276
+ files: receipt.artifacts.readFiles().map(file => ({ path: file.path, base64: Buffer.from(file.bytes).toString('base64') })) });
277
+ }
278
+ catch {
279
+ response.destroy();
280
+ }
281
+ });
282
+ http.maxConnections = 64;
283
+ http.headersTimeout = 5000;
284
+ http.requestTimeout = 5000;
285
+ http.keepAliveTimeout = 3000;
286
+ http.on('upgrade', (_request, socket) => socket.destroy());
287
+ const vite = await createViteServer({ root, configFile: false, envFile: false, publicDir: false,
288
+ mode: 'development', appType: 'custom', logLevel: 'silent',
289
+ server: { middlewareMode: true, hmr: false, ws: false,
290
+ watch: { followSymlinks: false, ignored: ['**/node_modules/**', '**/dist/**', '**/.git/**', '**/.promptframe/**', '**/.component-packages/**'] } },
291
+ });
292
+ const changed = (_event, path) => {
293
+ const local = relative(root, resolve(path)).split(sep).join('/');
294
+ for (const [id, module] of modules) {
295
+ if (local === module.path || local.startsWith(module.path + '/') || local === 'pnpm-lock.yaml'
296
+ || local === 'package.json' || local === 'pnpm-workspace.yaml' || local === 'promptframe-workspace.json')
297
+ enqueue(id);
298
+ }
299
+ };
300
+ vite.watcher.on('all', changed);
301
+ vite.watcher.on('error', () => { watcherDiagnostic = 'development.workspace.watch_failed'; notify(); });
302
+ try {
303
+ await new Promise((resolve, reject) => {
304
+ http.once('error', reject);
305
+ http.listen(port, host, () => { http.removeListener('error', reject); resolve(); });
306
+ });
307
+ }
308
+ catch (error) {
309
+ await vite.close();
310
+ throw error;
311
+ }
312
+ const address = http.address();
313
+ if (!address || typeof address === 'string') {
314
+ await vite.close();
315
+ http.close();
316
+ throw new Error('development.connection.no_address');
317
+ }
318
+ expectedHost = `${host === '::1' ? '[::1]' : host}:${address.port}`;
319
+ for (const id of modules.keys())
320
+ enqueue(id);
321
+ const expiry = setTimeout(() => {
322
+ controller.abort(new Error('development.connection.expired'));
323
+ pending.clear();
324
+ for (const response of listeners) {
325
+ response.write('event: expired\ndata: {"code":"development.connection.expired"}\n\n');
326
+ response.end();
327
+ }
328
+ listeners.clear();
329
+ }, expiresAt - Date.now());
330
+ expiry.unref();
331
+ let closePromise;
332
+ return Object.freeze({ connectionId, url: `http://${expectedHost}`, studioOrigin: origin.origin,
333
+ credential, expiresAt: new Date(expiresAt).toISOString(),
334
+ close() {
335
+ return closePromise ??= (async () => {
336
+ closed = true;
337
+ clearTimeout(expiry);
338
+ controller.abort(new Error('development.workspace.closed'));
339
+ pending.clear();
340
+ for (const response of listeners)
341
+ response.end();
342
+ listeners.clear();
343
+ const httpClosed = new Promise((resolve, reject) => http.close(error => error ? reject(error) : resolve()));
344
+ http.closeAllConnections();
345
+ await pumping;
346
+ await vite.close();
347
+ await httpClosed;
348
+ })();
349
+ },
350
+ });
351
+ }
352
+ //# sourceMappingURL=development-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-workspace.js","sourceRoot":"","sources":["../src/development-workspace.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -471,6 +471,11 @@ function preview(argv) {
471
471
  console.log(`Run: npm run ${previewScript}`);
472
472
  }
473
473
  async function dev(argv) {
474
+ const workspaceRoot = autoWorkspaceRoot(argv);
475
+ if (workspaceRoot) {
476
+ await devWorkspace(workspaceRoot, argv);
477
+ return;
478
+ }
474
479
  const input = resolveComponentInput(argv);
475
480
  const dir = input.dir;
476
481
  const target = resolveUploadTarget(argv);
@@ -519,6 +524,48 @@ async function dev(argv) {
519
524
  return;
520
525
  await runDevServer(dir, devCommand);
521
526
  }
527
+ async function devWorkspace(root, argv) {
528
+ const studioOrigin = valueAfter(argv, '--studio-origin')
529
+ ?? fail('Workspace dev requires --studio-origin <exact-origin> for its local connection.', 'dev.workspace.origin_required', 2);
530
+ const host = valueAfter(argv, '--host') ?? '127.0.0.1';
531
+ const port = Number(valueAfter(argv, '--port') ?? '0');
532
+ if ((host !== '127.0.0.1' && host !== '::1') || !Number.isSafeInteger(port) || port < 0 || port > 65535) {
533
+ fail('Workspace dev binds one explicit loopback address and port (0 chooses one actual free port).', 'dev.workspace.address_invalid', 2);
534
+ }
535
+ const workspace = readWorkspaceConfig(root);
536
+ if (hasFlag(argv, '--json') && !hasFlag(argv, '--dry-run')) {
537
+ fail('dev --json requires --dry-run so stdout remains machine-readable.', 'dev.json_requires_dry_run');
538
+ }
539
+ if (hasFlag(argv, '--dry-run')) {
540
+ printJson({ command: 'dev.workspace', workspace: workspaceSummary(root), modules: workspace.components,
541
+ host, port, studioOrigin, status: 'declared', checked: false, playerLoaded: false });
542
+ return;
543
+ }
544
+ // Lazy import keeps ordinary validate/check free of a Vite server lifecycle.
545
+ const { startDevelopmentWorkspace } = await import('./development-workspace.js');
546
+ let stop;
547
+ const stopped = new Promise(resolve => { stop = resolve; });
548
+ process.once('SIGINT', stop);
549
+ process.once('SIGTERM', stop);
550
+ try {
551
+ const server = await startDevelopmentWorkspace({ root, modules: workspace.components, studioOrigin, host, port });
552
+ try {
553
+ // This short-lived credential is for explicit local tooling, never an
554
+ // application login token or something to embed in component code.
555
+ printJson({ command: 'dev.workspace', contractVersion: 'promptframe-development.v1',
556
+ connectionId: server.connectionId, url: server.url, studioOrigin: server.studioOrigin,
557
+ credential: server.credential, expiresAt: server.expiresAt, playerLoaded: false });
558
+ await stopped;
559
+ }
560
+ finally {
561
+ await server.close();
562
+ }
563
+ }
564
+ finally {
565
+ process.removeListener('SIGINT', stop);
566
+ process.removeListener('SIGTERM', stop);
567
+ }
568
+ }
522
569
  function packageComponent(argv) {
523
570
  const input = resolveComponentInput(argv);
524
571
  const artifact = packageDirectory(input.dir, valueAfter(argv, '--out'));
@@ -1620,6 +1667,7 @@ const POSITIONAL_VALUE_FLAGS = new Set([
1620
1667
  '--endpoint',
1621
1668
  '--expires-at',
1622
1669
  '--host',
1670
+ '--studio-origin',
1623
1671
  '--id',
1624
1672
  '--level',
1625
1673
  '--name',
@@ -4252,6 +4300,7 @@ Commands:
4252
4300
  preview <dir> Validate and print local Remotion preview envelope
4253
4301
  --write-local-report Write .promptframe/local-previews/preview-report.json
4254
4302
  dev <dir> Start the local Remotion Player preview server
4303
+ --studio-origin <origin> Required for a multi-component workspace's checked-module connection
4255
4304
  package <dir> --out <zip> Validate and package a component source zip
4256
4305
  upload <dir|zip> Upload component source package to PromptFrame
4257
4306
  --target <target> marketplace_authoring or project_private_generation