From 55ffd1c201a55e882eb016312a4978dbc2735b5f Mon Sep 17 00:00:00 2001 From: Rob Di Marco Date: Wed, 10 Sep 2025 09:46:58 -0400 Subject: [PATCH 1/3] Fix git divergent branches error in demo update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace git pull with fetch + reset --hard to avoid divergent branch conflicts. This ensures the demo repository always matches the remote exactly, discarding any local changes that might have been made during demo usage. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- packages/atxp/src/run-demo.ts | 46 ++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/atxp/src/run-demo.ts b/packages/atxp/src/run-demo.ts index a5c188a..9cbf2ca 100644 --- a/packages/atxp/src/run-demo.ts +++ b/packages/atxp/src/run-demo.ts @@ -76,26 +76,50 @@ async function cloneDemoRepo(demoDir: string, isVerbose: boolean): Promise async function updateDemoRepo(demoDir: string, isVerbose: boolean): Promise { return new Promise((resolve, _reject) => { - const git = spawn('git', [ - 'pull', - '--depth', '1', // Keep shallow history during pull - 'origin', 'main' // Explicitly pull from main branch + // First fetch the latest changes + const fetch = spawn('git', [ + 'fetch', + '--depth', '1', // Keep shallow history during fetch + 'origin', 'main' // Explicitly fetch from main branch ], { cwd: demoDir, stdio: isVerbose ? 'inherit' : 'pipe' }); - git.on('close', (code) => { - if (code === 0) { - console.log(chalk.green('Demo updated successfully')); + fetch.on('close', (fetchCode) => { + if (fetchCode !== 0) { + console.log(chalk.yellow('Could not fetch updates, using existing version')); resolve(); - } else { + return; + } + + // Reset local branch to match remote exactly (discarding any local changes) + const reset = spawn('git', [ + 'reset', + '--hard', // Discard local changes + 'origin/main' // Reset to remote main branch + ], { + cwd: demoDir, + stdio: isVerbose ? 'inherit' : 'pipe' + }); + + reset.on('close', (resetCode) => { + if (resetCode === 0) { + console.log(chalk.green('Demo updated successfully')); + resolve(); + } else { + console.log(chalk.yellow('Could not update demo, using existing version')); + resolve(); // Don't fail if update fails + } + }); + + reset.on('error', (_error) => { console.log(chalk.yellow('Could not update demo, using existing version')); resolve(); // Don't fail if update fails - } + }); }); - git.on('error', (_error) => { + fetch.on('error', (_error) => { console.log(chalk.yellow('Could not update demo, using existing version')); resolve(); // Don't fail if update fails }); @@ -107,7 +131,7 @@ async function installDependencies(demoDir: string, isVerbose: boolean): Promise return new Promise((resolve, reject) => { // Use --silent flag to reduce npm output - const npmArgs = isVerbose ? ['run', 'install-all'] : ['run', 'install-all', '--silent']; + const npmArgs = isVerbose ? ['run', 'setup'] : ['run', 'setup', '--silent']; const npm = spawn('npm', npmArgs, { cwd: demoDir, From 07d5bb532d32dbe99ea49990e34fa4fff2e1a6a1 Mon Sep 17 00:00:00 2001 From: Rob Di Marco Date: Wed, 10 Sep 2025 09:52:10 -0400 Subject: [PATCH 2/3] Refactor demo to use single port instead of frontend/backend ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace frontendPort and backendPort with single port parameter - Update CLI args to use --port/-p instead of --frontend-port/--backend-port - Default port changed to 8017 (previously backend port) - Simplify .env file creation to single root .env instead of separate files - Update environment variables and browser opening to use single port - Aligns with new architecture of unified server handling both frontend and backend 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- packages/atxp/src/index.ts | 20 ++++----------- packages/atxp/src/run-demo.ts | 47 +++++++++++++---------------------- 2 files changed, 22 insertions(+), 45 deletions(-) diff --git a/packages/atxp/src/index.ts b/packages/atxp/src/index.ts index adefa6e..a9c67af 100644 --- a/packages/atxp/src/index.ts +++ b/packages/atxp/src/index.ts @@ -8,8 +8,7 @@ import { showHelp } from './help.js'; import { checkAllDependencies, showDependencyError } from './check-dependencies.js'; interface DemoOptions { - frontendPort: number; - backendPort: number; + port: number; dir: string; verbose: boolean; refresh: boolean; @@ -25,22 +24,13 @@ function parseArgs(): { command: string; demoOptions: DemoOptions } { return index !== -1 ? process.argv[index + 1] : undefined; }; - const frontendPort = (() => { - const portValue = getArgValue('--frontend-port', '--fp'); + const port = (() => { + const portValue = getArgValue('--port', '-p'); if (portValue) { const parsed = parseInt(portValue, 10); if (parsed > 0 && parsed < 65536) return parsed; } - return 8016; // default frontend port - })(); - - const backendPort = (() => { - const portValue = getArgValue('--backend-port', '--bp'); - if (portValue) { - const parsed = parseInt(portValue, 10); - if (parsed > 0 && parsed < 65536) return parsed; - } - return 8017; // default backend port + return 8017; // default port (previously backend port) })(); const dir = (() => { @@ -53,7 +43,7 @@ function parseArgs(): { command: string; demoOptions: DemoOptions } { return { command, - demoOptions: { frontendPort, backendPort, dir, verbose, refresh } + demoOptions: { port, dir, verbose, refresh } }; } diff --git a/packages/atxp/src/run-demo.ts b/packages/atxp/src/run-demo.ts index 9cbf2ca..ba8b25e 100644 --- a/packages/atxp/src/run-demo.ts +++ b/packages/atxp/src/run-demo.ts @@ -5,8 +5,7 @@ import open from 'open'; import path from 'path'; interface DemoOptions { - frontendPort: number; - backendPort: number; + port: number; dir: string; verbose: boolean; refresh: boolean; @@ -35,10 +34,10 @@ export async function runDemo(options: DemoOptions): Promise { await installDependencies(options.dir, options.verbose); // Create .env files for configuration - await createEnvFiles(options.dir, options.frontendPort, options.backendPort, options.verbose); + await createEnvFiles(options.dir, options.port, options.verbose); // Start the demo and open browser - await startDemo(options.frontendPort, options.backendPort, options.dir, options.verbose); + await startDemo(options.port, options.dir, options.verbose); } catch (error) { console.error(chalk.red('Error starting demo:'), (error as Error).message); @@ -153,9 +152,9 @@ async function installDependencies(demoDir: string, isVerbose: boolean): Promise }); } -async function startDemo(frontendPort: number, backendPort: number, demoDir: string, isVerbose: boolean): Promise { +async function startDemo(port: number, demoDir: string, isVerbose: boolean): Promise { console.log(chalk.blue('Starting demo application...')); - console.log(chalk.green(`Demo will be available at: http://localhost:${frontendPort}`)); + console.log(chalk.green(`Demo will be available at: http://localhost:${port}`)); console.log(chalk.gray(`Demo directory: ${demoDir}`)); console.log(chalk.yellow('Press Ctrl+C to stop the demo')); if (!isVerbose) { @@ -166,11 +165,8 @@ async function startDemo(frontendPort: number, backendPort: number, demoDir: str // Set the port environment variable for the demo const env = { ...process.env, - // Backend will use PORT from its .env file, frontend will use PORT from its .env file - // We don't set PORT globally to avoid conflicts - let each service read its own .env - FRONTEND_PORT: frontendPort.toString(), - BACKEND_PORT: backendPort.toString(), - REACT_APP_BACKEND_PORT: backendPort.toString(), + // Server will use PORT from its .env file + PORT: port.toString(), NODE_ENV: 'production', // Suppress deprecation warnings NODE_NO_WARNINGS: '1', @@ -224,10 +220,10 @@ async function startDemo(frontendPort: number, backendPort: number, demoDir: str if (!demoOpenedBrowser) { try { console.log(chalk.blue('Opening browser...')); - await open(`http://localhost:${frontendPort}`); + await open(`http://localhost:${port}`); } catch { console.log(chalk.yellow('Could not open browser automatically')); - console.log(chalk.white(`Please open http://localhost:${frontendPort} in your browser`)); + console.log(chalk.white(`Please open http://localhost:${port} in your browser`)); } } }, 2000); @@ -258,32 +254,23 @@ async function startDemo(frontendPort: number, backendPort: number, demoDir: str }); } -async function createEnvFiles(demoDir: string, frontendPort: number, backendPort: number, isVerbose: boolean): Promise { +async function createEnvFiles(demoDir: string, port: number, isVerbose: boolean): Promise { if (isVerbose) { - console.log(chalk.blue('Creating .env files...')); + console.log(chalk.blue('Creating .env file...')); } try { - // Create backend .env file - const backendEnvPath = path.join(demoDir, 'backend', '.env'); - const backendEnvContent = `PORT=${backendPort}\nFRONTEND_PORT=${frontendPort}\n`; - await fs.writeFile(backendEnvPath, backendEnvContent); + // Create .env file for the server + const envPath = path.join(demoDir, '.env'); + const envContent = `PORT=${port}\n`; + await fs.writeFile(envPath, envContent); if (isVerbose) { - console.log(chalk.gray(`Created backend .env: ${backendEnvPath}`)); - } - - // Create frontend .env file - const frontendEnvPath = path.join(demoDir, 'frontend', '.env'); - const frontendEnvContent = `PORT=${frontendPort}\nREACT_APP_BACKEND_PORT=${backendPort}\n`; - await fs.writeFile(frontendEnvPath, frontendEnvContent); - - if (isVerbose) { - console.log(chalk.gray(`Created frontend .env: ${frontendEnvPath}`)); + console.log(chalk.gray(`Created .env: ${envPath}`)); } } catch (error) { - console.log(chalk.yellow(`Warning: Could not create .env files: ${(error as Error).message}`)); + console.log(chalk.yellow(`Warning: Could not create .env file: ${(error as Error).message}`)); console.log(chalk.gray('Demo will use environment variables passed directly')); } } From a6c46ac0f253709b981ff300c3965ac066606107 Mon Sep 17 00:00:00 2001 From: Rob Di Marco Date: Wed, 10 Sep 2025 09:55:37 -0400 Subject: [PATCH 3/3] Remove .env file creation logic from demo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The demo server no longer needs .env files as it will use environment variables passed directly through the spawn process. This simplifies the demo setup and aligns with the unified server architecture. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- packages/atxp/src/run-demo.ts | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/packages/atxp/src/run-demo.ts b/packages/atxp/src/run-demo.ts index ba8b25e..ffd5a16 100644 --- a/packages/atxp/src/run-demo.ts +++ b/packages/atxp/src/run-demo.ts @@ -33,9 +33,6 @@ export async function runDemo(options: DemoOptions): Promise { // Install dependencies if needed await installDependencies(options.dir, options.verbose); - // Create .env files for configuration - await createEnvFiles(options.dir, options.port, options.verbose); - // Start the demo and open browser await startDemo(options.port, options.dir, options.verbose); @@ -254,26 +251,6 @@ async function startDemo(port: number, demoDir: string, isVerbose: boolean): Pro }); } -async function createEnvFiles(demoDir: string, port: number, isVerbose: boolean): Promise { - if (isVerbose) { - console.log(chalk.blue('Creating .env file...')); - } - - try { - // Create .env file for the server - const envPath = path.join(demoDir, '.env'); - const envContent = `PORT=${port}\n`; - await fs.writeFile(envPath, envContent); - - if (isVerbose) { - console.log(chalk.gray(`Created .env: ${envPath}`)); - } - - } catch (error) { - console.log(chalk.yellow(`Warning: Could not create .env file: ${(error as Error).message}`)); - console.log(chalk.gray('Demo will use environment variables passed directly')); - } -} async function cleanup(): Promise { try {