From 2d0778287d813e43437b25e5957a2ee81e831f01 Mon Sep 17 00:00:00 2001 From: Joakim Date: Wed, 10 Sep 2025 23:12:32 +0200 Subject: [PATCH] fix: disable auto-enhancement in development mode to prevent live-reload loops - Add dev_mode parameter to SiteManager constructor - Modify IsAutoEnhanceEnabled() to return false when dev_mode is true - Update serve.go to pass dev_mode flag to SiteManager - Add ForceEnhanceEnabled() method for testing production behavior in development - Update documentation to explain development vs production mode behavior This fixes the development workflow where content updates would trigger file modifications that caused unwanted page reloads in live-server. Development mode: Content saved to database only, editor loads dynamically Production mode: Content saved + files enhanced for immediate static deployment --- COMMANDS.md | 18 ++++++++++++++++-- README.md | 25 ++++++++++++++++++++++--- cmd/serve.go | 2 +- internal/content/site_manager.go | 20 +++++++++++++++++++- 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/COMMANDS.md b/COMMANDS.md index d3b51e5..d3aebec 100644 --- a/COMMANDS.md +++ b/COMMANDS.md @@ -104,9 +104,23 @@ When running `insertr serve`, the server automatically: - **Auto-updates files** when content changes via API - **Creates backups** of original files (if enabled) -**Live Enhancement Process:** +**Development vs Production Behavior:** + +**Development Mode** (`--dev-mode`): +- ✅ Content changes saved to database +- ❌ File enhancement **disabled** (prevents live-reload loops) +- ✅ Editor loads content dynamically from API +- ✅ Perfect for `just dev` workflow + +**Production Mode** (no `--dev-mode`): +- ✅ Content changes saved to database +- ✅ File enhancement **enabled** +- ✅ Static files updated immediately +- ✅ Changes live instantly + +**Live Enhancement Process (Production):** 1. Content updated via API → Database updated -2. If site has `auto_enhance: true` → File enhancement triggered +2. If site has `auto_enhance: true` AND not in dev mode → File enhancement triggered 3. Static files updated in-place → Changes immediately live ### API Endpoints diff --git a/README.md b/README.md index 592aab6..16cfea9 100644 --- a/README.md +++ b/README.md @@ -436,14 +436,33 @@ server: backup_originals: true ``` +### **Development vs Production Modes** + +**Development Mode** (recommended for development): +```bash +# Development: Content updates save to database only +# NO file enhancement to prevent live-reload loops +./insertr serve --dev-mode +just dev # Uses dev mode automatically +``` + +**Production Mode** (for deployment): +```bash +# Production: Content updates trigger immediate file enhancement +./insertr serve # No --dev-mode flag +``` + ### **Quick Start** ```bash # 1. Configure sites in insertr.yaml -# 2. Start the server +# 2. Start development server (no file enhancement) ./insertr serve --dev-mode -# 3. Your sites are automatically registered and enhanced -# 4. Content changes via editor immediately update static files +# 3. Editor loads content from database dynamically +# 4. No unwanted file modifications or page reloads during development + +# 5. For production deployment: +./insertr serve # Enables automatic file enhancement ``` ## ⚙️ Configuration diff --git a/cmd/serve.go b/cmd/serve.go index 4a2bc1c..96fa14d 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -73,7 +73,7 @@ func runServe(cmd *cobra.Command, args []string) { contentClient := content.NewDatabaseClient(database) // Initialize site manager - siteManager := content.NewSiteManager(contentClient, "./insertr-backups") + siteManager := content.NewSiteManager(contentClient, "./insertr-backups", devMode) // Load sites from configuration if siteConfigs := viper.Get("server.sites"); siteConfigs != nil { diff --git a/internal/content/site_manager.go b/internal/content/site_manager.go index d363449..cb31c8c 100644 --- a/internal/content/site_manager.go +++ b/internal/content/site_manager.go @@ -24,10 +24,11 @@ type SiteManager struct { enhancer *Enhancer mutex sync.RWMutex backupDir string + devMode bool } // NewSiteManager creates a new site manager -func NewSiteManager(contentClient ContentClient, backupDir string) *SiteManager { +func NewSiteManager(contentClient ContentClient, backupDir string, devMode bool) *SiteManager { if backupDir == "" { backupDir = "./insertr-backups" } @@ -36,6 +37,7 @@ func NewSiteManager(contentClient ContentClient, backupDir string) *SiteManager sites: make(map[string]*SiteConfig), enhancer: NewEnhancer(contentClient, ""), // siteID will be set per operation backupDir: backupDir, + devMode: devMode, } } @@ -103,10 +105,26 @@ func (sm *SiteManager) GetAllSites() map[string]*SiteConfig { } // IsAutoEnhanceEnabled checks if a site has auto-enhancement enabled +// Returns false in development mode to prevent unwanted file modifications and live-reload loops func (sm *SiteManager) IsAutoEnhanceEnabled(siteID string) bool { sm.mutex.RLock() defer sm.mutex.RUnlock() + // Disable auto-enhancement in development mode to prevent file modification conflicts with live-reload + if sm.devMode { + return false + } + + site, exists := sm.sites[siteID] + return exists && site.AutoEnhance +} + +// ForceEnhanceEnabled allows testing production behavior in development mode +// This method bypasses the dev_mode check for testing purposes +func (sm *SiteManager) ForceEnhanceEnabled(siteID string) bool { + sm.mutex.RLock() + defer sm.mutex.RUnlock() + site, exists := sm.sites[siteID] return exists && site.AutoEnhance }