From ad6bf26278efa8f77b7fed22b37afea6b0d4b14b Mon Sep 17 00:00:00 2001 From: lukashow Date: Sun, 15 Feb 2026 20:58:11 +0800 Subject: [PATCH 1/4] fix(core): Remove hardcoded project root name detection logic --- .../src/utils/getCallerModuleId.ts | 37 ++++++++++++++++--- .../core/functions/utils/ensureRootName.ts | 11 +++--- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts b/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts index f5b8bc115..a95d06046 100644 --- a/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts +++ b/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts @@ -1,3 +1,5 @@ +import path from 'path' + export default function getCallerModuleId(): | { source: 'app' | 'core'; id: string } | undefined { @@ -17,8 +19,33 @@ export default function getCallerModuleId(): if (!filePath) return undefined - // Try external app module: /apps/{moduleId}/server/ - const appMatch = filePath.match(/lifeforge\/apps\/([^/]+)\/server\//) + // Extract project root from file path + let projectRoot: string | undefined + + // For app modules: /path/to/projectRoot/apps/moduleId/server/... + const appsIndex = filePath.indexOf('/apps/') + + if (appsIndex !== -1) { + const pathBeforeApps = filePath.substring(0, appsIndex) + + projectRoot = path.basename(pathBeforeApps) + } else { + // For core modules: /path/to/projectRoot/server/src/... + const serverIndex = filePath.indexOf('/server/') + + if (serverIndex !== -1) { + const pathBeforeServer = filePath.substring(0, serverIndex) + + projectRoot = path.basename(pathBeforeServer) + } + } + + if (!projectRoot) return undefined + + // Try external app module: /{projectRoot}/apps/{moduleId}/server/ + const appMatch = filePath.match( + new RegExp(`${projectRoot}\\/apps\\/([^/]+)\\/server\\/`) + ) if (appMatch) return { @@ -27,10 +54,10 @@ export default function getCallerModuleId(): } // Try core module: - // - /lifeforge/server/src/lib/{coreModuleId}/ - // - /lifeforge/server/src/core/{coreModuleId}/ + // - /{projectRoot}/server/src/lib/{coreModuleId}/ + // - /{projectRoot}/server/src/core/{coreModuleId}/ const coreMatch = filePath.match( - /lifeforge\/server\/src\/(?:lib|core)\/([^/]+)\// + new RegExp(`${projectRoot}\\/server\\/src\\/(?:lib|core)\\/([^/]+)\\/`) ) if (coreMatch) diff --git a/server/src/core/functions/utils/ensureRootName.ts b/server/src/core/functions/utils/ensureRootName.ts index 711b226ab..fc9d6efe7 100644 --- a/server/src/core/functions/utils/ensureRootName.ts +++ b/server/src/core/functions/utils/ensureRootName.ts @@ -1,10 +1,10 @@ -import { coreLogger } from '@functions/logging' import path from 'path' +import { coreLogger } from '@functions/logging' /** - * Ensures the root directory name is 'lifeforge'. - * Exits the process if the root directory name is not 'lifeforge'. + * Logs a warning if the root directory name is not 'lifeforge'. + * This is for informational purposes only and does not prevent execution. */ export default function ensureRootName(): void { const projectRoot = path.basename( @@ -12,9 +12,8 @@ export default function ensureRootName(): void { ) if (projectRoot !== 'lifeforge') { - coreLogger.error( - `Project root directory must be named 'lifeforge', but found '${projectRoot}'. Please rename the root directory.` + coreLogger.warn( + `Project root directory is '${projectRoot}', not 'lifeforge'. Some features may not work as expected.` ) - process.exit(1) } } From 98ee57998d02072b7baa586eab7412f74096d775 Mon Sep 17 00:00:00 2001 From: lukashow Date: Sun, 15 Feb 2026 20:58:44 +0800 Subject: [PATCH 2/4] fix(migration): Improve migration logging --- tools/src/commands/db/handlers/generateMigrationsHandler.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/src/commands/db/handlers/generateMigrationsHandler.ts b/tools/src/commands/db/handlers/generateMigrationsHandler.ts index c85a08186..01ab09264 100644 --- a/tools/src/commands/db/handlers/generateMigrationsHandler.ts +++ b/tools/src/commands/db/handlers/generateMigrationsHandler.ts @@ -4,6 +4,7 @@ import getPBInstance from '@/utils/pocketbase' import { cleanupOldMigrations } from '../functions/migration-generation/cleanupOldMigrations' import stageMigration from '../functions/migration-generation/stageMigrations' import { importSchemaModules } from '../utils' +import chalk from 'chalk' /** * Command handler for generating database migrations @@ -29,9 +30,9 @@ export async function generateMigrationsHandler( killPB?.() - logger.success('Migrations generated successfully') + logger.success(`Migrations generated successfully for module ${chalk.green(targetModule ? `${targetModule}` : 'all modules')}`) } catch (error) { - logger.error('Migration script failed') + logger.error(`Migration script failed for module ${chalk.red(targetModule ? `${targetModule}` : 'all modules')}.`) logger.debug(`Error details: ${error}`) killPB?.() From 29b4fd121141c5da9ae0232f2c0488170bfb8628 Mon Sep 17 00:00:00 2001 From: lukashow Date: Wed, 18 Feb 2026 17:45:39 +0800 Subject: [PATCH 3/4] fix(server): remove ensureRootName function to eliminate hardcoded checks --- .../core/functions/utils/ensureRootName.ts | 19 ------------------- server/src/index.ts | 2 -- 2 files changed, 21 deletions(-) delete mode 100644 server/src/core/functions/utils/ensureRootName.ts diff --git a/server/src/core/functions/utils/ensureRootName.ts b/server/src/core/functions/utils/ensureRootName.ts deleted file mode 100644 index fc9d6efe7..000000000 --- a/server/src/core/functions/utils/ensureRootName.ts +++ /dev/null @@ -1,19 +0,0 @@ -import path from 'path' - -import { coreLogger } from '@functions/logging' - -/** - * Logs a warning if the root directory name is not 'lifeforge'. - * This is for informational purposes only and does not prevent execution. - */ -export default function ensureRootName(): void { - const projectRoot = path.basename( - path.resolve(import.meta.dirname.split('server')[0]) - ) - - if (projectRoot !== 'lifeforge') { - coreLogger.warn( - `Project root directory is '${projectRoot}', not 'lifeforge'. Some features may not work as expected.` - ) - } -} diff --git a/server/src/index.ts b/server/src/index.ts index c1e901628..1bddb6b9a 100755 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -10,7 +10,6 @@ import { LocaleService } from '@functions/initialization/localeService' import traceRouteStack from '@functions/initialization/traceRouteStack' import { LOG_LEVELS, type LogLevel, coreLogger } from '@functions/logging' import createSocketServer from '@functions/socketio/createSocketServer' -import ensureRootName from '@functions/utils/ensureRootName' import app from './core/app' @@ -57,7 +56,6 @@ function startServer(server: ReturnType): void { async function main(): Promise { LocaleService.validateAndLoad() - ensureRootName() ensureDirectories() ensureCredentials() await checkDB() From 16eb3816415cc252fa56034fc9e88e106147425a Mon Sep 17 00:00:00 2001 From: lukashow Date: Wed, 18 Feb 2026 17:50:21 +0800 Subject: [PATCH 4/4] refactor(server-utils): extract project root logic into separate function --- .../src/utils/extractProjectRoot.ts | 29 +++++++++++++++++++ .../src/utils/getCallerModuleId.ts | 23 ++------------- 2 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 packages/lifeforge-server-utils/src/utils/extractProjectRoot.ts diff --git a/packages/lifeforge-server-utils/src/utils/extractProjectRoot.ts b/packages/lifeforge-server-utils/src/utils/extractProjectRoot.ts new file mode 100644 index 000000000..ab9a2faf0 --- /dev/null +++ b/packages/lifeforge-server-utils/src/utils/extractProjectRoot.ts @@ -0,0 +1,29 @@ +import path from 'path' + +/** + * Gets the project root directory name from a file path. + * Supports both app modules (/apps/) and core modules (/server/). + */ +export default function getProjectRootDir( + filePath: string +): string | undefined { + // For app modules: /path/to/projectRoot/apps/moduleId/server/... + const appsIndex = filePath.indexOf('/apps/') + + if (appsIndex !== -1) { + const pathBeforeApps = filePath.substring(0, appsIndex) + + return path.basename(pathBeforeApps) + } else { + // For core modules: /path/to/projectRoot/server/src/... + const serverIndex = filePath.indexOf('/server/') + + if (serverIndex !== -1) { + const pathBeforeServer = filePath.substring(0, serverIndex) + + return path.basename(pathBeforeServer) + } + } + + return undefined +} diff --git a/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts b/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts index a95d06046..1847487d3 100644 --- a/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts +++ b/packages/lifeforge-server-utils/src/utils/getCallerModuleId.ts @@ -1,4 +1,4 @@ -import path from 'path' +import getProjectRootDir from './extractProjectRoot' export default function getCallerModuleId(): | { source: 'app' | 'core'; id: string } @@ -19,26 +19,7 @@ export default function getCallerModuleId(): if (!filePath) return undefined - // Extract project root from file path - let projectRoot: string | undefined - - // For app modules: /path/to/projectRoot/apps/moduleId/server/... - const appsIndex = filePath.indexOf('/apps/') - - if (appsIndex !== -1) { - const pathBeforeApps = filePath.substring(0, appsIndex) - - projectRoot = path.basename(pathBeforeApps) - } else { - // For core modules: /path/to/projectRoot/server/src/... - const serverIndex = filePath.indexOf('/server/') - - if (serverIndex !== -1) { - const pathBeforeServer = filePath.substring(0, serverIndex) - - projectRoot = path.basename(pathBeforeServer) - } - } + const projectRoot = getProjectRootDir(filePath) if (!projectRoot) return undefined