diff --git a/backend/src/app-creator.js b/backend/src/app-creator.js index 535aef0..0ec2901 100644 --- a/backend/src/app-creator.js +++ b/backend/src/app-creator.js @@ -434,6 +434,7 @@ function addDynamicApp(appDef) { } function initDynamicApps() { + // 1. Charger les apps depuis .dashboard-apps.json (legacy) const dynamicApps = loadDynamicApps(); for (const app of dynamicApps) { const existingInConfig = config.apps.findIndex((a) => a.id === app.id); @@ -441,7 +442,32 @@ function initDynamicApps() { config.apps.push(app); } } - console.log(`Apps dynamiques chargées: ${dynamicApps.length}`); + // 2. Scanner les dossiers app.json (découverte automatique) + try { + const appsBasePath = config.appsBasePath || process.env.APPS_BASE_PATH || '/opt/manus-deploy/apps'; + const entries = fs.readdirSync(appsBasePath, { withFileTypes: true }); + let scanned = 0; + for (const entry of entries) { + if (!entry.isDirectory()) continue; + const appJsonPath = path.join(appsBasePath, entry.name, 'app.json'); + if (!fs.existsSync(appJsonPath)) continue; + try { + const appDef = JSON.parse(fs.readFileSync(appJsonPath, 'utf-8')); + if (!appDef.id) continue; + const existingInConfig = config.apps.findIndex((a) => a.id === appDef.id); + if (existingInConfig < 0) { + config.apps.push(appDef); + scanned++; + } + } catch (e) { + console.error(`Erreur lecture app.json dans ${entry.name}:`, e.message); + } + } + console.log(`Apps découvertes via app.json: ${scanned}`); + } catch (err) { + console.error('Erreur scan app.json:', err.message); + } + console.log(`Total apps chargées: ${config.apps.length}`); } // ============ CREATION D'APPLICATION ============