@edgible-team/cli 1.0.1

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 (102) hide show
  1. package/LICENSE +136 -0
  2. package/README.md +450 -0
  3. package/dist/client/api-client.js +1057 -0
  4. package/dist/client/index.js +21 -0
  5. package/dist/commands/agent.js +1280 -0
  6. package/dist/commands/ai.js +608 -0
  7. package/dist/commands/application.js +885 -0
  8. package/dist/commands/auth.js +570 -0
  9. package/dist/commands/base/BaseCommand.js +93 -0
  10. package/dist/commands/base/CommandHandler.js +7 -0
  11. package/dist/commands/base/command-wrapper.js +58 -0
  12. package/dist/commands/base/middleware.js +77 -0
  13. package/dist/commands/config.js +116 -0
  14. package/dist/commands/connectivity.js +59 -0
  15. package/dist/commands/debug.js +98 -0
  16. package/dist/commands/discover.js +144 -0
  17. package/dist/commands/examples/migrated-command-example.js +180 -0
  18. package/dist/commands/gateway.js +494 -0
  19. package/dist/commands/managedGateway.js +787 -0
  20. package/dist/commands/utils/config-validator.js +76 -0
  21. package/dist/commands/utils/gateway-prompt.js +79 -0
  22. package/dist/commands/utils/input-parser.js +120 -0
  23. package/dist/commands/utils/output-formatter.js +109 -0
  24. package/dist/config/app-config.js +99 -0
  25. package/dist/detection/SystemCapabilityDetector.js +1244 -0
  26. package/dist/detection/ToolDetector.js +305 -0
  27. package/dist/detection/WorkloadDetector.js +314 -0
  28. package/dist/di/bindings.js +99 -0
  29. package/dist/di/container.js +88 -0
  30. package/dist/di/types.js +32 -0
  31. package/dist/index.js +52 -0
  32. package/dist/interfaces/IDaemonManager.js +3 -0
  33. package/dist/repositories/config-repository.js +62 -0
  34. package/dist/repositories/gateway-repository.js +35 -0
  35. package/dist/scripts/postinstall.js +101 -0
  36. package/dist/services/AgentStatusManager.js +299 -0
  37. package/dist/services/ConnectivityTester.js +271 -0
  38. package/dist/services/DependencyInstaller.js +475 -0
  39. package/dist/services/LocalAgentManager.js +2216 -0
  40. package/dist/services/application/ApplicationService.js +299 -0
  41. package/dist/services/auth/AuthService.js +214 -0
  42. package/dist/services/aws.js +644 -0
  43. package/dist/services/daemon/DaemonManagerFactory.js +65 -0
  44. package/dist/services/daemon/DockerDaemonManager.js +395 -0
  45. package/dist/services/daemon/LaunchdDaemonManager.js +257 -0
  46. package/dist/services/daemon/PodmanDaemonManager.js +369 -0
  47. package/dist/services/daemon/SystemdDaemonManager.js +221 -0
  48. package/dist/services/daemon/WindowsServiceDaemonManager.js +210 -0
  49. package/dist/services/daemon/index.js +16 -0
  50. package/dist/services/edgible.js +3060 -0
  51. package/dist/services/gateway/GatewayService.js +334 -0
  52. package/dist/state/config.js +146 -0
  53. package/dist/types/AgentConfig.js +5 -0
  54. package/dist/types/AgentStatus.js +5 -0
  55. package/dist/types/ApiClient.js +5 -0
  56. package/dist/types/ApiRequests.js +5 -0
  57. package/dist/types/ApiResponses.js +5 -0
  58. package/dist/types/Application.js +5 -0
  59. package/dist/types/CaddyJson.js +5 -0
  60. package/dist/types/UnifiedAgentStatus.js +56 -0
  61. package/dist/types/WireGuard.js +5 -0
  62. package/dist/types/Workload.js +5 -0
  63. package/dist/types/agent.js +5 -0
  64. package/dist/types/command-options.js +5 -0
  65. package/dist/types/connectivity.js +5 -0
  66. package/dist/types/errors.js +250 -0
  67. package/dist/types/gateway-types.js +5 -0
  68. package/dist/types/index.js +48 -0
  69. package/dist/types/models/ApplicationData.js +5 -0
  70. package/dist/types/models/CertificateData.js +5 -0
  71. package/dist/types/models/DeviceData.js +5 -0
  72. package/dist/types/models/DevicePoolData.js +5 -0
  73. package/dist/types/models/OrganizationData.js +5 -0
  74. package/dist/types/models/OrganizationInviteData.js +5 -0
  75. package/dist/types/models/ProviderConfiguration.js +5 -0
  76. package/dist/types/models/ResourceData.js +5 -0
  77. package/dist/types/models/ServiceResourceData.js +5 -0
  78. package/dist/types/models/UserData.js +5 -0
  79. package/dist/types/route.js +5 -0
  80. package/dist/types/validation/schemas.js +218 -0
  81. package/dist/types/validation.js +5 -0
  82. package/dist/utils/FileIntegrityManager.js +256 -0
  83. package/dist/utils/PathMigration.js +219 -0
  84. package/dist/utils/PathResolver.js +235 -0
  85. package/dist/utils/PlatformDetector.js +277 -0
  86. package/dist/utils/console-logger.js +130 -0
  87. package/dist/utils/docker-compose-parser.js +179 -0
  88. package/dist/utils/errors.js +130 -0
  89. package/dist/utils/health-checker.js +155 -0
  90. package/dist/utils/json-logger.js +72 -0
  91. package/dist/utils/log-formatter.js +293 -0
  92. package/dist/utils/logger.js +59 -0
  93. package/dist/utils/network-utils.js +217 -0
  94. package/dist/utils/output.js +182 -0
  95. package/dist/utils/passwordValidation.js +91 -0
  96. package/dist/utils/progress.js +167 -0
  97. package/dist/utils/sudo-checker.js +22 -0
  98. package/dist/utils/urls.js +32 -0
  99. package/dist/utils/validation.js +31 -0
  100. package/dist/validation/schemas.js +175 -0
  101. package/dist/validation/validator.js +67 -0
  102. package/package.json +83 -0
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * Dependency injection bindings
4
+ * Registers all services with the container
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.bindServices = bindServices;
8
+ exports.initializeContainer = initializeContainer;
9
+ const container_1 = require("./container");
10
+ const types_1 = require("./types");
11
+ const console_logger_1 = require("../utils/console-logger");
12
+ const app_config_1 = require("../config/app-config");
13
+ const config_1 = require("../state/config");
14
+ const edgible_1 = require("../services/edgible");
15
+ const LocalAgentManager_1 = require("../services/LocalAgentManager");
16
+ const ConnectivityTester_1 = require("../services/ConnectivityTester");
17
+ const WorkloadDetector_1 = require("../detection/WorkloadDetector");
18
+ const ToolDetector_1 = require("../detection/ToolDetector");
19
+ const logger_1 = require("../utils/logger");
20
+ const config_repository_1 = require("../repositories/config-repository");
21
+ const gateway_repository_1 = require("../repositories/gateway-repository");
22
+ const AuthService_1 = require("../services/auth/AuthService");
23
+ const ApplicationService_1 = require("../services/application/ApplicationService");
24
+ const GatewayService_1 = require("../services/gateway/GatewayService");
25
+ /**
26
+ * Bind all services to the container
27
+ */
28
+ function bindServices(container = (0, container_1.getContainer)()) {
29
+ // Bind configuration
30
+ container.bind(types_1.TYPES.AppConfig, () => (0, app_config_1.getConfig)(), true);
31
+ // Bind logger
32
+ container.bind(types_1.TYPES.Logger, () => {
33
+ const config = container.get(types_1.TYPES.AppConfig);
34
+ const logger = new console_logger_1.ConsoleLogger({
35
+ level: (0, logger_1.parseLogLevel)(config.logLevel),
36
+ colorEnabled: config.colorEnabled,
37
+ plain: config.plain,
38
+ });
39
+ return logger;
40
+ }, true);
41
+ // Bind ConfigManager
42
+ container.bind(types_1.TYPES.ConfigManager, () => new config_1.ConfigManager(), true);
43
+ // Bind Repositories
44
+ container.bind(types_1.TYPES.ConfigRepository, () => {
45
+ const configManager = container.get(types_1.TYPES.ConfigManager);
46
+ return new config_repository_1.ConfigRepositoryImpl(configManager);
47
+ }, true);
48
+ container.bind(types_1.TYPES.GatewayRepository, () => {
49
+ const configManager = container.get(types_1.TYPES.ConfigManager);
50
+ return new gateway_repository_1.GatewayRepositoryImpl(configManager);
51
+ }, true);
52
+ // Bind AuthService
53
+ container.bind(types_1.TYPES.AuthService, () => {
54
+ const config = container.get(types_1.TYPES.AppConfig);
55
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
56
+ const logger = container.get(types_1.TYPES.Logger);
57
+ return new AuthService_1.AuthServiceImpl(config.apiBaseUrl, configRepository, logger);
58
+ }, true);
59
+ // Bind ApplicationService
60
+ container.bind(types_1.TYPES.ApplicationService, () => {
61
+ const config = container.get(types_1.TYPES.AppConfig);
62
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
63
+ const authService = container.get(types_1.TYPES.AuthService);
64
+ const logger = container.get(types_1.TYPES.Logger);
65
+ return new ApplicationService_1.ApplicationServiceImpl(config.apiBaseUrl, configRepository, authService, logger);
66
+ }, true);
67
+ // Bind GatewayService
68
+ container.bind(types_1.TYPES.GatewayService, () => {
69
+ const config = container.get(types_1.TYPES.AppConfig);
70
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
71
+ const gatewayRepository = container.get(types_1.TYPES.GatewayRepository);
72
+ const authService = container.get(types_1.TYPES.AuthService);
73
+ const logger = container.get(types_1.TYPES.Logger);
74
+ return new GatewayService_1.GatewayServiceImpl(config.apiBaseUrl, configRepository, gatewayRepository, authService, logger);
75
+ }, true);
76
+ // Bind EdgibleService
77
+ container.bind(types_1.TYPES.EdgibleService, () => {
78
+ const config = container.get(types_1.TYPES.AppConfig);
79
+ return new edgible_1.EdgibleService(config.apiBaseUrl);
80
+ }, true);
81
+ // Bind LocalAgentManager
82
+ container.bind(types_1.TYPES.LocalAgentManager, () => new LocalAgentManager_1.LocalAgentManager(), true);
83
+ // Bind ConnectivityTester
84
+ container.bind(types_1.TYPES.ConnectivityTester, () => new ConnectivityTester_1.ConnectivityTester(), false);
85
+ // Bind WorkloadDetector
86
+ container.bind(types_1.TYPES.WorkloadDetector, () => new WorkloadDetector_1.WorkloadDetector(), false);
87
+ // Bind ToolDetector
88
+ container.bind(types_1.TYPES.ToolDetector, () => ToolDetector_1.ToolDetector, true);
89
+ }
90
+ /**
91
+ * Initialize container with all bindings
92
+ * Should be called once at application startup
93
+ */
94
+ function initializeContainer() {
95
+ const container = (0, container_1.getContainer)();
96
+ bindServices(container);
97
+ return container;
98
+ }
99
+ //# sourceMappingURL=bindings.js.map
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Simple dependency injection container
4
+ * Supports singleton and transient bindings
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Container = void 0;
8
+ exports.getContainer = getContainer;
9
+ exports.setContainer = setContainer;
10
+ exports.resetContainer = resetContainer;
11
+ class Container {
12
+ constructor() {
13
+ this.bindings = new Map();
14
+ this.singletons = new Map();
15
+ }
16
+ /**
17
+ * Register a service binding
18
+ */
19
+ bind(identifier, factory, singleton = true) {
20
+ this.bindings.set(identifier, { factory, singleton });
21
+ }
22
+ /**
23
+ * Get a service instance
24
+ */
25
+ get(identifier) {
26
+ const binding = this.bindings.get(identifier);
27
+ if (!binding) {
28
+ throw new Error(`Service not bound: ${identifier.toString()}`);
29
+ }
30
+ if (binding.singleton) {
31
+ if (!this.singletons.has(identifier)) {
32
+ const instance = binding.factory();
33
+ this.singletons.set(identifier, instance);
34
+ }
35
+ return this.singletons.get(identifier);
36
+ }
37
+ else {
38
+ return binding.factory();
39
+ }
40
+ }
41
+ /**
42
+ * Check if a service is bound
43
+ */
44
+ isBound(identifier) {
45
+ return this.bindings.has(identifier);
46
+ }
47
+ /**
48
+ * Clear all bindings and singletons (useful for testing)
49
+ */
50
+ reset() {
51
+ this.bindings.clear();
52
+ this.singletons.clear();
53
+ }
54
+ /**
55
+ * Unbind a specific service
56
+ */
57
+ unbind(identifier) {
58
+ this.bindings.delete(identifier);
59
+ this.singletons.delete(identifier);
60
+ }
61
+ }
62
+ exports.Container = Container;
63
+ /**
64
+ * Default container instance
65
+ */
66
+ let defaultContainer = null;
67
+ /**
68
+ * Get default container instance
69
+ */
70
+ function getContainer() {
71
+ if (!defaultContainer) {
72
+ defaultContainer = new Container();
73
+ }
74
+ return defaultContainer;
75
+ }
76
+ /**
77
+ * Set container instance (useful for testing)
78
+ */
79
+ function setContainer(container) {
80
+ defaultContainer = container;
81
+ }
82
+ /**
83
+ * Reset default container
84
+ */
85
+ function resetContainer() {
86
+ defaultContainer = null;
87
+ }
88
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Dependency injection type identifiers
4
+ * Uses symbol-based keys for type safety
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TYPES = void 0;
8
+ exports.TYPES = {
9
+ // Loggers
10
+ Logger: Symbol.for('Logger'),
11
+ // Services
12
+ EdgibleService: Symbol.for('EdgibleService'),
13
+ AuthService: Symbol.for('AuthService'),
14
+ GatewayService: Symbol.for('GatewayService'),
15
+ ApplicationService: Symbol.for('ApplicationService'),
16
+ GatewaySshService: Symbol.for('GatewaySshService'),
17
+ GatewayDiagnosticsService: Symbol.for('GatewayDiagnosticsService'),
18
+ LocalAgentManager: Symbol.for('LocalAgentManager'),
19
+ ConnectivityTester: Symbol.for('ConnectivityTester'),
20
+ AWSService: Symbol.for('AWSService'),
21
+ // Repositories
22
+ ConfigRepository: Symbol.for('ConfigRepository'),
23
+ GatewayRepository: Symbol.for('GatewayRepository'),
24
+ // Managers
25
+ ConfigManager: Symbol.for('ConfigManager'),
26
+ // Detectors
27
+ WorkloadDetector: Symbol.for('WorkloadDetector'),
28
+ ToolDetector: Symbol.for('ToolDetector'),
29
+ // Configuration
30
+ AppConfig: Symbol.for('AppConfig'),
31
+ };
32
+ //# sourceMappingURL=types.js.map
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const errors_1 = require("./utils/errors");
6
+ const output_1 = require("./utils/output");
7
+ const bindings_1 = require("./di/bindings");
8
+ const application_1 = require("./commands/application");
9
+ const gateway_1 = require("./commands/gateway");
10
+ const auth_1 = require("./commands/auth");
11
+ const config_1 = require("./commands/config");
12
+ const discover_1 = require("./commands/discover");
13
+ const connectivity_1 = require("./commands/connectivity");
14
+ const ai_1 = require("./commands/ai");
15
+ const agent_1 = require("./commands/agent");
16
+ const debug_1 = require("./commands/debug");
17
+ const managedGateway_1 = require("./commands/managedGateway");
18
+ // Initialize dependency injection container
19
+ (0, bindings_1.initializeContainer)();
20
+ const program = new commander_1.Command();
21
+ // Set up the CLI
22
+ program
23
+ .name('edgible')
24
+ .description('CLI tool for Edgible service')
25
+ .version('1.0.0')
26
+ .configureHelp({
27
+ helpWidth: 100,
28
+ })
29
+ .option('--no-color', 'Disable colored output')
30
+ .option('--plain', 'Plain text output (no colors, no emojis)')
31
+ .hook('preAction', (thisCommand, actionCommand) => {
32
+ // Apply output configuration based on global options
33
+ const opts = thisCommand.opts();
34
+ (0, output_1.applyOutputConfig)({ noColor: opts.noColor === false, plain: opts.plain === true });
35
+ // Configure error handler
36
+ errors_1.ErrorHandler.setColorEnabled((0, output_1.detectColorSupport)() && opts.plain !== true);
37
+ });
38
+ // Set up command groups
39
+ (0, auth_1.setupAuthCommands)(program);
40
+ (0, application_1.setupApplicationCommands)(program);
41
+ (0, gateway_1.setupGatewayCommands)(program);
42
+ (0, config_1.setupConfigCommands)(program);
43
+ (0, discover_1.setupDiscoverCommands)(program);
44
+ (0, connectivity_1.setupConnectivityCommands)(program);
45
+ (0, ai_1.setupAiCommands)(program);
46
+ (0, agent_1.setupAgentCommands)(program);
47
+ if (process.env.NODE_ENV !== 'production') {
48
+ (0, debug_1.setupDebugCommands)(program);
49
+ (0, managedGateway_1.setupManagedGatewayCommands)(program);
50
+ }
51
+ program.parse(process.argv);
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IDaemonManager.js.map
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration repository
4
+ * Abstracts config access for better testability and centralized state management
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ConfigRepositoryImpl = void 0;
8
+ /**
9
+ * ConfigRepository implementation using ConfigManager
10
+ */
11
+ class ConfigRepositoryImpl {
12
+ constructor(configManager) {
13
+ this.configManager = configManager;
14
+ }
15
+ getConfig() {
16
+ return this.configManager.getConfig();
17
+ }
18
+ updateConfig(updates) {
19
+ this.configManager.updateConfig(updates);
20
+ }
21
+ isFirstRun() {
22
+ return this.configManager.isFirstRun();
23
+ }
24
+ setFirstRunComplete() {
25
+ this.configManager.setFirstRunComplete();
26
+ }
27
+ setEmail(email) {
28
+ this.configManager.setEmail(email);
29
+ }
30
+ getEmail() {
31
+ return this.configManager.getEmail();
32
+ }
33
+ setAccountStatus(exists) {
34
+ this.configManager.setAccountStatus(exists);
35
+ }
36
+ hasAccount() {
37
+ return this.configManager.hasAccount();
38
+ }
39
+ clearConfig() {
40
+ this.configManager.clearConfig();
41
+ }
42
+ setAWSProfile(profile) {
43
+ this.configManager.setAWSProfile(profile);
44
+ }
45
+ getAWSProfile() {
46
+ return this.configManager.getAWSProfile();
47
+ }
48
+ setAWSRegion(region) {
49
+ this.configManager.setAWSRegion(region);
50
+ }
51
+ getAWSRegion() {
52
+ return this.configManager.getAWSRegion();
53
+ }
54
+ setDeviceType(deviceType) {
55
+ this.configManager.setDeviceType(deviceType);
56
+ }
57
+ getDeviceType() {
58
+ return this.configManager.getDeviceType();
59
+ }
60
+ }
61
+ exports.ConfigRepositoryImpl = ConfigRepositoryImpl;
62
+ //# sourceMappingURL=config-repository.js.map
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Gateway repository
4
+ * Manages gateway state and configuration
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GatewayRepositoryImpl = void 0;
8
+ /**
9
+ * GatewayRepository implementation using ConfigManager
10
+ */
11
+ class GatewayRepositoryImpl {
12
+ constructor(configManager) {
13
+ this.configManager = configManager;
14
+ }
15
+ addGateway(gatewayId, gatewayInfo) {
16
+ this.configManager.addGateway(gatewayId, gatewayInfo);
17
+ }
18
+ getGateway(gatewayId) {
19
+ return this.configManager.getGateway(gatewayId);
20
+ }
21
+ getGateways() {
22
+ return this.configManager.getGateways();
23
+ }
24
+ removeGateway(gatewayId) {
25
+ this.configManager.removeGateway(gatewayId);
26
+ }
27
+ hasGateway(gatewayId) {
28
+ return this.getGateway(gatewayId) !== undefined;
29
+ }
30
+ listGatewayIds() {
31
+ return Object.keys(this.getGateways());
32
+ }
33
+ }
34
+ exports.GatewayRepositoryImpl = GatewayRepositoryImpl;
35
+ //# sourceMappingURL=gateway-repository.js.map
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Post-Install Script
5
+ *
6
+ * Displays welcome message and performs basic environment checks after installation.
7
+ * This runs automatically after `npm install` or `npm install -g edgible-cli`.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { execSync } = require('child_process');
13
+
14
+ // Colors for console output
15
+ const colors = {
16
+ reset: '\x1b[0m',
17
+ bright: '\x1b[1m',
18
+ green: '\x1b[32m',
19
+ yellow: '\x1b[33m',
20
+ cyan: '\x1b[36m',
21
+ gray: '\x1b[90m'
22
+ };
23
+
24
+ function log(message, color = colors.reset) {
25
+ console.log(`${color}${message}${colors.reset}`);
26
+ }
27
+
28
+ function checkNodeVersion() {
29
+ const version = process.version;
30
+ const major = parseInt(version.split('.')[0].substring(1));
31
+
32
+ if (major < 16) {
33
+ log(`\n⚠️ Warning: Node.js ${version} detected. Edgible CLI requires Node.js >=16.0.0`, colors.yellow);
34
+ log(` Please upgrade Node.js: https://nodejs.org/\n`, colors.gray);
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+
40
+ function checkIfGlobalInstall() {
41
+ // Check if running in global node_modules
42
+ const isGlobal = __dirname.includes('node_modules') &&
43
+ (__dirname.includes('/lib/node_modules/') ||
44
+ __dirname.includes('\\lib\\node_modules\\'));
45
+ return isGlobal;
46
+ }
47
+
48
+ function main() {
49
+ try {
50
+ // Skip in CI environments
51
+ if (process.env.CI || process.env.EDGIBLE_NO_INTERACTIVE) {
52
+ return;
53
+ }
54
+
55
+ log('\n');
56
+ log('═══════════════════════════════════════════════════════', colors.cyan);
57
+ log(' ✨ Welcome to Edgible CLI!', colors.bright + colors.cyan);
58
+ log('═══════════════════════════════════════════════════════', colors.cyan);
59
+ log('\n');
60
+
61
+ // Check Node.js version
62
+ const nodeOk = checkNodeVersion();
63
+
64
+ // Check if global install
65
+ const isGlobal = checkIfGlobalInstall();
66
+
67
+ if (isGlobal) {
68
+ log('✅ Edgible CLI installed globally', colors.green);
69
+ log('\n');
70
+ log('Quick Start:', colors.bright);
71
+ log(' 1. Run: edgible login', colors.gray);
72
+ log(' 2. Run: edgible --help', colors.gray);
73
+ log('\n');
74
+ } else {
75
+ log('📦 Edgible CLI installed locally', colors.cyan);
76
+ log('\n');
77
+ log('Quick Start:', colors.bright);
78
+ log(' 1. Run: npx edgible login', colors.gray);
79
+ log(' 2. Run: npx edgible --help', colors.gray);
80
+ log('\n');
81
+ log('For global access, install with: npm install -g edgible-cli', colors.gray);
82
+ log('\n');
83
+ }
84
+
85
+ log('Documentation: https://edgible.com/docs', colors.cyan);
86
+ log('Support: https://github.com/edgible/edgible-cli/issues', colors.cyan);
87
+ log('\n');
88
+
89
+ } catch (error) {
90
+ // Silently fail - post-install scripts should not break installation
91
+ // Error is logged to npm but won't stop the process
92
+ }
93
+ }
94
+
95
+ // Run if called directly
96
+ if (require.main === module) {
97
+ main();
98
+ }
99
+
100
+ module.exports = { main };
101
+