@openbuilder/cli 0.50.21 → 0.50.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -943
- package/dist/chunks/{auto-update-Cr7SnKwX.js → auto-update-Dq2PFvjt.js} +12 -46
- package/dist/chunks/auto-update-Dq2PFvjt.js.map +1 -0
- package/dist/chunks/{cli-auth-rqwB_Zwt.js → cli-auth-ChCnxlFl.js} +2 -2
- package/dist/chunks/cli-auth-ChCnxlFl.js.map +1 -0
- package/dist/chunks/{init-DDtrxZ0M.js → init-BsQ3dhwf.js} +3 -2
- package/dist/chunks/{init-DDtrxZ0M.js.map → init-BsQ3dhwf.js.map} +1 -1
- package/dist/chunks/{init-tui-tZtLISA4.js → init-tui-Dvk6Ndvl.js} +5 -4
- package/dist/chunks/{init-tui-tZtLISA4.js.map → init-tui-Dvk6Ndvl.js.map} +1 -1
- package/dist/chunks/{login-DFgTXEGt.js → login-BhtodVsj.js} +2 -2
- package/dist/chunks/{login-DFgTXEGt.js.map → login-BhtodVsj.js.map} +1 -1
- package/dist/chunks/{logout-DwddishT.js → logout-CDDASeuQ.js} +2 -2
- package/dist/chunks/{logout-DwddishT.js.map → logout-CDDASeuQ.js.map} +1 -1
- package/dist/chunks/{main-tui-BrfgfCDw.js → main-tui-C-BqvY5r.js} +6 -5
- package/dist/chunks/{main-tui-BrfgfCDw.js.map → main-tui-C-BqvY5r.js.map} +1 -1
- package/dist/chunks/{run-LjsGm3tI.js → run-BbtmU1EJ.js} +26 -3
- package/dist/chunks/run-BbtmU1EJ.js.map +1 -0
- package/dist/cli/index.js +7 -7
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
- package/dist/chunks/auto-update-Cr7SnKwX.js.map +0 -1
- package/dist/chunks/cli-auth-rqwB_Zwt.js.map +0 -1
- package/dist/chunks/run-LjsGm3tI.js.map +0 -1
|
@@ -153,40 +153,6 @@ function performAppUpgrade() {
|
|
|
153
153
|
return false;
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
|
-
/**
|
|
157
|
-
* Re-launch the CLI with original arguments after update
|
|
158
|
-
*/
|
|
159
|
-
function relaunchCLI() {
|
|
160
|
-
const args = process.argv.slice(2);
|
|
161
|
-
try {
|
|
162
|
-
// Get the actual path to openbuilder to avoid shell hash caching issues
|
|
163
|
-
// This ensures we run the newly installed version, not a cached path
|
|
164
|
-
let openbuilderPath = 'openbuilder';
|
|
165
|
-
try {
|
|
166
|
-
// Use 'command -v' to get the actual path, bypassing shell hash
|
|
167
|
-
openbuilderPath = execSync('command -v openbuilder', { encoding: 'utf-8' }).trim();
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
// Fallback to just 'openbuilder' if command -v fails
|
|
171
|
-
}
|
|
172
|
-
// Use spawnSync with the explicit path to ensure we get the new version
|
|
173
|
-
const result = spawnSync(openbuilderPath, args, {
|
|
174
|
-
stdio: 'inherit',
|
|
175
|
-
env: {
|
|
176
|
-
...process.env,
|
|
177
|
-
OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Prevent update loop
|
|
178
|
-
OPENBUILDER_SKIP_BANNER: '1', // Suppress banner after restart (already shown before update)
|
|
179
|
-
},
|
|
180
|
-
// Don't use shell: true to avoid shell hash caching
|
|
181
|
-
});
|
|
182
|
-
// Exit with the same code as the relaunched process
|
|
183
|
-
process.exit(result.status ?? 0);
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
// If relaunch fails, just exit - user can run command again
|
|
187
|
-
process.exit(0);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
156
|
/**
|
|
191
157
|
* Main auto-update check function
|
|
192
158
|
* Call this early in CLI startup
|
|
@@ -259,8 +225,8 @@ async function checkAndAutoUpdate(currentVersion) {
|
|
|
259
225
|
console.log();
|
|
260
226
|
console.log(` ${pc.cyan('⬆')} ${pc.bold('Update available:')} ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);
|
|
261
227
|
console.log();
|
|
262
|
-
//
|
|
263
|
-
console.log(` ${pc.dim('
|
|
228
|
+
// Perform the CLI update
|
|
229
|
+
console.log(` ${pc.dim('Updating CLI...')}`);
|
|
264
230
|
const cliSuccess = performCLIUpdate();
|
|
265
231
|
if (!cliSuccess) {
|
|
266
232
|
// CLI update failed, continue with current version
|
|
@@ -271,28 +237,28 @@ async function checkAndAutoUpdate(currentVersion) {
|
|
|
271
237
|
return false;
|
|
272
238
|
}
|
|
273
239
|
console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);
|
|
274
|
-
//
|
|
240
|
+
// Check if we need to upgrade the app
|
|
275
241
|
const monorepoPath = config.monorepoPath;
|
|
276
242
|
const hasMonorepo = monorepoPath && existsSync(monorepoPath);
|
|
277
243
|
if (hasMonorepo) {
|
|
278
244
|
// Mark that we need to upgrade the app after CLI restart
|
|
279
|
-
// The new CLI version will handle the app upgrade
|
|
280
245
|
saveUpdateCache({
|
|
281
246
|
lastCheck: now,
|
|
282
247
|
latestVersion,
|
|
283
248
|
pendingAppUpgrade: true,
|
|
284
249
|
});
|
|
285
|
-
console.log();
|
|
286
|
-
console.log(` ${pc.dim('Step 2/2:')} App upgrade will continue after restart...`);
|
|
287
250
|
}
|
|
288
251
|
console.log();
|
|
289
|
-
console.log(` ${pc.green('✓')} ${pc.bold('
|
|
252
|
+
console.log(` ${pc.green('✓')} ${pc.bold('Update complete!')}`);
|
|
253
|
+
console.log();
|
|
254
|
+
console.log(` ${pc.yellow('⚠')} ${pc.bold('Please restart your terminal')} or run:`);
|
|
255
|
+
console.log(` ${pc.cyan('hash -r')} ${pc.dim('(bash/zsh)')}`);
|
|
256
|
+
console.log();
|
|
257
|
+
console.log(` ${pc.dim('Then run')} ${pc.cyan('openbuilder')} ${pc.dim('again.')}`);
|
|
290
258
|
console.log();
|
|
291
|
-
//
|
|
292
|
-
|
|
293
|
-
relaunchCLI();
|
|
294
|
-
return true; // CLI will exit via relaunchCLI
|
|
259
|
+
// Exit - user needs to restart terminal to pick up new version
|
|
260
|
+
process.exit(0);
|
|
295
261
|
}
|
|
296
262
|
|
|
297
263
|
export { checkAndAutoUpdate };
|
|
298
|
-
//# sourceMappingURL=auto-update-
|
|
264
|
+
//# sourceMappingURL=auto-update-Dq2PFvjt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update-Dq2PFvjt.js","sources":["../../src/cli/utils/auto-update.ts"],"sourcesContent":["/**\n * Auto-update utility for OpenBuilder CLI\n * \n * Checks GitHub Releases for newer versions and automatically\n * updates both:\n * 1. The CLI itself (globally installed npm package)\n * 2. The app/monorepo (local installation that runs the web app)\n */\n\nimport { execSync, spawnSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport pc from 'picocolors';\nimport { configManager } from './config-manager.js';\n\n// GitHub API endpoint for releases\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';\n\n// Install command for CLI\nconst INSTALL_COMMAND = 'curl -fsSL https://openbuilder.sh/install | bash';\n\n// Cache settings\nconst CACHE_DIR = join(homedir(), '.config', 'openbuilder');\nconst CACHE_FILE = join(CACHE_DIR, 'update-cache.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string;\n // Track if we need to upgrade the app after CLI update\n pendingAppUpgrade?: boolean;\n}\n\n/**\n * Read the update cache file\n */\nfunction readUpdateCache(): UpdateCache | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const content = readFileSync(CACHE_FILE, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Cache read failed, that's fine\n }\n return null;\n}\n\n/**\n * Write to the update cache file\n */\nfunction saveUpdateCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Cache write failed, that's fine\n }\n}\n\n/**\n * Fetch the latest release version from GitHub\n * Returns version string (e.g., \"0.28.0\") or null on failure\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n const response = await fetch(GITHUB_RELEASES_URL, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'OpenBuilder-CLI-AutoUpdate',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { tag_name: string };\n // Remove 'v' prefix if present (e.g., \"v0.28.0\" -> \"0.28.0\")\n return data.tag_name.replace(/^v/, '');\n } catch {\n // Network error, timeout, or parse error\n return null;\n }\n}\n\n/**\n * Compare two semver versions\n * Returns true if version1 < version2 (i.e., version2 is newer)\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parseVersion = (v: string) => {\n const parts = v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };\n };\n\n const c = parseVersion(current);\n const l = parseVersion(latest);\n\n if (l.major > c.major) return true;\n if (l.major < c.major) return false;\n if (l.minor > c.minor) return true;\n if (l.minor < c.minor) return false;\n return l.patch > c.patch;\n}\n\n/**\n * Perform the CLI update by running the install script\n */\nfunction performCLIUpdate(): boolean {\n try {\n // Run the install command with quiet mode to avoid banner spam\n execSync(INSTALL_COMMAND, {\n stdio: 'inherit',\n shell: '/bin/bash',\n env: {\n ...process.env,\n OPENBUILDER_QUIET_INSTALL: '1', // Suppress banner in installer\n },\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the app/monorepo needs upgrading and perform the upgrade\n * This updates the local OpenBuilder installation that runs the web app\n */\nfunction performAppUpgrade(): boolean {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n\n // No monorepo configured, skip app upgrade\n if (!monorepoPath || !existsSync(monorepoPath)) {\n return true; // Not an error, just nothing to upgrade\n }\n\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Upgrading app installation...')}`);\n console.log(` ${pc.dim(monorepoPath)}`);\n console.log();\n\n try {\n // Run openbuilder upgrade --force to upgrade the monorepo\n // Use --force to skip prompts since we're in auto-update mode\n const result = spawnSync('openbuilder', ['upgrade', '--force'], {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Don't re-check for CLI updates\n },\n shell: true,\n });\n\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Re-launch the CLI with original arguments after update\n */\nfunction relaunchCLI(): void {\n const args = process.argv.slice(2);\n \n try {\n // Get the actual path to openbuilder to avoid shell hash caching issues\n // This ensures we run the newly installed version, not a cached path\n let openbuilderPath = 'openbuilder';\n try {\n // Use 'command -v' to get the actual path, bypassing shell hash\n openbuilderPath = execSync('command -v openbuilder', { encoding: 'utf-8' }).trim();\n } catch {\n // Fallback to just 'openbuilder' if command -v fails\n }\n \n // Use spawnSync with the explicit path to ensure we get the new version\n const result = spawnSync(openbuilderPath, args, {\n stdio: 'inherit',\n env: { \n ...process.env, \n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Prevent update loop\n OPENBUILDER_SKIP_BANNER: '1', // Suppress banner after restart (already shown before update)\n },\n // Don't use shell: true to avoid shell hash caching\n });\n \n // Exit with the same code as the relaunched process\n process.exit(result.status ?? 0);\n } catch {\n // If relaunch fails, just exit - user can run command again\n process.exit(0);\n }\n}\n\n/**\n * Main auto-update check function\n * Call this early in CLI startup\n * \n * Updates both:\n * 1. The CLI itself (globally installed)\n * 2. The app/monorepo (if configured)\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns true if update was performed and CLI should exit\n */\nexport async function checkAndAutoUpdate(currentVersion: string): Promise<boolean> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n // But check if we have a pending app upgrade from a previous CLI update\n const cache = readUpdateCache();\n if (cache?.pendingAppUpgrade) {\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Completing app upgrade...')}`);\n \n const appSuccess = performAppUpgrade();\n \n if (appSuccess) {\n // Clear the pending flag\n saveUpdateCache({ ...cache, pendingAppUpgrade: false });\n console.log(` ${pc.green('✓')} ${pc.bold('App upgrade complete!')}`);\n } else {\n console.log(` ${pc.yellow('⚠')} ${pc.dim('App upgrade failed. Run manually:')} ${pc.cyan('openbuilder upgrade')}`);\n }\n console.log();\n }\n return false;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return false;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, skip update\n if (!latestVersion) {\n return false;\n }\n\n // Check if update is needed\n if (!isNewerVersion(currentVersion, latestVersion)) {\n return false;\n }\n\n // Update available! Show message and perform update\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Update available:')} ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);\n console.log();\n\n // Perform the CLI update\n console.log(` ${pc.dim('Updating CLI...')}`);\n const cliSuccess = performCLIUpdate();\n\n if (!cliSuccess) {\n // CLI update failed, continue with current version\n console.log();\n console.log(` ${pc.yellow('⚠')} ${pc.dim('CLI update failed. Continuing with current version.')}`);\n console.log(` ${pc.dim('You can manually update with:')} ${pc.cyan('curl -fsSL https://openbuilder.sh/install | bash')}`);\n console.log();\n return false;\n }\n\n console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);\n \n // Check if we need to upgrade the app\n const monorepoPath = config.monorepoPath;\n const hasMonorepo = monorepoPath && existsSync(monorepoPath);\n\n if (hasMonorepo) {\n // Mark that we need to upgrade the app after CLI restart\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: true,\n });\n }\n\n console.log();\n console.log(` ${pc.green('✓')} ${pc.bold('Update complete!')}`);\n console.log();\n console.log(` ${pc.yellow('⚠')} ${pc.bold('Please restart your terminal')} or run:`);\n console.log(` ${pc.cyan('hash -r')} ${pc.dim('(bash/zsh)')}`);\n console.log();\n console.log(` ${pc.dim('Then run')} ${pc.cyan('openbuilder')} ${pc.dim('again.')}`);\n console.log();\n \n // Exit - user needs to restart terminal to pick up new version\n process.exit(0);\n}\n\n/**\n * Check for updates without auto-updating (for TUI modes)\n * Returns version info that can be displayed in the TUI\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns Update info or null if no update available\n */\nexport async function checkForUpdate(currentVersion: string): Promise<{\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n} | null> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n return null;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return null;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: cache?.pendingAppUpgrade,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, return null\n if (!latestVersion) {\n return null;\n }\n\n const updateAvailable = isNewerVersion(currentVersion, latestVersion);\n \n return {\n currentVersion,\n latestVersion,\n updateAvailable,\n };\n}\n\n/**\n * Clear the update cache (useful for testing or forcing a fresh check)\n */\nexport function clearUpdateCache(): void {\n try {\n if (existsSync(CACHE_FILE)) {\n unlinkSync(CACHE_FILE);\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Get the current update status (for debugging/status commands)\n */\nexport function getUpdateStatus(): { \n cacheFile: string;\n cache: UpdateCache | null;\n monorepoPath: string | undefined;\n hasMonorepo: boolean;\n} {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n \n return {\n cacheFile: CACHE_FILE,\n cache: readUpdateCache(),\n monorepoPath,\n hasMonorepo: !!(monorepoPath && existsSync(monorepoPath)),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -336,5 +336,5 @@ function clearToken() {
|
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
|
|
339
|
-
export { clearToken as c, getStoredToken as g, hasStoredToken as h, performOAuthLogin as p, storeToken as s };
|
|
340
|
-
//# sourceMappingURL=cli-auth-
|
|
339
|
+
export { clearToken as c, getStoredToken as g, hasStoredToken as h, openBrowser as o, performOAuthLogin as p, storeToken as s };
|
|
340
|
+
//# sourceMappingURL=cli-auth-ChCnxlFl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-auth-ChCnxlFl.js","sources":["../../src/cli/utils/cli-auth.ts"],"sourcesContent":["import http from 'node:http';\nimport { URL } from 'node:url';\nimport { hostname, platform } from 'node:os';\nimport { exec } from 'node:child_process';\nimport chalk from 'chalk';\nimport { configManager } from './config-manager.js';\n\n/**\n * Open a URL in the default browser (cross-platform)\n */\nexport async function openBrowser(url: string): Promise<void> {\n const os = platform();\n \n return new Promise((resolve, reject) => {\n let command: string;\n \n switch (os) {\n case 'darwin':\n command = `open \"${url}\"`;\n break;\n case 'win32':\n command = `start \"\" \"${url}\"`;\n break;\n default: // Linux and others\n command = `xdg-open \"${url}\"`;\n }\n \n exec(command, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\ninterface AuthResult {\n success: boolean;\n token?: string;\n error?: string;\n}\n\ninterface CLIAuthOptions {\n apiUrl?: string;\n deviceName?: string;\n silent?: boolean;\n}\n\n/**\n * Find an available port for the callback server\n */\nasync function findAvailablePort(startPort: number = 9876, endPort: number = 9999): Promise<number> {\n for (let port = startPort; port <= endPort; port++) {\n const isAvailable = await new Promise<boolean>((resolve) => {\n const server = http.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n \n if (isAvailable) {\n return port;\n }\n }\n \n throw new Error('No available ports found for OAuth callback server');\n}\n\n/**\n * Get a device name for the runner key\n */\nfunction getDeviceName(): string {\n const host = hostname();\n const date = new Date().toLocaleDateString();\n return `CLI - ${host} - ${date}`;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(port: number): Promise<AuthResult> {\n return new Promise((resolve) => {\n // Track active connections so we can forcefully close them\n const connections = new Set<import('net').Socket>();\n \n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n \n if (url.pathname === '/callback') {\n const token = url.searchParams.get('token');\n const status = url.searchParams.get('status');\n const error = url.searchParams.get('error');\n \n // Send response to browser\n res.writeHead(200, { 'Content-Type': 'text/html' });\n \n if (status === 'success' && token) {\n res.end(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Authentication Successful</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #09090b;\n color: white;\n }\n .container {\n text-align: center;\n padding: 40px;\n }\n .success {\n color: #22c55e;\n font-size: 48px;\n margin-bottom: 20px;\n }\n h1 { margin: 0 0 10px; }\n p { color: #a1a1aa; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"success\">✓</div>\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n \n // Close server and resolve - destroy all connections to ensure clean exit\n server.close();\n connections.forEach(conn => conn.destroy());\n resolve({ success: true, token });\n } else {\n res.end(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Authentication Failed</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #09090b;\n color: white;\n }\n .container {\n text-align: center;\n padding: 40px;\n }\n .error {\n color: #ef4444;\n font-size: 48px;\n margin-bottom: 20px;\n }\n h1 { margin: 0 0 10px; }\n p { color: #a1a1aa; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"error\">✗</div>\n <h1>Authentication Failed</h1>\n <p>${error || 'An error occurred during authentication.'}</p>\n <p>Please close this window and try again.</p>\n </div>\n </body>\n </html>\n `);\n \n server.close();\n connections.forEach(conn => conn.destroy());\n resolve({ success: false, error: error || 'Authentication failed' });\n }\n } else {\n // Handle other paths\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n }\n });\n \n // Timeout after 5 minutes\n const timeout = setTimeout(() => {\n server.close();\n connections.forEach(conn => conn.destroy());\n resolve({ success: false, error: 'Authentication timed out' });\n }, 5 * 60 * 1000);\n \n server.on('close', () => {\n clearTimeout(timeout);\n });\n \n // Handle server errors (e.g., port became unavailable due to race condition)\n server.on('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n if (err.code === 'EADDRINUSE') {\n resolve({ success: false, error: `Port ${port} is no longer available. Please try again.` });\n } else {\n resolve({ success: false, error: `Server error: ${err.message}` });\n }\n });\n \n // Track connections for cleanup\n server.on('connection', (conn) => {\n connections.add(conn);\n conn.on('close', () => connections.delete(conn));\n });\n \n server.listen(port, '127.0.0.1');\n });\n}\n\n/**\n * Perform CLI OAuth authentication flow\n * \n * 1. Find an available port\n * 2. Start local callback server\n * 3. Request auth session from API\n * 4. Open browser to auth page\n * 5. Wait for callback\n * 6. Return token\n */\nexport async function performOAuthLogin(options: CLIAuthOptions = {}): Promise<AuthResult> {\n const apiUrl = options.apiUrl || 'https://openbuilder.sh';\n const deviceName = options.deviceName || getDeviceName();\n const silent = options.silent || false;\n \n try {\n // Find available port\n if (!silent) {\n console.log(chalk.dim('Finding available port for callback...'));\n }\n const port = await findAvailablePort();\n \n // Start callback server before requesting auth (so it's ready when browser redirects)\n const callbackPromise = startCallbackServer(port);\n \n // Request auth session from API\n if (!silent) {\n console.log(chalk.dim('Initiating authentication...'));\n }\n \n const response = await fetch(`${apiUrl}/api/auth/cli/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n callbackPort: port,\n callbackHost: 'localhost',\n deviceName,\n }),\n });\n \n if (!response.ok) {\n const data = await response.json();\n return { success: false, error: data.error || 'Failed to start authentication' };\n }\n \n const { authUrl } = await response.json();\n \n // Open browser\n if (!silent) {\n console.log('');\n console.log(chalk.cyan('Opening browser for authentication...'));\n console.log(chalk.dim(`If the browser doesn't open, visit:`));\n console.log(chalk.underline(authUrl));\n console.log('');\n }\n \n try {\n await openBrowser(authUrl);\n } catch {\n // Browser failed to open - user will need to copy/paste URL\n if (!silent) {\n console.log(chalk.yellow('Could not open browser automatically.'));\n }\n }\n \n if (!silent) {\n console.log(chalk.yellow('Waiting for authentication...'));\n console.log(chalk.dim('(Press Ctrl+C to cancel)'));\n }\n \n // Wait for callback\n const result = await callbackPromise;\n \n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Authentication failed',\n };\n }\n}\n\n/**\n * Check if we have a valid stored token\n */\nexport function hasStoredToken(): boolean {\n const token = getStoredToken();\n return token !== null && token.startsWith('sv_');\n}\n\n/**\n * Get the stored runner token\n */\nexport function getStoredToken(): string | null {\n const config = configManager.get();\n \n // Check for runner token in config\n if (config.server?.secret && config.server.secret.startsWith('sv_')) {\n return config.server.secret;\n }\n \n // Legacy: check broker config\n if (config.broker?.secret && config.broker.secret.startsWith('sv_')) {\n return config.broker.secret;\n }\n \n return null;\n}\n\n/**\n * Store the runner token in config\n */\nexport function storeToken(token: string, apiUrl?: string): void {\n // Determine the WebSocket URL from the API URL\n let wsUrl = 'wss://openbuilder.sh/ws/runner';\n if (apiUrl) {\n const url = new URL(apiUrl);\n const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n wsUrl = `${protocol}//${url.host}/ws/runner`;\n }\n \n // Store in the server config\n configManager.set('server', {\n wsUrl,\n secret: token,\n });\n \n // Also set the apiUrl if provided\n if (apiUrl) {\n configManager.set('apiUrl', apiUrl);\n }\n}\n\n/**\n * Clear the stored token\n */\nexport function clearToken(): void {\n const config = configManager.get();\n \n // Clear server secret\n if (config.server) {\n configManager.set('server', {\n ...config.server,\n secret: '',\n });\n }\n \n // Clear legacy broker secret\n if (config.broker) {\n configManager.set('broker', {\n ...config.broker,\n secret: '',\n });\n }\n}\n\n/**\n * Validate the stored token against the server\n */\nexport async function validateToken(token: string, apiUrl: string): Promise<boolean> {\n try {\n // Try to fetch user's runner keys - this will fail if token is invalid\n const response = await fetch(`${apiUrl}/api/runner-keys`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n \n return response.ok;\n } catch {\n return false;\n }\n}\n"],"names":["http"],"mappings":";;;;;;;;AAOA;;AAEG;AACI,eAAe,WAAW,CAAC,GAAW,EAAA;AAC3C,IAAA,MAAM,EAAE,GAAG,QAAQ,EAAE;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,IAAI,OAAe;QAEnB,QAAQ,EAAE;AACR,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,CAAG;gBACzB;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,GAAG,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,CAAG;gBAC7B;AACF,YAAA;AACE,gBAAA,OAAO,GAAG,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,CAAG;;AAGjC,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YACtB,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,KAAK,CAAC;YACf;iBAAO;AACL,gBAAA,OAAO,EAAE;YACX;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACJ;AAcA;;AAEG;AACH,eAAe,iBAAiB,CAAC,YAAoB,IAAI,EAAE,UAAkB,IAAI,EAAA;AAC/E,IAAA,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE;QAClD,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;AACzD,YAAA,MAAM,MAAM,GAAGA,aAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAK;gBAC5B,MAAM,CAAC,KAAK,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC;AACf,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;AAClC,QAAA,CAAC,CAAC;QAEF,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC;AACvE;AAEA;;AAEG;AACH,SAAS,aAAa,GAAA;AACpB,IAAA,MAAM,IAAI,GAAG,QAAQ,EAAE;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE;AAC5C,IAAA,OAAO,CAAA,MAAA,EAAS,IAAI,CAAA,GAAA,EAAM,IAAI,EAAE;AAClC;AAEA;;AAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAA;AACvC,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;;AAE7B,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwB;QAEnD,MAAM,MAAM,GAAGA,aAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAC5C,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAC;AAE/D,YAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE;gBAChC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;;gBAG3C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAEnD,gBAAA,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,EAAE;oBACjC,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCP,UAAA,CAAA,CAAC;;oBAGF,MAAM,CAAC,KAAK,EAAE;AACd,oBAAA,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC3C,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBACnC;qBAAO;oBACL,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCK,qBAAA,EAAA,KAAK,IAAI,0CAA0C,CAAA;;;;;AAK/D,UAAA,CAAA,CAAC;oBAEF,MAAM,CAAC,KAAK,EAAE;AACd,oBAAA,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AAC3C,oBAAA,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,uBAAuB,EAAE,CAAC;gBACtE;YACF;iBAAO;;gBAEL,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AACpD,gBAAA,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;YACtB;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAK;YAC9B,MAAM,CAAC,KAAK,EAAE;AACd,YAAA,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;AAChE,QAAA,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjB,QAAA,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAK;YACtB,YAAY,CAAC,OAAO,CAAC;AACvB,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,KAAI;YAChD,YAAY,CAAC,OAAO,CAAC;AACrB,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;AAC7B,gBAAA,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA,KAAA,EAAQ,IAAI,CAAA,0CAAA,CAA4C,EAAE,CAAC;YAC9F;iBAAO;AACL,gBAAA,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA,cAAA,EAAiB,GAAG,CAAC,OAAO,CAAA,CAAE,EAAE,CAAC;YACpE;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,KAAI;AAC/B,YAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClD,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;AAClC,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;;;;AASG;AACI,eAAe,iBAAiB,CAAC,UAA0B,EAAE,EAAA;AAClE,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,wBAAwB;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,aAAa,EAAE;AACxD,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK;AAEtC,IAAA,IAAI;;QAEF,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAClE;AACA,QAAA,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE;;AAGtC,QAAA,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAAC;;QAGjD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACxD;QAEA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,EAAG,MAAM,qBAAqB,EAAE;AAC3D,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnB,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,YAAY,EAAE,WAAW;gBACzB,UAAU;aACX,CAAC;AACH,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AAClC,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gCAAgC,EAAE;QAClF;QAEA,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;QAGzC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,mCAAA,CAAqC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACrC,YAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjB;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,WAAW,CAAC,OAAO,CAAC;QAC5B;AAAE,QAAA,MAAM;;YAEN,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;YACpE;QACF;QAEA,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACpD;;AAGA,QAAA,MAAM,MAAM,GAAG,MAAM,eAAe;AAEpC,QAAA,OAAO,MAAM;IACf;IAAE,OAAO,KAAK,EAAE;QACd,OAAO;AACL,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,uBAAuB;SACxE;IACH;AACF;AAEA;;AAEG;SACa,cAAc,GAAA;AAC5B,IAAA,MAAM,KAAK,GAAG,cAAc,EAAE;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;AAClD;AAEA;;AAEG;SACa,cAAc,GAAA;AAC5B,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE;;AAGlC,IAAA,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACnE,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM;IAC7B;;AAGA,IAAA,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACnE,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM;IAC7B;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACG,SAAU,UAAU,CAAC,KAAa,EAAE,MAAe,EAAA;;IAEvD,IAAI,KAAK,GAAG,gCAAgC;IAC5C,IAAI,MAAM,EAAE;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;AAC3B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK;QAC3D,KAAK,GAAG,GAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAC,IAAI,YAAY;IAC9C;;AAGA,IAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;QAC1B,KAAK;AACL,QAAA,MAAM,EAAE,KAAK;AACd,KAAA,CAAC;;IAGF,IAAI,MAAM,EAAE;AACV,QAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACrC;AACF;AAEA;;AAEG;SACa,UAAU,GAAA;AACxB,IAAA,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE;;AAGlC,IAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,QAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC1B,GAAG,MAAM,CAAC,MAAM;AAChB,YAAA,MAAM,EAAE,EAAE;AACX,SAAA,CAAC;IACJ;;AAGA,IAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,QAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC1B,GAAG,MAAM,CAAC,MAAM;AAChB,YAAA,MAAM,EAAE,EAAE;AACX,SAAA,CAAC;IACJ;AACF;;;;"}
|
|
@@ -10,7 +10,7 @@ import { i as isInsideMonorepo } from './repo-detector-B_oj696o.js';
|
|
|
10
10
|
import { isPnpmInstalled, cloneRepository, installDependencies, buildAgentCore } from './repo-cloner-CpOQjFSo.js';
|
|
11
11
|
import { s as setupDatabase, p as pushDatabaseSchema, c as connectManualDatabase } from './database-setup-BYjIRAmT.js';
|
|
12
12
|
import { C as CLIError, e as errors } from './cli-error-BjQwvWtK.js';
|
|
13
|
-
import { initTUICommand } from './init-tui-
|
|
13
|
+
import { initTUICommand } from './init-tui-Dvk6Ndvl.js';
|
|
14
14
|
import 'conf';
|
|
15
15
|
import 'node:os';
|
|
16
16
|
import 'node:child_process';
|
|
@@ -32,6 +32,7 @@ import 'node:buffer';
|
|
|
32
32
|
import './use-app-Cj2bzWaw.js';
|
|
33
33
|
import './Banner-BlktOjfl.js';
|
|
34
34
|
import 'node:url';
|
|
35
|
+
import 'node:http';
|
|
35
36
|
|
|
36
37
|
/**
|
|
37
38
|
* Enhanced init command with @clack/prompts and friction-free -y mode
|
|
@@ -469,4 +470,4 @@ async function initCommand(options) {
|
|
|
469
470
|
}
|
|
470
471
|
|
|
471
472
|
export { initCommand };
|
|
472
|
-
//# sourceMappingURL=init-
|
|
473
|
+
//# sourceMappingURL=init-BsQ3dhwf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-DDtrxZ0M.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(), 'openbuilder-workspace');\n}\n\n/**\n * Get default monorepo clone path\n */\nfunction getDefaultMonorepoPath(): string {\n return join(process.cwd(), 'openbuilder');\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(' OpenBuilder 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 OpenBuilder 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 OpenBuilder 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 OpenBuilder 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 openbuilder 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 openbuilder 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 @openbuilder/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/openbuilder.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 openbuilder 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('✨ OpenBuilder is ready!'));\n\n p.note(\n `${pc.cyan('openbuilder 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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"}
|
|
1
|
+
{"version":3,"file":"init-BsQ3dhwf.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(), 'openbuilder-workspace');\n}\n\n/**\n * Get default monorepo clone path\n */\nfunction getDefaultMonorepoPath(): string {\n return join(process.cwd(), 'openbuilder');\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(' OpenBuilder 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 OpenBuilder 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 OpenBuilder 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 OpenBuilder 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 openbuilder 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 openbuilder 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 @openbuilder/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/openbuilder.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 openbuilder 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('✨ OpenBuilder is ready!'));\n\n p.note(\n `${pc.cyan('openbuilder 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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"}
|
|
@@ -10,6 +10,10 @@ import 'node:process';
|
|
|
10
10
|
import 'node:events';
|
|
11
11
|
import { u as useApp } from './use-app-Cj2bzWaw.js';
|
|
12
12
|
import { g as getVersionInfo, B as Banner } from './Banner-BlktOjfl.js';
|
|
13
|
+
import 'node:http';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:os';
|
|
16
|
+
import 'node:child_process';
|
|
13
17
|
import { c as configManager } from './config-manager-BkbjtN-H.js';
|
|
14
18
|
import { i as isInsideMonorepo } from './repo-detector-B_oj696o.js';
|
|
15
19
|
import { isPnpmInstalled, cloneRepository, installDependencies, buildAgentCore } from './repo-cloner-CpOQjFSo.js';
|
|
@@ -18,11 +22,8 @@ import { C as CLIError } from './cli-error-BjQwvWtK.js';
|
|
|
18
22
|
import './_commonjsHelpers-h-Bqc03Z.js';
|
|
19
23
|
import 'assert';
|
|
20
24
|
import 'events';
|
|
21
|
-
import 'node:os';
|
|
22
25
|
import 'module';
|
|
23
26
|
import 'node:buffer';
|
|
24
|
-
import 'node:child_process';
|
|
25
|
-
import 'node:url';
|
|
26
27
|
import 'conf';
|
|
27
28
|
import './logger-ZpJi7chw.js';
|
|
28
29
|
import './spinner-BJL9zWAJ.js';
|
|
@@ -1128,4 +1129,4 @@ async function executeInitFlow(options, callbacks) {
|
|
|
1128
1129
|
}
|
|
1129
1130
|
|
|
1130
1131
|
export { initTUICommand };
|
|
1131
|
-
//# sourceMappingURL=init-tui-
|
|
1132
|
+
//# sourceMappingURL=init-tui-Dvk6Ndvl.js.map
|