@kinotic-ai/kinotic-cli 2.1.2 → 2.3.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 CHANGED
@@ -1,4 +1,4 @@
1
- Structures CLI
1
+ Kinotic CLI
2
2
  =================
3
3
 
4
4
  <!-- toc -->
@@ -12,7 +12,7 @@ $ npm install -g @kinotic-ai/kinotic-cli
12
12
  $ kinotic COMMAND
13
13
  running command...
14
14
  $ kinotic (--version)
15
- @kinotic-ai/kinotic-cli/2.1.2 darwin-arm64 node-v22.13.1
15
+ @kinotic-ai/kinotic-cli/2.2.0 darwin-arm64 node-v22.13.1
16
16
  $ kinotic --help [COMMAND]
17
17
  USAGE
18
18
  $ kinotic COMMAND
@@ -21,57 +21,13 @@ USAGE
21
21
  <!-- usagestop -->
22
22
  # Commands
23
23
  <!-- commands -->
24
- * [`kinotic autocomplete [SHELL]`](#kinotic-autocomplete-shell)
25
24
  * [`kinotic create project NAME`](#kinotic-create-project-name)
26
25
  * [`kinotic gen`](#kinotic-gen)
27
26
  * [`kinotic generate`](#kinotic-generate)
28
- * [`kinotic help [COMMAND]`](#kinotic-help-command)
29
27
  * [`kinotic init`](#kinotic-init)
30
28
  * [`kinotic initialize`](#kinotic-initialize)
31
- * [`kinotic plugins`](#kinotic-plugins)
32
- * [`kinotic plugins add PLUGIN`](#kinotic-plugins-add-plugin)
33
- * [`kinotic plugins:inspect PLUGIN...`](#kinotic-pluginsinspect-plugin)
34
- * [`kinotic plugins install PLUGIN`](#kinotic-plugins-install-plugin)
35
- * [`kinotic plugins link PATH`](#kinotic-plugins-link-path)
36
- * [`kinotic plugins remove [PLUGIN]`](#kinotic-plugins-remove-plugin)
37
- * [`kinotic plugins reset`](#kinotic-plugins-reset)
38
- * [`kinotic plugins uninstall [PLUGIN]`](#kinotic-plugins-uninstall-plugin)
39
- * [`kinotic plugins unlink [PLUGIN]`](#kinotic-plugins-unlink-plugin)
40
- * [`kinotic plugins update`](#kinotic-plugins-update)
41
29
  * [`kinotic sync`](#kinotic-sync)
42
30
  * [`kinotic synchronize`](#kinotic-synchronize)
43
- * [`kinotic update [CHANNEL]`](#kinotic-update-channel)
44
-
45
- ## `kinotic autocomplete [SHELL]`
46
-
47
- Display autocomplete installation instructions.
48
-
49
- ```
50
- USAGE
51
- $ kinotic autocomplete [SHELL] [-r]
52
-
53
- ARGUMENTS
54
- [SHELL] (zsh|bash|powershell) Shell type
55
-
56
- FLAGS
57
- -r, --refresh-cache Refresh cache (ignores displaying instructions)
58
-
59
- DESCRIPTION
60
- Display autocomplete installation instructions.
61
-
62
- EXAMPLES
63
- $ kinotic autocomplete
64
-
65
- $ kinotic autocomplete bash
66
-
67
- $ kinotic autocomplete zsh
68
-
69
- $ kinotic autocomplete powershell
70
-
71
- $ kinotic autocomplete --refresh-cache
72
- ```
73
-
74
- _See code: [@oclif/plugin-autocomplete](https://github.com/oclif/plugin-autocomplete/blob/v3.2.41/src/commands/autocomplete/index.ts)_
75
31
 
76
32
  ## `kinotic create project NAME`
77
33
 
@@ -91,7 +47,7 @@ EXAMPLES
91
47
  $ kinotic create project MyProjectName
92
48
  ```
93
49
 
94
- _See code: [src/commands/create/project.ts](https://github.com/kinotic-ai/kinotic/blob/v2.1.2/src/commands/create/project.ts)_
50
+ _See code: [src/commands/create/project.ts](https://github.com/kinotic-ai/kinotic/blob/v2.2.0/src/commands/create/project.ts)_
95
51
 
96
52
  ## `kinotic gen`
97
53
 
@@ -149,27 +105,7 @@ EXAMPLES
149
105
  $ kinotic gen --force
150
106
  ```
151
107
 
152
- _See code: [src/commands/generate.ts](https://github.com/kinotic-ai/kinotic/blob/v2.1.2/src/commands/generate.ts)_
153
-
154
- ## `kinotic help [COMMAND]`
155
-
156
- Display help for kinotic.
157
-
158
- ```
159
- USAGE
160
- $ kinotic help [COMMAND...] [-n]
161
-
162
- ARGUMENTS
163
- [COMMAND...] Command to show help for.
164
-
165
- FLAGS
166
- -n, --nested-commands Include all nested commands in the output.
167
-
168
- DESCRIPTION
169
- Display help for kinotic.
170
- ```
171
-
172
- _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/6.2.38/src/commands/help.ts)_
108
+ _See code: [src/commands/generate.ts](https://github.com/kinotic-ai/kinotic/blob/v2.2.0/src/commands/generate.ts)_
173
109
 
174
110
  ## `kinotic init`
175
111
 
@@ -231,297 +167,7 @@ EXAMPLES
231
167
  $ kinotic init -a my.app -e path/to/entities -r path/to/repository --mirror
232
168
  ```
233
169
 
234
- _See code: [src/commands/initialize.ts](https://github.com/kinotic-ai/kinotic/blob/v2.1.2/src/commands/initialize.ts)_
235
-
236
- ## `kinotic plugins`
237
-
238
- List installed plugins.
239
-
240
- ```
241
- USAGE
242
- $ kinotic plugins [--json] [--core]
243
-
244
- FLAGS
245
- --core Show core plugins.
246
-
247
- GLOBAL FLAGS
248
- --json Format output as json.
249
-
250
- DESCRIPTION
251
- List installed plugins.
252
-
253
- EXAMPLES
254
- $ kinotic plugins
255
- ```
256
-
257
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/index.ts)_
258
-
259
- ## `kinotic plugins add PLUGIN`
260
-
261
- Installs a plugin into kinotic.
262
-
263
- ```
264
- USAGE
265
- $ kinotic plugins add PLUGIN... [--json] [-f] [-h] [-s | -v]
266
-
267
- ARGUMENTS
268
- PLUGIN... Plugin to install.
269
-
270
- FLAGS
271
- -f, --force Force npm to fetch remote resources even if a local copy exists on disk.
272
- -h, --help Show CLI help.
273
- -s, --silent Silences npm output.
274
- -v, --verbose Show verbose npm output.
275
-
276
- GLOBAL FLAGS
277
- --json Format output as json.
278
-
279
- DESCRIPTION
280
- Installs a plugin into kinotic.
281
-
282
- Uses npm to install plugins.
283
-
284
- Installation of a user-installed plugin will override a core plugin.
285
-
286
- Use the KINOTIC_NPM_LOG_LEVEL environment variable to set the npm loglevel.
287
- Use the KINOTIC_NPM_REGISTRY environment variable to set the npm registry.
288
-
289
- ALIASES
290
- $ kinotic plugins add
291
-
292
- EXAMPLES
293
- Install a plugin from npm registry.
294
-
295
- $ kinotic plugins add myplugin
296
-
297
- Install a plugin from a github url.
298
-
299
- $ kinotic plugins add https://github.com/someuser/someplugin
300
-
301
- Install a plugin from a github slug.
302
-
303
- $ kinotic plugins add someuser/someplugin
304
- ```
305
-
306
- ## `kinotic plugins:inspect PLUGIN...`
307
-
308
- Displays installation properties of a plugin.
309
-
310
- ```
311
- USAGE
312
- $ kinotic plugins inspect PLUGIN...
313
-
314
- ARGUMENTS
315
- PLUGIN... [default: .] Plugin to inspect.
316
-
317
- FLAGS
318
- -h, --help Show CLI help.
319
- -v, --verbose
320
-
321
- GLOBAL FLAGS
322
- --json Format output as json.
323
-
324
- DESCRIPTION
325
- Displays installation properties of a plugin.
326
-
327
- EXAMPLES
328
- $ kinotic plugins inspect myplugin
329
- ```
330
-
331
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/inspect.ts)_
332
-
333
- ## `kinotic plugins install PLUGIN`
334
-
335
- Installs a plugin into kinotic.
336
-
337
- ```
338
- USAGE
339
- $ kinotic plugins install PLUGIN... [--json] [-f] [-h] [-s | -v]
340
-
341
- ARGUMENTS
342
- PLUGIN... Plugin to install.
343
-
344
- FLAGS
345
- -f, --force Force npm to fetch remote resources even if a local copy exists on disk.
346
- -h, --help Show CLI help.
347
- -s, --silent Silences npm output.
348
- -v, --verbose Show verbose npm output.
349
-
350
- GLOBAL FLAGS
351
- --json Format output as json.
352
-
353
- DESCRIPTION
354
- Installs a plugin into kinotic.
355
-
356
- Uses npm to install plugins.
357
-
358
- Installation of a user-installed plugin will override a core plugin.
359
-
360
- Use the KINOTIC_NPM_LOG_LEVEL environment variable to set the npm loglevel.
361
- Use the KINOTIC_NPM_REGISTRY environment variable to set the npm registry.
362
-
363
- ALIASES
364
- $ kinotic plugins add
365
-
366
- EXAMPLES
367
- Install a plugin from npm registry.
368
-
369
- $ kinotic plugins install myplugin
370
-
371
- Install a plugin from a github url.
372
-
373
- $ kinotic plugins install https://github.com/someuser/someplugin
374
-
375
- Install a plugin from a github slug.
376
-
377
- $ kinotic plugins install someuser/someplugin
378
- ```
379
-
380
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/install.ts)_
381
-
382
- ## `kinotic plugins link PATH`
383
-
384
- Links a plugin into the CLI for development.
385
-
386
- ```
387
- USAGE
388
- $ kinotic plugins link PATH [-h] [--install] [-v]
389
-
390
- ARGUMENTS
391
- PATH [default: .] path to plugin
392
-
393
- FLAGS
394
- -h, --help Show CLI help.
395
- -v, --verbose
396
- --[no-]install Install dependencies after linking the plugin.
397
-
398
- DESCRIPTION
399
- Links a plugin into the CLI for development.
400
-
401
- Installation of a linked plugin will override a user-installed or core plugin.
402
-
403
- e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
404
- command will override the user-installed or core plugin implementation. This is useful for development work.
405
-
406
-
407
- EXAMPLES
408
- $ kinotic plugins link myplugin
409
- ```
410
-
411
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/link.ts)_
412
-
413
- ## `kinotic plugins remove [PLUGIN]`
414
-
415
- Removes a plugin from the CLI.
416
-
417
- ```
418
- USAGE
419
- $ kinotic plugins remove [PLUGIN...] [-h] [-v]
420
-
421
- ARGUMENTS
422
- [PLUGIN...] plugin to uninstall
423
-
424
- FLAGS
425
- -h, --help Show CLI help.
426
- -v, --verbose
427
-
428
- DESCRIPTION
429
- Removes a plugin from the CLI.
430
-
431
- ALIASES
432
- $ kinotic plugins unlink
433
- $ kinotic plugins remove
434
-
435
- EXAMPLES
436
- $ kinotic plugins remove myplugin
437
- ```
438
-
439
- ## `kinotic plugins reset`
440
-
441
- Remove all user-installed and linked plugins.
442
-
443
- ```
444
- USAGE
445
- $ kinotic plugins reset [--hard] [--reinstall]
446
-
447
- FLAGS
448
- --hard Delete node_modules and package manager related files in addition to uninstalling plugins.
449
- --reinstall Reinstall all plugins after uninstalling.
450
- ```
451
-
452
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/reset.ts)_
453
-
454
- ## `kinotic plugins uninstall [PLUGIN]`
455
-
456
- Removes a plugin from the CLI.
457
-
458
- ```
459
- USAGE
460
- $ kinotic plugins uninstall [PLUGIN...] [-h] [-v]
461
-
462
- ARGUMENTS
463
- [PLUGIN...] plugin to uninstall
464
-
465
- FLAGS
466
- -h, --help Show CLI help.
467
- -v, --verbose
468
-
469
- DESCRIPTION
470
- Removes a plugin from the CLI.
471
-
472
- ALIASES
473
- $ kinotic plugins unlink
474
- $ kinotic plugins remove
475
-
476
- EXAMPLES
477
- $ kinotic plugins uninstall myplugin
478
- ```
479
-
480
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/uninstall.ts)_
481
-
482
- ## `kinotic plugins unlink [PLUGIN]`
483
-
484
- Removes a plugin from the CLI.
485
-
486
- ```
487
- USAGE
488
- $ kinotic plugins unlink [PLUGIN...] [-h] [-v]
489
-
490
- ARGUMENTS
491
- [PLUGIN...] plugin to uninstall
492
-
493
- FLAGS
494
- -h, --help Show CLI help.
495
- -v, --verbose
496
-
497
- DESCRIPTION
498
- Removes a plugin from the CLI.
499
-
500
- ALIASES
501
- $ kinotic plugins unlink
502
- $ kinotic plugins remove
503
-
504
- EXAMPLES
505
- $ kinotic plugins unlink myplugin
506
- ```
507
-
508
- ## `kinotic plugins update`
509
-
510
- Update installed plugins.
511
-
512
- ```
513
- USAGE
514
- $ kinotic plugins update [-h] [-v]
515
-
516
- FLAGS
517
- -h, --help Show CLI help.
518
- -v, --verbose
519
-
520
- DESCRIPTION
521
- Update installed plugins.
522
- ```
523
-
524
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/5.4.58/src/commands/plugins/update.ts)_
170
+ _See code: [src/commands/initialize.ts](https://github.com/kinotic-ai/kinotic/blob/v2.2.0/src/commands/initialize.ts)_
525
171
 
526
172
  ## `kinotic sync`
527
173
 
@@ -587,43 +233,5 @@ EXAMPLES
587
233
  $ kinotic sync -p -v -s http://localhost:9090
588
234
  ```
589
235
 
590
- _See code: [src/commands/synchronize.ts](https://github.com/kinotic-ai/kinotic/blob/v2.1.2/src/commands/synchronize.ts)_
591
-
592
- ## `kinotic update [CHANNEL]`
593
-
594
- update the kinotic CLI
595
-
596
- ```
597
- USAGE
598
- $ kinotic update [CHANNEL] [--force | | [-a | -v <value> | -i]] [-b ]
599
-
600
- FLAGS
601
- -a, --available See available versions.
602
- -b, --verbose Show more details about the available versions.
603
- -i, --interactive Interactively select version to install. This is ignored if a channel is provided.
604
- -v, --version=<value> Install a specific version.
605
- --force Force a re-download of the requested version.
606
-
607
- DESCRIPTION
608
- update the kinotic CLI
609
-
610
- EXAMPLES
611
- Update to the stable channel:
612
-
613
- $ kinotic update stable
614
-
615
- Update to a specific version:
616
-
617
- $ kinotic update --version 1.0.0
618
-
619
- Interactively select version:
620
-
621
- $ kinotic update --interactive
622
-
623
- See available versions:
624
-
625
- $ kinotic update --available
626
- ```
627
-
628
- _See code: [@oclif/plugin-update](https://github.com/oclif/plugin-update/blob/4.7.23/src/commands/update.ts)_
236
+ _See code: [src/commands/synchronize.ts](https://github.com/kinotic-ai/kinotic/blob/v2.2.0/src/commands/synchronize.ts)_
629
237
  <!-- commandsstop -->
@@ -4,7 +4,7 @@ import path from 'path';
4
4
  import chalk from 'chalk';
5
5
  import { input } from '@inquirer/prompts';
6
6
  import { isKinoticProject, saveKinoticProjectConfig } from '../internal/state/KinoticProjectConfigUtil.js';
7
- import { KinoticProjectConfig } from '@kinotic-ai/core';
7
+ import { KinoticProjectConfig } from '@kinotic-ai/os-api';
8
8
  /**
9
9
  * Validates the application name according to server requirements:
10
10
  * - First character must be a letter
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export declare class Login extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ server: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,21 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import { resolveServer } from '../internal/state/Environment.js';
3
+ import { CliAuthenticator } from '../internal/CliAuthenticator.js';
4
+ export class Login extends Command {
5
+ static description = 'Log in to a Kinotic Server and store credentials for subsequent commands';
6
+ static examples = [
7
+ '$ kinotic login',
8
+ '$ kinotic login --server http://localhost:9090'
9
+ ];
10
+ static flags = {
11
+ server: Flags.string({ char: 's', description: 'The Kinotic server to log in to' })
12
+ };
13
+ async run() {
14
+ const { flags } = await this.parse(Login);
15
+ const serverConfig = await resolveServer(this.config.configDir, flags.server);
16
+ if (!(await new CliAuthenticator(serverConfig.url, this.config.configDir, this).login())) {
17
+ this.error('Login failed');
18
+ }
19
+ this.log(`Logged in to ${serverConfig.url}`);
20
+ }
21
+ }
@@ -7,7 +7,6 @@ export declare class Synchronize extends Command {
7
7
  server: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
8
  publish: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
9
9
  verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
- authHeaderFile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
10
  dryRun: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
11
  force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
12
  };
@@ -7,7 +7,7 @@ import { WebSocket } from 'ws';
7
7
  import { EntityCodeGenerationService } from '../internal/EntityCodeGenerationService.js';
8
8
  import { ProjectMigrationService } from '../internal/ProjectMigrationService.js';
9
9
  import { resolveServer } from '../internal/state/Environment.js';
10
- import { connectAndUpgradeSession } from '../internal/Utils.js';
10
+ import { CliAuthenticator } from '../internal/CliAuthenticator.js';
11
11
  // This is required when running Kinotic from node
12
12
  Object.assign(global, { WebSocket });
13
13
  Kinotic.use(OsApiPlugin);
@@ -24,7 +24,6 @@ export class Synchronize extends Command {
24
24
  server: Flags.string({ char: 's', description: 'The Kinotic server to connect to' }),
25
25
  publish: Flags.boolean({ char: 'p', description: 'Publish each Entity after save/update' }),
26
26
  verbose: Flags.boolean({ char: 'v', description: 'Enable verbose logging' }),
27
- authHeaderFile: Flags.string({ char: 'f', description: 'JSON File containing authentication headers', required: false }),
28
27
  dryRun: Flags.boolean({ description: 'Dry run enables verbose logging and does not save any changes to the server' }),
29
28
  force: Flags.boolean({ description: 'Force full regeneration, ignoring incremental change detection', default: false })
30
29
  };
@@ -40,45 +39,47 @@ export class Synchronize extends Command {
40
39
  const serverConfig = await resolveServer(this.config.configDir, flags.server);
41
40
  serverUrl = serverConfig.url;
42
41
  }
43
- if (flags.dryRun || await connectAndUpgradeSession(serverUrl, this, flags.authHeaderFile)) {
44
- try {
45
- let project = null;
46
- if (!flags.dryRun) {
47
- await Kinotic.applications.createApplicationIfNotExist(kinoticProjectConfig.application, '');
48
- project = new Project(null, kinoticProjectConfig.application, kinoticProjectConfig.name, kinoticProjectConfig.description);
49
- project.sourceOfTruth = ProjectType.TYPESCRIPT;
50
- project = await Kinotic.projects.createProjectIfNotExist(project);
42
+ if (!flags.dryRun && !(await new CliAuthenticator(serverUrl, this.config.configDir, this).connect())) {
43
+ this.error('Could not connect to the Kinotic Server');
44
+ }
45
+ try {
46
+ let project = null;
47
+ if (!flags.dryRun) {
48
+ await Kinotic.applications.createApplicationIfNotExist(kinoticProjectConfig.application, '');
49
+ project = new Project(null, kinoticProjectConfig.application, kinoticProjectConfig.name, kinoticProjectConfig.description);
50
+ project.organizationId = kinoticProjectConfig.organization;
51
+ project.sourceOfTruth = ProjectType.TYPESCRIPT;
52
+ project = await Kinotic.projects.createProjectIfNotExist(project);
53
+ }
54
+ const codeGenerationService = new EntityCodeGenerationService(kinoticProjectConfig.application, kinoticProjectConfig.fileExtensionForImports, this);
55
+ await codeGenerationService
56
+ .generateAllEntities(kinoticProjectConfig, flags.verbose || flags.dryRun, async (entityInfo, services) => {
57
+ // combine named queries from generated services
58
+ const namedQueries = [];
59
+ for (let serviceInfo of services) {
60
+ namedQueries.push(...serviceInfo.namedQueries);
61
+ }
62
+ // We sync named queries first since currently the backend cache eviction logic is a little dumb
63
+ // i.e. The cache eviction for the EntityDefinition deletes the GraphQL schema
64
+ // This will evict the named query execution plan cache
65
+ // We want to make sure the GraphQL schema is updated after both these are updated and the EntityDefinition below
66
+ if (!flags.dryRun && namedQueries.length > 0) {
67
+ await this.synchronizeNamedQueries(kinoticProjectConfig.organization, project.id, entityInfo.entity, namedQueries);
51
68
  }
52
- const codeGenerationService = new EntityCodeGenerationService(kinoticProjectConfig.application, kinoticProjectConfig.fileExtensionForImports, this);
53
- await codeGenerationService
54
- .generateAllEntities(kinoticProjectConfig, flags.verbose || flags.dryRun, async (entityInfo, services) => {
55
- // combine named queries from generated services
56
- const namedQueries = [];
57
- for (let serviceInfo of services) {
58
- namedQueries.push(...serviceInfo.namedQueries);
59
- }
60
- // We sync named queries first since currently the backend cache eviction logic is a little dumb
61
- // i.e. The cache eviction for the EntityDefinition deletes the GraphQL schema
62
- // This will evict the named query execution plan cache
63
- // We want to make sure the GraphQL schema is updated after both these are updated and the EntityDefinition below
64
- if (!flags.dryRun && namedQueries.length > 0) {
65
- await this.synchronizeNamedQueries(project.id, entityInfo.entity, namedQueries);
66
- }
67
- if (!flags.dryRun) {
68
- await this.synchronizeEntity(project.id, entityInfo.entity, flags.publish, flags.verbose);
69
- }
70
- }, flags.force);
71
- // Apply migrations after entity synchronization
72
69
  if (!flags.dryRun) {
73
- const migrationService = new ProjectMigrationService(this);
74
- await migrationService.applyMigrations(project.id, './migrations', flags.verbose);
70
+ await this.synchronizeEntity(kinoticProjectConfig.organization, project.id, entityInfo.entity, flags.publish, flags.verbose);
75
71
  }
76
- this.log(`Synchronization Complete For application: ${kinoticProjectConfig.application}`);
72
+ }, flags.force);
73
+ // Apply migrations after entity synchronization
74
+ if (!flags.dryRun) {
75
+ const migrationService = new ProjectMigrationService(this);
76
+ await migrationService.applyMigrations(project.id, './migrations', flags.verbose);
77
77
  }
78
- catch (e) {
79
- if (e instanceof Error) {
80
- this.error(e.message);
81
- }
78
+ this.log(`Synchronization Complete For application: ${kinoticProjectConfig.application}`);
79
+ }
80
+ catch (e) {
81
+ if (e instanceof Error) {
82
+ this.error(e.message);
82
83
  }
83
84
  }
84
85
  await Kinotic.disconnect();
@@ -104,11 +105,11 @@ export class Synchronize extends Command {
104
105
  }
105
106
  }
106
107
  }
107
- async synchronizeEntity(projectId, entitySchema, publish, verbose) {
108
+ async synchronizeEntity(organizationId, projectId, entitySchema, publish, verbose) {
108
109
  const entityDefinitionService = Kinotic.entityDefinitions;
109
110
  const application = entitySchema.namespace;
110
111
  const name = entitySchema.name;
111
- const entityDefinitionId = (application + '.' + name).toLowerCase();
112
+ const entityDefinitionId = (organizationId + '.' + application + '.' + name).toLowerCase();
112
113
  this.log(`Synchronizing Entity: ${application}.${name}`);
113
114
  try {
114
115
  let entityDefinition = await entityDefinitionService.findById(entityDefinitionId);
@@ -122,7 +123,7 @@ export class Synchronize extends Command {
122
123
  entityDefinition = await entityDefinitionService.save(entityDefinition);
123
124
  }
124
125
  else {
125
- entityDefinition = new EntityDefinition(application, projectId, name, entitySchema);
126
+ entityDefinition = new EntityDefinition(organizationId, application, projectId, name, entitySchema);
126
127
  this.logVerbose(`Creating Entity: ${application}.${name}`, verbose);
127
128
  entityDefinition = await entityDefinitionService.create(entityDefinition);
128
129
  }
@@ -137,11 +138,11 @@ export class Synchronize extends Command {
137
138
  this.log(chalk.red('Error') + ` Synchronizing Entity: ${entityDefinitionId}, Exception: ${message}`);
138
139
  }
139
140
  }
140
- async synchronizeNamedQueries(projectId, entitySchema, namedQueries) {
141
+ async synchronizeNamedQueries(organizationId, projectId, entitySchema, namedQueries) {
141
142
  const namedQueriesService = Kinotic.namedQueriesDefinitions;
142
143
  const application = entitySchema.namespace;
143
144
  const entityDefinitionName = entitySchema.name;
144
- const id = (application + '.' + entityDefinitionName).toLowerCase();
145
+ const id = (organizationId + '.' + application + '.' + entityDefinitionName).toLowerCase();
145
146
  this.log(`Synchronizing Named Queries for Entity: ${application}.${entityDefinitionName}`);
146
147
  try {
147
148
  const namedQueriesDefinition = new NamedQueriesDefinition(id, application, projectId, entityDefinitionName, namedQueries);
@@ -0,0 +1,46 @@
1
+ import { Logger } from './Logger.js';
2
+ /**
3
+ * CLI authentication against a Kinotic server using the OAuth 2.0 Device Authorization Grant
4
+ * (RFC 8628). {@link login} runs the interactive browser flow once and stores the refresh
5
+ * token; {@link connect} uses that stored token to open an authenticated {@link Kinotic}
6
+ * connection, refreshing the short-lived access token before every (re)connect.
7
+ */
8
+ export declare class CliAuthenticator {
9
+ private readonly server;
10
+ private readonly configDir;
11
+ private readonly logger;
12
+ private refreshToken;
13
+ private accessToken;
14
+ private accessTokenExpiresAt;
15
+ /**
16
+ * @param server the server url to authenticate against
17
+ * @param configDir directory the rotating refresh token is persisted in
18
+ * @param logger sink for user-facing progress messages
19
+ */
20
+ constructor(server: string, configDir: string, logger: Pick<Logger, 'log'>);
21
+ /**
22
+ * Runs the interactive device-authorization login and persists the refresh token, so
23
+ * later {@link connect} calls — this run or a future one — are non-interactive.
24
+ *
25
+ * @return true if login succeeded
26
+ */
27
+ login(): Promise<boolean>;
28
+ /**
29
+ * Opens an authenticated {@link Kinotic} connection using the stored refresh token. Fails
30
+ * fast — with no interactive prompt — when there are no stored credentials.
31
+ *
32
+ * @return true if the connection was established
33
+ */
34
+ connect(): Promise<boolean>;
35
+ /**
36
+ * Returns a valid access token, refreshing it — and persisting the rotated refresh token —
37
+ * when it is absent or within 10s of expiry.
38
+ */
39
+ private freshAccessToken;
40
+ /** Parses the server url into the host/port the gateway serves both REST and STOMP on. */
41
+ private parseServer;
42
+ /** Runs the RFC 8628 device flow: start, browser approval, then poll for tokens. */
43
+ private deviceLogin;
44
+ private loadRefreshToken;
45
+ private saveRefreshToken;
46
+ }