@runflow-ai/cli 0.2.24 → 0.2.26

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 (48) hide show
  1. package/dist/commands/agents/agents.command.js +5 -1
  2. package/dist/commands/agents/agents.command.js.map +1 -1
  3. package/dist/commands/agents/agents.service.js +15 -1
  4. package/dist/commands/agents/agents.service.js.map +1 -1
  5. package/dist/commands/create/code-generator.js +0 -3
  6. package/dist/commands/create/code-generator.js.map +1 -1
  7. package/dist/commands/doctor/doctor.command.d.ts +13 -0
  8. package/dist/commands/doctor/doctor.command.js +288 -0
  9. package/dist/commands/doctor/doctor.command.js.map +1 -0
  10. package/dist/commands/login/login.command.d.ts +3 -1
  11. package/dist/commands/login/login.command.js +99 -23
  12. package/dist/commands/login/login.command.js.map +1 -1
  13. package/dist/commands/profiles/profiles.command.js +3 -3
  14. package/dist/commands/profiles/profiles.command.js.map +1 -1
  15. package/dist/commands/switch/switch.command.d.ts +4 -1
  16. package/dist/commands/switch/switch.command.js +99 -21
  17. package/dist/commands/switch/switch.command.js.map +1 -1
  18. package/dist/commands/test/test.command.d.ts +6 -1
  19. package/dist/commands/test/test.command.js +137 -74
  20. package/dist/commands/test/test.command.js.map +1 -1
  21. package/dist/commands/whoami/whoami.command.d.ts +4 -0
  22. package/dist/commands/whoami/whoami.command.js +73 -0
  23. package/dist/commands/whoami/whoami.command.js.map +1 -0
  24. package/dist/common/api-client.d.ts +1 -0
  25. package/dist/common/api-client.js +80 -10
  26. package/dist/common/api-client.js.map +1 -1
  27. package/dist/common/auth0-login.d.ts +9 -0
  28. package/dist/common/auth0-login.js +215 -0
  29. package/dist/common/auth0-login.js.map +1 -0
  30. package/dist/common/config.d.ts +25 -5
  31. package/dist/common/config.js +53 -16
  32. package/dist/common/config.js.map +1 -1
  33. package/dist/common/help.d.ts +1 -1
  34. package/dist/common/help.js +9 -7
  35. package/dist/common/help.js.map +1 -1
  36. package/dist/common/token-refresh.d.ts +1 -0
  37. package/dist/common/token-refresh.js +35 -0
  38. package/dist/common/token-refresh.js.map +1 -0
  39. package/dist/common/ui.d.ts +6 -0
  40. package/dist/common/ui.js +27 -0
  41. package/dist/common/ui.js.map +1 -1
  42. package/dist/common/version-check.d.ts +1 -0
  43. package/dist/common/version-check.js +52 -0
  44. package/dist/common/version-check.js.map +1 -0
  45. package/dist/index.js +13 -0
  46. package/dist/index.js.map +1 -1
  47. package/package.json +14 -12
  48. package/scripts/postinstall.js +178 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.refreshAccessToken = refreshAccessToken;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const config_1 = require("./config");
9
+ const logger_1 = require("./logger");
10
+ async function refreshAccessToken() {
11
+ const profile = (0, config_1.getCurrentProfile)();
12
+ if (!profile?.refreshToken) {
13
+ (0, logger_1.logDebug)('No refresh token available');
14
+ return null;
15
+ }
16
+ try {
17
+ (0, logger_1.logDebug)('Refreshing access token...');
18
+ const response = await axios_1.default.post(`${config_1.AUTH0_CONFIG.domain}/oauth/token`, {
19
+ grant_type: 'refresh_token',
20
+ client_id: config_1.AUTH0_CONFIG.clientId,
21
+ refresh_token: profile.refreshToken,
22
+ }, { timeout: 10_000 });
23
+ const newToken = response.data.access_token;
24
+ const expiresIn = response.data.expires_in || 86400;
25
+ const expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();
26
+ (0, config_1.updateCurrentProfileToken)(newToken, expiresAt);
27
+ (0, logger_1.logDebug)('Access token refreshed successfully');
28
+ return newToken;
29
+ }
30
+ catch (error) {
31
+ (0, logger_1.logDebug)(`Token refresh failed: ${error.message}`);
32
+ return null;
33
+ }
34
+ }
35
+ //# sourceMappingURL=token-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-refresh.js","sourceRoot":"","sources":["../../src/common/token-refresh.ts"],"names":[],"mappings":";;;;;AASA,gDAkCC;AA3CD,kDAA0B;AAC1B,qCAAsF;AACtF,qCAAoC;AAO7B,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,IAAA,0BAAiB,GAAE,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;QAC3B,IAAA,iBAAQ,EAAC,4BAA4B,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,IAAA,iBAAQ,EAAC,4BAA4B,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,qBAAY,CAAC,MAAM,cAAc,EACpC;YACE,UAAU,EAAE,eAAe;YAC3B,SAAS,EAAE,qBAAY,CAAC,QAAQ;YAChC,aAAa,EAAE,OAAO,CAAC,YAAY;SACpC,EACD,EAAE,OAAO,EAAE,MAAM,EAAE,CACpB,CAAC;QAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAGxE,IAAA,kCAAyB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE/C,IAAA,iBAAQ,EAAC,qCAAqC,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAA,iBAAQ,EAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -3,5 +3,11 @@ interface ListItem {
3
3
  name?: string;
4
4
  isActive?: boolean;
5
5
  }
6
+ interface SearchableOption {
7
+ id: string;
8
+ name: string;
9
+ hint?: string;
10
+ }
11
+ export declare function searchableSelect<T extends SearchableOption>(items: T[], message: string): Promise<T | null>;
6
12
  export declare function selectItem<T extends ListItem>(items: T[], message: string): Promise<T>;
7
13
  export {};
package/dist/common/ui.js CHANGED
@@ -1,8 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchableSelect = searchableSelect;
3
4
  exports.selectItem = selectItem;
4
5
  const inquirer = require("inquirer");
5
6
  const chalk = require("chalk");
7
+ const AutocompletePrompt = require("inquirer-autocomplete-prompt");
8
+ inquirer.registerPrompt('autocomplete', AutocompletePrompt);
9
+ async function searchableSelect(items, message) {
10
+ if (items.length === 0)
11
+ return null;
12
+ const choices = items.map((item) => ({
13
+ name: item.hint ? `${item.name} ${chalk.gray(item.hint)}` : item.name,
14
+ value: item.id,
15
+ short: item.name,
16
+ }));
17
+ const { selected } = await inquirer.prompt([
18
+ {
19
+ type: 'autocomplete',
20
+ name: 'selected',
21
+ message,
22
+ source: (_answers, input) => {
23
+ if (!input)
24
+ return choices;
25
+ const term = input.toLowerCase();
26
+ return choices.filter((c) => c.short.toLowerCase().includes(term) || c.value.toLowerCase().includes(term));
27
+ },
28
+ pageSize: 15,
29
+ },
30
+ ]);
31
+ return items.find((i) => i.id === selected) || null;
32
+ }
6
33
  async function selectItem(items, message) {
7
34
  if (items.length > 10) {
8
35
  console.log(chalk.gray(`Found ${items.length} items (use ↑↓ arrows to navigate, Enter to select)`));
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/common/ui.ts"],"names":[],"mappings":";;AASA,gCA+BC;AAxCD,qCAAsC;AACtC,+BAAgC;AAQzB,KAAK,UAAU,UAAU,CAC9B,KAAU,EACV,OAAe;IAGf,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,qDAAqD,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAC3B,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACf,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAC7B,EAAE;QACF,KAAK,EAAE,IAAI,CAAC,EAAE;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAiB;QACnD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI;YACV,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;SACrC;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/common/ui.ts"],"names":[],"mappings":";;AAkBA,4CA6BC;AAED,gCA+BC;AAhFD,qCAAsC;AACtC,+BAAgC;AAChC,mEAAoE;AAEpE,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAcrD,KAAK,UAAU,gBAAgB,CACpC,KAAU,EACV,OAAe;IAEf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;QACrE,KAAK,EAAE,IAAI,CAAC,EAAE;QACd,KAAK,EAAE,IAAI,CAAC,IAAI;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC/D;YACE,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,UAAU;YAChB,OAAO;YACP,MAAM,EAAE,CAAC,QAAa,EAAE,KAAa,EAAE,EAAE;gBACvC,IAAI,CAAC,KAAK;oBAAE,OAAO,OAAO,CAAC;gBAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACpF,CAAC;YACJ,CAAC;YACD,QAAQ,EAAE,EAAE;SACN;KACT,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,KAAU,EACV,OAAe;IAGf,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,qDAAqD,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAC3B,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACf,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;gBACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAC7B,EAAE;QACF,KAAK,EAAE,IAAI,CAAC,EAAE;KACf,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAiB;QACnD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI;YACV,OAAO;YACP,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC;SACrC;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function checkVersionCompatibility(cliVersion: string): Promise<void>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.checkVersionCompatibility = checkVersionCompatibility;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const config_1 = require("./config");
10
+ const logger_1 = require("./logger");
11
+ function compareSemver(a, b) {
12
+ const partsA = a.split('.').map(Number);
13
+ const partsB = b.split('.').map(Number);
14
+ for (let i = 0; i < 3; i++) {
15
+ const va = partsA[i] || 0;
16
+ const vb = partsB[i] || 0;
17
+ if (va < vb)
18
+ return -1;
19
+ if (va > vb)
20
+ return 1;
21
+ }
22
+ return 0;
23
+ }
24
+ async function checkVersionCompatibility(cliVersion) {
25
+ try {
26
+ const config = (0, config_1.loadConfig)();
27
+ if (!config?.apiKey && !config?.token)
28
+ return;
29
+ const apiUrl = (0, config_1.getApiUrl)(config);
30
+ const response = await axios_1.default.get(`${apiUrl}/health`, { timeout: 3000 });
31
+ const versions = response.data?.versions;
32
+ if (!versions)
33
+ return;
34
+ if (versions.minCliVersion && compareSemver(cliVersion, versions.minCliVersion) < 0) {
35
+ console.warn(chalk_1.default.yellow(`\nWarning: Your CLI version (${cliVersion}) is below the minimum required (${versions.minCliVersion}).`));
36
+ console.warn(chalk_1.default.yellow(' Update with: npm install -g @runflow-ai/cli\n'));
37
+ }
38
+ try {
39
+ const sdkPkg = require('@runflow-ai/sdk/package.json');
40
+ if (versions.minSdkVersion && compareSemver(sdkPkg.version, versions.minSdkVersion) < 0) {
41
+ console.warn(chalk_1.default.yellow(`\nWarning: Your SDK version (${sdkPkg.version}) is below the minimum required (${versions.minSdkVersion}).`));
42
+ console.warn(chalk_1.default.yellow(' Update with: npm install @runflow-ai/sdk@latest\n'));
43
+ }
44
+ }
45
+ catch {
46
+ }
47
+ }
48
+ catch (error) {
49
+ (0, logger_1.logDebug)(`Version check failed (non-critical): ${error.message}`);
50
+ }
51
+ }
52
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/common/version-check.ts"],"names":[],"mappings":";;;;;AA0BA,8DAmCC;AA7DD,kDAA0B;AAC1B,kDAA0B;AAC1B,qCAAiD;AACjD,qCAAoC;AAMpC,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAMM,KAAK,UAAU,yBAAyB,CAAC,UAAkB;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK;YAAE,OAAO;QAE9C,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAEzC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAGtB,IAAI,QAAQ,CAAC,aAAa,IAAI,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACpF,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CAAC,gCAAgC,UAAU,oCAAoC,QAAQ,CAAC,aAAa,IAAI,CAAC,CACvH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAChF,CAAC;QAGD,IAAI,CAAC;YAEH,MAAM,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxF,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CAAC,gCAAgC,MAAM,CAAC,OAAO,oCAAoC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAC3H,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAA,iBAAQ,EAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -53,9 +53,12 @@ const secret_command_1 = require("./commands/secret/secret.command");
53
53
  const credentials_command_1 = require("./commands/credentials/credentials.command");
54
54
  const prompts_command_1 = require("./commands/prompts/prompts.command");
55
55
  const kb_command_1 = require("./commands/kb/kb.command");
56
+ const whoami_command_1 = require("./commands/whoami/whoami.command");
57
+ const doctor_command_1 = require("./commands/doctor/doctor.command");
56
58
  const logger_1 = require("./common/logger");
57
59
  const banner_1 = require("./common/banner");
58
60
  const help_1 = require("./common/help");
61
+ const version_check_1 = require("./common/version-check");
59
62
  const fs = __importStar(require("fs"));
60
63
  const path = __importStar(require("path"));
61
64
  let AppModule = class AppModule {
@@ -74,6 +77,8 @@ AppModule = __decorate([
74
77
  prompts_command_1.PromptsCommand,
75
78
  kb_command_1.KnowledgeBaseCommand,
76
79
  secret_command_1.SecretCommand,
80
+ whoami_command_1.WhoamiCommand,
81
+ doctor_command_1.DoctorCommand,
77
82
  ],
78
83
  })
79
84
  ], AppModule);
@@ -134,12 +139,18 @@ async function bootstrap() {
134
139
  'switch',
135
140
  'use',
136
141
  'profiles',
142
+ 'whoami',
143
+ 'doctor',
137
144
  ].includes(arg));
138
145
  if (show) {
139
146
  (0, banner_1.showBanner)();
140
147
  (0, help_1.showTree)();
141
148
  return;
142
149
  }
150
+ const isSkipVersionCheck = args.some((arg) => ['login', '--help', '-h', '--version', '-v'].includes(arg));
151
+ if (!isSkipVersionCheck) {
152
+ (0, version_check_1.checkVersionCompatibility)(getVersion()).catch(() => { });
153
+ }
143
154
  try {
144
155
  await nest_commander_1.CommandFactory.run(AppModule, { cliName: 'rf' });
145
156
  }
@@ -179,6 +190,8 @@ function getSuggestions(unknownCommand) {
179
190
  'knowledge',
180
191
  'credentials',
181
192
  'credential',
193
+ 'whoami',
194
+ 'doctor',
182
195
  ];
183
196
  const suggestions = [];
184
197
  for (const cmd of availableCommands) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@runflow-ai/cli",
3
- "version": "0.2.24",
3
+ "version": "0.2.26",
4
4
  "description": "Official CLI for RunFlow AI platform - manage agents, deploy code, and interact with AI workflows from your terminal",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "commonjs",
8
8
  "bin": {
9
- "rf": "dist/index.js"
9
+ "rf": "dist/index.js",
10
+ "runflow": "dist/index.js"
10
11
  },
11
12
  "scripts": {
12
13
  "build": "tsc -p tsconfig.json",
@@ -15,20 +16,21 @@
15
16
  "dev:verbose": "ts-node src/index.ts --verbose",
16
17
  "lint": "eslint . --ext .ts",
17
18
  "test": "jest --coverage",
18
- "prepublishOnly": "npm run build"
19
+ "prepublishOnly": "npm run build",
20
+ "postinstall": "node scripts/postinstall.js"
19
21
  },
20
22
  "dependencies": {
21
23
  "@clack/prompts": "^0.7.0",
22
24
  "@gati/space-invaders": "^1.0.2",
23
- "@nestjs/common": "^10.4.20",
24
- "@nestjs/core": "^10.4.20",
25
- "axios": "^1.13.2",
25
+ "@nestjs/common": "^11.1.14",
26
+ "@nestjs/core": "^11.1.14",
27
+ "@nestjs/platform-express": "^11.1.14",
28
+ "axios": "^1.13.5",
26
29
  "chalk": "^4.1.2",
27
- "cors": "^2.8.5",
28
- "express": "^4.22.1",
29
- "figlet": "^1.9.4",
30
- "form-data": "^4.0.1",
30
+ "figlet": "^1.10.0",
31
+ "form-data": "^4.0.5",
31
32
  "inquirer": "^8.2.7",
33
+ "inquirer-autocomplete-prompt": "^2.0.1",
32
34
  "nest-commander": "^3.20.1",
33
35
  "ora": "^5.4.1",
34
36
  "picocolors": "^1.0.0",
@@ -36,10 +38,9 @@
36
38
  "yaml": "^2.8.2"
37
39
  },
38
40
  "devDependencies": {
39
- "@types/cors": "^2.8.19",
40
- "@types/express": "^4.17.25",
41
41
  "@types/figlet": "^1.7.0",
42
42
  "@types/form-data": "^2.5.0",
43
+ "@types/inquirer-autocomplete-prompt": "^2.0.2",
43
44
  "@types/jest": "^29.5.14",
44
45
  "@types/node": "^20.19.26",
45
46
  "@typescript-eslint/eslint-plugin": "^6.21.0",
@@ -56,6 +57,7 @@
56
57
  "dist/**/*",
57
58
  "static/**/*",
58
59
  "scenarios/**/*",
60
+ "scripts/**/*",
59
61
  "README.md",
60
62
  "CLI-DOCS.md",
61
63
  "QUICK-TEST-GUIDE.md"
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Postinstall script for @runflow-ai/cli
4
+ * Runs after npm install -g to check environment and give actionable guidance.
5
+ * Must be plain JS (no TypeScript, no dependencies).
6
+ */
7
+
8
+ const { execSync } = require('child_process');
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const os = require('os');
12
+
13
+ const GREEN = '\x1b[32m';
14
+ const YELLOW = '\x1b[33m';
15
+ const RED = '\x1b[31m';
16
+ const GRAY = '\x1b[90m';
17
+ const CYAN = '\x1b[36m';
18
+ const BOLD = '\x1b[1m';
19
+ const RESET = '\x1b[0m';
20
+
21
+ function ok(msg) { console.log(` ${GREEN}✓${RESET} ${msg}`); }
22
+ function warn(msg) { console.log(` ${YELLOW}⚠${RESET} ${msg}`); }
23
+ function fail(msg) { console.log(` ${RED}✗${RESET} ${msg}`); }
24
+ function hint(msg) { console.log(` ${GRAY}${msg}${RESET}`); }
25
+
26
+ function run(cmd) {
27
+ try {
28
+ return execSync(cmd, { stdio: 'pipe', timeout: 5000 }).toString().trim();
29
+ } catch {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ function checkPath() {
35
+ const prefix = run('npm config get prefix --no-workspaces') || run('npm config get prefix');
36
+ if (!prefix) return true; // can't determine, skip
37
+ const npmBin = process.platform === 'win32' ? prefix : path.join(prefix, 'bin');
38
+
39
+ const envPath = process.env.PATH || process.env.Path || '';
40
+ const paths = envPath.split(path.delimiter);
41
+ const inPath = paths.some(p => {
42
+ try { return path.resolve(p) === path.resolve(npmBin); } catch { return false; }
43
+ });
44
+
45
+ if (inPath) {
46
+ ok('rf command available in PATH');
47
+ return true;
48
+ }
49
+
50
+ warn('npm global bin is NOT in your PATH');
51
+ hint(`Directory: ${npmBin}`);
52
+ hint('');
53
+
54
+ if (process.platform === 'win32') {
55
+ hint('Fix for PowerShell (add to $PROFILE):');
56
+ hint(` $env:PATH += ";${npmBin}"`);
57
+ hint('');
58
+ hint('Fix for CMD (run as Administrator):');
59
+ hint(` setx PATH "%PATH%;${npmBin}"`);
60
+ } else {
61
+ const shell = process.env.SHELL || '/bin/bash';
62
+ const rcFile = shell.includes('zsh') ? '~/.zshrc' : '~/.bashrc';
63
+ hint(`Add to ${rcFile}:`);
64
+ hint(` export PATH="$PATH:${npmBin}"`);
65
+ hint('');
66
+ hint('Then reload:');
67
+ hint(` source ${rcFile}`);
68
+ }
69
+ return false;
70
+ }
71
+
72
+ function checkNode() {
73
+ const version = process.version;
74
+ const major = parseInt(version.slice(1).split('.')[0], 10);
75
+ if (major >= 20) {
76
+ ok(`Node.js ${version}`);
77
+ return true;
78
+ }
79
+ fail(`Node.js ${version} (required: >= 20)`);
80
+ hint('Update: https://nodejs.org');
81
+ return false;
82
+ }
83
+
84
+ function checkGit() {
85
+ const version = run('git --version');
86
+ if (version) {
87
+ ok(version);
88
+ return true;
89
+ }
90
+
91
+ fail('Git not found');
92
+ if (process.platform === 'win32') {
93
+ hint('Install: winget install Git.Git');
94
+ hint('Or download: https://git-scm.com/download/win');
95
+ } else if (process.platform === 'darwin') {
96
+ hint('Install: xcode-select --install');
97
+ hint('Or: brew install git');
98
+ } else {
99
+ hint('Install: sudo apt-get install git');
100
+ hint('Or download: https://git-scm.com');
101
+ }
102
+ return false;
103
+ }
104
+
105
+ function checkPowerShellPolicy() {
106
+ if (process.platform !== 'win32') return true;
107
+
108
+ const policy = run('powershell -Command "Get-ExecutionPolicy -Scope CurrentUser"');
109
+ if (!policy) return true; // can't check, skip
110
+
111
+ if (policy === 'Restricted' || policy === 'Undefined') {
112
+ warn(`PowerShell ExecutionPolicy: ${policy}`);
113
+ hint('Fix: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned');
114
+ return false;
115
+ }
116
+ ok(`PowerShell ExecutionPolicy: ${policy}`);
117
+ return true;
118
+ }
119
+
120
+ // --- Guards: only run for global installs, not in CI, npx, or monorepo ---
121
+ function shouldRun() {
122
+ // Skip in CI environments
123
+ if (process.env.CI || process.env.CONTINUOUS_INTEGRATION || process.env.GITHUB_ACTIONS) {
124
+ return false;
125
+ }
126
+
127
+ // Skip npx / dlx temporary installs (npm cache _npx dir)
128
+ if (__dirname.includes('_npx') || __dirname.includes('.cache')) {
129
+ return false;
130
+ }
131
+
132
+ // npm sets this to 'true' for global installs
133
+ if (process.env.npm_config_global === 'true') {
134
+ return true;
135
+ }
136
+
137
+ // Detect monorepo / workspace install: if there's a package.json above us
138
+ // with workspaces, we're inside a monorepo install
139
+ try {
140
+ const rootPkg = path.join(__dirname, '..', '..', '..', 'package.json');
141
+ if (fs.existsSync(rootPkg)) {
142
+ const pkg = JSON.parse(fs.readFileSync(rootPkg, 'utf8'));
143
+ if (pkg.workspaces) return false;
144
+ }
145
+ } catch {
146
+ // ignore
147
+ }
148
+
149
+ // If npm_config_global is not explicitly 'true' and we can't determine,
150
+ // still run (could be a standalone local install by an end user)
151
+ return true;
152
+ }
153
+
154
+ // --- Main ---
155
+ try {
156
+ if (!shouldRun()) process.exit(0);
157
+
158
+ console.log('');
159
+ console.log(`${BOLD}${CYAN}Runflow CLI${RESET} installed successfully!`);
160
+ console.log('');
161
+
162
+ let issues = 0;
163
+
164
+ if (!checkNode()) issues++;
165
+ if (!checkGit()) issues++;
166
+ if (!checkPath()) issues++;
167
+ if (!checkPowerShellPolicy()) issues++;
168
+
169
+ console.log('');
170
+ if (issues === 0) {
171
+ console.log(` ${GREEN}Ready to go!${RESET} Run ${BOLD}rf login${RESET} to get started.`);
172
+ } else {
173
+ console.log(` ${YELLOW}${issues} issue(s) detected.${RESET} Fix them, then run ${BOLD}rf doctor${RESET} to verify.`);
174
+ }
175
+ console.log('');
176
+ } catch {
177
+ // Never fail npm install because of postinstall
178
+ }