@openbuilder/cli 0.50.2 → 0.50.9

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.
@@ -1,6 +1,6 @@
1
1
  // OpenBuilder CLI - Built with Rollup
2
2
  import { existsSync, readFileSync, rmSync, writeFileSync, renameSync } from 'node:fs';
3
- import { join, dirname } from 'node:path';
3
+ import { dirname, join } from 'node:path';
4
4
  import { execSync } from 'node:child_process';
5
5
  import * as p from '@clack/prompts';
6
6
  import pc from 'picocolors';
@@ -13,12 +13,130 @@ import 'node:os';
13
13
 
14
14
  /**
15
15
  * Upgrade command - In-place upgrade to latest version
16
- * Preserves configuration and user data while replacing application code
16
+ *
17
+ * This command upgrades both:
18
+ * 1. The CLI itself (globally installed npm package)
19
+ * 2. The app/monorepo (local installation that runs the web app)
17
20
  */
21
+ // GitHub API endpoint for releases
22
+ const GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';
23
+ // Install command for CLI
24
+ const INSTALL_COMMAND = 'curl -fsSL https://openbuilder.app/install | bash';
25
+ /**
26
+ * Fetch the latest release version from GitHub
27
+ */
28
+ async function fetchLatestVersion() {
29
+ try {
30
+ const controller = new AbortController();
31
+ const timeout = setTimeout(() => controller.abort(), 5000);
32
+ const response = await fetch(GITHUB_RELEASES_URL, {
33
+ headers: {
34
+ 'Accept': 'application/vnd.github.v3+json',
35
+ 'User-Agent': 'OpenBuilder-CLI-Upgrade',
36
+ },
37
+ signal: controller.signal,
38
+ });
39
+ clearTimeout(timeout);
40
+ if (!response.ok) {
41
+ return null;
42
+ }
43
+ const data = await response.json();
44
+ return data.tag_name.replace(/^v/, '');
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Compare two semver versions
52
+ * Returns true if version1 < version2 (i.e., version2 is newer)
53
+ */
54
+ function isNewerVersion(current, latest) {
55
+ const parseVersion = (v) => {
56
+ const parts = v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);
57
+ return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };
58
+ };
59
+ const c = parseVersion(current);
60
+ const l = parseVersion(latest);
61
+ if (l.major > c.major)
62
+ return true;
63
+ if (l.major < c.major)
64
+ return false;
65
+ if (l.minor > c.minor)
66
+ return true;
67
+ if (l.minor < c.minor)
68
+ return false;
69
+ return l.patch > c.patch;
70
+ }
71
+ /**
72
+ * Perform the CLI update by running the install script
73
+ */
74
+ function performCLIUpdate() {
75
+ try {
76
+ execSync(INSTALL_COMMAND, {
77
+ stdio: 'inherit',
78
+ shell: '/bin/bash',
79
+ env: {
80
+ ...process.env,
81
+ OPENBUILDER_QUIET_INSTALL: '1',
82
+ },
83
+ });
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
18
90
  async function upgradeCommand(options) {
19
91
  const s = p.spinner();
20
- // Step 1: Find current monorepo
21
- s.start('Locating OpenBuilder installation');
92
+ // Get current CLI version
93
+ let currentVersion = '0.0.0';
94
+ try {
95
+ // Try to find package.json by traversing up
96
+ let searchDir = dirname(new URL(import.meta.url).pathname);
97
+ for (let i = 0; i < 5; i++) {
98
+ const pkgPath = join(searchDir, 'package.json');
99
+ if (existsSync(pkgPath)) {
100
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
101
+ currentVersion = pkg.version || '0.0.0';
102
+ break;
103
+ }
104
+ searchDir = dirname(searchDir);
105
+ }
106
+ }
107
+ catch {
108
+ // Ignore errors reading package.json
109
+ }
110
+ // ========================================
111
+ // STEP 1: Always update CLI automatically
112
+ // ========================================
113
+ s.start('Checking for CLI updates');
114
+ const latestVersion = await fetchLatestVersion();
115
+ if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {
116
+ s.stop(pc.cyan('⬆') + ` CLI update available: ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);
117
+ console.log();
118
+ console.log(` ${pc.dim('Updating CLI...')}`);
119
+ const cliSuccess = performCLIUpdate();
120
+ if (cliSuccess) {
121
+ console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);
122
+ console.log();
123
+ }
124
+ else {
125
+ console.log(` ${pc.yellow('⚠')} CLI update failed`);
126
+ console.log(` ${pc.dim('Run manually:')} ${pc.cyan(INSTALL_COMMAND)}`);
127
+ console.log();
128
+ }
129
+ }
130
+ else if (latestVersion) {
131
+ s.stop(pc.green('✓') + ` CLI is up to date (${currentVersion})`);
132
+ }
133
+ else {
134
+ s.stop(pc.yellow('⚠') + ' Could not check for CLI updates');
135
+ }
136
+ // ========================================
137
+ // STEP 2: Find app installation and prompt
138
+ // ========================================
139
+ s.start('Locating OpenBuilder app installation');
22
140
  let monorepoRoot;
23
141
  const config = configManager.get();
24
142
  // Try config first
@@ -33,20 +151,34 @@ async function upgradeCommand(options) {
33
151
  }
34
152
  }
35
153
  if (!monorepoRoot) {
36
- s.stop(pc.red('') + ' OpenBuilder installation not found');
37
- throw new CLIError({
38
- code: 'UPGRADE_NOT_IN_REPO',
39
- message: 'Could not locate OpenBuilder installation',
40
- suggestions: [
41
- 'Run from within OpenBuilder directory',
42
- 'Or run init first: openbuilder init',
43
- config.monorepoPath ? `Configured path not found: ${config.monorepoPath}` : 'No installation path configured',
44
- ],
45
- docs: 'https://github.com/codyde/openbuilder#upgrade',
154
+ s.stop(pc.dim('') + ' No OpenBuilder app installation found');
155
+ console.log();
156
+ console.log(pc.dim(' The CLI has been updated. No local app installation to upgrade.'));
157
+ console.log(pc.dim(' Run ') + pc.cyan('openbuilder init') + pc.dim(' to set up a local installation.'));
158
+ console.log();
159
+ return;
160
+ }
161
+ s.stop(pc.green('✓') + ` Found app installation`);
162
+ // Prompt user about upgrading the app
163
+ console.log();
164
+ console.log(` ${pc.bold('App installation found:')}`);
165
+ console.log(` ${pc.cyan(monorepoRoot)}`);
166
+ console.log();
167
+ // Skip prompt if --force is used
168
+ if (!options.force) {
169
+ const shouldUpgradeApp = await p.confirm({
170
+ message: 'Would you like to upgrade the app installation as well?',
171
+ initialValue: true,
46
172
  });
173
+ if (p.isCancel(shouldUpgradeApp) || !shouldUpgradeApp) {
174
+ console.log();
175
+ console.log(pc.dim(' Skipping app upgrade. CLI has been updated.'));
176
+ console.log();
177
+ return;
178
+ }
47
179
  }
48
- s.stop(pc.green('✓') + ` Found: ${monorepoRoot}`);
49
- // Step 2: Check git status
180
+ console.log();
181
+ // Check git status before upgrading
50
182
  if (!options.force) {
51
183
  s.start('Checking for uncommitted changes');
52
184
  try {
@@ -79,7 +211,7 @@ async function upgradeCommand(options) {
79
211
  // Continue anyway - user might have extracted from tarball
80
212
  }
81
213
  }
82
- // Step 3: Backup configuration files
214
+ // Backup configuration files
83
215
  s.start('Backing up configuration files');
84
216
  const envBackup = {
85
217
  runner: {},
@@ -109,7 +241,7 @@ async function upgradeCommand(options) {
109
241
  }
110
242
  }
111
243
  s.stop(pc.green('✓') + ` Backed up ${backedUpCount} configuration file(s)`);
112
- // Step 4: Determine branch
244
+ // Determine branch and clone
113
245
  const branch = options.branch || 'main';
114
246
  s.start(`Cloning fresh copy from ${pc.cyan(branch)}`);
115
247
  const parentDir = dirname(monorepoRoot);
@@ -142,7 +274,7 @@ async function upgradeCommand(options) {
142
274
  ],
143
275
  });
144
276
  }
145
- // Step 5: Restore configuration files
277
+ // Restore configuration files
146
278
  s.start('Restoring configuration files');
147
279
  let restoredCount = 0;
148
280
  const restorePaths = [
@@ -161,7 +293,7 @@ async function upgradeCommand(options) {
161
293
  }
162
294
  }
163
295
  s.stop(pc.green('✓') + ` Restored ${restoredCount} configuration file(s)`);
164
- // Step 6: Install dependencies
296
+ // Install dependencies
165
297
  s.start('Installing dependencies');
166
298
  try {
167
299
  execSync('pnpm install', {
@@ -185,7 +317,7 @@ async function upgradeCommand(options) {
185
317
  ],
186
318
  });
187
319
  }
188
- // Step 7: Build services
320
+ // Build services
189
321
  s.start('Building services (this may take a moment)');
190
322
  try {
191
323
  execSync('pnpm turbo build', {
@@ -226,7 +358,7 @@ async function upgradeCommand(options) {
226
358
  ],
227
359
  });
228
360
  }
229
- // Step 7.5: Apply database migrations (if DATABASE_URL exists)
361
+ // Apply database migrations (if DATABASE_URL exists)
230
362
  const databaseUrl = envBackup.openbuilder.env?.match(/DATABASE_URL=["']?([^"'\n]+)["']?/)?.[1] ||
231
363
  envBackup.openbuilder.envLocal?.match(/DATABASE_URL=["']?([^"'\n]+)["']?/)?.[1] ||
232
364
  process.env.DATABASE_URL;
@@ -253,7 +385,7 @@ async function upgradeCommand(options) {
253
385
  s.start('Skipping database migrations (no DATABASE_URL found)');
254
386
  s.stop(pc.yellow('⚠') + ' No database configured');
255
387
  }
256
- // Step 8: Swap directories (atomic operation)
388
+ // Swap directories (atomic operation)
257
389
  s.start('Finalizing upgrade');
258
390
  const backupDir = join(parentDir, `${repoName}-backup-${Date.now()}`);
259
391
  try {
@@ -281,7 +413,7 @@ async function upgradeCommand(options) {
281
413
  }
282
414
  throw error;
283
415
  }
284
- // Step 9: Cleanup backup
416
+ // Cleanup backup
285
417
  s.start('Cleaning up');
286
418
  try {
287
419
  rmSync(backupDir, { recursive: true, force: true });
@@ -320,4 +452,4 @@ async function upgradeCommand(options) {
320
452
  }
321
453
 
322
454
  export { upgradeCommand };
323
- //# sourceMappingURL=upgrade-CT6w0lKp.js.map
455
+ //# sourceMappingURL=upgrade-BXI69MKW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-BXI69MKW.js","sources":["../../src/cli/commands/upgrade.ts"],"sourcesContent":["/**\n * Upgrade command - In-place upgrade to latest version\n * \n * This command upgrades 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 { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, renameSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport { configManager } from '../utils/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.app/install | bash';\n\ninterface UpgradeOptions {\n branch?: string;\n force?: boolean;\n}\n\ninterface EnvBackup {\n runner: { env?: string; envLocal?: string };\n openbuilder: { env?: string; envLocal?: string };\n}\n\n/**\n * Fetch the latest release version from GitHub\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(GITHUB_RELEASES_URL, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'OpenBuilder-CLI-Upgrade',\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 return data.tag_name.replace(/^v/, '');\n } catch {\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 execSync(INSTALL_COMMAND, {\n stdio: 'inherit',\n shell: '/bin/bash',\n env: {\n ...process.env,\n OPENBUILDER_QUIET_INSTALL: '1',\n },\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions) {\n const s = p.spinner();\n \n // Get current CLI version\n let currentVersion = '0.0.0';\n try {\n // Try to find package.json by traversing up\n let searchDir = dirname(new URL(import.meta.url).pathname);\n for (let i = 0; i < 5; i++) {\n const pkgPath = join(searchDir, 'package.json');\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n currentVersion = pkg.version || '0.0.0';\n break;\n }\n searchDir = dirname(searchDir);\n }\n } catch {\n // Ignore errors reading package.json\n }\n \n // ========================================\n // STEP 1: Always update CLI automatically\n // ========================================\n s.start('Checking for CLI updates');\n \n const latestVersion = await fetchLatestVersion();\n \n if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {\n s.stop(pc.cyan('⬆') + ` CLI update available: ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);\n \n console.log();\n console.log(` ${pc.dim('Updating CLI...')}`);\n \n const cliSuccess = performCLIUpdate();\n \n if (cliSuccess) {\n console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);\n console.log();\n } else {\n console.log(` ${pc.yellow('⚠')} CLI update failed`);\n console.log(` ${pc.dim('Run manually:')} ${pc.cyan(INSTALL_COMMAND)}`);\n console.log();\n }\n } else if (latestVersion) {\n s.stop(pc.green('✓') + ` CLI is up to date (${currentVersion})`);\n } else {\n s.stop(pc.yellow('⚠') + ' Could not check for CLI updates');\n }\n\n // ========================================\n // STEP 2: Find app installation and prompt\n // ========================================\n s.start('Locating OpenBuilder app installation');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n // Try config first\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n // Try detection if not in config\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.dim('ℹ') + ' No OpenBuilder app installation found');\n console.log();\n console.log(pc.dim(' The CLI has been updated. No local app installation to upgrade.'));\n console.log(pc.dim(' Run ') + pc.cyan('openbuilder init') + pc.dim(' to set up a local installation.'));\n console.log();\n return;\n }\n\n s.stop(pc.green('✓') + ` Found app installation`);\n \n // Prompt user about upgrading the app\n console.log();\n console.log(` ${pc.bold('App installation found:')}`);\n console.log(` ${pc.cyan(monorepoRoot)}`);\n console.log();\n \n // Skip prompt if --force is used\n if (!options.force) {\n const shouldUpgradeApp = await p.confirm({\n message: 'Would you like to upgrade the app installation as well?',\n initialValue: true,\n });\n \n if (p.isCancel(shouldUpgradeApp) || !shouldUpgradeApp) {\n console.log();\n console.log(pc.dim(' Skipping app upgrade. CLI has been updated.'));\n console.log();\n return;\n }\n }\n \n console.log();\n\n // Check git status before upgrading\n if (!options.force) {\n s.start('Checking for uncommitted changes');\n\n try {\n const gitStatus = execSync('git status --porcelain', {\n cwd: monorepoRoot,\n encoding: 'utf-8',\n }).trim();\n\n if (gitStatus.length > 0) {\n s.stop(pc.yellow('⚠') + ' Uncommitted changes detected');\n\n const changes = gitStatus.split('\\n').slice(0, 5);\n console.log(pc.dim(' Modified files:'));\n changes.forEach(line => console.log(pc.dim(` ${line}`)));\n\n if (!options.force) {\n const confirm = await p.confirm({\n message: 'Continue upgrade? This will discard local changes.',\n initialValue: false,\n });\n\n if (!confirm || p.isCancel(confirm)) {\n console.log(pc.dim('\\nUpgrade cancelled'));\n process.exit(0);\n }\n }\n } else {\n s.stop(pc.green('✓') + ' No uncommitted changes');\n }\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Not a git repository');\n // Continue anyway - user might have extracted from tarball\n }\n }\n\n // Backup configuration files\n s.start('Backing up configuration files');\n\n const envBackup: EnvBackup = {\n runner: {},\n openbuilder: {},\n };\n\n // Define paths to check\n const envPaths = [\n { app: 'runner', path: join(monorepoRoot, 'apps/runner/.env') },\n { app: 'runner', pathLocal: join(monorepoRoot, 'apps/runner/.env.local') },\n { app: 'openbuilder', path: join(monorepoRoot, 'apps/openbuilder/.env') },\n { app: 'openbuilder', pathLocal: join(monorepoRoot, 'apps/openbuilder/.env.local') },\n ];\n\n let backedUpCount = 0;\n\n for (const item of envPaths) {\n const app = item.app as keyof EnvBackup;\n const filePath = item.path || item.pathLocal!;\n const isLocal = !!item.pathLocal;\n\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n if (isLocal) {\n envBackup[app].envLocal = content;\n } else {\n envBackup[app].env = content;\n }\n backedUpCount++;\n }\n }\n\n s.stop(pc.green('✓') + ` Backed up ${backedUpCount} configuration file(s)`);\n\n // Determine branch and clone\n const branch = options.branch || 'main';\n\n s.start(`Cloning fresh copy from ${pc.cyan(branch)}`);\n\n const parentDir = dirname(monorepoRoot);\n const repoName = monorepoRoot.split('/').pop();\n const tempDir = join(parentDir, `${repoName}-upgrade-temp`);\n\n // Remove temp directory if it exists from failed previous upgrade\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n try {\n execSync(\n `git clone --branch ${branch} --depth 1 https://github.com/codyde/openbuilder.git \"${tempDir}\"`,\n {\n cwd: parentDir,\n stdio: 'pipe', // Silent\n }\n );\n\n s.stop(pc.green('✓') + ' Cloned successfully');\n } catch (error) {\n s.stop(pc.red('✗') + ' Clone failed');\n\n // Cleanup temp dir\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n throw new CLIError({\n code: 'UPGRADE_CLONE_FAILED',\n message: `Failed to clone branch \"${branch}\"`,\n suggestions: [\n 'Check your internet connection',\n 'Verify the branch exists: https://github.com/codyde/openbuilder/tree/' + branch,\n 'Try upgrading to main: openbuilder upgrade',\n ],\n });\n }\n\n // Restore configuration files\n s.start('Restoring configuration files');\n\n let restoredCount = 0;\n\n const restorePaths = [\n { app: 'runner' as const, file: '.env', dir: join(tempDir, 'apps/runner') },\n { app: 'runner' as const, file: '.env.local', dir: join(tempDir, 'apps/runner') },\n { app: 'openbuilder' as const, file: '.env', dir: join(tempDir, 'apps/openbuilder') },\n { app: 'openbuilder' as const, file: '.env.local', dir: join(tempDir, 'apps/openbuilder') },\n ];\n\n for (const item of restorePaths) {\n const isLocal = item.file === '.env.local';\n const backupContent = isLocal ? envBackup[item.app].envLocal : envBackup[item.app].env;\n\n if (backupContent) {\n const targetPath = join(item.dir, item.file);\n writeFileSync(targetPath, backupContent, 'utf-8');\n restoredCount++;\n }\n }\n\n s.stop(pc.green('✓') + ` Restored ${restoredCount} configuration file(s)`);\n\n // Install dependencies\n s.start('Installing dependencies');\n\n try {\n execSync('pnpm install', {\n cwd: tempDir,\n stdio: 'pipe',\n env: { ...process.env, TURBO_TELEMETRY_DISABLED: '1' },\n });\n\n s.stop(pc.green('✓') + ' Dependencies installed');\n } catch (error) {\n s.stop(pc.red('✗') + ' Dependency installation failed');\n\n // Cleanup\n rmSync(tempDir, { recursive: true, force: true });\n\n throw new CLIError({\n code: 'UPGRADE_INSTALL_FAILED',\n message: 'Failed to install dependencies in new version',\n suggestions: [\n 'Check if the branch is stable',\n 'Try upgrading to main instead',\n 'Check disk space',\n ],\n });\n }\n\n // Build services\n s.start('Building services (this may take a moment)');\n\n try {\n execSync('pnpm turbo build', {\n cwd: tempDir,\n stdio: 'pipe',\n env: { ...process.env, TURBO_TELEMETRY_DISABLED: '1' },\n });\n\n s.stop(pc.green('✓') + ' Build successful');\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n\n // Try to extract error message from execSync error\n let errorOutput = '';\n if (error && typeof error === 'object' && 'stderr' in error) {\n errorOutput = String((error as { stderr?: unknown }).stderr || '');\n }\n if (!errorOutput && error && typeof error === 'object' && 'stdout' in error) {\n errorOutput = String((error as { stdout?: unknown }).stdout || '');\n }\n\n // Show error details if available\n if (errorOutput) {\n console.log(pc.red('\\nBuild errors:'));\n console.log(pc.gray('─'.repeat(60)));\n const lines = errorOutput.split('\\n').slice(-20);\n lines.forEach(line => console.log(pc.red(` ${line}`)));\n console.log(pc.gray('─'.repeat(60)));\n console.log('');\n }\n\n // Cleanup\n rmSync(tempDir, { recursive: true, force: true });\n\n throw new CLIError({\n code: 'UPGRADE_BUILD_FAILED',\n message: 'Failed to build new version',\n suggestions: [\n 'The branch may have build errors',\n 'Try upgrading to a stable release tag',\n 'Check build logs for errors',\n ],\n });\n }\n\n // Apply database migrations (if DATABASE_URL exists)\n const databaseUrl =\n envBackup.openbuilder.env?.match(/DATABASE_URL=[\"']?([^\"'\\n]+)[\"']?/)?.[1] ||\n envBackup.openbuilder.envLocal?.match(/DATABASE_URL=[\"']?([^\"'\\n]+)[\"']?/)?.[1] ||\n process.env.DATABASE_URL;\n\n if (databaseUrl) {\n s.start('Applying database migrations');\n\n try {\n execSync('npx drizzle-kit push --config=drizzle.config.ts', {\n cwd: join(tempDir, 'apps/openbuilder'),\n stdio: 'pipe',\n env: {\n ...process.env,\n DATABASE_URL: databaseUrl,\n },\n });\n\n s.stop(pc.green('✓') + ' Database schema updated');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Migration failed');\n console.log(pc.dim(' You may need to run: openbuilder database'));\n console.log(pc.dim(' This won\\'t prevent the upgrade from completing'));\n }\n } else {\n s.start('Skipping database migrations (no DATABASE_URL found)');\n s.stop(pc.yellow('⚠') + ' No database configured');\n }\n\n // Swap directories (atomic operation)\n s.start('Finalizing upgrade');\n\n const backupDir = join(parentDir, `${repoName}-backup-${Date.now()}`);\n\n try {\n // Rename current installation to backup\n renameSync(monorepoRoot, backupDir);\n\n // Rename new installation to production\n renameSync(tempDir, monorepoRoot);\n\n s.stop(pc.green('✓') + ' Upgrade finalized');\n } catch (error) {\n s.stop(pc.red('✗') + ' Failed to swap directories');\n\n // Attempt recovery\n try {\n if (existsSync(backupDir)) {\n renameSync(backupDir, monorepoRoot);\n console.log(pc.yellow('⚠') + ' Restored original installation');\n }\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n } catch (recoveryError) {\n console.error(pc.red('❌') + ' Failed to recover. Manual intervention required.');\n console.error(pc.dim(` Backup location: ${backupDir}`));\n }\n\n throw error;\n }\n\n // Cleanup backup\n s.start('Cleaning up');\n\n try {\n rmSync(backupDir, { recursive: true, force: true });\n s.stop(pc.green('✓') + ' Cleanup complete');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Could not remove backup');\n console.log(pc.dim(` You can manually delete: ${backupDir}`));\n }\n\n // Success!\n console.log();\n console.log(pc.green('✓') + pc.bold(' Upgrade complete!'));\n console.log();\n\n // Check if user is currently inside the monorepo directory\n const currentDir = process.cwd();\n const isCurrentlyInMonorepo = currentDir.startsWith(monorepoRoot);\n\n if (isCurrentlyInMonorepo) {\n console.log(pc.yellow('⚠') + pc.bold(' IMPORTANT: Your shell directory is stale'));\n console.log();\n console.log(pc.dim(' The upgrade renamed directories while you were inside them.'));\n console.log(pc.dim(' You need to refresh your shell location:'));\n console.log();\n console.log(pc.cyan(' cd .. && cd ' + monorepoRoot.split('/').pop()));\n console.log();\n console.log(pc.dim(' Or simply close and reopen your terminal.'));\n console.log();\n }\n\n console.log(pc.dim(' Note: Restart your terminal to use the updated CLI'));\n console.log(pc.dim(' Or run: hash -r'));\n console.log();\n\n if (branch !== 'main') {\n console.log(pc.yellow('⚠') + ` You upgraded to branch: ${pc.cyan(branch)}`);\n console.log(pc.dim(' To return to main: openbuilder upgrade'));\n console.log();\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -470,34 +470,26 @@ if (isSilentMode) {
470
470
  process.env.SILENT_MODE = '1';
471
471
  }
472
472
  // Auto-update check - do this BEFORE displaying banner to avoid double banners
473
- // For TUI modes: check only and store result for display (don't auto-update to avoid disruption)
474
- // For CLI modes: full auto-update with restart
473
+ // All modes (TUI and CLI): full auto-update with restart
475
474
  // For version mode: skip entirely - just show version
476
475
  let willAutoUpdate = false;
477
476
  if (!process.env.OPENBUILDER_SKIP_UPDATE_CHECK && !isVersionCommand) {
478
- const { checkAndAutoUpdate, checkForUpdate } = await import('../chunks/auto-update-Dj3lWPWO.js');
477
+ const { checkAndAutoUpdate } = await import('../chunks/auto-update-BvDYQPBr.js');
479
478
  try {
480
- if (isTUIMode) {
481
- // TUI mode: just check for updates, store result for TUI to display
482
- const updateInfo = await checkForUpdate(packageJson.version);
483
- if (updateInfo?.updateAvailable) {
484
- // Store update info for TUI components to access
485
- process.env.OPENBUILDER_UPDATE_AVAILABLE = updateInfo.latestVersion;
486
- }
487
- }
488
- else {
489
- // CLI mode: full auto-update
490
- // Show banner first since we're in CLI mode and might not auto-update
479
+ // Show banner first for non-TUI modes
480
+ if (!isSilentMode) {
491
481
  displayBanner();
492
- const didUpdate = await checkAndAutoUpdate(packageJson.version);
493
- if (didUpdate) {
494
- // CLI will be relaunched by auto-update, exit this process
495
- willAutoUpdate = true;
496
- process.exit(0);
497
- }
482
+ }
483
+ // Full auto-update for all modes
484
+ const didUpdate = await checkAndAutoUpdate(packageJson.version);
485
+ if (didUpdate) {
486
+ // CLI will be relaunched by auto-update, exit this process
487
+ willAutoUpdate = true;
488
+ process.exit(0);
498
489
  }
499
490
  }
500
491
  catch {
492
+ // Auto-update failed silently, continue with current version
501
493
  }
502
494
  }
503
495
  else if (!isSilentMode) {
@@ -524,12 +516,12 @@ program
524
516
  // Default action when no subcommand is provided
525
517
  if (options.runner) {
526
518
  // Start runner only (legacy flag)
527
- const { runCommand } = await import('../chunks/run-D23hg4xy.js');
519
+ const { runCommand } = await import('../chunks/run-CXf8t7aQ.js');
528
520
  await runCommand({});
529
521
  }
530
522
  else {
531
523
  // Show TUI main menu
532
- const { mainTUICommand } = await import('../chunks/main-tui-Cq1hLCx-.js');
524
+ const { mainTUICommand } = await import('../chunks/main-tui-CI-fhhsm.js');
533
525
  await mainTUICommand();
534
526
  }
535
527
  }
@@ -601,7 +593,7 @@ program
601
593
  .option('--no-tui', 'Disable TUI dashboard, use plain text logs')
602
594
  .action(async (options) => {
603
595
  try {
604
- const { runCommand } = await import('../chunks/run-D23hg4xy.js');
596
+ const { runCommand } = await import('../chunks/run-CXf8t7aQ.js');
605
597
  await runCommand(options);
606
598
  }
607
599
  catch (error) {
@@ -681,13 +673,39 @@ program
681
673
  .option('--force', 'Skip safety checks (uncommitted changes)')
682
674
  .action(async (options) => {
683
675
  try {
684
- const { upgradeCommand } = await import('../chunks/upgrade-CT6w0lKp.js');
676
+ const { upgradeCommand } = await import('../chunks/upgrade-BXI69MKW.js');
685
677
  await upgradeCommand(options);
686
678
  }
687
679
  catch (error) {
688
680
  globalErrorHandler.handle(error);
689
681
  }
690
682
  });
683
+ program
684
+ .command('login')
685
+ .description('Authenticate with OpenBuilder via OAuth (GitHub/Sentry)')
686
+ .option('-u, --url <url>', 'OpenBuilder server URL (default: https://openbuilder.app)')
687
+ .option('-f, --force', 'Force re-authentication even if already logged in')
688
+ .action(async (options) => {
689
+ try {
690
+ const { loginCommand } = await import('../chunks/login-CxIFa4OV.js');
691
+ await loginCommand(options);
692
+ }
693
+ catch (error) {
694
+ globalErrorHandler.handle(error);
695
+ }
696
+ });
697
+ program
698
+ .command('logout')
699
+ .description('Clear stored authentication credentials')
700
+ .action(async () => {
701
+ try {
702
+ const { logoutCommand } = await import('../chunks/logout-BeoZSsNe.js');
703
+ await logoutCommand();
704
+ }
705
+ catch (error) {
706
+ globalErrorHandler.handle(error);
707
+ }
708
+ });
691
709
  program.parse();
692
710
 
693
711
  export { shutdownHandler };