@hatchway/cli 0.50.53
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 +274 -0
- package/bin/hatchway.js +31 -0
- package/dist/chunks/Banner-DL1Fpz_g.js +115 -0
- package/dist/chunks/Banner-DL1Fpz_g.js.map +1 -0
- package/dist/chunks/auto-update-Ddo5Ntt7.js +264 -0
- package/dist/chunks/auto-update-Ddo5Ntt7.js.map +1 -0
- package/dist/chunks/build-V8_D-JHF.js +116 -0
- package/dist/chunks/build-V8_D-JHF.js.map +1 -0
- package/dist/chunks/cleanup-BNuJNSve.js +141 -0
- package/dist/chunks/cleanup-BNuJNSve.js.map +1 -0
- package/dist/chunks/cli-auth-B4Do-N8Y.js +340 -0
- package/dist/chunks/cli-auth-B4Do-N8Y.js.map +1 -0
- package/dist/chunks/cli-error-1drkrXNn.js +140 -0
- package/dist/chunks/cli-error-1drkrXNn.js.map +1 -0
- package/dist/chunks/config-hFJA7z5y.js +167 -0
- package/dist/chunks/config-hFJA7z5y.js.map +1 -0
- package/dist/chunks/config-manager-DST6RbP8.js +133 -0
- package/dist/chunks/config-manager-DST6RbP8.js.map +1 -0
- package/dist/chunks/database-YGb1Lzim.js +68 -0
- package/dist/chunks/database-YGb1Lzim.js.map +1 -0
- package/dist/chunks/database-setup-U31oEs90.js +253 -0
- package/dist/chunks/database-setup-U31oEs90.js.map +1 -0
- package/dist/chunks/devtools-CPruVlOo.js +75 -0
- package/dist/chunks/devtools-CPruVlOo.js.map +1 -0
- package/dist/chunks/index-DCC6HGdr.js +119 -0
- package/dist/chunks/index-DCC6HGdr.js.map +1 -0
- package/dist/chunks/init-DkXJVFFx.js +472 -0
- package/dist/chunks/init-DkXJVFFx.js.map +1 -0
- package/dist/chunks/init-tui-D2VOVdeK.js +1131 -0
- package/dist/chunks/init-tui-D2VOVdeK.js.map +1 -0
- package/dist/chunks/logger-6V5cBxba.js +38 -0
- package/dist/chunks/logger-6V5cBxba.js.map +1 -0
- package/dist/chunks/login-CA1XWUEM.js +63 -0
- package/dist/chunks/login-CA1XWUEM.js.map +1 -0
- package/dist/chunks/logout-BC4VFt8f.js +40 -0
- package/dist/chunks/logout-BC4VFt8f.js.map +1 -0
- package/dist/chunks/main-tui-D8KkJRd_.js +648 -0
- package/dist/chunks/main-tui-D8KkJRd_.js.map +1 -0
- package/dist/chunks/manager-DjVI7erc.js +1161 -0
- package/dist/chunks/manager-DjVI7erc.js.map +1 -0
- package/dist/chunks/port-allocator-BENntRMG.js +864 -0
- package/dist/chunks/port-allocator-BENntRMG.js.map +1 -0
- package/dist/chunks/process-killer-ChXAqhfm.js +87 -0
- package/dist/chunks/process-killer-ChXAqhfm.js.map +1 -0
- package/dist/chunks/prompts-Beijr8dm.js +128 -0
- package/dist/chunks/prompts-Beijr8dm.js.map +1 -0
- package/dist/chunks/repo-cloner-UY3L2X7h.js +219 -0
- package/dist/chunks/repo-cloner-UY3L2X7h.js.map +1 -0
- package/dist/chunks/repo-detector-36VydrlB.js +66 -0
- package/dist/chunks/repo-detector-36VydrlB.js.map +1 -0
- package/dist/chunks/run-Du6dvTJL.js +697 -0
- package/dist/chunks/run-Du6dvTJL.js.map +1 -0
- package/dist/chunks/runner-logger-instance-Dj_JMznn.js +899 -0
- package/dist/chunks/runner-logger-instance-Dj_JMznn.js.map +1 -0
- package/dist/chunks/spinner-DTH0QZQw.js +53 -0
- package/dist/chunks/spinner-DTH0QZQw.js.map +1 -0
- package/dist/chunks/start-Dkuro1jp.js +1713 -0
- package/dist/chunks/start-Dkuro1jp.js.map +1 -0
- package/dist/chunks/start-traditional-7wlD2f2H.js +255 -0
- package/dist/chunks/start-traditional-7wlD2f2H.js.map +1 -0
- package/dist/chunks/status-BU3cFJm1.js +97 -0
- package/dist/chunks/status-BU3cFJm1.js.map +1 -0
- package/dist/chunks/theme-NAQBkisB.js +40222 -0
- package/dist/chunks/theme-NAQBkisB.js.map +1 -0
- package/dist/chunks/upgrade-BBpJirEu.js +455 -0
- package/dist/chunks/upgrade-BBpJirEu.js.map +1 -0
- package/dist/chunks/use-app-Ct3w2jLI.js +10 -0
- package/dist/chunks/use-app-Ct3w2jLI.js.map +1 -0
- package/dist/chunks/useBuildState-Dy7pRR8Z.js +330 -0
- package/dist/chunks/useBuildState-Dy7pRR8Z.js.map +1 -0
- package/dist/cli/index.js +712 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.js +13625 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.js +45 -0
- package/dist/instrument.js.map +1 -0
- package/dist/templates.json +295 -0
- package/package.json +87 -0
- package/templates/config.template.json +18 -0
- package/templates.json +295 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-traditional-7wlD2f2H.js","sources":["../../src/cli/commands/start-traditional.ts"],"sourcesContent":["/**\n * Enhanced start command with graceful shutdown and better error handling\n * Starts the full stack: Web App + Runner (no broker - runner connects directly)\n */\n\nimport { spawn, ChildProcess } from 'node:child_process';\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { findMonorepoRoot, isInsideMonorepo } from '../utils/repo-detector.js';\nimport { killProcessOnPort } from '../utils/process-killer.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { shutdownHandler } from '../index.js';\n\ninterface StartOptions {\n port?: string;\n dev?: boolean; // Use development mode (hot reload)\n rebuild?: boolean; // Rebuild services before starting\n local?: boolean; // Enable local mode (default: true, use --no-local to disable)\n verbose?: boolean; // Enable verbose logging\n}\n\ninterface ManagedProcess {\n name: string;\n process: ChildProcess;\n port?: number;\n}\n\nexport async function startCommand(options: StartOptions) {\n const s = p.spinner();\n\n // Step 1: Find monorepo\n s.start('Locating Hatchway repository');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n // Try config first\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n // Try detection\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n configManager.set('monorepoPath', monorepoRoot);\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.red('✗') + ' Repository not found');\n throw errors.monorepoNotFound([\n config.monorepoPath || 'none',\n process.cwd(),\n ]);\n }\n\n s.stop(pc.green('✓') + ' Repository found');\n\n // Step 2: Check dependencies\n const nodeModulesPath = join(monorepoRoot, 'node_modules');\n\n if (!existsSync(nodeModulesPath)) {\n s.start('Installing dependencies');\n try {\n const { installDependencies } = await import('../utils/repo-cloner.js');\n await installDependencies(monorepoRoot);\n s.stop(pc.green('✓') + ' Dependencies installed');\n } catch (error) {\n s.stop(pc.red('✗') + ' Failed to install dependencies');\n throw new CLIError({\n code: 'DEPENDENCIES_INSTALL_FAILED',\n message: 'Failed to install dependencies',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n `Run manually: cd ${monorepoRoot} && pnpm install`,\n 'Check your internet connection',\n ],\n });\n }\n }\n\n // Step 2.5: Check for production build (unless --dev mode)\n const nextBuildIdPath = join(monorepoRoot, 'apps', 'hatchway', '.next', 'BUILD_ID');\n const needsProductionBuild = !options.dev && !existsSync(nextBuildIdPath);\n\n // Rebuild services if requested OR if production build is missing\n if (options.rebuild || needsProductionBuild) {\n const buildReason = options.rebuild \n ? 'Rebuilding services' \n : 'Building for production (first run)';\n s.start(buildReason);\n\n try {\n // Use turbo to build all services with caching\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoRoot,\n stdio: 'inherit', // Show build output in traditional mode\n shell: true,\n });\n\n buildProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Build failed with code ${code}`));\n }\n });\n\n buildProcess.on('error', reject);\n });\n\n s.stop(pc.green('✓') + ' Build complete (using Turborepo cache)');\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n throw new CLIError({\n code: 'BUILD_FAILED',\n message: 'Failed to build services',\n suggestions: [\n 'Check that all dependencies are installed',\n 'Try running: pnpm build:all',\n 'Run with --dev flag to skip build and use dev mode',\n ],\n });\n }\n }\n\n // Step 3: Check database\n if (!config.databaseUrl) {\n throw new CLIError({\n code: 'MISSING_REQUIRED_CONFIG',\n message: 'Database URL not configured',\n suggestions: [\n 'Run initialization: hatchway init',\n 'Or set manually: hatchway config set databaseUrl <url>',\n 'Or setup database: hatchway db',\n ],\n docs: 'https://github.com/codyde/hatchway#database-setup',\n });\n }\n\n // Step 4: Clean up zombie processes\n const webPort = Number(options.port || '3000');\n\n s.start('Checking for port conflicts');\n await killProcessOnPort(webPort);\n s.stop(pc.green('✓') + ' Ports available');\n\n console.log();\n console.log(pc.bold('Starting services...'));\n console.log();\n\n const processes: ManagedProcess[] = [];\n const sharedSecret = configManager.getSecret() || 'dev-secret';\n\n // Register cleanup with shutdown handler\n shutdownHandler.onShutdown(async () => {\n console.log();\n console.log(pc.yellow('⚠'), 'Stopping all services...');\n\n // Kill all child processes\n for (const { name, process: proc } of processes) {\n if (!proc.killed && proc.pid) {\n console.log(pc.dim(` Stopping ${name}...`));\n proc.kill('SIGTERM');\n }\n }\n\n // Give them time to exit gracefully\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n // Force kill stragglers\n for (const { name, port } of processes) {\n if (port) {\n try {\n await killProcessOnPort(port);\n } catch {\n // Best effort\n }\n }\n }\n\n console.log(pc.green('✓'), 'All services stopped');\n });\n\n try {\n // Local mode is enabled by default, can be disabled with --no-local\n const isLocalMode = options.local !== false;\n\n // Write .env.local file to ensure env vars are available to Next.js\n const envLocalPath = join(monorepoRoot, 'apps', 'hatchway', '.env.local');\n const envContent = [\n '# Auto-generated by hatchway CLI - DO NOT EDIT',\n `# Generated at: ${new Date().toISOString()}`,\n '',\n `HATCHWAY_LOCAL_MODE=${isLocalMode ? 'true' : 'false'}`,\n `RUNNER_SHARED_SECRET=${sharedSecret}`,\n `WORKSPACE_ROOT=${config.workspace}`,\n `RUNNER_ID=${config.runner?.id || 'local'}`,\n `RUNNER_DEFAULT_ID=${config.runner?.id || 'local'}`,\n `DATABASE_URL=${config.databaseUrl || ''}`,\n '',\n ].join('\\n');\n\n writeFileSync(envLocalPath, envContent);\n\n // Start Web App (now handles runner WebSocket connections directly)\n console.log(pc.cyan('1/2'), 'Starting web app...');\n // Default to production mode unless --dev flag is present\n const webCommand = options.dev ? 'dev' : 'start';\n const webApp = spawn('pnpm', ['--filter', 'hatchway', webCommand], {\n cwd: monorepoRoot,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n PORT: String(webPort),\n DATABASE_URL: config.databaseUrl,\n RUNNER_SHARED_SECRET: sharedSecret,\n WORKSPACE_ROOT: config.workspace,\n RUNNER_ID: config.runner?.id || 'local',\n RUNNER_DEFAULT_ID: config.runner?.id || 'local',\n // Enable local mode - bypasses authentication requirements (default: true)\n HATCHWAY_LOCAL_MODE: isLocalMode ? 'true' : 'false',\n },\n });\n\n processes.push({ name: 'Web App', process: webApp, port: webPort });\n shutdownHandler.registerProcess(webApp);\n\n // Handle web app output\n webApp.stdout?.on('data', (data) => {\n const text = data.toString().trim();\n if (text && !text.includes('warn') && !text.includes('deprecated')) {\n console.log(pc.blue('[web]'), text);\n }\n });\n\n webApp.stderr?.on('data', (data) => {\n const text = data.toString().trim();\n if (text && !text.includes('warn') && !text.includes('deprecated')) {\n console.log(pc.yellow('[web]'), text);\n }\n });\n\n webApp.on('exit', (code) => {\n // Exit codes 0, 130 (SIGINT), and 143 (SIGTERM) are normal shutdown\n if (code !== 0 && code !== null && code !== 130 && code !== 143) {\n console.error(pc.red('✗'), `Web app crashed with code ${code}`);\n process.exit(1);\n }\n });\n\n // Wait for web app and WebSocket server to initialize\n await new Promise(resolve => setTimeout(resolve, 3000));\n\n // Start Runner\n console.log(pc.cyan('2/2'), 'Starting runner...');\n console.log();\n\n // Success message\n console.log(pc.green('✓'), pc.bold('All services started!'));\n console.log();\n console.log(pc.bold('Services running:'));\n console.log(` ${pc.blue('Web App:')} http://localhost:${webPort}`);\n console.log(` ${pc.magenta('Runner:')} Connected to web app`);\n console.log();\n console.log(pc.dim(`Press ${pc.cyan('Ctrl+C')} to stop all services`));\n console.log();\n\n // Start runner (blocks until shutdown) - connects directly to Next.js WebSocket\n const { startRunner } = await import('../../index.js');\n await startRunner({\n wsUrl: `ws://localhost:${webPort}/ws/runner`,\n sharedSecret: sharedSecret,\n runnerId: config.runner?.id || 'local',\n workspace: config.workspace,\n verbose: options.verbose,\n tuiMode: false, // Traditional mode = no TUI\n });\n\n } catch (error) {\n // Global error handler will format this nicely\n throw error;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Hatchway CLI - Built with Rollup
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { l as logger } from './logger-6V5cBxba.js';
|
|
6
|
+
import { c as configManager } from './config-manager-DST6RbP8.js';
|
|
7
|
+
import 'conf';
|
|
8
|
+
import 'node:os';
|
|
9
|
+
import 'node:path';
|
|
10
|
+
|
|
11
|
+
async function statusCommand() {
|
|
12
|
+
logger.section('Hatchway Runner Status');
|
|
13
|
+
// Check if initialized
|
|
14
|
+
const isInitialized = configManager.isInitialized();
|
|
15
|
+
logger.log('');
|
|
16
|
+
logger.info(`${chalk.bold('Status:')} ${isInitialized ? chalk.green('Initialized') : chalk.yellow('Not initialized')}`);
|
|
17
|
+
if (!isInitialized) {
|
|
18
|
+
logger.log('');
|
|
19
|
+
logger.warn('Run "hatchway init" to initialize');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Get configuration
|
|
23
|
+
const config = configManager.get();
|
|
24
|
+
logger.log('');
|
|
25
|
+
// Config file
|
|
26
|
+
logger.info(`${chalk.bold('Config File:')}`);
|
|
27
|
+
logger.log(` ${configManager.path}`);
|
|
28
|
+
logger.log('');
|
|
29
|
+
// Workspace
|
|
30
|
+
logger.info(`${chalk.bold('Workspace:')}`);
|
|
31
|
+
logger.log(` Path: ${config.workspace}`);
|
|
32
|
+
const workspaceExists = existsSync(config.workspace);
|
|
33
|
+
logger.log(` Exists: ${workspaceExists ? chalk.green('Yes') : chalk.red('No')}`);
|
|
34
|
+
if (workspaceExists) {
|
|
35
|
+
try {
|
|
36
|
+
const entries = await readdir(config.workspace);
|
|
37
|
+
const projects = [];
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const entryPath = `${config.workspace}/${entry}`;
|
|
40
|
+
const stats = await stat(entryPath);
|
|
41
|
+
if (stats.isDirectory()) {
|
|
42
|
+
projects.push(entry);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
logger.log(` Projects: ${projects.length}`);
|
|
46
|
+
if (projects.length > 0 && projects.length <= 10) {
|
|
47
|
+
projects.forEach(p => logger.log(` - ${p}`));
|
|
48
|
+
}
|
|
49
|
+
else if (projects.length > 10) {
|
|
50
|
+
projects.slice(0, 10).forEach(p => logger.log(` - ${p}`));
|
|
51
|
+
logger.log(` ... and ${projects.length - 10} more`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
logger.log(` Projects: ${chalk.yellow('Unable to read')}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
logger.log('');
|
|
59
|
+
// Server
|
|
60
|
+
logger.info(`${chalk.bold('Server:')}`);
|
|
61
|
+
logger.log(` WebSocket URL: ${config.server?.wsUrl || 'not set'}`);
|
|
62
|
+
logger.log(` API URL: ${config.apiUrl || 'not set'}`);
|
|
63
|
+
logger.log(` Secret: ${config.server?.secret ? chalk.green('Set') : chalk.red('Not set')}`);
|
|
64
|
+
logger.log('');
|
|
65
|
+
// Runner
|
|
66
|
+
logger.info(`${chalk.bold('Runner:')}`);
|
|
67
|
+
logger.log(` ID: ${config.runner?.id || 'not set'}`);
|
|
68
|
+
logger.log(` Reconnect Attempts: ${config.runner?.reconnectAttempts || 5}`);
|
|
69
|
+
logger.log(` Heartbeat Interval: ${config.runner?.heartbeatInterval || 15000}ms`);
|
|
70
|
+
logger.log('');
|
|
71
|
+
// Validate configuration
|
|
72
|
+
const validation = configManager.validate();
|
|
73
|
+
logger.info(`${chalk.bold('Validation:')}`);
|
|
74
|
+
if (validation.valid) {
|
|
75
|
+
logger.log(` ${chalk.green('✓')} Configuration is valid`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
logger.log(` ${chalk.red('✗')} Configuration has errors:`);
|
|
79
|
+
validation.errors.forEach((err) => logger.log(` - ${chalk.red(err)}`));
|
|
80
|
+
}
|
|
81
|
+
logger.log('');
|
|
82
|
+
// Next steps
|
|
83
|
+
if (validation.valid) {
|
|
84
|
+
logger.info('Ready to run! Use:');
|
|
85
|
+
logger.log(` ${chalk.cyan('hatchway run')} - Start local full stack`);
|
|
86
|
+
logger.log(` ${chalk.cyan('hatchway runner')} - Connect to remote server`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.info('Fix configuration errors with:');
|
|
90
|
+
logger.log(` ${chalk.cyan('hatchway config set <key> <value>')}`);
|
|
91
|
+
logger.log(` or ${chalk.cyan('hatchway init')} to reconfigure`);
|
|
92
|
+
}
|
|
93
|
+
logger.log('');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { statusCommand };
|
|
97
|
+
//# sourceMappingURL=status-BU3cFJm1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-BU3cFJm1.js","sources":["../../src/cli/commands/status.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\n\nexport async function statusCommand() {\n logger.section('Hatchway Runner Status');\n\n // Check if initialized\n const isInitialized = configManager.isInitialized();\n logger.log('');\n logger.info(`${chalk.bold('Status:')} ${isInitialized ? chalk.green('Initialized') : chalk.yellow('Not initialized')}`);\n\n if (!isInitialized) {\n logger.log('');\n logger.warn('Run \"hatchway init\" to initialize');\n return;\n }\n\n // Get configuration\n const config = configManager.get();\n logger.log('');\n\n // Config file\n logger.info(`${chalk.bold('Config File:')}`);\n logger.log(` ${configManager.path}`);\n logger.log('');\n\n // Workspace\n logger.info(`${chalk.bold('Workspace:')}`);\n logger.log(` Path: ${config.workspace}`);\n\n const workspaceExists = existsSync(config.workspace);\n logger.log(` Exists: ${workspaceExists ? chalk.green('Yes') : chalk.red('No')}`);\n\n if (workspaceExists) {\n try {\n const entries = await readdir(config.workspace);\n const projects = [];\n\n for (const entry of entries) {\n const entryPath = `${config.workspace}/${entry}`;\n const stats = await stat(entryPath);\n if (stats.isDirectory()) {\n projects.push(entry);\n }\n }\n\n logger.log(` Projects: ${projects.length}`);\n if (projects.length > 0 && projects.length <= 10) {\n projects.forEach(p => logger.log(` - ${p}`));\n } else if (projects.length > 10) {\n projects.slice(0, 10).forEach(p => logger.log(` - ${p}`));\n logger.log(` ... and ${projects.length - 10} more`);\n }\n } catch (error) {\n logger.log(` Projects: ${chalk.yellow('Unable to read')}`);\n }\n }\n logger.log('');\n\n // Server\n logger.info(`${chalk.bold('Server:')}`);\n logger.log(` WebSocket URL: ${config.server?.wsUrl || 'not set'}`);\n logger.log(` API URL: ${config.apiUrl || 'not set'}`);\n logger.log(` Secret: ${config.server?.secret ? chalk.green('Set') : chalk.red('Not set')}`);\n logger.log('');\n\n // Runner\n logger.info(`${chalk.bold('Runner:')}`);\n logger.log(` ID: ${config.runner?.id || 'not set'}`);\n logger.log(` Reconnect Attempts: ${config.runner?.reconnectAttempts || 5}`);\n logger.log(` Heartbeat Interval: ${config.runner?.heartbeatInterval || 15000}ms`);\n logger.log('');\n\n // Validate configuration\n const validation = configManager.validate();\n logger.info(`${chalk.bold('Validation:')}`);\n if (validation.valid) {\n logger.log(` ${chalk.green('✓')} Configuration is valid`);\n } else {\n logger.log(` ${chalk.red('✗')} Configuration has errors:`);\n validation.errors.forEach((err) => logger.log(` - ${chalk.red(err)}`));\n }\n logger.log('');\n\n // Next steps\n if (validation.valid) {\n logger.info('Ready to run! Use:');\n logger.log(` ${chalk.cyan('hatchway run')} - Start local full stack`);\n logger.log(` ${chalk.cyan('hatchway runner')} - Connect to remote server`);\n } else {\n logger.info('Fix configuration errors with:');\n logger.log(` ${chalk.cyan('hatchway config set <key> <value>')}`);\n logger.log(` or ${chalk.cyan('hatchway init')} to reconfigure`);\n }\n logger.log('');\n}\n"],"names":[],"mappings":"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"}
|