@revos/cli 0.1.1 → 0.1.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/README.md CHANGED
@@ -26,10 +26,32 @@ revos [command] [options]
26
26
  ### Project Initialization
27
27
 
28
28
  ```bash
29
- revos init [project-name]
29
+ revos init [destination] [--yes] [--dry-run]
30
30
  ```
31
31
 
32
- Scaffolds a new RevOS data engineering project. If `project-name` is omitted, uses the current directory name.
32
+ Scaffolds a new RevOS data engineering project. If `destination` is omitted, initializes in the current directory.
33
+
34
+ **Arguments:**
35
+
36
+ ```
37
+ destination Path or project name (default: current directory)
38
+ Examples:
39
+ my-project → creates ./my-project/
40
+ ./my-project → same as above
41
+ ../my-project → one level up
42
+ /home/user/my-project → absolute path
43
+ ```
44
+
45
+ **Flags:**
46
+
47
+ ```
48
+ -y, --yes Skip confirmation prompts, use defaults
49
+ --dry-run Show what would be created without creating files or GCP resources
50
+ ```
51
+
52
+ **Non-empty directory behavior:**
53
+
54
+ If the destination already exists and is not empty, you will be prompted to confirm before proceeding. Use `--yes` to skip this prompt.
33
55
 
34
56
  **What it does:**
35
57
 
@@ -1,5 +1,5 @@
1
- import { A as getCredentialsPath, C as getUserInfo, D as tokenResponseToCredentials, N as saveCredentials, O as startOAuthServer, S as generatePKCEChallenge, T as setClerkConfig, b as buildAuthorizationUrl, m as unwrap, n as selectOrganization, p as createApiClient, x as exchangeCodeForTokens } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { A as getCredentialsPath, C as getUserInfo, D as tokenResponseToCredentials, N as saveCredentials, O as startOAuthServer, S as generatePKCEChallenge, T as setClerkConfig, b as buildAuthorizationUrl, m as unwrap, n as selectOrganization, p as createApiClient, x as exchangeCodeForTokens } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Flags } from "@oclif/core";
5
5
  import open from "open";
@@ -1,5 +1,5 @@
1
- import { k as deleteCredentials } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { k as deleteCredentials } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  //#region src/adapters/oclif/commands/auth/logout.ts
4
4
  var AuthLogout = class extends BaseCommand {
5
5
  static description = "Remove stored authentication credentials";
@@ -1,5 +1,5 @@
1
- import { A as getCredentialsPath, M as loadCredentials, j as isTokenExpired } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { A as getCredentialsPath, M as loadCredentials, j as isTokenExpired } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  //#region src/adapters/oclif/commands/auth/status.ts
5
5
  var AuthStatus = class extends BaseCommand {
@@ -5,7 +5,11 @@ import * as _$_oclif_core_interfaces0 from "@oclif/core/interfaces";
5
5
  declare class Init extends BaseCommand<typeof Init> {
6
6
  static description: string;
7
7
  static args: {
8
- name: _$_oclif_core_interfaces0.Arg<string | undefined, Record<string, unknown>>;
8
+ destination: _$_oclif_core_interfaces0.Arg<string | undefined, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ yes: _$_oclif_core_interfaces0.BooleanFlag<boolean>;
12
+ "dry-run": _$_oclif_core_interfaces0.BooleanFlag<boolean>;
9
13
  };
10
14
  run(): Promise<void>;
11
15
  }
@@ -1,27 +1,88 @@
1
- import { P as ApiError, t as InitService, y as getConfig } from "../../../core-Dq15hO6f.mjs";
1
+ import { P as ApiError, t as InitService, y as getConfig } from "../../../core-EJgxP-x5.mjs";
2
2
  import { TEMPLATES_DIR } from "../../../templates/index.mjs";
3
- import { t as BaseCommand } from "../../../base.command-DlYMawJ6.mjs";
3
+ import { t as BaseCommand } from "../../../base.command-DDSLyx5v.mjs";
4
+ import * as fs from "fs";
4
5
  import * as path from "path";
6
+ import select from "@inquirer/select";
5
7
  import chalk from "chalk";
6
- import { Args } from "@oclif/core";
8
+ import { Args, Flags } from "@oclif/core";
7
9
  //#region src/adapters/oclif/commands/init.ts
10
+ function isDirEmpty(dirPath) {
11
+ return fs.readdirSync(dirPath).length === 0;
12
+ }
8
13
  var Init = class extends BaseCommand {
9
14
  static description = "Scaffold a new RevOS data engineering project";
10
- static args = { name: Args.string({
11
- description: "Project name (used as directory name)",
15
+ static args = { destination: Args.string({
16
+ description: "Path or project name (default: current directory name). Supports relative and absolute paths.",
12
17
  required: false
13
18
  }) };
19
+ static flags = {
20
+ yes: Flags.boolean({
21
+ char: "y",
22
+ description: "Non-interactive mode, use defaults",
23
+ default: false
24
+ }),
25
+ "dry-run": Flags.boolean({
26
+ description: "Show what would be created without making any changes",
27
+ default: false
28
+ })
29
+ };
14
30
  async run() {
15
31
  const { apiUrl, token, organizationId } = await getConfig();
16
- const projectName = this.args.name ?? path.basename(process.cwd());
17
- if (!projectName || projectName.includes("/") || projectName.includes("\\") || projectName === "..") this.error(`Invalid project name: "${projectName}"`, { exit: 1 });
18
- this.log(`\nInitializing project ${chalk.bold(projectName)}...\n`);
19
- const result = await new InitService(TEMPLATES_DIR).run({
32
+ let projectName;
33
+ let targetDir;
34
+ if (this.args.destination) {
35
+ const resolved = path.resolve(this.args.destination);
36
+ projectName = path.basename(resolved);
37
+ targetDir = path.dirname(resolved);
38
+ } else {
39
+ const cwd = process.cwd();
40
+ projectName = path.basename(cwd);
41
+ targetDir = path.dirname(cwd);
42
+ }
43
+ if (!projectName) this.error("Could not determine project name from path", { exit: 1 });
44
+ const projectDir = path.join(targetDir, projectName);
45
+ if (fs.existsSync(projectDir) && !isDirEmpty(projectDir) && !this.flags.yes) {
46
+ if (await select({
47
+ message: `Directory "${projectName}" already exists and is not empty. What would you like to do?`,
48
+ choices: [{
49
+ name: "Initialize in this directory",
50
+ value: "init"
51
+ }, {
52
+ name: "Cancel",
53
+ value: "cancel"
54
+ }]
55
+ }) === "cancel") {
56
+ this.log("Cancelled.");
57
+ return;
58
+ }
59
+ }
60
+ const service = new InitService(TEMPLATES_DIR);
61
+ const org = await service.resolveOrganization(apiUrl, token, organizationId).catch((err) => {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ this.error(message, { exit: 1 });
64
+ });
65
+ if (this.flags["dry-run"]) {
66
+ const preview = service.dryRun(projectName, targetDir);
67
+ this.log(`\nWould create project ${chalk.bold(projectName)} for organization ${chalk.bold(org.name)}`);
68
+ this.log(` Path: ${chalk.dim(preview.projectDir)}\n`);
69
+ this.log("Directories:");
70
+ for (const dir of preview.dirs) this.log(` ${dir}/`);
71
+ this.log("\nFiles:");
72
+ for (const file of preview.files) this.log(` ${file}`);
73
+ this.log(chalk.dim("\nNo files created, no GCP resources provisioned."));
74
+ return;
75
+ }
76
+ this.log(`\nCreating project ${chalk.bold(projectName)} for organization ${chalk.bold(org.name)}`);
77
+ this.log(` Path: ${chalk.dim(projectDir)}\n`);
78
+ const result = await service.run({
20
79
  projectName,
21
- targetDir: process.cwd(),
80
+ targetDir,
22
81
  apiUrl,
23
82
  token,
24
- organizationId
83
+ organizationId,
84
+ organization: org,
85
+ allowExistingDir: true
25
86
  }).catch((err) => {
26
87
  if (err instanceof ApiError) {
27
88
  this.log(chalk.red(`\nAPI error: ${err.status} ${err.statusText}`));
@@ -31,7 +92,6 @@ var Init = class extends BaseCommand {
31
92
  const message = err instanceof Error ? err.message : String(err);
32
93
  this.error(message, { exit: 1 });
33
94
  });
34
- this.log(chalk.green(`\nOrganization: ${result.organization.name}`));
35
95
  this.log(chalk.green(`\nProject created at ${result.projectDir}`));
36
96
  this.log("\nGenerated files:");
37
97
  for (const f of result.createdFiles) this.log(` ${f}`);
@@ -1,5 +1,5 @@
1
- import { M as loadCredentials, m as unwrap, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { M as loadCredentials, m as unwrap, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  //#region src/adapters/oclif/commands/org/current.ts
4
4
  var OrgCurrent = class extends BaseCommand {
5
5
  static description = "Show currently selected organization";
@@ -1,5 +1,5 @@
1
- import { m as unwrap, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { m as unwrap, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Flags } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/org/list.ts
@@ -1,5 +1,5 @@
1
- import { M as loadCredentials, N as saveCredentials, m as unwrap, n as selectOrganization, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { M as loadCredentials, N as saveCredentials, m as unwrap, n as selectOrganization, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Args } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/org/switch.ts
@@ -1,5 +1,5 @@
1
- import { p as createApiClient, r as DiffService, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { p as createApiClient, r as DiffService, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Args, Flags } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/overlays/diff.ts
@@ -1,5 +1,5 @@
1
- import { a as PullService, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { a as PullService, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Flags } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/overlays/pull.ts
@@ -1,5 +1,5 @@
1
- import { o as PushService, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { o as PushService, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Args, Flags } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/overlays/push.ts
@@ -1,5 +1,5 @@
1
- import { i as StatusService, p as createApiClient, y as getConfig } from "../../../../core-Dq15hO6f.mjs";
2
- import { t as BaseCommand } from "../../../../base.command-DlYMawJ6.mjs";
1
+ import { i as StatusService, p as createApiClient, y as getConfig } from "../../../../core-EJgxP-x5.mjs";
2
+ import { t as BaseCommand } from "../../../../base.command-DDSLyx5v.mjs";
3
3
  import chalk from "chalk";
4
4
  import { Args, Flags } from "@oclif/core";
5
5
  //#region src/adapters/oclif/commands/overlays/status.ts
@@ -1,4 +1,4 @@
1
- import { E as setClerkEnv, P as ApiError } from "./core-Dq15hO6f.mjs";
1
+ import { E as setClerkEnv, P as ApiError } from "./core-EJgxP-x5.mjs";
2
2
  import { Command, Flags } from "@oclif/core";
3
3
  import { makeTable } from "@oclif/table";
4
4
  //#region src/adapters/oclif/base.command.ts
@@ -801,7 +801,33 @@ async function selectOrganization(organizations) {
801
801
  }
802
802
  //#endregion
803
803
  //#region src/core/services/init.service.ts
804
- var InitService = class {
804
+ var InitService = class InitService {
805
+ static PROJECT_DIRS = [
806
+ ".devcontainer",
807
+ ".claude/skills/explore-lakehouse",
808
+ ".claude/skills/create-semantic-model",
809
+ "dbt/models/bronze",
810
+ "dbt/models/silver",
811
+ "dbt/models/gold",
812
+ "semantic/cubes"
813
+ ];
814
+ static PROJECT_FILES = [
815
+ ".devcontainer/devcontainer.json",
816
+ ".devcontainer/Dockerfile",
817
+ ".devcontainer/setup.sh",
818
+ ".gitignore",
819
+ "README.md",
820
+ "dbt/profiles.yml",
821
+ "dbt/dbt_project.yml",
822
+ "CLAUDE.md",
823
+ "AGENTS.md",
824
+ ".claude/skills/explore-lakehouse/SKILL.md",
825
+ ".claude/skills/create-semantic-model/SKILL.md",
826
+ "dbt/models/bronze/.gitkeep",
827
+ "dbt/models/silver/.gitkeep",
828
+ "dbt/models/gold/.gitkeep",
829
+ "semantic/cubes/.gitkeep"
830
+ ];
805
831
  constructor(templatesDir) {
806
832
  this.templatesDir = templatesDir;
807
833
  }
@@ -809,7 +835,7 @@ var InitService = class {
809
835
  const { projectName, targetDir, apiUrl, token, organizationId } = options;
810
836
  const projectDir = path.join(targetDir, projectName);
811
837
  const projectSlug = projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
812
- const org = await this.resolveOrganization(apiUrl, token, organizationId);
838
+ const org = options.organization ?? await this.resolveOrganization(apiUrl, token, organizationId);
813
839
  const gcpProjectId = await this.downloadGcpKey(apiUrl, token, org, projectSlug);
814
840
  const resolvedOrg = {
815
841
  ...org,
@@ -819,7 +845,7 @@ var InitService = class {
819
845
  return {
820
846
  projectDir,
821
847
  organization: resolvedOrg,
822
- createdFiles: this.scaffold(projectDir, projectName, projectSlug, resolvedOrg)
848
+ createdFiles: this.scaffold(projectDir, projectName, projectSlug, resolvedOrg, options.allowExistingDir)
823
849
  };
824
850
  }
825
851
  async resolveOrganization(apiUrl, token, organizationId) {
@@ -857,18 +883,18 @@ var InitService = class {
857
883
  });
858
884
  return JSON.parse(keyJson).project_id ?? "";
859
885
  }
860
- scaffold(projectDir, projectName, projectSlug, org) {
861
- if (fs.existsSync(projectDir)) throw new Error(`Directory "${projectName}" already exists. Remove it or choose a different name.`);
886
+ dryRun(projectName, targetDir) {
887
+ return {
888
+ projectDir: path.join(targetDir, projectName),
889
+ dirs: InitService.PROJECT_DIRS,
890
+ files: InitService.PROJECT_FILES
891
+ };
892
+ }
893
+ scaffold(projectDir, projectName, projectSlug, org, allowExistingDir) {
894
+ if (fs.existsSync(projectDir) && !allowExistingDir) throw new Error(`Directory "${projectName}" already exists. Remove it or choose a different name.`);
862
895
  const created = [];
863
- for (const dir of [
864
- ".devcontainer",
865
- ".claude/skills/explore-lakehouse",
866
- ".claude/skills/create-semantic-model",
867
- "dbt/models/bronze",
868
- "dbt/models/silver",
869
- "dbt/models/gold",
870
- "semantic/cubes"
871
- ]) fs.mkdirSync(path.join(projectDir, dir), { recursive: true });
896
+ const dirs = InitService.PROJECT_DIRS;
897
+ for (const dir of dirs) fs.mkdirSync(path.join(projectDir, dir), { recursive: true });
872
898
  const dbtName = projectName.replace(/[^a-zA-Z0-9_]/g, "_");
873
899
  const files = {
874
900
  ".devcontainer/devcontainer.json": this.renderTemplate(".devcontainer/devcontainer.json", {
@@ -162,6 +162,8 @@ interface InitOptions {
162
162
  apiUrl: string;
163
163
  token: string;
164
164
  organizationId?: string;
165
+ organization?: OrganizationInfo;
166
+ allowExistingDir?: boolean;
165
167
  }
166
168
  interface InitResult {
167
169
  projectDir: string;
@@ -170,10 +172,17 @@ interface InitResult {
170
172
  }
171
173
  declare class InitService {
172
174
  private readonly templatesDir;
175
+ private static readonly PROJECT_DIRS;
176
+ private static readonly PROJECT_FILES;
173
177
  constructor(templatesDir: string);
174
178
  run(options: InitOptions): Promise<InitResult>;
175
- private resolveOrganization;
179
+ resolveOrganization(apiUrl: string, token: string, organizationId?: string): Promise<OrganizationInfo>;
176
180
  private downloadGcpKey;
181
+ dryRun(projectName: string, targetDir: string): {
182
+ projectDir: string;
183
+ dirs: readonly string[];
184
+ files: readonly string[];
185
+ };
177
186
  private scaffold;
178
187
  private renderTemplate;
179
188
  }
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { a as DiffEntry, c as OverlayStatusInfo, d as StatusResult, f as SyncStatus, i as DiffChange, l as PullResult, n as CubeDefinition, o as DiffResult, r as CubeOverlay, s as OverlayFile, t as Config, u as PushResult } from "./types-DZssnweO.mjs";
2
- import { A as ClerkEnv, B as tokenResponseToCredentials, C as LoadedOverlay, D as loadOverlaysByNames, E as loadOverlays, F as generatePKCEChallenge, G as isTokenExpired, H as startOAuthServer, I as getUserInfo, J as getConfig, K as loadCredentials, L as refreshAccessToken, M as PKCEChallenge, N as buildAuthorizationUrl, O as loadOverlaysFromDir, P as exchangeCodeForTokens, R as setClerkConfig, S as sanitizeFileName, T as loadOverlayFile, U as deleteCredentials, V as OAuthServerResult, W as getCredentialsPath, Y as ApiError, _ as createApiClient, a as DiffOptions, b as formatError, c as StatusOptions, d as PullOptions, f as PullService, g as ApiClient, h as PushService, i as DiffContext, j as ClerkOAuthConfig, k as saveOverlayToFile, l as StatusService, m as PushOptions, n as InitResult, o as DiffService, p as PushContext, q as saveCredentials, r as InitService, s as StatusContext, t as InitOptions, u as PullContext, v as unwrap, w as getLocalOverlayNames, x as isContentEqual, y as findRemoteOnlyOverlays, z as setClerkEnv } from "./index-DuqD2b_7.mjs";
2
+ import { A as ClerkEnv, B as tokenResponseToCredentials, C as LoadedOverlay, D as loadOverlaysByNames, E as loadOverlays, F as generatePKCEChallenge, G as isTokenExpired, H as startOAuthServer, I as getUserInfo, J as getConfig, K as loadCredentials, L as refreshAccessToken, M as PKCEChallenge, N as buildAuthorizationUrl, O as loadOverlaysFromDir, P as exchangeCodeForTokens, R as setClerkConfig, S as sanitizeFileName, T as loadOverlayFile, U as deleteCredentials, V as OAuthServerResult, W as getCredentialsPath, Y as ApiError, _ as createApiClient, a as DiffOptions, b as formatError, c as StatusOptions, d as PullOptions, f as PullService, g as ApiClient, h as PushService, i as DiffContext, j as ClerkOAuthConfig, k as saveOverlayToFile, l as StatusService, m as PushOptions, n as InitResult, o as DiffService, p as PushContext, q as saveCredentials, r as InitService, s as StatusContext, t as InitOptions, u as PullContext, v as unwrap, w as getLocalOverlayNames, x as isContentEqual, y as findRemoteOnlyOverlays, z as setClerkEnv } from "./index-DH6vy050.mjs";
3
3
  import { a as OrgListResult, c as StoredCredentials, i as OAuthCallbackResult, l as TokenResponse, n as AuthStatusInfo, o as OrgSwitchResult, r as ClerkUserInfo, s as OrganizationInfo, t as AuthResult } from "./types-DsQtGF-c.mjs";
4
4
  export { ApiClient, ApiError, AuthResult, AuthStatusInfo, ClerkEnv, ClerkOAuthConfig, ClerkUserInfo, Config, CubeDefinition, CubeOverlay, DiffChange, DiffContext, DiffEntry, DiffOptions, DiffResult, DiffService, InitOptions, InitResult, InitService, LoadedOverlay, OAuthCallbackResult, OAuthServerResult, OrgListResult, OrgSwitchResult, OrganizationInfo, OverlayFile, OverlayStatusInfo, PKCEChallenge, PullContext, PullOptions, PullResult, PullService, PushContext, PushOptions, PushResult, PushService, StatusContext, StatusOptions, StatusResult, StatusService, StoredCredentials, SyncStatus, TokenResponse, buildAuthorizationUrl, createApiClient, deleteCredentials, exchangeCodeForTokens, findRemoteOnlyOverlays, formatError, generatePKCEChallenge, getConfig, getCredentialsPath, getLocalOverlayNames, getUserInfo, isContentEqual, isTokenExpired, loadCredentials, loadOverlayFile, loadOverlays, loadOverlaysByNames, loadOverlaysFromDir, refreshAccessToken, sanitizeFileName, saveCredentials, saveOverlayToFile, setClerkConfig, setClerkEnv, startOAuthServer, tokenResponseToCredentials, unwrap };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { A as getCredentialsPath, C as getUserInfo, D as tokenResponseToCredentials, E as setClerkEnv, M as loadCredentials, N as saveCredentials, O as startOAuthServer, P as ApiError, S as generatePKCEChallenge, T as setClerkConfig, _ as isContentEqual, a as PullService, b as buildAuthorizationUrl, c as loadOverlayFile, d as loadOverlaysFromDir, f as saveOverlayToFile, g as formatError, h as findRemoteOnlyOverlays, i as StatusService, j as isTokenExpired, k as deleteCredentials, l as loadOverlays, m as unwrap, o as PushService, p as createApiClient, r as DiffService, s as getLocalOverlayNames, t as InitService, u as loadOverlaysByNames, v as sanitizeFileName, w as refreshAccessToken, x as exchangeCodeForTokens, y as getConfig } from "./core-Dq15hO6f.mjs";
1
+ import { A as getCredentialsPath, C as getUserInfo, D as tokenResponseToCredentials, E as setClerkEnv, M as loadCredentials, N as saveCredentials, O as startOAuthServer, P as ApiError, S as generatePKCEChallenge, T as setClerkConfig, _ as isContentEqual, a as PullService, b as buildAuthorizationUrl, c as loadOverlayFile, d as loadOverlaysFromDir, f as saveOverlayToFile, g as formatError, h as findRemoteOnlyOverlays, i as StatusService, j as isTokenExpired, k as deleteCredentials, l as loadOverlays, m as unwrap, o as PushService, p as createApiClient, r as DiffService, s as getLocalOverlayNames, t as InitService, u as loadOverlaysByNames, v as sanitizeFileName, w as refreshAccessToken, x as exchangeCodeForTokens, y as getConfig } from "./core-EJgxP-x5.mjs";
2
2
  export { ApiError, DiffService, InitService, PullService, PushService, StatusService, buildAuthorizationUrl, createApiClient, deleteCredentials, exchangeCodeForTokens, findRemoteOnlyOverlays, formatError, generatePKCEChallenge, getConfig, getCredentialsPath, getLocalOverlayNames, getUserInfo, isContentEqual, isTokenExpired, loadCredentials, loadOverlayFile, loadOverlays, loadOverlaysByNames, loadOverlaysFromDir, refreshAccessToken, sanitizeFileName, saveCredentials, saveOverlayToFile, setClerkConfig, setClerkEnv, startOAuthServer, tokenResponseToCredentials, unwrap };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@revos/cli",
3
- "version": "0.1.1",
4
- "description": "RevOS CLI for managing overlays and other resources",
3
+ "version": "0.1.2",
4
+ "description": "RevOS CLI for managing RevOS platform resources",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -16,6 +16,12 @@
16
16
  "dirname": "revos",
17
17
  "topicSeparator": " ",
18
18
  "commands": "./dist/adapters/oclif/commands",
19
+ "plugins": [
20
+ "@oclif/plugin-warn-if-update-available"
21
+ ],
22
+ "warn-if-update-available": {
23
+ "timeoutInDays": 7
24
+ },
19
25
  "topics": {
20
26
  "auth": {
21
27
  "description": "Authentication commands"
@@ -34,7 +40,9 @@
34
40
  ],
35
41
  "dependencies": {
36
42
  "@inquirer/search": "^4.1.7",
43
+ "@inquirer/select": "^4.4.2",
37
44
  "@oclif/core": "^4.2.10",
45
+ "@oclif/plugin-warn-if-update-available": "^3.1.61",
38
46
  "@oclif/table": "^0.5.4",
39
47
  "chalk": "^4.1.2",
40
48
  "open": "^10.1.0",