mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-02 20:43:36 +00:00
fix(electron): Fix broken symlinks in server bundle preventing app startup
Fixes #742 This commit resolves two critical issues that prevented the Electron app from starting: 1. **Broken symlinks in server bundle** - After npm install, local @automaker/* packages were symlinked in node_modules - These symlinks broke after electron-builder packaging since relative paths no longer existed - Solution: Added Step 6b in prepare-server.mjs to replace symlinks with real directory copies - Added lstatSync and resolve imports to support symlink detection and replacement 2. **electronUserDataWriteFileSync fails on first launch** - The userData directory doesn't exist on first app launch - Writing .api-key file would fail with ENOENT error - Solution: Added directory existence check and creation with { recursive: true } before writing Files modified: - apps/ui/scripts/prepare-server.mjs: Added symlink replacement logic after npm install - libs/platform/src/system-paths.ts: Added parent directory creation in electronUserDataWriteFileSync Verification: After these fixes, npm run build:electron produces a working app that starts without ERR_MODULE_NOT_FOUND errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,8 +7,8 @@
|
||||
*/
|
||||
|
||||
import { execSync } from 'child_process';
|
||||
import { cpSync, existsSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'fs';
|
||||
import { join, dirname } from 'path';
|
||||
import { cpSync, existsSync, mkdirSync, rmSync, writeFileSync, readFileSync, lstatSync } from 'fs';
|
||||
import { join, dirname, resolve } from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
@@ -112,6 +112,21 @@ execSync('npm install --omit=dev', {
|
||||
},
|
||||
});
|
||||
|
||||
// Step 6b: Replace symlinks for local packages with real copies
|
||||
// npm install creates symlinks for file: references, but these break when packaged by electron-builder
|
||||
console.log('🔗 Replacing symlinks with real directory copies...');
|
||||
const nodeModulesAutomaker = join(BUNDLE_DIR, 'node_modules', '@automaker');
|
||||
for (const pkgName of LOCAL_PACKAGES) {
|
||||
const pkgDir = pkgName.replace('@automaker/', '');
|
||||
const nmPkgPath = join(nodeModulesAutomaker, pkgDir);
|
||||
if (existsSync(nmPkgPath) && lstatSync(nmPkgPath).isSymbolicLink()) {
|
||||
const realPath = resolve(BUNDLE_DIR, 'libs', pkgDir);
|
||||
rmSync(nmPkgPath);
|
||||
cpSync(realPath, nmPkgPath, { recursive: true });
|
||||
console.log(` ✓ Replaced symlink: ${pkgName}`);
|
||||
}
|
||||
}
|
||||
|
||||
// Step 7: Rebuild native modules for current architecture
|
||||
// This is critical for modules like node-pty that have native bindings
|
||||
console.log('🔨 Rebuilding native modules for current architecture...');
|
||||
|
||||
@@ -750,6 +750,11 @@ export function electronUserDataWriteFileSync(
|
||||
throw new Error('[SystemPaths] Electron userData path not initialized');
|
||||
}
|
||||
const fullPath = path.join(electronUserDataPath, relativePath);
|
||||
// Ensure parent directory exists (may not exist on first launch)
|
||||
const dir = path.dirname(fullPath);
|
||||
if (!fsSync.existsSync(dir)) {
|
||||
fsSync.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
fsSync.writeFileSync(fullPath, data, options);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user