@hatchway/cli 0.50.54 → 0.50.57
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 +2 -2
- package/dist/chunks/{database-YGb1Lzim.js → database-CsfD1Nxf.js} +2 -2
- package/dist/chunks/{database-YGb1Lzim.js.map → database-CsfD1Nxf.js.map} +1 -1
- package/dist/chunks/{database-setup-U31oEs90.js → database-setup-BdXiI4MV.js} +7 -3
- package/dist/chunks/database-setup-BdXiI4MV.js.map +1 -0
- package/dist/chunks/{init-DkXJVFFx.js → init-Ckj9MlWI.js} +3 -3
- package/dist/chunks/{init-DkXJVFFx.js.map → init-Ckj9MlWI.js.map} +1 -1
- package/dist/chunks/{init-tui-D2VOVdeK.js → init-tui-m2supRiJ.js} +43 -7
- package/dist/chunks/init-tui-m2supRiJ.js.map +1 -0
- package/dist/chunks/{main-tui-D8KkJRd_.js → main-tui-DZ6e5DoU.js} +5 -2
- package/dist/chunks/{main-tui-D8KkJRd_.js.map → main-tui-DZ6e5DoU.js.map} +1 -1
- package/dist/cli/index.js +15 -21
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +289 -758
- package/dist/index.js.map +1 -1
- package/dist/instrument.js +1 -0
- package/dist/instrument.js.map +1 -1
- package/dist/lib/skills/platform-plugin/.claude-plugin/plugin.json +5 -0
- package/dist/lib/skills/platform-plugin/skills/architectural-thinking/SKILL.md +36 -0
- package/dist/lib/skills/platform-plugin/skills/build-verification/SKILL.md +54 -0
- package/dist/lib/skills/platform-plugin/skills/communication-style/SKILL.md +28 -0
- package/dist/lib/skills/platform-plugin/skills/context-awareness/SKILL.md +36 -0
- package/dist/lib/skills/platform-plugin/skills/dependency-management/SKILL.md +41 -0
- package/dist/lib/skills/platform-plugin/skills/design-excellence/SKILL.md +35 -0
- package/dist/lib/skills/platform-plugin/skills/template-originality/SKILL.md +34 -0
- package/dist/lib/skills/platform-plugin/skills/todo-workflow/SKILL.md +44 -0
- package/dist/lib/skills/platform-plugin/skills/todo-workflow-codex/SKILL.md +53 -0
- package/package.json +5 -5
- package/dist/chunks/database-setup-U31oEs90.js.map +0 -1
- package/dist/chunks/init-tui-D2VOVdeK.js.map +0 -1
package/README.md
CHANGED
|
@@ -227,8 +227,8 @@ A: Yes, while you're using hatchway.sh. It executes builds and serves previews.
|
|
|
227
227
|
**Q: Can I use a different AI model?**
|
|
228
228
|
A: Yes! Select your preferred Claude model using the `@model` tag in the web UI:
|
|
229
229
|
- `claude-haiku-4-5` (fast)
|
|
230
|
-
- `claude-sonnet-4-
|
|
231
|
-
- `claude-opus-4-
|
|
230
|
+
- `claude-sonnet-4-6` (balanced)
|
|
231
|
+
- `claude-opus-4-6` (most capable)
|
|
232
232
|
|
|
233
233
|
**Q: How do I update the CLI?**
|
|
234
234
|
A:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { l as logger } from './logger-6V5cBxba.js';
|
|
4
4
|
import { c as configManager } from './config-manager-DST6RbP8.js';
|
|
5
|
-
import { s as setupDatabase, p as pushDatabaseSchema } from './database-setup-
|
|
5
|
+
import { s as setupDatabase, p as pushDatabaseSchema } from './database-setup-BdXiI4MV.js';
|
|
6
6
|
import 'conf';
|
|
7
7
|
import 'node:os';
|
|
8
8
|
import 'node:path';
|
|
@@ -65,4 +65,4 @@ async function databaseCommand() {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export { databaseCommand };
|
|
68
|
-
//# sourceMappingURL=database-
|
|
68
|
+
//# sourceMappingURL=database-CsfD1Nxf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-
|
|
1
|
+
{"version":3,"file":"database-CsfD1Nxf.js","sources":["../../src/cli/commands/database.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { setupDatabase, pushDatabaseSchema } from '../utils/database-setup.js';\nimport { prompts } from '../utils/prompts.js';\n\nexport async function databaseCommand() {\n logger.section('Database Setup');\n logger.log('');\n\n // Check if monorepo is configured\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n\n if (!monorepoPath) {\n logger.error('Monorepo path not found in config');\n logger.info('Run \"hatchway init\" first to set up the repository');\n process.exit(1);\n }\n\n // Step 1: Setup new database\n logger.info('Setting up new Neon PostgreSQL database...');\n logger.log('');\n\n const databaseUrl = await setupDatabase(monorepoPath);\n\n if (!databaseUrl) {\n logger.error('Failed to create database');\n logger.log('');\n logger.info('You can manually set a database URL with:');\n logger.log(` ${chalk.cyan('hatchway config set databaseUrl <url>')}`);\n process.exit(1);\n }\n\n logger.log('');\n logger.success('Database created!');\n logger.info(`Connection string saved to config`);\n logger.log('');\n\n // Save to config\n configManager.set('databaseUrl', databaseUrl);\n\n // Step 2: Push schema\n logger.info('Initializing database schema...');\n logger.log('');\n\n const pushed = await pushDatabaseSchema(monorepoPath, databaseUrl);\n\n if (!pushed) {\n logger.warn('Failed to push database schema');\n logger.log('');\n logger.info('You can try manually:');\n logger.log(` ${chalk.cyan('cd apps/hatchway')}`);\n logger.log(` ${chalk.cyan('npx drizzle-kit push --config=drizzle.config.ts')}`);\n logger.log('');\n process.exit(1);\n }\n\n // Success!\n logger.log('');\n logger.success('Database setup complete! 🎉');\n logger.log('');\n logger.info('Database is ready for use');\n logger.info(`You can now run: ${chalk.cyan('hatchway run')}`);\n logger.log('');\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAMO,eAAe,eAAe,GAAA;AACnC,IAAA,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;AAChC,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGd,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE;AAClC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY;IAExC,IAAI,CAAC,YAAY,EAAE;AACjB,QAAA,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC;AACjD,QAAA,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC;AACjE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;;AAGA,IAAA,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC;AACzD,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAEd,IAAA,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC;IAErD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC;AACzC,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,QAAA,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA,CAAE,CAAC;AACtE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AAEA,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,IAAA,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;AACnC,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,iCAAA,CAAmC,CAAC;AAChD,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGd,IAAA,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC;;AAG7C,IAAA,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC;AAC9C,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC;IAElE,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC;AAC7C,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,QAAA,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC;AACpC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA,CAAE,CAAC;AACjD,QAAA,MAAM,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA,CAAE,CAAC;AAChF,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;;AAGA,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,IAAA,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC;AAC7C,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,IAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;AACxC,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA,CAAE,CAAC;AAC7D,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAChB;;;;"}
|
|
@@ -45,8 +45,11 @@ async function clearDatabaseUrlFromEnv(monorepoPath) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
* Run neondb setup to create a database and get the connection string
|
|
48
|
+
* Run get-db (formerly neondb) setup to create a database and get the connection string
|
|
49
49
|
* Returns the DATABASE_URL if successful
|
|
50
|
+
*
|
|
51
|
+
* Note: The 'neondb' package was renamed to 'get-db'. We use 'get-db' directly
|
|
52
|
+
* to avoid deprecation warnings and ensure compatibility.
|
|
50
53
|
*/
|
|
51
54
|
async function setupDatabase(monorepoPath, silent = false) {
|
|
52
55
|
// Clear any stale DATABASE_URL first
|
|
@@ -55,7 +58,8 @@ async function setupDatabase(monorepoPath, silent = false) {
|
|
|
55
58
|
spinner.start('Setting up Neon PostgreSQL database...');
|
|
56
59
|
}
|
|
57
60
|
return new Promise((resolve) => {
|
|
58
|
-
|
|
61
|
+
// Use 'get-db' (the renamed neondb package) for database creation
|
|
62
|
+
const proc = spawn('npx', ['get-db', '-y'], {
|
|
59
63
|
cwd: monorepoPath, // Run in monorepo root so .env is created there
|
|
60
64
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
61
65
|
shell: true,
|
|
@@ -250,4 +254,4 @@ async function connectManualDatabase() {
|
|
|
250
254
|
}
|
|
251
255
|
|
|
252
256
|
export { connectManualDatabase as c, pushDatabaseSchema as p, setupDatabase as s };
|
|
253
|
-
//# sourceMappingURL=database-setup-
|
|
257
|
+
//# sourceMappingURL=database-setup-BdXiI4MV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-setup-BdXiI4MV.js","sources":["../../src/cli/utils/database-setup.ts"],"sourcesContent":["import { spawn, execFileSync } from 'node:child_process';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { logger } from './logger.js';\nimport { spinner } from './spinner.js';\nimport { prompts } from './prompts.js';\n\n/**\n * Read DATABASE_URL from .env file in monorepo root\n */\nexport async function readDatabaseUrlFromEnv(monorepoPath: string): Promise<string | null> {\n const envPath = join(monorepoPath, '.env');\n\n if (!existsSync(envPath)) {\n return null;\n }\n\n try {\n const content = await readFile(envPath, 'utf-8');\n const match = content.match(/^DATABASE_URL\\s*=\\s*['\"]?([^'\"\\n]+)['\"]?/m);\n return match ? match[1] : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Clear DATABASE_URL from .env file (removes stale value)\n */\nexport async function clearDatabaseUrlFromEnv(monorepoPath: string): Promise<void> {\n const envPath = join(monorepoPath, '.env');\n\n if (!existsSync(envPath)) {\n return;\n }\n\n try {\n const content = await readFile(envPath, 'utf-8');\n const updated = content\n .split('\\n')\n .filter(line => !line.trim().startsWith('DATABASE_URL'))\n .join('\\n');\n await writeFile(envPath, updated, 'utf-8');\n } catch (error) {\n logger.warn('Could not clear DATABASE_URL from .env');\n }\n}\n\n/**\n * Run get-db (formerly neondb) setup to create a database and get the connection string\n * Returns the DATABASE_URL if successful\n * \n * Note: The 'neondb' package was renamed to 'get-db'. We use 'get-db' directly\n * to avoid deprecation warnings and ensure compatibility.\n */\nexport async function setupDatabase(monorepoPath: string, silent: boolean = false): Promise<string | null> {\n // Clear any stale DATABASE_URL first\n await clearDatabaseUrlFromEnv(monorepoPath);\n\n if (!silent) {\n spinner.start('Setting up Neon PostgreSQL database...');\n }\n\n return new Promise((resolve) => {\n // Use 'get-db' (the renamed neondb package) for database creation\n const proc = spawn('npx', ['get-db', '-y'], {\n cwd: monorepoPath, // Run in monorepo root so .env is created there\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n let databaseUrl: string | null = null;\n let output = '';\n\n proc.stdout?.on('data', (data) => {\n const text = data.toString();\n output += text;\n\n // Look for DATABASE_URL in the output\n const match = text.match(/DATABASE_URL[=:]?\\s*['\"]?([^'\"\\s]+)['\"]?/);\n if (match && match[1]) {\n databaseUrl = match[1];\n }\n\n // Also check for postgres:// connection strings\n const connMatch = text.match(/(postgres(?:ql)?:\\/\\/[^\\s'\"]+)/);\n if (connMatch && connMatch[1]) {\n databaseUrl = connMatch[1];\n }\n });\n\n proc.stderr?.on('data', (data) => {\n const text = data.toString();\n // Only log actual errors (and only if not silent)\n if (!silent && (text.includes('error') || text.includes('Error'))) {\n logger.debug(text.trim());\n }\n });\n\n proc.on('exit', async (code) => {\n if (code === 0) {\n // Try to read DATABASE_URL from .env file (neondb writes it there)\n const urlFromEnv = await readDatabaseUrlFromEnv(monorepoPath);\n\n if (urlFromEnv) {\n databaseUrl = urlFromEnv;\n if (!silent) {\n spinner.succeed('Database created successfully');\n }\n resolve(databaseUrl);\n } else if (databaseUrl) {\n // Fallback to what we parsed from output\n if (!silent) {\n spinner.succeed('Database created successfully');\n }\n resolve(databaseUrl);\n } else {\n if (!silent) {\n spinner.warn('Database command completed but DATABASE_URL not found');\n logger.info('Check .env file in monorepo root for DATABASE_URL');\n }\n resolve(null);\n }\n } else {\n if (!silent) {\n spinner.fail('Failed to create database');\n }\n resolve(null);\n }\n });\n\n proc.on('error', (error) => {\n if (!silent) {\n spinner.fail('Failed to run neondb');\n logger.error(`Error: ${error.message}`);\n }\n resolve(null);\n });\n });\n}\n\n/**\n * Check if get-db (formerly neondb) is available\n */\nexport async function isNeondbAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n const proc = spawn('npx', ['get-db', '--version'], {\n stdio: 'ignore',\n shell: true,\n });\n\n proc.on('exit', (code) => {\n resolve(code === 0);\n });\n\n proc.on('error', () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Push database schema using drizzle-kit\n */\nexport async function pushDatabaseSchema(monorepoPath: string, databaseUrl: string, silent: boolean = false): Promise<boolean> {\n const { join } = await import('path');\n const { existsSync } = await import('fs');\n\n const hatchwayAppPath = join(monorepoPath, 'apps/hatchway');\n const configPath = join(hatchwayAppPath, 'drizzle.config.ts');\n\n // Verify paths exist\n if (!existsSync(hatchwayAppPath)) {\n if (!silent) {\n logger.error(`Directory not found: ${hatchwayAppPath}`);\n }\n return false;\n }\n\n if (!existsSync(configPath)) {\n if (!silent) {\n logger.error(`Drizzle config not found: ${configPath}`);\n }\n return false;\n }\n\n if (!silent) {\n spinner.start('Ensuring hatchway dependencies are installed...');\n }\n\n try {\n execFileSync('pnpm', ['install'], {\n cwd: hatchwayAppPath,\n stdio: 'pipe',\n });\n execFileSync('pnpm', ['--filter', '@hatchway/agent-core', 'build'], {\n cwd: monorepoPath,\n stdio: 'pipe',\n });\n if (!silent) {\n spinner.succeed('Dependencies ready');\n }\n } catch (error) {\n if (!silent) {\n spinner.warn('Dependency installation failed, trying schema push anyway');\n }\n }\n\n if (!silent) {\n spinner.start('Initializing database schema (this may take a moment)...');\n }\n\n return new Promise((resolve) => {\n const proc = spawn('npx', ['drizzle-kit', 'push', '--config=drizzle.config.ts'], {\n cwd: hatchwayAppPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env: {\n ...process.env,\n DATABASE_URL: databaseUrl, // Ensure drizzle-kit has access\n },\n });\n\n let allOutput = '';\n\n // Capture all output for debugging\n proc.stdout?.on('data', (data) => {\n allOutput += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n allOutput += data.toString();\n });\n\n proc.on('exit', (code) => {\n if (code === 0) {\n if (!silent) {\n spinner.succeed('Database schema initialized successfully');\n }\n resolve(true);\n } else {\n if (!silent) {\n spinner.fail('Failed to push database schema');\n // Show all output when it fails so user can see what went wrong\n if (allOutput.trim()) {\n logger.log(''); // Blank line\n logger.log('Output from drizzle-kit push:');\n logger.log(allOutput.trim());\n logger.log(''); // Blank line\n }\n }\n resolve(false);\n }\n });\n\n proc.on('error', (error) => {\n if (!silent) {\n spinner.fail('Failed to run drizzle-kit');\n logger.error(`Error: ${error.message}`);\n }\n resolve(false);\n });\n });\n}\n\n/**\n * Connect to an existing database manually by prompting for connection string\n */\nexport async function connectManualDatabase(): Promise<string | null> {\n logger.log('');\n\n // Ask user what type of connection they want\n const connectionType = await prompts.select(\n 'How would you like to connect your database?',\n [\n 'Connect an existing Hatchway database',\n 'Provide a connection string directly',\n ]\n );\n\n logger.log('');\n\n // Prompt for the connection string\n let message: string;\n if (connectionType === 'Connect an existing Hatchway database') {\n message = 'Enter your Hatchway database connection string:';\n } else {\n message = 'Enter your PostgreSQL connection string:';\n }\n\n const connectionString = await prompts.input(message);\n\n // Basic validation\n if (!connectionString || connectionString.trim() === '') {\n logger.error('Connection string cannot be empty');\n return null;\n }\n\n // Validate it looks like a PostgreSQL connection string\n if (!connectionString.match(/^postgres(?:ql)?:\\/\\//)) {\n logger.error('Connection string must start with postgres:// or postgresql://');\n return null;\n }\n\n return connectionString.trim();\n}\n"],"names":[],"mappings":";;;;;;;;;AAQA;;AAEG;AACI,eAAe,sBAAsB,CAAC,YAAoB,EAAA;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;AAE1C,IAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACxB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC;AACxE,QAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAChC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEA;;AAEG;AACI,eAAe,uBAAuB,CAAC,YAAoB,EAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;AAE1C,IAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACxB;IACF;AAEA,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAChD,MAAM,OAAO,GAAG;aACb,KAAK,CAAC,IAAI;AACV,aAAA,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC;QACb,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;IAC5C;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC;IACvD;AACF;AAEA;;;;;;AAMG;AACI,eAAe,aAAa,CAAC,YAAoB,EAAE,SAAkB,KAAK,EAAA;;AAE/E,IAAA,MAAM,uBAAuB,CAAC,YAAY,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC;IACzD;AAEA,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;;QAE7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;YAC1C,GAAG,EAAE,YAAY;AACjB,YAAA,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;AACjC,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,CAAC;QAEF,IAAI,WAAW,GAAkB,IAAI;QAGrC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;;YAI5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC;AACpE,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACrB,gBAAA,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;YACxB;;YAGA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC;AAC9D,YAAA,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;AAC7B,gBAAA,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;;AAE5B,YAAA,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE;gBACjE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,KAAI;AAC7B,YAAA,IAAI,IAAI,KAAK,CAAC,EAAE;;AAEd,gBAAA,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,YAAY,CAAC;gBAE7D,IAAI,UAAU,EAAE;oBACd,WAAW,GAAG,UAAU;oBACxB,IAAI,CAAC,MAAM,EAAE;AACX,wBAAA,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC;oBAClD;oBACA,OAAO,CAAC,WAAW,CAAC;gBACtB;qBAAO,IAAI,WAAW,EAAE;;oBAEtB,IAAI,CAAC,MAAM,EAAE;AACX,wBAAA,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC;oBAClD;oBACA,OAAO,CAAC,WAAW,CAAC;gBACtB;qBAAO;oBACL,IAAI,CAAC,MAAM,EAAE;AACX,wBAAA,OAAO,CAAC,IAAI,CAAC,uDAAuD,CAAC;AACrE,wBAAA,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC;oBAClE;oBACA,OAAO,CAAC,IAAI,CAAC;gBACf;YACF;iBAAO;gBACL,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC;gBAC3C;gBACA,OAAO,CAAC,IAAI,CAAC;YACf;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YACzB,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;YACzC;YACA,OAAO,CAAC,IAAI,CAAC;AACf,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;AAsBA;;AAEG;AACI,eAAe,kBAAkB,CAAC,YAAoB,EAAE,WAAmB,EAAE,MAAA,GAAkB,KAAK,EAAA;IACzG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,MAAM,CAAC;IACrC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;IAEzC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC;;AAG7D,IAAA,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;QAChC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,CAAC,KAAK,CAAC,wBAAwB,eAAe,CAAA,CAAE,CAAC;QACzD;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QAC3B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,CAAC,KAAK,CAAC,6BAA6B,UAAU,CAAA,CAAE,CAAC;QACzD;AACA,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC;IAClE;AAEA,IAAA,IAAI;AACF,QAAA,YAAY,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,KAAK,EAAE,MAAM;AACd,SAAA,CAAC;QACF,YAAY,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE;AAClE,YAAA,GAAG,EAAE,YAAY;AACjB,YAAA,KAAK,EAAE,MAAM;AACd,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACvC;IACF;IAAE,OAAO,KAAK,EAAE;QACd,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC;QAC3E;IACF;IAEA,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC;IAC3E;AAEA,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,4BAA4B,CAAC,EAAE;AAC/E,YAAA,GAAG,EAAE,eAAe;AACpB,YAAA,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;AACjC,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,YAAY,EAAE,WAAW;AAC1B,aAAA;AACF,SAAA,CAAC;QAEF,IAAI,SAAS,GAAG,EAAE;;QAGlB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;AAC/B,YAAA,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;AAC/B,YAAA,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAI;AACvB,YAAA,IAAI,IAAI,KAAK,CAAC,EAAE;gBACd,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,OAAO,CAAC,OAAO,CAAC,0CAA0C,CAAC;gBAC7D;gBACA,OAAO,CAAC,IAAI,CAAC;YACf;iBAAO;gBACL,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC;;AAE9C,oBAAA,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE;AACpB,wBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACf,wBAAA,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC;wBAC3C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AAC5B,wBAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjB;gBACF;gBACA,OAAO,CAAC,KAAK,CAAC;YAChB;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YACzB,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC;gBACzC,MAAM,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;YACzC;YACA,OAAO,CAAC,KAAK,CAAC;AAChB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,qBAAqB,GAAA;AACzC,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;IAGd,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,MAAM,CACzC,8CAA8C,EAC9C;QACE,uCAAuC;QACvC,sCAAsC;AACvC,KAAA,CACF;AAED,IAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGd,IAAA,IAAI,OAAe;AACnB,IAAA,IAAI,cAAc,KAAK,uCAAuC,EAAE;QAC9D,OAAO,GAAG,iDAAiD;IAC7D;SAAO;QACL,OAAO,GAAG,0CAA0C;IACtD;IAEA,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;;IAGrD,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACvD,QAAA,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC;AACjD,QAAA,OAAO,IAAI;IACb;;IAGA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE;AACpD,QAAA,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC;AAC9E,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,gBAAgB,CAAC,IAAI,EAAE;AAChC;;;;"}
|
|
@@ -8,9 +8,9 @@ import pc from 'picocolors';
|
|
|
8
8
|
import { c as configManager } from './config-manager-DST6RbP8.js';
|
|
9
9
|
import { i as isInsideMonorepo } from './repo-detector-36VydrlB.js';
|
|
10
10
|
import { isPnpmInstalled, cloneRepository, installDependencies, buildAgentCore } from './repo-cloner-UY3L2X7h.js';
|
|
11
|
-
import { s as setupDatabase, p as pushDatabaseSchema, c as connectManualDatabase } from './database-setup-
|
|
11
|
+
import { s as setupDatabase, p as pushDatabaseSchema, c as connectManualDatabase } from './database-setup-BdXiI4MV.js';
|
|
12
12
|
import { C as CLIError, e as errors } from './cli-error-1drkrXNn.js';
|
|
13
|
-
import { initTUICommand } from './init-tui-
|
|
13
|
+
import { initTUICommand } from './init-tui-m2supRiJ.js';
|
|
14
14
|
import 'conf';
|
|
15
15
|
import 'node:os';
|
|
16
16
|
import 'node:child_process';
|
|
@@ -469,4 +469,4 @@ async function initCommand(options) {
|
|
|
469
469
|
}
|
|
470
470
|
|
|
471
471
|
export { initCommand };
|
|
472
|
-
//# sourceMappingURL=init-
|
|
472
|
+
//# sourceMappingURL=init-Ckj9MlWI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-DkXJVFFx.js","sources":["../../src/cli/commands/init.ts"],"sourcesContent":["/**\n * Enhanced init command with @clack/prompts and friction-free -y mode\n * Provides beautiful interactive setup or completely automated installation\n * \n * For -y mode: Uses a beautiful centered TUI with animated progress\n */\n\nimport { mkdir, realpath, writeFile } from 'node:fs/promises';\nimport { existsSync, realpathSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport {\n cloneRepository,\n installDependencies,\n isPnpmInstalled,\n buildAgentCore\n} from '../utils/repo-cloner.js';\nimport {\n setupDatabase,\n pushDatabaseSchema,\n connectManualDatabase\n} from '../utils/database-setup.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { initTUICommand } from './init-tui.js';\n\n/**\n * Generate a secure random secret\n */\nfunction generateSecret(): string {\n return randomBytes(32).toString('hex');\n}\n\n/**\n * Check if a path is or contains the current working directory\n * Prevents accidental deletion of the directory we're running from\n */\nfunction isCurrentWorkingDirectory(targetPath: string): boolean {\n try {\n const cwd = realpathSync(process.cwd());\n const target = realpathSync(resolve(targetPath));\n // Check if target is cwd or if cwd is inside target\n return cwd === target || cwd.startsWith(target + '/');\n } catch {\n // If we can't resolve paths, be safe and assume it might be cwd\n const cwd = process.cwd();\n const target = resolve(targetPath);\n return cwd === target || cwd.startsWith(target + '/');\n }\n}\n\n/**\n * Safely remove a directory, but never the current working directory\n */\nfunction safeRemoveDirectory(targetPath: string, rmSync: typeof import('fs').rmSync): boolean {\n if (isCurrentWorkingDirectory(targetPath)) {\n console.error(`\\n⚠️ Cannot remove ${targetPath} - it is the current working directory`);\n console.error(' Please run this command from a different directory.\\n');\n return false;\n }\n rmSync(targetPath, { recursive: true, force: true });\n return true;\n}\n\n/**\n * Normalize URL by adding protocol if missing\n */\nfunction normalizeUrl(url: string): string {\n if (!url) return url;\n if (url.match(/^https?:\\/\\//i)) return url;\n if (url.match(/^(localhost|127\\.0\\.0\\.1)(:|\\/|$)/i)) {\n return `http://${url}`;\n }\n return `https://${url}`;\n}\n\n/**\n * Get default workspace path\n */\nfunction getDefaultWorkspace(): string {\n return join(process.cwd(), 'hatchway-workspace');\n}\n\n/**\n * Get default monorepo clone path\n */\nfunction getDefaultMonorepoPath(): string {\n return join(process.cwd(), 'hatchway');\n}\n\ninterface InitOptions {\n workspace?: string;\n url?: string;\n secret?: string;\n branch?: string;\n database?: string | boolean; // Can be: undefined (neon), or a PostgreSQL connection string\n yes?: boolean;\n nonInteractive?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n const isNonInteractive = options.nonInteractive || options.yes;\n\n // ========================================\n // NON-INTERACTIVE MODE: Use beautiful TUI\n // ========================================\n if (isNonInteractive) {\n return initTUICommand(options);\n }\n\n // ========================================\n // INTERACTIVE MODE (Beautiful @clack/prompts)\n // ========================================\n // Handle Ctrl+C gracefully\n const handleCancel = () => {\n p.cancel('Setup cancelled');\n process.exit(0);\n };\n\n try {\n {\n // Keep banner visible - don't clear screen\n console.log(); // Just add spacing\n\n p.intro(pc.bgCyan(pc.black(' Hatchway Setup ')));\n\n // Step 1: Check if already initialized\n if (configManager.isInitialized()) {\n const shouldReset = await p.confirm({\n message: 'Configuration already exists. Reset and reconfigure?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldReset)) {\n handleCancel();\n return;\n }\n\n if (!shouldReset) {\n p.cancel('Setup cancelled');\n return;\n }\n\n configManager.reset();\n p.log.success('Configuration reset');\n }\n\n // Step 2: Check for monorepo\n const s = p.spinner();\n s.start('Checking for Hatchway repository');\n\n const repoCheck = await isInsideMonorepo();\n let monorepoPath: string | undefined;\n\n if (repoCheck.inside && repoCheck.root) {\n s.stop(pc.green('✓') + ' Found repository at: ' + pc.cyan(repoCheck.root));\n monorepoPath = repoCheck.root;\n } else {\n s.stop('Repository not found in current directory');\n\n const shouldClone = await p.confirm({\n message: 'Clone Hatchway repository?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldClone)) {\n handleCancel();\n return;\n }\n\n if (shouldClone) {\n // Check for pnpm\n const hasPnpm = await isPnpmInstalled();\n if (!hasPnpm) {\n throw new CLIError({\n code: 'DEPENDENCIES_INSTALL_FAILED',\n message: 'pnpm is not installed',\n suggestions: [\n 'Install pnpm: npm install -g pnpm',\n 'Or visit: https://pnpm.io/installation',\n ],\n });\n }\n\n const clonePath = await p.text({\n message: 'Where should the repository be cloned?',\n placeholder: getDefaultMonorepoPath(),\n defaultValue: getDefaultMonorepoPath(),\n validate: (value) => {\n if (!value) return 'Path is required';\n },\n });\n\n if (p.isCancel(clonePath)) {\n handleCancel();\n return;\n }\n\n // Check if path exists\n const defaultWorkspace = getDefaultWorkspace();\n const existingInstallation = existsSync(clonePath as string) || existsSync(defaultWorkspace);\n\n if (existingInstallation) {\n const shouldOverwrite = await p.confirm({\n message: `Existing Hatchway installation found. Replace it with fresh install?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldOverwrite)) {\n handleCancel();\n return;\n }\n\n if (shouldOverwrite) {\n s.start('Removing existing installation');\n const { rmSync } = await import('fs');\n\n // Safety check: never delete the current working directory\n if (existsSync(clonePath as string)) {\n if (!safeRemoveDirectory(clonePath as string, rmSync)) {\n s.stop(pc.red('✗') + ' Cannot remove current working directory');\n p.cancel('Please run hatchway init from a different directory');\n return;\n }\n }\n\n // Delete workspace directory\n if (existsSync(defaultWorkspace)) {\n if (!safeRemoveDirectory(defaultWorkspace, rmSync)) {\n s.stop(pc.red('✗') + ' Cannot remove current working directory');\n p.cancel('Please run hatchway init from a different directory');\n return;\n }\n }\n\n s.stop(pc.green('✓') + ' Existing installation removed');\n } else {\n p.cancel('Setup cancelled');\n return;\n }\n }\n\n // Clone, install, build\n try {\n s.start('Cloning repository from GitHub');\n monorepoPath = await cloneRepository({\n targetPath: clonePath as string,\n branch: options.branch || 'main',\n });\n s.stop(pc.green('✓') + ' Repository cloned');\n\n s.start('Installing dependencies (this may take a few minutes)');\n await installDependencies(monorepoPath);\n s.stop(pc.green('✓') + ' Dependencies installed');\n\n s.start('Building @hatchway/agent-core');\n await buildAgentCore(monorepoPath);\n s.stop(pc.green('✓') + ' Build complete');\n\n // Ask about pre-building services\n const shouldPreBuild = await p.confirm({\n message: 'Pre-build all services for production performance?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldPreBuild)) {\n handleCancel();\n return;\n }\n\n if (shouldPreBuild) {\n s.start('Building all services (this may take a minute)');\n const { spawn } = await import('child_process');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoPath,\n stdio: 'pipe',\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('✓') + ' All services built for production');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Build failed (you can build later with: pnpm build:all)');\n }\n }\n } catch (error) {\n throw new CLIError({\n code: 'MONOREPO_CLONE_FAILED',\n message: 'Failed to setup repository',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n 'Check your internet connection',\n 'Verify you have git installed: git --version',\n 'Try cloning manually: git clone https://github.com/codyde/hatchway.git',\n ],\n });\n }\n } else {\n p.note(\n 'Setup will continue in runner-only mode.\\nYou can add the repository path later with:\\n hatchway config set monorepoPath <path>',\n 'Repository setup skipped'\n );\n }\n }\n\n // Step 3: Workspace configuration\n p.log.step(pc.cyan('Workspace Configuration'));\n\n const workspace = await p.text({\n message: 'Where should generated projects be stored?',\n placeholder: getDefaultWorkspace(),\n defaultValue: getDefaultWorkspace(),\n validate: (value) => {\n if (!value) return 'Workspace path is required';\n },\n });\n\n if (p.isCancel(workspace)) {\n handleCancel();\n return;\n }\n\n // Create workspace directory\n try {\n if (!existsSync(workspace as string)) {\n await mkdir(workspace as string, { recursive: true });\n }\n } catch (error) {\n throw errors.workspaceNotFound(workspace as string);\n }\n\n // Step 4: Connection configuration\n p.log.step(pc.cyan('Connection Configuration'));\n\n const wsUrl = await p.text({\n message: 'Server WebSocket URL',\n placeholder: 'ws://localhost:3000/ws/runner',\n defaultValue: 'ws://localhost:3000/ws/runner',\n });\n\n if (p.isCancel(wsUrl)) {\n handleCancel();\n return;\n }\n\n const apiUrl = await p.text({\n message: 'API base URL',\n placeholder: 'http://localhost:3000',\n defaultValue: options.url || 'http://localhost:3000',\n });\n\n if (p.isCancel(apiUrl)) {\n handleCancel();\n return;\n }\n\n // Step 5: Security\n const secret = await p.text({\n message: 'Shared secret (press Enter to generate)',\n placeholder: 'Generated automatically',\n defaultValue: options.secret || generateSecret(),\n });\n\n if (p.isCancel(secret)) {\n handleCancel();\n return;\n }\n\n const runnerId = await p.text({\n message: 'Runner ID',\n placeholder: 'local',\n defaultValue: 'local',\n });\n\n if (p.isCancel(runnerId)) {\n handleCancel();\n return;\n }\n\n // Step 6: Database setup (if monorepo available)\n let databaseUrl: string | undefined;\n\n if (monorepoPath) {\n p.log.step(pc.cyan('Database Setup'));\n\n const dbChoice = await p.select({\n message: 'Database configuration',\n options: [\n {\n value: 'neon',\n label: 'Create Neon database (recommended)',\n hint: 'Free tier, persistent storage'\n },\n {\n value: 'existing',\n label: 'Use existing PostgreSQL',\n hint: 'Provide connection string'\n },\n ],\n });\n\n if (p.isCancel(dbChoice)) {\n handleCancel();\n return;\n }\n\n if (dbChoice === 'neon') {\n p.note(\n 'Opening Neon in your browser...\\nCreate a database and paste the connection string below.',\n pc.cyan('Database Setup')\n );\n databaseUrl = await setupDatabase(monorepoPath) || undefined;\n \n // Push schema if we have a database\n if (databaseUrl) {\n s.start('Pushing database schema');\n const pushed = await pushDatabaseSchema(monorepoPath, databaseUrl);\n if (pushed) {\n s.stop(pc.green('✓') + ' Schema initialized');\n } else {\n s.stop(pc.yellow('⚠') + ' Schema push failed (you can retry later)');\n }\n }\n } else if (dbChoice === 'existing') {\n databaseUrl = await connectManualDatabase() || undefined;\n \n // Push schema if we have a database\n if (databaseUrl) {\n s.start('Pushing database schema');\n const pushed = await pushDatabaseSchema(monorepoPath, databaseUrl);\n if (pushed) {\n s.stop(pc.green('✓') + ' Schema initialized');\n } else {\n s.stop(pc.yellow('⚠') + ' Schema push failed (you can retry later)');\n }\n }\n }\n }\n\n // Step 7: Save configuration\n try {\n configManager.set('workspace', workspace);\n if (monorepoPath) {\n configManager.set('monorepoPath', monorepoPath);\n }\n if (databaseUrl) {\n configManager.set('databaseUrl', databaseUrl);\n }\n configManager.set('apiUrl', normalizeUrl(apiUrl as string));\n configManager.set('server', {\n wsUrl: wsUrl,\n secret: secret,\n });\n configManager.set('runner', {\n id: runnerId,\n reconnectAttempts: 5,\n heartbeatInterval: 15000,\n });\n configManager.set('tunnel', {\n provider: 'cloudflare',\n autoCreate: true,\n });\n } catch (error) {\n throw new CLIError({\n code: 'CONFIG_INVALID',\n message: 'Failed to save configuration',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n 'Check file permissions on config directory',\n 'Try running with sudo (not recommended)',\n ],\n });\n }\n\n // Validate\n const validation = configManager.validate();\n if (!validation.valid) {\n throw new CLIError({\n code: 'CONFIG_INVALID',\n message: 'Configuration validation failed',\n context: { errors: validation.errors },\n suggestions: validation.errors,\n });\n }\n\n // Success!\n p.outro(pc.green('✨ Hatchway is ready!'));\n\n p.note(\n `${pc.cyan('hatchway run')}\\n\\nThen open: ${pc.cyan('http://localhost:3000')}`,\n 'Next Steps'\n );\n\n return;\n }\n } catch (error) {\n // Handle cancellation gracefully\n if (error && typeof error === 'object' && 'name' in error) {\n if ((error as { name: string }).name === 'ExitPromptError' || (error as { code?: string }).code === 'CLACK_CANCEL') {\n handleCancel();\n return;\n }\n }\n\n // Re-throw for global error handler\n throw error;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;AAyBH;;AAEG;AACH,SAAS,cAAc,GAAA;IACrB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxC;AAEA;;;AAGG;AACH,SAAS,yBAAyB,CAAC,UAAkB,EAAA;AACnD,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;;AAEhD,QAAA,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;IACvD;AAAE,IAAA,MAAM;;AAEN,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;AAClC,QAAA,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;IACvD;AACF;AAEA;;AAEG;AACH,SAAS,mBAAmB,CAAC,UAAkB,EAAE,MAAkC,EAAA;AACjF,IAAA,IAAI,yBAAyB,CAAC,UAAU,CAAC,EAAE;AACzC,QAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,CAAA,sCAAA,CAAwC,CAAC;AACxF,QAAA,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC;AACzE,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACpD,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACH,SAAS,YAAY,CAAC,GAAW,EAAA;AAC/B,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;AAAE,QAAA,OAAO,GAAG;AAC1C,IAAA,IAAI,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,EAAE;QACnD,OAAO,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE;IACxB;IACA,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE;AACzB;AAEA;;AAEG;AACH,SAAS,mBAAmB,GAAA;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC;AAClD;AAEA;;AAEG;AACH,SAAS,sBAAsB,GAAA;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;AACxC;AAYO,eAAe,WAAW,CAAC,OAAoB,EAAA;IACpD,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG;;;;IAK9D,IAAI,gBAAgB,EAAE;AACpB,QAAA,OAAO,cAAc,CAAC,OAAO,CAAC;IAChC;;;;;IAMA,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAC3B,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,IAAA,CAAC;AAED,IAAA,IAAI;QACF;;AAEE,YAAA,OAAO,CAAC,GAAG,EAAE,CAAC;AAEd,YAAA,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;;AAGhD,YAAA,IAAI,aAAa,CAAC,aAAa,EAAE,EAAE;AACjC,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;AAClC,oBAAA,OAAO,EAAE,sDAAsD;AAC/D,oBAAA,YAAY,EAAE,IAAI;AACnB,iBAAA,CAAC;AAEF,gBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC3B,oBAAA,YAAY,EAAE;oBACd;gBACF;gBAEA,IAAI,CAAC,WAAW,EAAE;AAChB,oBAAA,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC3B;gBACF;gBAEA,aAAa,CAAC,KAAK,EAAE;AACrB,gBAAA,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC;YACtC;;AAGA,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE;AACrB,YAAA,CAAC,CAAC,KAAK,CAAC,kCAAkC,CAAC;AAE3C,YAAA,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE;AAC1C,YAAA,IAAI,YAAgC;YAEpC,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE;gBACtC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,wBAAwB,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC1E,gBAAA,YAAY,GAAG,SAAS,CAAC,IAAI;YAC/B;iBAAO;AACL,gBAAA,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC;AAEnD,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;AAClC,oBAAA,OAAO,EAAE,4BAA4B;AACrC,oBAAA,YAAY,EAAE,IAAI;AACnB,iBAAA,CAAC;AAEF,gBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC3B,oBAAA,YAAY,EAAE;oBACd;gBACF;gBAEA,IAAI,WAAW,EAAE;;AAEf,oBAAA,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE;oBACvC,IAAI,CAAC,OAAO,EAAE;wBACZ,MAAM,IAAI,QAAQ,CAAC;AACjB,4BAAA,IAAI,EAAE,6BAA6B;AACnC,4BAAA,OAAO,EAAE,uBAAuB;AAChC,4BAAA,WAAW,EAAE;gCACX,mCAAmC;gCACnC,wCAAwC;AACzC,6BAAA;AACF,yBAAA,CAAC;oBACJ;AAEA,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AAC7B,wBAAA,OAAO,EAAE,wCAAwC;wBACjD,WAAW,EAAE,sBAAsB,EAAE;wBACrC,YAAY,EAAE,sBAAsB,EAAE;AACtC,wBAAA,QAAQ,EAAE,CAAC,KAAK,KAAI;AAClB,4BAAA,IAAI,CAAC,KAAK;AAAE,gCAAA,OAAO,kBAAkB;wBACvC,CAAC;AACF,qBAAA,CAAC;AAEF,oBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACzB,wBAAA,YAAY,EAAE;wBACd;oBACF;;AAGA,oBAAA,MAAM,gBAAgB,GAAG,mBAAmB,EAAE;oBAC9C,MAAM,oBAAoB,GAAG,UAAU,CAAC,SAAmB,CAAC,IAAI,UAAU,CAAC,gBAAgB,CAAC;oBAE5F,IAAI,oBAAoB,EAAE;AACxB,wBAAA,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;AACtC,4BAAA,OAAO,EAAE,CAAA,oEAAA,CAAsE;AAC/E,4BAAA,YAAY,EAAE,IAAI;AACnB,yBAAA,CAAC;AAEF,wBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AAC/B,4BAAA,YAAY,EAAE;4BACd;wBACF;wBAEA,IAAI,eAAe,EAAE;AACnB,4BAAA,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC;4BACzC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,IAAI,CAAC;;AAGrC,4BAAA,IAAI,UAAU,CAAC,SAAmB,CAAC,EAAE;gCACnC,IAAI,CAAC,mBAAmB,CAAC,SAAmB,EAAE,MAAM,CAAC,EAAE;AACrD,oCAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,0CAA0C,CAAC;AAChE,oCAAA,CAAC,CAAC,MAAM,CAAC,qDAAqD,CAAC;oCAC/D;gCACF;4BACF;;AAGA,4BAAA,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE;gCAChC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE;AAClD,oCAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,0CAA0C,CAAC;AAChE,oCAAA,CAAC,CAAC,MAAM,CAAC,qDAAqD,CAAC;oCAC/D;gCACF;4BACF;AAEA,4BAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC;wBAC1D;6BAAO;AACL,4BAAA,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;4BAC3B;wBACF;oBACF;;AAGA,oBAAA,IAAI;AACF,wBAAA,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC;wBACzC,YAAY,GAAG,MAAM,eAAe,CAAC;AACnC,4BAAA,UAAU,EAAE,SAAmB;AAC/B,4BAAA,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;AACjC,yBAAA,CAAC;AACF,wBAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC;AAE5C,wBAAA,CAAC,CAAC,KAAK,CAAC,uDAAuD,CAAC;AAChE,wBAAA,MAAM,mBAAmB,CAAC,YAAY,CAAC;AACvC,wBAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,yBAAyB,CAAC;AAEjD,wBAAA,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC;AACxC,wBAAA,MAAM,cAAc,CAAC,YAAY,CAAC;AAClC,wBAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC;;AAGzC,wBAAA,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;AACrC,4BAAA,OAAO,EAAE,oDAAoD;AAC7D,4BAAA,YAAY,EAAE,IAAI;AACnB,yBAAA,CAAC;AAEF,wBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;AAC9B,4BAAA,YAAY,EAAE;4BACd;wBACF;wBAEA,IAAI,cAAc,EAAE;AAClB,4BAAA,CAAC,CAAC,KAAK,CAAC,gDAAgD,CAAC;4BACzD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,eAAe,CAAC;AAE/C,4BAAA,IAAI;gCACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;oCAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;AAChD,wCAAA,GAAG,EAAE,YAAY;AACjB,wCAAA,KAAK,EAAE,MAAM;AACb,wCAAA,KAAK,EAAE,IAAI;AACZ,qCAAA,CAAC;oCAEF,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,KAAI;AAChC,wCAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,4CAAA,OAAO,EAAE;wCACX;6CAAO;4CACL,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAA,CAAE,CAAC,CAAC;wCACrD;AACF,oCAAA,CAAC,CAAC;AAEF,oCAAA,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;AAClC,gCAAA,CAAC,CAAC;AAEF,gCAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,oCAAoC,CAAC;4BAC9D;4BAAE,OAAO,KAAK,EAAE;AACd,gCAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,0DAA0D,CAAC;4BACrF;wBACF;oBACF;oBAAE,OAAO,KAAK,EAAE;wBACd,MAAM,IAAI,QAAQ,CAAC;AACjB,4BAAA,IAAI,EAAE,uBAAuB;AAC7B,4BAAA,OAAO,EAAE,4BAA4B;AACrC,4BAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,4BAAA,WAAW,EAAE;gCACX,gCAAgC;gCAChC,8CAA8C;gCAC9C,wEAAwE;AACzE,6BAAA;AACF,yBAAA,CAAC;oBACJ;gBACF;qBAAO;AACL,oBAAA,CAAC,CAAC,IAAI,CACJ,kIAAkI,EAClI,0BAA0B,CAC3B;gBACH;YACF;;AAGA,YAAA,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AAE9C,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AAC7B,gBAAA,OAAO,EAAE,4CAA4C;gBACrD,WAAW,EAAE,mBAAmB,EAAE;gBAClC,YAAY,EAAE,mBAAmB,EAAE;AACnC,gBAAA,QAAQ,EAAE,CAAC,KAAK,KAAI;AAClB,oBAAA,IAAI,CAAC,KAAK;AAAE,wBAAA,OAAO,4BAA4B;gBACjD,CAAC;AACF,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACzB,gBAAA,YAAY,EAAE;gBACd;YACF;;AAGA,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAmB,CAAC,EAAE;oBACpC,MAAM,KAAK,CAAC,SAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBACvD;YACF;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAmB,CAAC;YACrD;;AAGA,YAAA,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAE/C,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AACzB,gBAAA,OAAO,EAAE,sBAAsB;AAC/B,gBAAA,WAAW,EAAE,+BAA+B;AAC5C,gBAAA,YAAY,EAAE,+BAA+B;AAC9C,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrB,gBAAA,YAAY,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AAC1B,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,WAAW,EAAE,uBAAuB;AACpC,gBAAA,YAAY,EAAE,OAAO,CAAC,GAAG,IAAI,uBAAuB;AACrD,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtB,gBAAA,YAAY,EAAE;gBACd;YACF;;AAGA,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AAC1B,gBAAA,OAAO,EAAE,yCAAyC;AAClD,gBAAA,WAAW,EAAE,yBAAyB;AACtC,gBAAA,YAAY,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,EAAE;AACjD,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtB,gBAAA,YAAY,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;AAC5B,gBAAA,OAAO,EAAE,WAAW;AACpB,gBAAA,WAAW,EAAE,OAAO;AACpB,gBAAA,YAAY,EAAE,OAAO;AACtB,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxB,gBAAA,YAAY,EAAE;gBACd;YACF;;AAGA,YAAA,IAAI,WAA+B;YAEnC,IAAI,YAAY,EAAE;AAChB,gBAAA,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAErC,gBAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;AAC9B,oBAAA,OAAO,EAAE,wBAAwB;AACjC,oBAAA,OAAO,EAAE;AACP,wBAAA;AACE,4BAAA,KAAK,EAAE,MAAM;AACb,4BAAA,KAAK,EAAE,oCAAoC;AAC3C,4BAAA,IAAI,EAAE;AACP,yBAAA;AACD,wBAAA;AACE,4BAAA,KAAK,EAAE,UAAU;AACjB,4BAAA,KAAK,EAAE,yBAAyB;AAChC,4BAAA,IAAI,EAAE;AACP,yBAAA;AACF,qBAAA;AACF,iBAAA,CAAC;AAEF,gBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxB,oBAAA,YAAY,EAAE;oBACd;gBACF;AAEA,gBAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,oBAAA,CAAC,CAAC,IAAI,CACJ,2FAA2F,EAC3F,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAC1B;oBACD,WAAW,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,IAAI,SAAS;;oBAG5D,IAAI,WAAW,EAAE;AACf,wBAAA,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC;wBAClC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC;wBAClE,IAAI,MAAM,EAAE;AACV,4BAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC;wBAC/C;6BAAO;AACL,4BAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,2CAA2C,CAAC;wBACtE;oBACF;gBACF;AAAO,qBAAA,IAAI,QAAQ,KAAK,UAAU,EAAE;AAClC,oBAAA,WAAW,GAAG,MAAM,qBAAqB,EAAE,IAAI,SAAS;;oBAGxD,IAAI,WAAW,EAAE;AACf,wBAAA,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC;wBAClC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC;wBAClE,IAAI,MAAM,EAAE;AACV,4BAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC;wBAC/C;6BAAO;AACL,4BAAA,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,2CAA2C,CAAC;wBACtE;oBACF;gBACF;YACF;;AAGA,YAAA,IAAI;AACF,gBAAA,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;gBACzC,IAAI,YAAY,EAAE;AAChB,oBAAA,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC;gBACjD;gBACA,IAAI,WAAW,EAAE;AACf,oBAAA,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC;gBAC/C;gBACA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,MAAgB,CAAC,CAAC;AAC3D,gBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC1B,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,MAAM,EAAE,MAAM;AACf,iBAAA,CAAC;AACF,gBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC1B,oBAAA,EAAE,EAAE,QAAQ;AACZ,oBAAA,iBAAiB,EAAE,CAAC;AACpB,oBAAA,iBAAiB,EAAE,KAAK;AACzB,iBAAA,CAAC;AACF,gBAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;AAC1B,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA,CAAC;YACJ;YAAE,OAAO,KAAK,EAAE;gBACd,MAAM,IAAI,QAAQ,CAAC;AACjB,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,OAAO,EAAE,8BAA8B;AACvC,oBAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,oBAAA,WAAW,EAAE;wBACX,4CAA4C;wBAC5C,yCAAyC;AAC1C,qBAAA;AACF,iBAAA,CAAC;YACJ;;AAGA,YAAA,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE;AAC3C,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;gBACrB,MAAM,IAAI,QAAQ,CAAC;AACjB,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,OAAO,EAAE,iCAAiC;AAC1C,oBAAA,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE;oBACtC,WAAW,EAAE,UAAU,CAAC,MAAM;AAC/B,iBAAA,CAAC;YACJ;;YAGA,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAEzC,CAAC,CAAC,IAAI,CACJ,CAAA,EAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA,CAAE,EAC9E,YAAY,CACb;YAED;QACF;IACF;IAAE,OAAO,KAAK,EAAE;;QAEd,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE;AACzD,YAAA,IAAK,KAA0B,CAAC,IAAI,KAAK,iBAAiB,IAAK,KAA2B,CAAC,IAAI,KAAK,cAAc,EAAE;AAClH,gBAAA,YAAY,EAAE;gBACd;YACF;QACF;;AAGA,QAAA,MAAM,KAAK;IACb;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"init-Ckj9MlWI.js","sources":["../../src/cli/commands/init.ts"],"sourcesContent":["/**\n * Enhanced init command with @clack/prompts and friction-free -y mode\n * Provides beautiful interactive setup or completely automated installation\n * \n * For -y mode: Uses a beautiful centered TUI with animated progress\n */\n\nimport { mkdir, realpath, writeFile } from 'node:fs/promises';\nimport { existsSync, realpathSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport {\n cloneRepository,\n installDependencies,\n isPnpmInstalled,\n buildAgentCore\n} from '../utils/repo-cloner.js';\nimport {\n setupDatabase,\n pushDatabaseSchema,\n connectManualDatabase\n} from '../utils/database-setup.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { initTUICommand } from './init-tui.js';\n\n/**\n * Generate a secure random secret\n */\nfunction generateSecret(): string {\n return randomBytes(32).toString('hex');\n}\n\n/**\n * Check if a path is or contains the current working directory\n * Prevents accidental deletion of the directory we're running from\n */\nfunction isCurrentWorkingDirectory(targetPath: string): boolean {\n try {\n const cwd = realpathSync(process.cwd());\n const target = realpathSync(resolve(targetPath));\n // Check if target is cwd or if cwd is inside target\n return cwd === target || cwd.startsWith(target + '/');\n } catch {\n // If we can't resolve paths, be safe and assume it might be cwd\n const cwd = process.cwd();\n const target = resolve(targetPath);\n return cwd === target || cwd.startsWith(target + '/');\n }\n}\n\n/**\n * Safely remove a directory, but never the current working directory\n */\nfunction safeRemoveDirectory(targetPath: string, rmSync: typeof import('fs').rmSync): boolean {\n if (isCurrentWorkingDirectory(targetPath)) {\n console.error(`\\n⚠️ Cannot remove ${targetPath} - it is the current working directory`);\n console.error(' Please run this command from a different directory.\\n');\n return false;\n }\n rmSync(targetPath, { recursive: true, force: true });\n return true;\n}\n\n/**\n * Normalize URL by adding protocol if missing\n */\nfunction normalizeUrl(url: string): string {\n if (!url) return url;\n if (url.match(/^https?:\\/\\//i)) return url;\n if (url.match(/^(localhost|127\\.0\\.0\\.1)(:|\\/|$)/i)) {\n return `http://${url}`;\n }\n return `https://${url}`;\n}\n\n/**\n * Get default workspace path\n */\nfunction getDefaultWorkspace(): string {\n return join(process.cwd(), 'hatchway-workspace');\n}\n\n/**\n * Get default monorepo clone path\n */\nfunction getDefaultMonorepoPath(): string {\n return join(process.cwd(), 'hatchway');\n}\n\ninterface InitOptions {\n workspace?: string;\n url?: string;\n secret?: string;\n branch?: string;\n database?: string | boolean; // Can be: undefined (neon), or a PostgreSQL connection string\n yes?: boolean;\n nonInteractive?: boolean;\n}\n\nexport async function initCommand(options: InitOptions) {\n const isNonInteractive = options.nonInteractive || options.yes;\n\n // ========================================\n // NON-INTERACTIVE MODE: Use beautiful TUI\n // ========================================\n if (isNonInteractive) {\n return initTUICommand(options);\n }\n\n // ========================================\n // INTERACTIVE MODE (Beautiful @clack/prompts)\n // ========================================\n // Handle Ctrl+C gracefully\n const handleCancel = () => {\n p.cancel('Setup cancelled');\n process.exit(0);\n };\n\n try {\n {\n // Keep banner visible - don't clear screen\n console.log(); // Just add spacing\n\n p.intro(pc.bgCyan(pc.black(' Hatchway Setup ')));\n\n // Step 1: Check if already initialized\n if (configManager.isInitialized()) {\n const shouldReset = await p.confirm({\n message: 'Configuration already exists. Reset and reconfigure?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldReset)) {\n handleCancel();\n return;\n }\n\n if (!shouldReset) {\n p.cancel('Setup cancelled');\n return;\n }\n\n configManager.reset();\n p.log.success('Configuration reset');\n }\n\n // Step 2: Check for monorepo\n const s = p.spinner();\n s.start('Checking for Hatchway repository');\n\n const repoCheck = await isInsideMonorepo();\n let monorepoPath: string | undefined;\n\n if (repoCheck.inside && repoCheck.root) {\n s.stop(pc.green('✓') + ' Found repository at: ' + pc.cyan(repoCheck.root));\n monorepoPath = repoCheck.root;\n } else {\n s.stop('Repository not found in current directory');\n\n const shouldClone = await p.confirm({\n message: 'Clone Hatchway repository?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldClone)) {\n handleCancel();\n return;\n }\n\n if (shouldClone) {\n // Check for pnpm\n const hasPnpm = await isPnpmInstalled();\n if (!hasPnpm) {\n throw new CLIError({\n code: 'DEPENDENCIES_INSTALL_FAILED',\n message: 'pnpm is not installed',\n suggestions: [\n 'Install pnpm: npm install -g pnpm',\n 'Or visit: https://pnpm.io/installation',\n ],\n });\n }\n\n const clonePath = await p.text({\n message: 'Where should the repository be cloned?',\n placeholder: getDefaultMonorepoPath(),\n defaultValue: getDefaultMonorepoPath(),\n validate: (value) => {\n if (!value) return 'Path is required';\n },\n });\n\n if (p.isCancel(clonePath)) {\n handleCancel();\n return;\n }\n\n // Check if path exists\n const defaultWorkspace = getDefaultWorkspace();\n const existingInstallation = existsSync(clonePath as string) || existsSync(defaultWorkspace);\n\n if (existingInstallation) {\n const shouldOverwrite = await p.confirm({\n message: `Existing Hatchway installation found. Replace it with fresh install?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldOverwrite)) {\n handleCancel();\n return;\n }\n\n if (shouldOverwrite) {\n s.start('Removing existing installation');\n const { rmSync } = await import('fs');\n\n // Safety check: never delete the current working directory\n if (existsSync(clonePath as string)) {\n if (!safeRemoveDirectory(clonePath as string, rmSync)) {\n s.stop(pc.red('✗') + ' Cannot remove current working directory');\n p.cancel('Please run hatchway init from a different directory');\n return;\n }\n }\n\n // Delete workspace directory\n if (existsSync(defaultWorkspace)) {\n if (!safeRemoveDirectory(defaultWorkspace, rmSync)) {\n s.stop(pc.red('✗') + ' Cannot remove current working directory');\n p.cancel('Please run hatchway init from a different directory');\n return;\n }\n }\n\n s.stop(pc.green('✓') + ' Existing installation removed');\n } else {\n p.cancel('Setup cancelled');\n return;\n }\n }\n\n // Clone, install, build\n try {\n s.start('Cloning repository from GitHub');\n monorepoPath = await cloneRepository({\n targetPath: clonePath as string,\n branch: options.branch || 'main',\n });\n s.stop(pc.green('✓') + ' Repository cloned');\n\n s.start('Installing dependencies (this may take a few minutes)');\n await installDependencies(monorepoPath);\n s.stop(pc.green('✓') + ' Dependencies installed');\n\n s.start('Building @hatchway/agent-core');\n await buildAgentCore(monorepoPath);\n s.stop(pc.green('✓') + ' Build complete');\n\n // Ask about pre-building services\n const shouldPreBuild = await p.confirm({\n message: 'Pre-build all services for production performance?',\n initialValue: true,\n });\n\n if (p.isCancel(shouldPreBuild)) {\n handleCancel();\n return;\n }\n\n if (shouldPreBuild) {\n s.start('Building all services (this may take a minute)');\n const { spawn } = await import('child_process');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoPath,\n stdio: 'pipe',\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('✓') + ' All services built for production');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Build failed (you can build later with: pnpm build:all)');\n }\n }\n } catch (error) {\n throw new CLIError({\n code: 'MONOREPO_CLONE_FAILED',\n message: 'Failed to setup repository',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n 'Check your internet connection',\n 'Verify you have git installed: git --version',\n 'Try cloning manually: git clone https://github.com/codyde/hatchway.git',\n ],\n });\n }\n } else {\n p.note(\n 'Setup will continue in runner-only mode.\\nYou can add the repository path later with:\\n hatchway config set monorepoPath <path>',\n 'Repository setup skipped'\n );\n }\n }\n\n // Step 3: Workspace configuration\n p.log.step(pc.cyan('Workspace Configuration'));\n\n const workspace = await p.text({\n message: 'Where should generated projects be stored?',\n placeholder: getDefaultWorkspace(),\n defaultValue: getDefaultWorkspace(),\n validate: (value) => {\n if (!value) return 'Workspace path is required';\n },\n });\n\n if (p.isCancel(workspace)) {\n handleCancel();\n return;\n }\n\n // Create workspace directory\n try {\n if (!existsSync(workspace as string)) {\n await mkdir(workspace as string, { recursive: true });\n }\n } catch (error) {\n throw errors.workspaceNotFound(workspace as string);\n }\n\n // Step 4: Connection configuration\n p.log.step(pc.cyan('Connection Configuration'));\n\n const wsUrl = await p.text({\n message: 'Server WebSocket URL',\n placeholder: 'ws://localhost:3000/ws/runner',\n defaultValue: 'ws://localhost:3000/ws/runner',\n });\n\n if (p.isCancel(wsUrl)) {\n handleCancel();\n return;\n }\n\n const apiUrl = await p.text({\n message: 'API base URL',\n placeholder: 'http://localhost:3000',\n defaultValue: options.url || 'http://localhost:3000',\n });\n\n if (p.isCancel(apiUrl)) {\n handleCancel();\n return;\n }\n\n // Step 5: Security\n const secret = await p.text({\n message: 'Shared secret (press Enter to generate)',\n placeholder: 'Generated automatically',\n defaultValue: options.secret || generateSecret(),\n });\n\n if (p.isCancel(secret)) {\n handleCancel();\n return;\n }\n\n const runnerId = await p.text({\n message: 'Runner ID',\n placeholder: 'local',\n defaultValue: 'local',\n });\n\n if (p.isCancel(runnerId)) {\n handleCancel();\n return;\n }\n\n // Step 6: Database setup (if monorepo available)\n let databaseUrl: string | undefined;\n\n if (monorepoPath) {\n p.log.step(pc.cyan('Database Setup'));\n\n const dbChoice = await p.select({\n message: 'Database configuration',\n options: [\n {\n value: 'neon',\n label: 'Create Neon database (recommended)',\n hint: 'Free tier, persistent storage'\n },\n {\n value: 'existing',\n label: 'Use existing PostgreSQL',\n hint: 'Provide connection string'\n },\n ],\n });\n\n if (p.isCancel(dbChoice)) {\n handleCancel();\n return;\n }\n\n if (dbChoice === 'neon') {\n p.note(\n 'Opening Neon in your browser...\\nCreate a database and paste the connection string below.',\n pc.cyan('Database Setup')\n );\n databaseUrl = await setupDatabase(monorepoPath) || undefined;\n \n // Push schema if we have a database\n if (databaseUrl) {\n s.start('Pushing database schema');\n const pushed = await pushDatabaseSchema(monorepoPath, databaseUrl);\n if (pushed) {\n s.stop(pc.green('✓') + ' Schema initialized');\n } else {\n s.stop(pc.yellow('⚠') + ' Schema push failed (you can retry later)');\n }\n }\n } else if (dbChoice === 'existing') {\n databaseUrl = await connectManualDatabase() || undefined;\n \n // Push schema if we have a database\n if (databaseUrl) {\n s.start('Pushing database schema');\n const pushed = await pushDatabaseSchema(monorepoPath, databaseUrl);\n if (pushed) {\n s.stop(pc.green('✓') + ' Schema initialized');\n } else {\n s.stop(pc.yellow('⚠') + ' Schema push failed (you can retry later)');\n }\n }\n }\n }\n\n // Step 7: Save configuration\n try {\n configManager.set('workspace', workspace);\n if (monorepoPath) {\n configManager.set('monorepoPath', monorepoPath);\n }\n if (databaseUrl) {\n configManager.set('databaseUrl', databaseUrl);\n }\n configManager.set('apiUrl', normalizeUrl(apiUrl as string));\n configManager.set('server', {\n wsUrl: wsUrl,\n secret: secret,\n });\n configManager.set('runner', {\n id: runnerId,\n reconnectAttempts: 5,\n heartbeatInterval: 15000,\n });\n configManager.set('tunnel', {\n provider: 'cloudflare',\n autoCreate: true,\n });\n } catch (error) {\n throw new CLIError({\n code: 'CONFIG_INVALID',\n message: 'Failed to save configuration',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n 'Check file permissions on config directory',\n 'Try running with sudo (not recommended)',\n ],\n });\n }\n\n // Validate\n const validation = configManager.validate();\n if (!validation.valid) {\n throw new CLIError({\n code: 'CONFIG_INVALID',\n message: 'Configuration validation failed',\n context: { errors: validation.errors },\n suggestions: validation.errors,\n });\n }\n\n // Success!\n p.outro(pc.green('✨ Hatchway is ready!'));\n\n p.note(\n `${pc.cyan('hatchway run')}\\n\\nThen open: ${pc.cyan('http://localhost:3000')}`,\n 'Next Steps'\n );\n\n return;\n }\n } catch (error) {\n // Handle cancellation gracefully\n if (error && typeof error === 'object' && 'name' in error) {\n if ((error as { name: string }).name === 'ExitPromptError' || (error as { code?: string }).code === 'CLACK_CANCEL') {\n handleCancel();\n return;\n }\n }\n\n // Re-throw for global error handler\n throw error;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import 'node:child_process';
|
|
|
17
17
|
import { c as configManager } from './config-manager-DST6RbP8.js';
|
|
18
18
|
import { i as isInsideMonorepo } from './repo-detector-36VydrlB.js';
|
|
19
19
|
import { isPnpmInstalled, cloneRepository, installDependencies, buildAgentCore } from './repo-cloner-UY3L2X7h.js';
|
|
20
|
-
import { p as pushDatabaseSchema, s as setupDatabase } from './database-setup-
|
|
20
|
+
import { p as pushDatabaseSchema, s as setupDatabase } from './database-setup-BdXiI4MV.js';
|
|
21
21
|
import { C as CLIError } from './cli-error-1drkrXNn.js';
|
|
22
22
|
import 'assert';
|
|
23
23
|
import 'events';
|
|
@@ -750,6 +750,9 @@ function sleep(ms) {
|
|
|
750
750
|
* Run the TUI-based init command
|
|
751
751
|
*/
|
|
752
752
|
async function initTUICommand(options) {
|
|
753
|
+
// Enable silent mode right before TUI renders
|
|
754
|
+
// This prevents console output from bleeding into the TUI
|
|
755
|
+
process.env.SILENT_MODE = '1';
|
|
753
756
|
// Clear screen for fullscreen experience
|
|
754
757
|
console.clear();
|
|
755
758
|
try {
|
|
@@ -774,8 +777,23 @@ async function initTUICommand(options) {
|
|
|
774
777
|
}
|
|
775
778
|
}
|
|
776
779
|
catch (error) {
|
|
777
|
-
//
|
|
778
|
-
|
|
780
|
+
// Display error if it wasn't shown in TUI
|
|
781
|
+
// CLIErrors from the init flow are shown in TUI, but errors from startCommand are not
|
|
782
|
+
console.clear();
|
|
783
|
+
if (error instanceof CLIError) {
|
|
784
|
+
console.error('\n Error: ' + error.message + '\n');
|
|
785
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
786
|
+
console.error(' Suggestions:');
|
|
787
|
+
error.suggestions.forEach((s) => console.error(' - ' + s));
|
|
788
|
+
console.error('');
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
else if (error instanceof Error) {
|
|
792
|
+
console.error('\n Error: ' + error.message + '\n');
|
|
793
|
+
}
|
|
794
|
+
else {
|
|
795
|
+
console.error('\n An unexpected error occurred\n');
|
|
796
|
+
}
|
|
779
797
|
process.exit(1);
|
|
780
798
|
}
|
|
781
799
|
}
|
|
@@ -923,13 +941,31 @@ async function executeInitFlow(options, callbacks) {
|
|
|
923
941
|
await pushDatabaseSchema(monorepoPath, databaseUrl, true); // silent mode
|
|
924
942
|
}
|
|
925
943
|
}
|
|
944
|
+
// Verify we got a database URL - it's required for the app to work
|
|
945
|
+
if (!databaseUrl) {
|
|
946
|
+
throw new Error('Database setup did not return a connection URL');
|
|
947
|
+
}
|
|
926
948
|
completeTask('database');
|
|
927
949
|
await sleep(layout.taskCompletionDelay);
|
|
928
950
|
}
|
|
929
951
|
catch (error) {
|
|
930
|
-
// Database setup is
|
|
931
|
-
|
|
932
|
-
|
|
952
|
+
// Database setup failed - this is a critical error
|
|
953
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
954
|
+
failTask('database', 'Setup failed');
|
|
955
|
+
failStep('database');
|
|
956
|
+
setError('Database setup failed', [
|
|
957
|
+
errorMessage,
|
|
958
|
+
'',
|
|
959
|
+
'You can provide your own database:',
|
|
960
|
+
' hatchway init --database postgres://...',
|
|
961
|
+
'',
|
|
962
|
+
'Or set it manually later:',
|
|
963
|
+
' hatchway config set databaseUrl postgres://...',
|
|
964
|
+
]);
|
|
965
|
+
throw new CLIError({
|
|
966
|
+
code: 'DB_CONNECTION_FAILED',
|
|
967
|
+
message: 'Failed to setup database: ' + errorMessage,
|
|
968
|
+
});
|
|
933
969
|
}
|
|
934
970
|
completeStep('database');
|
|
935
971
|
await sleep(layout.stepTransitionDelay);
|
|
@@ -1128,4 +1164,4 @@ async function executeInitFlow(options, callbacks) {
|
|
|
1128
1164
|
}
|
|
1129
1165
|
|
|
1130
1166
|
export { initTUICommand };
|
|
1131
|
-
//# sourceMappingURL=init-tui-
|
|
1167
|
+
//# sourceMappingURL=init-tui-m2supRiJ.js.map
|