diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 0c6b8d29..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,911 +0,0 @@ -# Changelog - -All notable changes to the IGNY8 platform will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ---- - -## [Unreleased] - -### [2025-11-26] IGNY8 Stage 3 — Full Pipeline Implementation COMPLETE - -**Status:** ✅ **100% COMPLETE** (All Core Features Functional, Production-Ready) - -**Summary:** -Stage 3 successfully stabilized the entire IGNY8 pipeline with complete Stage 1 schema compliance. The platform now supports end-to-end content creation from ideas to WordPress publishing with proper bidirectional synchronization, comprehensive error handling, and a clean, simplified user interface. WordPress plugin updated for full schema compatibility. - -#### Added -- WordPress unpublishing endpoint -- WordPress import flow with proper schema mapping -- Proper Task → Content flow using final Stage 1 schema -- Ideas → Tasks creation with correct field mappings -- Content creation now independent of Tasks (no OneToOne FK) -- WordPress adapter integration for publish/unpublish endpoints -- Frontend conditional publish/unpublish buttons based on external_id -- "View on WordPress" action for published content -- Cluster Detail page integration with Content Manager -- Sites module auto-filtering across all modules -- STAGE_3_PROGRESS.md comprehensive tracking document -- **WordPress Plugin:** Added `content_id`, `content_structure`, and `source` meta field support -- **WordPress Plugin:** Full backward compatibility for legacy `content` field - -#### Changed -- **BREAKING:** `generate_content` AI function now creates independent Content records - - No longer uses deprecated TaskContent model - - Creates Content with: title, content_html, cluster, content_type, content_structure - - Sets source='igny8', status='draft' automatically - - Updates Task status to 'completed' after content creation -- **BREAKING:** Ideas → Tasks mapping uses new schema - - site_entity_type → content_type (direct mapping) - - cluster_role → content_structure (mapped: hub→article, supporting→guide, attribute→comparison) - - keyword_objects → keywords M2M (preserved relationships) -- **BREAKING:** WordPress import uses content_html instead of html_content - - Maps WP post_type → content_type - - Creates ContentTaxonomy M2M for categories/tags - - Sets source='wordpress' and proper status -- **BREAKING:** WordPress adapter prioritizes content_html over deprecated fields - - Checks content_html first, then html_content, then content for backward compatibility - - Ensures Stage 1 schema compliance in publish flow -- WordPress publish endpoint prevents duplicate publishing - - Checks external_id before allowing publish - - Returns 400 error if already published - - Updates external_id, external_url, status on success -- Frontend table actions now support conditional visibility - - Added `shouldShow` callback to RowActionConfig - - TablePageTemplate filters actions based on row data - - Content publish actions show/hide based on external_id -- **BREAKING:** PostEditor simplified to Stage 1 schema only - - Removed deprecated SEO fields (meta_title, meta_description, primary_keyword, secondary_keywords) - - Replaced SEO/Metadata tabs with single "Taxonomy & Cluster" tab - - Shows read-only taxonomy_terms and cluster assignments - - Uses content_html consistently throughout -- **WordPress Plugin:** All sync functions now use `content_html` as primary field - - Updated `igny8_create_wordpress_post_from_task()` for schema compliance - - Updated `igny8_sync_igny8_tasks_to_wp()` for schema compliance - - Updated webhook handler in `Igny8Webhooks` class - - Added fallback to `content` field for backward compatibility - -#### Fixed -- Planner `bulk_queue_to_writer` using deprecated Task fields -- AI content generation creating wrong model structure -- WordPress publish flow not setting external references -- WordPress import using deprecated html_content field -- WordPress adapter not prioritizing content_html -- Task status not updating to 'completed' after content generation -- Frontend showing publish button even when content already published -- ClusterDetail page not linking to Content Manager -- Sites module filtering not working across all modules -- **WordPress Plugin:** Schema mismatch causing empty post content - - Plugin was expecting `content` field but backend sends `content_html` - - All content handling functions updated with backward-compatible fallback - - Added support for new Stage 1 meta fields: content_structure, source, content_id - -#### Verified & Validated -- ✅ End-to-end pipeline: Idea → Task → Content → Publish → WordPress -- ✅ Bidirectional sync: WordPress ↔ IGNY8 with proper field mapping -- ✅ Duplicate prevention: external_id checks prevent re-publishing -- ✅ Status transitions: draft/published, queued/completed work correctly -- ✅ Taxonomy mapping: ContentTaxonomy M2M syncs properly -- ✅ Cluster assignment: Works and appears in Cluster Detail page -- ✅ Site filtering: ContentViewSet extends SiteSectorModelViewSet -- ✅ Schema compliance: All deprecated fields removed/updated - -#### Performance Notes -- Basic loading states implemented -- Error handling via toast notifications -- Advanced retry logic deferred to future optimization phase -- Performance monitoring deferred to production deployment - -#### Production Readiness -**Ready for Deployment:** -- All core pipeline flows functional and tested -- Complete Stage 1 schema compliance -- WordPress integration stable -- UI simplified and user-friendly -- Documentation comprehensive - -**Recommended Next Steps:** -1. Deploy to staging environment -2. Conduct full E2E testing with real WordPress sites -3. Create user documentation and training materials -4. Implement deferred performance optimizations (Part G) -5. Monitor production metrics and errors - ---- - -## Previous Releases - -#### Removed -- All references to deprecated fields in generate_content function: - - task.idea (OneToOne removed) - - task.taxonomy (replaced by task.taxonomy_term) - - task.keyword_objects (replaced by task.keywords) - - SEO fields (meta_title, meta_description, primary_keyword, etc.) -- Deprecated SEO/Metadata tabs from PostEditor UI - -#### Known Issues -- WordPress import (WP → IGNY8) still uses deprecated `html_content` field -- PostEditor SEO/Metadata tabs need redesign (reference deprecated fields) -- Frontend publish button guards not yet implemented -- WordPress sync service needs update for Stage 1 schema - -#### Migration Notes -- No database migrations required (Stage 1 migrations already applied) -- AI function behavior changed: always creates new Content, never updates existing -- Task-to-Content relationship is now logical only (no FK constraint) - -See `STAGE_3_PROGRESS.md` for detailed implementation status and next steps. - ---- - -## 📋 Changelog Management - -**IMPORTANT**: This changelog is only updated after user confirmation that a fix or feature is complete and working. - -### Changelog Structure - -Each entry follows this format: -- **Version**: Semantic versioning (MAJOR.MINOR.PATCH) -- **Date**: YYYY-MM-DD format -- **Type**: Added, Changed, Fixed, Deprecated, Removed, Security -- **Description**: Clear description of the change -- **Affected Areas**: Modules, components, or features affected - ---- - -## [1.1.0] - Stage 2 Frontend Refactor - 2025-11-25 - -### ✅ **STAGE 2 COMPLETE** - Nov 25, 2025 - -**Status:** Core refactor complete with zero TypeScript errors. Application builds successfully and ready for runtime testing. - -**Completion Rate:** 92% (25/27 planned files updated) -**Build Status:** ✅ Passes TypeScript compilation (0 errors) -**Remaining Work:** 2 legacy components need refactoring (non-critical) - -### Changed - Frontend Schema Alignment (25 Files Updated) - -#### API & Configuration Layer (5 files) -- **`src/services/api.ts`** - - Updated `Content`, `Task`, `ContentIdea`, `ContentFilters` interfaces to match Stage 1 backend schema - - **REMOVED FIELDS:** `entity_type`, `cluster_role`, `sync_status`, `meta_title`, `meta_description`, `primary_keyword`, `secondary_keywords`, `tags`, `categories`, `word_count`, `task_id`, `generated_at` - - **ADDED FIELDS:** `content_type`, `content_structure`, `taxonomy_terms[]`, `source`, `external_id`, `external_url`, `cluster_name`, `created_at` - -- **`src/services/integration.api.ts`** - - ✅ Verified clean (sync_status correctly scoped to Integration model only) - -- **`src/config/pages/tasks.config.tsx`** - - Removed `entity_type` and `cluster_role` columns from table config - - Updated `content_type` options: `blog_post` → `post`, added `page`, `product`, `service`, `category`, `tag` - - Updated `content_structure` options: removed deprecated `cluster_hub`, `pillar_page`, `supporting_page` - -- **`src/config/pages/content.config.tsx`** - - **Major restructure:** Added `content_type`, `content_structure`, `cluster_name`, `taxonomy_terms` columns - - Removed columns: `primary_keyword`, `secondary_keywords`, `tags`, `categories`, `word_count`, `entity_type`, `cluster_role`, `sync_status` - - Updated status values: `draft/review/publish` → `draft/published` - - Changed timestamp field: `generated_at` → `created_at` - -- **`src/config/pages/ideas.config.tsx`** - - Removed `site_entity_type` and `cluster_role` columns and filters - - Updated default content type values - -#### State Management (1 file) -- **`src/store/plannerStore.ts`** - - ✅ Verified clean (no deprecated fields used) - -#### Planner Module (3 files) -- **`src/config/pages/clusters.config.tsx`** - - Made cluster names clickable with React Router Link to `/clusters/:id` - -- **`src/pages/Planner/Ideas.tsx`** - - Removed `entityTypeFilter` state and handlers - - Updated default form values: `blog_post` → `article/post` - -- **`src/pages/Planner/Dashboard.tsx`** - - ✅ Verified clean - -#### Writer Module (4 files) -- **`src/pages/Writer/Tasks.tsx`** - - Removed `entityTypeFilter` state and UI controls - - Fixed `formData` defaults: `blog_post` → `article/post` - -- **`src/pages/Writer/Content.tsx`** - - Removed `syncStatusFilter` state - - Removed "Synced/Pending" metrics from dashboard - - Changed default sort: `generated_at` → `created_at` - - Updated `getItemDisplayName`: removed `meta_title` fallback - -- **`src/pages/Writer/Dashboard.tsx`** - - Removed `review` status from content statistics - - Updated task status handling: `pending/in_progress/completed` → `queued/completed` - - Updated chart categories: removed "In Review" status - - **Marked Stage 3/4 endpoints as TODO:** `fetchTaxonomies`, `fetchAttributes` (endpoints not yet implemented in backend) - - Temporarily set `taxonomyCount` and `attributeCount` to 0 with TODO comments for future implementation - -- **`src/pages/Writer/ContentView.tsx`** - - Removed `meta_title` and `meta_description` from PageMeta component - -#### Sites Module (3 files) -- **`src/pages/Sites/Content.tsx`** - - Removed `primary_keyword` from Content interface - - Updated status options: `draft/review/publish` → `draft/published` - - Changed default sort: `generated_at` → `created_at` - -- **`src/pages/Sites/Settings.tsx`** - - ✅ Verified clean (meta_title/meta_description are for Site SEO settings, not Content model) - -- **`src/pages/Sites/List.tsx`** - - ✅ Verified clean - -#### Cluster Detail Pages (2 files) -- **`src/pages/Planner/ClusterDetail.tsx`** ✨ **NEW PAGE** - - Created comprehensive cluster detail page with tabbed interface - - Tabs: Articles, Pages, Products, Taxonomy - - Displays content items with new schema: `content_type`, `content_structure`, `taxonomy_terms`, `source`, `external_url` - - Fixed all TypeScript errors: added PageMeta descriptions, corrected Button/Badge variant/color props - - Integrated with Writer module (view/edit content links) - -- **`src/App.tsx`** - - Added `/planner/clusters/:id` route with lazy loading for ClusterDetail page - -#### PostEditor (Partial) (1 file) -- **`src/pages/Sites/PostEditor.tsx`** - - ✅ Updated `Content` interface to match new schema (removed all deprecated fields) - - ✅ Updated initial state and `loadPost` function - - ✅ Fixed `handleSave` (removed task creation logic, simplified content updates) - - ✅ Updated `CONTENT_TYPES` and `STATUS_OPTIONS` arrays - - ⚠️ **SEO and Metadata tabs still contain UI for deprecated fields** (forms display but don't save - needs full UI rewrite in future release) - -#### Optimizer Module (2 files) -- **`src/pages/Optimizer/ContentSelector.tsx`** - - Removed `syncStatus` from filter state - - Removed sync_status filter logic and UI controls - - Removed `SyncStatusBadge` import and table column - -- **`src/pages/Optimizer/AnalysisPreview.tsx`** - - Changed field reference: `entity_type` → `content_type` - - Removed `word_count` and `sync_status` display from preview - -#### Linker Module (1 file) -- **`src/pages/Linker/ContentList.tsx`** - - Removed `cluster_role` display from cluster badges - -#### Legacy Component Cleanup (3 files) -- **`src/components/content/ContentFilter.tsx`** - - ✅ Removed entire "Sync Status Filter" section - - ✅ Removed `SyncStatusBadge` import - - ✅ Removed `syncStatus` from `FilterState` interface - -- **`src/pages/Optimizer/ContentSelector.tsx`** - - ✅ Removed `SyncStatusBadge` column from content selector table - - ✅ Removed sync_status rendering logic - -- **`src/pages/Writer/Dashboard.tsx`** - - ✅ Added TODO comments for Stage 3/4 features (taxonomy/attribute management) - -### 🔴 Breaking Changes - Frontend Schema - -#### Content Model Fields -- **REMOVED:** `entity_type` → Use `content_type` instead -- **REMOVED:** `cluster_role` → No longer exists (clusters are pure topics) -- **REMOVED:** `sync_status` → Not applicable to Content (only Integration model) -- **REMOVED:** `meta_title` → Use `title` directly -- **REMOVED:** `meta_description` → Not in backend schema -- **REMOVED:** `primary_keyword`, `secondary_keywords` → SEO fields removed -- **REMOVED:** `tags[]`, `categories[]` → Use `taxonomy_terms[]` instead -- **REMOVED:** `word_count` → Not tracked in new schema -- **REMOVED:** `generated_at` → Use `created_at` instead -- **REMOVED:** `task_id` → OneToOne relationship removed - -#### Status Values Changed -- **Task Status:** `pending/in_progress/completed` → `queued/completed` -- **Content Status:** `draft/review/publish` → `draft/published` - -#### Content Types Changed -- **Content Type (formerly entity_type):** - - OLD: `blog_post`, `article`, `guide`, `tutorial` - - NEW: `post`, `page`, `product`, `service`, `category`, `tag` - -- **Content Structure (formerly content_format):** - - OLD: `cluster_hub`, `pillar_page`, `supporting_page`, `landing_page` - - NEW: `article`, `listicle`, `guide`, `comparison`, `product_page` - -### 📚 Documentation Updated -- ✅ Created `STAGE_2_REFACTOR_COMPLETE.md` with comprehensive change log -- ✅ Documented all 25 file updates with before/after field mappings -- ✅ Added TypeScript error resolution guide -- ✅ Build verification steps with success confirmation -- ✅ Known remaining work (2 legacy components) -- ✅ Migration checklist for developers - -### ⚠️ Known Remaining Work (Non-Critical) - -#### Low Priority Legacy Components (2 files) -1. **`src/components/common/ToggleTableRow.tsx`** - - **Issue:** Contains extensive fallback logic for deprecated fields (`primary_keyword`, `meta_description`, `tags`, `categories`) - - **Impact:** Low (gracefully falls back to empty when fields don't exist) - - **Fix Required:** Refactor to use only `taxonomy_terms[]` array - -2. **`src/pages/Sites/PostEditor.tsx` (SEO/Metadata Tabs)** - - **Issue:** SEO tab has form inputs for deprecated fields (`meta_title`, `meta_description`, `primary_keyword`, `secondary_keywords`) - - **Issue:** Metadata tab has tag/category management for old field structure - - **Impact:** Medium (UI sections display but don't function - non-breaking) - - **Fix Required:** Complete UI redesign for these tabs (deferred to future release) - -### ✅ Verification Completed -- ✅ TypeScript compilation: **0 errors** -- ✅ Build process: **Completes successfully in ~9-10s** -- ✅ All core modules updated (Planner, Writer, Sites, Optimizer, Linker) -- ✅ New cluster detail page functional -- ✅ Table configs aligned with new schema -- ⚠️ CSS warnings present (minor browser compatibility warnings, not errors) - -### 🚀 Next Steps -1. **Runtime Testing** - Start dev server and verify core workflows -2. **Stage 3/4 Implementation** - Implement `fetchTaxonomies` and `fetchAttributes` backend endpoints -3. **Legacy Component Refactor** - Update ToggleTableRow and PostEditor tabs (low priority) -4. **Integration Testing** - Verify WordPress sync with new schema - -### 📖 References -- **Stage 2 Summary:** `STAGE_2_REFACTOR_COMPLETE.md` -- **Stage 1 Summary:** `STAGE_1_COMPLETE.md` -- **Master Reference:** `MASTER_REFERENCE.md` -- **API Reference:** `master-docs/API-COMPLETE-REFERENCE.md` - ---- - -## [1.0.0] - Stage 1 Backend Refactor - 2025-11-25 - -### ✅ **STAGE 1 COMPLETE & DEPLOYED** - Nov 25, 2025 - -**Status:** All components completed and successfully deployed to production. - -**Completed Work:** -- ✅ Models refactored (Cluster, Task, Content, ContentTaxonomy) -- ✅ Serializers updated (TasksSerializer, ContentSerializer, ContentTaxonomySerializer) -- ✅ API ViewSets updated (removed deprecated fields, updated filters) -- ✅ Admin interface updated (new field names, simplified fieldsets) -- ✅ Code cleanup (removed all references to deprecated fields) -- ✅ Migrations generated and applied successfully -- ✅ System verified (no errors, all containers healthy) -- ✅ Documentation consolidated (see `STAGE_1_COMPLETE.md`) - -**Applied Migrations:** -- `planner/migrations/0004_remove_clusters_igny8_clust_context_0d6bd7_idx_and_more.py` -- `writer/migrations/0007_alter_contenttaxonomyrelation_unique_together_and_more.py` - -**Deployment Verification:** -- ✅ Django system check: No issues -- ✅ Backend container: Healthy -- ✅ Celery workers: Running -- ✅ All migrations: Applied -- ✅ No startup errors - ---- - -### 🔴 Breaking Changes - Models Refactored - -#### Cluster Model - Simplified to Pure Topics -- **REMOVED:** `context_type` field (topic/attribute/service_line choices) -- **REMOVED:** `dimension_meta` JSONField -- **REMOVED:** `context_type` database index -- **RESULT:** Clusters are now pure topic clusters without dimension/role metadata -- **Files:** `backend/igny8_core/business/planning/models.py` - -#### Task Model - Content Type Architecture -- **REMOVED:** `cluster_role` field (hub/supporting/attribute) -- **REMOVED:** `entity_type` field (replaced with `content_type`) -- **REMOVED:** `keywords` CharField (legacy comma-separated) -- **REMOVED:** `keyword_objects` M2M (renamed to `keywords`) -- **REMOVED:** `idea` ForeignKey to ContentIdeas -- **REMOVED:** `taxonomy` ForeignKey to SiteBlueprintTaxonomy -- **REMOVED:** STATUS CHOICES: `in_progress`, `failed` -- **ADDED:** `content_type` CharField (required, indexed) - post, page, product, service, category, tag, etc. -- **ADDED:** `content_structure` CharField (required, indexed) - article, listicle, guide, comparison, product_page, etc. -- **ADDED:** `taxonomy_term` ForeignKey to ContentTaxonomy (nullable) -- **CHANGED:** `cluster` ForeignKey now REQUIRED (blank=False) -- **CHANGED:** `keywords` M2M to planner.Keywords -- **CHANGED:** `status` choices: queued, completed only -- **Files:** `backend/igny8_core/business/content/models.py` - -#### Content Model - Simplified Content Management -- **REMOVED:** `task` OneToOneField to Tasks -- **REMOVED:** `cluster_role` CharField -- **REMOVED:** `sync_status` CharField (native/imported/synced) -- **REMOVED:** `entity_type` (replaced with `content_type`) -- **REMOVED:** `content_format` (replaced with `content_structure`) -- **REMOVED:** `word_count`, `metadata`, `meta_title`, `meta_description`, `primary_keyword`, `secondary_keywords` -- **REMOVED:** `sync_metadata`, `internal_links`, `linker_version`, `optimizer_version`, `optimization_scores` -- **REMOVED:** `external_type`, `json_blocks`, `structure_data` -- **REMOVED:** `taxonomies` M2M through ContentTaxonomyRelation -- **REMOVED:** `generated_at` field -- **REMOVED:** `ContentTaxonomyRelation` through model -- **ADDED:** `title` CharField (required, indexed) -- **ADDED:** `content_html` TextField (renamed from html_content) -- **ADDED:** `content_type` CharField (required, indexed) -- **ADDED:** `content_structure` CharField (required, indexed) -- **ADDED:** `taxonomy_terms` M2M to ContentTaxonomy (direct, no through model) -- **CHANGED:** `cluster` ForeignKey now REQUIRED (blank=False) -- **CHANGED:** `external_id` now indexed -- **CHANGED:** `source` choices: igny8, wordpress only -- **CHANGED:** `status` choices: draft, published only -- **Files:** `backend/igny8_core/business/content/models.py` - -#### ContentTaxonomy Model - WordPress + Cluster Taxonomies -- **REMOVED:** `sync_status` CharField (native/imported/synced) -- **REMOVED:** `description` TextField -- **REMOVED:** `parent` ForeignKey (hierarchical support) -- **REMOVED:** `count` IntegerField (WordPress count) -- **REMOVED:** `metadata` JSONField -- **REMOVED:** `clusters` M2M to planner.Clusters -- **MODIFIED:** `taxonomy_type` CHOICES updated: - - Renamed: `product_cat` → `product_category` - - Renamed: `product_attr` → `product_attribute` - - **NEW:** `cluster` - IGNY8-native cluster-mapped taxonomy -- **CHANGED:** `external_taxonomy` now nullable (null for cluster taxonomies) -- **CHANGED:** `external_id` now nullable (null for cluster taxonomies) -- **Files:** `backend/igny8_core/business/content/models.py` - -### Changed - Serializers Updated - -#### ClusterSerializer -- **REMOVED:** `context_type` field exposure -- **REMOVED:** `context_type_display` computed field -- **REMOVED:** `dimension_meta` field exposure -- **REMOVED:** Feature flag checks for Stage 1 fields -- **Files:** `backend/igny8_core/modules/planner/serializers.py` - -### 📚 Documentation Updated - -- ✅ Created `STAGE_1_REFACTOR_COMPLETE_SUMMARY.md` with complete implementation guide -- ✅ Documented all model changes with before/after comparison -- ✅ Provided migration commands and verification steps -- ✅ Added Django admin verification checklist -- ✅ Added API endpoint test examples -- ✅ Added frontend verification checklist -- ✅ Updated flow diagrams for Planner → Writer → ContentManager → WP Publish -- ✅ Documented WordPress import flow - -### ⚠️ Migration Required - -**Run these commands to apply model changes:** - -```powershell -cd backend -python manage.py makemigrations planner --name "stage1_remove_cluster_context_fields" -python manage.py makemigrations writer --name "stage1_refactor_task_content_taxonomy" -python manage.py migrate planner -python manage.py migrate writer -``` - -**⚠️ WARNING:** This is a DESTRUCTIVE migration. Backup your database before running. - -### 🚧 Remaining Work (In Progress) - -#### Serializers (Partial) -- ⚠️ TasksSerializer needs update for new fields -- ⚠️ ContentSerializer needs update for new fields -- ⚠️ ContentTaxonomySerializer needs sync_status removed - -#### API Endpoints (Not Started) -- ⚠️ Task creation endpoint requires cluster + content_type + content_structure -- ⚠️ Content creation endpoint requires new field structure -- ⚠️ Publish endpoint needs status + external_id logic update -- ⚠️ WordPress import endpoint needs source='wordpress' logic - -#### Services (Not Started) -- ⚠️ Content generation service needs update for new Content structure -- ⚠️ WordPress publish service needs simplification (remove sync_status) -- ⚠️ WordPress import service needs ContentTaxonomy auto-creation - -#### Frontend (Stage 2) -- ⚠️ React components need update for new API structure -- ⚠️ Forms need content_type + content_structure fields -- ⚠️ Remove cluster_role, sync_status UI elements - -### 📖 References - -- **Complete Summary:** `STAGE_1_REFACTOR_COMPLETE_SUMMARY.md` -- **Master Reference:** `MASTER_REFERENCE.md` (needs update) -- **Implementation Audit:** `IMPLEMENTATION_AUDIT_REPORT.md` -- **Workflow Guide:** `planner-writer-workflow.md` - ---- - -## [1.0.1] - 2025-11-24 - -### Changed - -#### WordPress Integration - Authentication Modernization -- **Simplified authentication to API key only** across WordPress plugin and Django backend - - Removed webhook secret/signature validation in favor of direct API key authentication - - Updated `class-igny8-webhooks.php` to validate `X-IGNY8-API-KEY` or `Authorization: Bearer` headers - - Modified Django `views.py` validator to require only `api_key` in `credentials_json` for new WordPress integrations - - Files changed: - - `igny8-wp-integration/includes/class-igny8-webhooks.php` - - `igny8/backend/igny8_core/modules/integration/views.py` - -- **Implemented 3-state connection model** for clearer integration status tracking - - States: `not_connected` (no API key), `configured` (API key + integration_id), `connected` (structure synced) - - Added `igny8_get_connection_state()` helper function - - Files changed: - - `igny8-wp-integration/includes/functions.php` - - `igny8-wp-integration/admin/settings.php` - -### Added - -#### WordPress Integration - Enhanced Logging & Filtering -- **Safe logging functions** that filter sensitive data (api_key, password, secret, token) - - Added `igny8_log_connection_state()` for connection state transitions - - Added `igny8_log_sync()` for sync operations with context tracking - - Enhanced `igny8_sync_site_structure_to_backend()` with detailed operation logging - - Files changed: - - `igny8-wp-integration/includes/functions.php` - -- **Product attribute filtering** to sync only IGNY8-created WooCommerce attributes - - Filters product attribute terms by `igny8_origin = 'igny8_app'` term meta - - Applies to taxonomies starting with `pa_` prefix - - Files changed: - - `igny8-wp-integration/data/site-collection.php` - -### Removed - -#### WordPress Integration - Legacy Authentication -- **Removed webhook secret authentication** from WordPress plugin - - Deleted `igny8_get_webhook_secret()` and `igny8_regenerate_webhook_secret()` functions - - Removed webhook secret UI from admin settings page - - Removed HMAC-SHA256 signature validation from webhook handler - - Files changed: - - `igny8-wp-integration/includes/functions.php` - - `igny8-wp-integration/includes/class-igny8-webhooks.php` - - `igny8-wp-integration/admin/settings.php` - -### Security - -#### WordPress Integration -- **Upgraded authentication security** by consolidating to single API key method - - Eliminated webhook signature complexity and potential timing attack vectors - - Implemented constant-time comparison for API key validation using `hash_equals()` - - All incoming webhook requests now require valid API key in headers - - Files affected: - - `igny8-wp-integration/includes/class-igny8-webhooks.php` - - `igny8-wp-integration/includes/class-igny8-rest-api.php` - ---- - -## [1.0.0] - 2025-11-24 - -### Added - -#### Backend Core -- **Multi-Tenancy System** - - Complete account isolation with Account → Site → Sector hierarchy - - User roles: Developer, Owner, Admin, Editor, Viewer, System Bot - - Automatic account filtering via `AccountContextMiddleware` - - Base classes: `AccountModelViewSet` and `SiteSectorModelViewSet` - - Account isolation at database level with ForeignKey relationships - -- **Authentication & Authorization** - - JWT token authentication with PyJWT 2.8+ - - 15-minute access token expiry - - Refresh token support - - API key authentication for WordPress integration - - Permission classes: `IsAuthenticatedAndActive`, `HasTenantAccess`, `IsEditorOrAbove`, `IsAdminOrOwner` - - Role-based access control matrix - -- **Planner Module** (`modules/planner/`) - - Keywords model with search volume, difficulty, intent tracking - - Clusters model with many-to-many keyword relationships - - ContentIdeas model linked to clusters - - AI-powered keyword clustering via `auto_cluster` function - - AI-powered content idea generation via `generate_ideas` function - - Bulk keyword import (CSV and manual) - - ViewSets: `KeywordViewSet`, `ClusterViewSet`, `ContentIdeasViewSet` - -- **Writer Module** (`modules/writer/`) - - Tasks model for content creation workflow - - Content model with HTML/plain text support and unified taxonomy structure - - Images model with featured/in-article image support - - AI content generation via GPT-4 (`generate_content` function) - - AI image generation via DALL-E 3 and Runware (`generate_images` function) - - Content taxonomies (`ContentTaxonomy`) and attributes (unified JSON structure) - - ViewSets: `TasksViewSet`, `ContentViewSet`, `ImagesViewSet`, `ContentTaxonomyViewSet`, `ContentAttributeViewSet` - -- **Linker Module** (`modules/linker/`) - - Internal linking recommendations - - Link graph analysis - - `LinkerViewSet` for link operations - -- **Optimizer Module** (`modules/optimizer/`) - - Content quality scoring - - SEO optimization suggestions - - `OptimizerViewSet` for optimization operations - -- **Publisher Module** (`modules/publisher/`) - - Publishing records tracking (`PublishingRecord` model) - - Deployment records (`DeploymentRecord` model) - - `PublisherViewSet`, `PublishingRecordViewSet`, `DeploymentRecordViewSet` - -- **Site Builder Module** (`modules/site_builder/`) - - Site blueprint management (`SiteBlueprint` model) - - Page blueprint creation (`PageBlueprint` model) - - Site structure planning with clusters and taxonomies - - `SiteBlueprintViewSet`, `PageBlueprintViewSet`, `SiteAssetView`, `SiteBuilderMetadataView` - -- **Automation Module** (`modules/automation/`) - - Automation rules engine (`AutomationRule` model) - - Scheduled tasks (`ScheduledTask` model) - - Rule execution via Celery beat - - `AutomationRuleViewSet`, `ScheduledTaskViewSet` - -- **Integration Module** (`modules/integration/`) - - WordPress integration support via `SiteIntegration` model - - Connection testing: `POST /integrations/test-connection/` - - Structure update: `POST /integrations/{id}/update-structure/` - - Content type summary: `GET /integrations/{id}/content-types/` - - Bidirectional sync support with sync status and logs - - Integration services: `IntegrationService`, `SyncService`, `ContentSyncService`, `SyncHealthService` - - Site-level sync endpoints: `/sites/{id}/sync/status/`, `/sites/{id}/sync/run/` - - `IntegrationViewSet` with comprehensive sync management - -- **System Module** (`modules/system/`) - - AI prompt management (`AIPrompt` model with types: cluster, ideas, content, image_prompts) - - Integration settings (`IntegrationSettings` model for OpenAI/Runware config) - - Author profiles for content style (`AuthorProfile` model) - - Content strategies (`Strategy` model) - - System and account settings endpoints - - ViewSets: `AIPromptViewSet`, `AuthorProfileViewSet`, `StrategyViewSet` - - Settings ViewSets: `SystemSettingsViewSet`, `AccountSettingsViewSet`, `UserSettingsViewSet`, `ModuleSettingsViewSet`, `AISettingsViewSet` - -- **Billing Module** (`modules/billing/`) - - Credit-based usage system - - Credit transactions tracking (`CreditTransaction` model) - - Usage analytics (`CreditUsageLog` model) - - `CreditService` for credit operations - - Monthly credit replenishment via Celery beat task - - ViewSets: `CreditBalanceViewSet`, `CreditUsageViewSet`, `CreditTransactionViewSet` - -- **AI Framework** (`ai/`) - - `AIEngine` - Central orchestrator for all AI operations with progress tracking - - `AICore` - Unified API client for OpenAI/Runware with rate calculation - - `BaseAIFunction` - Abstract interface for AI function implementations - - AI function registry system with 5 core functions - - Progress tracking with Celery task state updates - - Cost tracking (token usage and pricing) - - Console step tracker for debugging (`ConsoleStepTracker`) - - Prompt registry system (`PromptRegistry`) - - Model configuration per account via `IntegrationSettings` - - Validators for payload validation - - Celery task wrapper: `run_ai_task` - -- **AI Functions** (`ai/functions/`) - - `auto_cluster.py` - Semantic keyword clustering - - `generate_ideas.py` - Content idea generation from clusters - - `generate_content.py` - Full blog post generation with HTML - - `generate_image_prompts.py` - Extract image prompts from content - - `generate_images.py` - Image generation via DALL-E 3 / Runware - -- **API Infrastructure** (`api/`) - - Unified response format: `{success, data, message, request_id}` - - Response helpers: `success_response()`, `error_response()`, `paginated_response()` - - Request ID tracking via `RequestIDMiddleware` - - Resource tracking via `ResourceTrackingMiddleware` - - Rate limiting with `DebugScopedRateThrottle` (bypass in DEBUG mode) - - Custom pagination: `CustomPageNumberPagination` (default: 10, max: 100) - - OpenAPI 3.0 schema via drf-spectacular - - Swagger UI at `/api/docs/` - - ReDoc at `/api/redoc/` - - Centralized exception handling with unified error format - -- **Celery Integration** (`celery.py`) - - Async task processing for AI operations - - Celery beat for scheduled tasks - - Beat schedule: monthly credit replenishment, automation rule execution (every 5 min) - - Task autodiscovery from all installed apps - -#### Frontend Core -- **React 19 Application** (`frontend/`) - - Vite 6.1.0 build system with fast HMR - - TypeScript 5.7.2 for type safety - - React Router v7.9.5 for client-side routing - - Zustand 5.0.8 state management with localStorage persistence - - Lazy loading for all module pages (code splitting) - - Tailwind CSS 4.0.8 for styling - -- **Authentication** (`pages/AuthPages/`, `store/authStore.ts`) - - JWT-based authentication with automatic token refresh - - Login/signup pages - - Protected routes with `ProtectedRoute` component - - Auth store with Zustand (user, token, refreshToken state) - - Auto token refresh on 401 errors - -- **Module Pages** - - **Planner** (`pages/Planner/`): Keywords list, Clusters view, Ideas dashboard, Keyword opportunities - - **Writer** (`pages/Writer/`): Tasks dashboard, Content viewer with HTML preview, Drafts, Published list, Images gallery - - **Linker** (`pages/Linker/`): Link analysis dashboard, Content list with link suggestions - - **Optimizer** (`pages/Optimizer/`): Optimization dashboard, Content selector, Analysis preview - - **Thinker** (`pages/Thinker/`): AI prompts editor, Author profiles, Strategies, Image testing - - **Billing** (`pages/Billing/`): Credit balance, Transaction history, Usage analytics - - **Automation** (`pages/Automation/`): Rules management, Scheduled tasks list - - **Settings** (`pages/Settings/`): General, Users, Subscriptions, System, AI settings, API monitor - -- **UI Components** (`components/`) - - Reusable components library - - ApexCharts for data visualization - - Heroicons for icons - - Responsive layouts with Tailwind - - Form components with validation - - Modal system - - Loading states and skeletons - -- **API Integration** (`api/`, `services/`) - - Axios client with automatic token injection - - Request/response interceptors - - Automatic token refresh on 401 - - Module-specific API clients (planner, writer, linker, etc.) - - `fetchAPI` wrapper with unified format handling - - Error handling with toast notifications - -- **State Management** (`store/`) - - `authStore` - User authentication state - - `siteStore` - Site and sector context - - Module-specific stores (plannerStore, writerStore, etc.) - - Global app state (loading, errors, notifications) - - Zustand persist middleware for localStorage - -#### WordPress Plugin -- **Core Plugin** (`igny8-wp-integration/`) - - Plugin version 1.0.0 - - WordPress 5.0+ compatibility - - PHP 7.4+ requirement - - Main file: `igny8-bridge.php` - - Uninstall cleanup: `uninstall.php` - -- **API Client** (`includes/class-igny8-api.php`) - - `Igny8API` class for backend communication - - API key authentication (primary method) - - JWT token authentication support (fallback) - - Automatic retry on 401 errors - - Request/response parsing with unified format support - - Methods: `connect()`, `get()`, `post()`, `put()`, `delete()`, `parse_response()` - -- **REST API Endpoints** (`includes/class-igny8-rest-api.php`) - - `GET /wp-json/igny8/v1/site-metadata/` - Export site structure - - `GET /wp-json/igny8/v1/post-by-task-id/{id}` - Lookup by task ID - - `GET /wp-json/igny8/v1/post-by-content-id/{id}` - Lookup by content ID - - `POST /wp-json/igny8/v1/posts/` - Create post from IGNY8 - - `PUT /wp-json/igny8/v1/posts/{id}` - Update post from IGNY8 - - API key authentication via `X-IGNY8-API-Key` header - -- **Synchronization** (`sync/`) - - **WP → IGNY8** (`post-sync.php`): Post status sync on `save_post` hook - - **IGNY8 → WP** (`igny8-to-wp.php`): Content publishing via REST API - - **Taxonomy Sync** (`taxonomy-sync.php`): Taxonomy term synchronization - - **Hooks** (`hooks.php`): WordPress action/filter hook registration - - Bidirectional sync with status mapping - - Post meta tracking: `_igny8_task_id`, `_igny8_content_id`, `_igny8_wordpress_status`, `_igny8_last_synced`, `_igny8_managed` - -- **Admin Interface** (`admin/`) - - Settings page at Settings → IGNY8 API (`settings.php`) - - API key, email, password configuration - - Connection testing button - - Post columns showing IGNY8 status (`class-admin-columns.php`) - - Post meta boxes in editor (`class-post-meta-boxes.php`) - - Admin class: `Igny8Admin` (`class-admin.php`) - -- **Data Collection** (`data/`) - - Full site metadata collection (`site-collection.php`) - - Post type discovery with counts - - Taxonomy discovery with counts - - Link graph extraction (`link-graph.php`) - - Semantic mapping (`semantic-mapping.php`) - - WooCommerce integration support (`woocommerce.php`) - -- **Supporting Classes** (`includes/`) - - `Igny8Site` - Site data collection and export - - `Igny8Webhooks` - Webhook handlers (legacy) - - `Igny8WebhookLogs` - Webhook logging - - `Igny8LinkQueue` - Link processing queue - - Helper functions in `functions.php` - -#### Infrastructure -- **Docker Deployment** (`docker-compose.app.yml`) - - Multi-container setup for development - - Services: PostgreSQL, Redis, Django backend, Celery worker, Celery beat - - Volume persistence for database and media - - Network isolation - -- **Database** (PostgreSQL 14+) - - Multi-tenant data model with account isolation - - Optimized indexes for common queries - - JSON fields for flexible configuration storage - - Database migrations system - -- **Task Queue** (Celery + Redis) - - Redis as message broker - - Celery worker for async tasks - - Celery beat for scheduled tasks - - Progress tracking with task state updates - -### Documentation -- **Master Documentation** (`master-docs/`) - - Complete architecture documentation - - API reference with endpoint details - - Frontend and backend implementation guides - - WordPress plugin integration guide - -- **Project Documentation** - - `MASTER_REFERENCE.md` - Complete system architecture and navigation - - `README.md` - Quick start and setup guide - - `CHANGELOG.md` - This file - -### Changed -- N/A (Initial release) - -### Deprecated -- N/A (Initial release) - -### Removed -- N/A (Initial release) - -### Fixed -- N/A (Initial release) - -### Security -- JWT token authentication with 15-minute expiry and refresh tokens -- Secure API key storage in WordPress using encryption helpers -- CSRF protection on all forms -- SQL injection prevention via Django ORM -- XSS protection via Django template escaping -- HTTPS enforcement in production -- Account isolation at database level with automatic filtering -- Permission-based access control with role matrix -- Rate limiting to prevent abuse -- Request ID tracking for audit trails - ---- - -## Version History - -- **1.0.0** (2025-11-24) - Initial release with complete feature set - ---- - -## Versioning Strategy - -- **Major version** (X.0.0) - Breaking changes, major architectural changes -- **Minor version** (1.X.0) - New features, new modules, backward compatible -- **Patch version** (1.0.X) - Bug fixes, minor improvements, documentation updates - ---- - -## Upgrade Notes - -### Upgrading to 1.0.0 -This is the initial release. No upgrade path required. - -Future upgrade notes will be documented here for each version. - ---- - -## Future Roadmap - -Planned features and improvements (subject to change): - -- Enhanced analytics and reporting -- Additional AI model integrations -- Stripe payment integration -- Advanced automation workflows -- Mobile app support -- API webhooks -- Collaborative editing features -- Multi-language support - -See project board for current priorities and development status. - ---- - -**Note:** This changelog is maintained according to [Keep a Changelog](https://keepachangelog.com/) principles and only updated after user confirmation of completed features and fixes. - diff --git a/docs/automation/AI-FUNCTIONS-COMPLETE-REFERENCE.md b/docs/ai/AI-FUNCTIONS-COMPLETE-REFERENCE.md similarity index 100% rename from docs/automation/AI-FUNCTIONS-COMPLETE-REFERENCE.md rename to docs/ai/AI-FUNCTIONS-COMPLETE-REFERENCE.md diff --git a/frontend/src/pages/Sites/EXPECTED-PAGES-LIST.md b/frontend/src/pages/Sites/EXPECTED-PAGES-LIST.md deleted file mode 100644 index d4ca5536..00000000 --- a/frontend/src/pages/Sites/EXPECTED-PAGES-LIST.md +++ /dev/null @@ -1,61 +0,0 @@ -# Expected Frontend Pages - Sites Module - -## Currently Available Pages (4) - -1. **Site List** (`/sites`) - Basic list with filters -2. **Site Builder** (`/sites/builder`) - Placeholder only -3. **Blueprints** (`/sites/blueprints`) - Placeholder only -4. **Sites Management** (`/settings/sites`) - Should be merged into Site List - -## Expected Pages (16 Total) - -### Site Management Pages (12) - -| Page | Route | Status | Description | -|------|-------|--------|-------------| -| **All Sites** | `/sites` | ✅ Exists | Site list with filters, search, type badges | -| **Site Dashboard** | `/sites/:id` | ✅ Exists | Individual site dashboard with stats | -| **Site Content** | `/sites/:id/content` | ✅ Exists | Content list for a site | -| **Site Editor** | `/sites/:id/editor` | ✅ Exists | Site content editor | -| **Page Manager** | `/sites/:id/pages` | ✅ Exists | Manage pages for a site | -| **New Page** | `/sites/:id/pages/new` | ✅ Exists | Create new page | -| **Edit Page** | `/sites/:id/pages/:pageId/edit` | ✅ Exists | Edit existing page | -| **Post Editor** | `/sites/:id/posts/:postId` | ✅ Exists | View/edit post | -| **Edit Post** | `/sites/:id/posts/:postId/edit` | ✅ Exists | Edit post | -| **Site Preview** | `/sites/:id/preview` | ✅ Exists | Preview site | -| **Site Settings** | `/sites/:id/settings` | ✅ Exists | Site settings (General, SEO, OG, Schema, Integrations) | -| **Site Management** | `/sites/manage` | ✅ Exists | Site management dashboard | - -### Site Builder Pages (3) - -| Page | Route | Status | Description | -|------|-------|--------|-------------| -| **Site Builder Wizard** | `/sites/builder` | ⚠️ Placeholder | AI-powered site creation wizard (needs migration) | -| **Site Builder Preview** | `/sites/builder/preview` | ⚠️ Placeholder | Preview site during building (needs migration) | -| **Blueprints** | `/sites/blueprints` | ⚠️ Placeholder | View and manage all site blueprints (needs migration) | - -### Settings Pages (1) - -| Page | Route | Status | Description | -|------|-------|--------|-------------| -| **Sites Settings** | `/settings/sites` | ❌ Should be removed | Site configuration (should be merged into Site List) | - -## Issues to Fix - -1. **Sites in Settings dropdown** - Broken UX, should be removed -2. **Site management features** - Should be merged into Site List page -3. **Wizard is placeholder** - Needs full migration from site-builder container -4. **Pages incomplete** - Many pages exist but lack full functionality - -## Required Features for Site List - -- Create new site (modal) -- Edit site (modal) -- Delete site (with confirmation) -- Toggle site active/inactive -- Configure sectors for site (modal) -- View site details -- Site cards with all information -- Industry/sector badges -- Status indicators - diff --git a/frontend/src/pages/Sites/FIXES-SUMMARY.md b/frontend/src/pages/Sites/FIXES-SUMMARY.md deleted file mode 100644 index 392a50ca..00000000 --- a/frontend/src/pages/Sites/FIXES-SUMMARY.md +++ /dev/null @@ -1,92 +0,0 @@ -# Sites Module Fixes Summary - -## ✅ Completed Fixes - -### 1. Removed Sites from Settings Dropdown -- **File**: `frontend/src/layout/AppSidebar.tsx` -- **Change**: Removed "Sites" from Settings submenu -- **Result**: Sites now only accessible from main "Sites" menu in WORKFLOWS section - -### 2. Merged Site Management into Site List Page -- **File**: `frontend/src/pages/Sites/List.tsx` -- **Changes**: - - Added all site management functionality from Settings/Sites.tsx - - Added create/edit site modals - - Added sectors configuration modal - - Added site details/edit modal with delete option - - Added toggle switch for active/inactive status - - Updated site cards to match Settings/Sites.tsx style - - Added industry/sector badges - - Added site type badges - - Added integration count badges - - Added "Create with Builder" button alongside "Add Site" - - Added info alert about site configuration - -### 3. Updated Site Cards -- **Features Added**: - - Site icon - - Site description display - - Domain display - - Industry name badge - - Sector count badge (X / 5 Sectors) - - Integration count badge - - Site type badge (Site Builder / WordPress) - - Active/Inactive status indicator with colored circle - - Settings button (opens sectors modal) - - Details button (opens edit modal) - - Toggle switch for active/inactive - -## ⚠️ Still Needs Work - -### 1. Site Builder Wizard Migration -- **Current Status**: Placeholder only (`/sites/builder`) -- **Needs**: Full migration from `site-builder` container -- **Files to Migrate**: - - `site-builder/src/pages/wizard/WizardPage.tsx` - - `site-builder/src/pages/wizard/steps/*.tsx` (4 step components) - - `site-builder/src/state/builderStore.ts` - - `site-builder/src/api/builder.api.ts` - - `site-builder/src/types/siteBuilder.ts` -- **Target Location**: `frontend/src/pages/Sites/Builder/Wizard.tsx` - -### 2. Blueprints Page -- **Current Status**: Placeholder only (`/sites/blueprints`) -- **Needs**: Full implementation to list and manage site blueprints - -### 3. Site Builder Preview -- **Current Status**: Placeholder only (`/sites/builder/preview`) -- **Needs**: Full preview canvas implementation - -### 4. Other Site Pages -- Many pages exist but may need complete functionality: - - Site Dashboard (`/sites/:id`) - - Site Content (`/sites/:id/content`) - - Site Editor (`/sites/:id/editor`) - - Page Manager (`/sites/:id/pages`) - - Post Editor (`/sites/:id/posts/:postId`) - - Site Preview (`/sites/:id/preview`) - - Site Settings (`/sites/:id/settings`) - -## 📋 Expected Pages List - -See `EXPECTED-PAGES-LIST.md` for complete list of all expected frontend pages. - -## 🎯 Next Steps - -1. **Priority 1**: Migrate Site Builder Wizard - - Copy wizard components from site-builder container - - Adapt to main app structure - - Ensure API calls work correctly - - Test full wizard flow - -2. **Priority 2**: Implement Blueprints Page - - List all site blueprints - - Show blueprint status - - Allow editing/deleting blueprints - - Link to wizard for creating new blueprints - -3. **Priority 3**: Verify Other Pages - - Check each page has complete functionality - - Add missing features - - Ensure proper navigation between pages - diff --git a/sites/MIGRATION_SUMMARY.md b/sites/MIGRATION_SUMMARY.md deleted file mode 100644 index 7605fa92..00000000 --- a/sites/MIGRATION_SUMMARY.md +++ /dev/null @@ -1,116 +0,0 @@ -# Site Builder → Sites Container Migration Summary - -## Overview -Successfully merged Site Builder container into Sites container. Sites is now the primary container hosting both: -- **Public Site Renderer** (no auth required) -- **Site Builder** (auth required) - -## Structure Changes - -### New Directory Structure -``` -sites/src/ -├── builder/ # Site Builder (from site-builder/src/) -│ ├── pages/ # Wizard, Preview, Dashboard -│ ├── components/ # Builder-specific components -│ ├── state/ # Zustand stores -│ ├── api/ # API client with conditional auth -│ ├── types/ # TypeScript types -│ └── App.css # Builder styles -├── renderer/ # Sites Renderer (existing) -│ ├── pages/ # SiteRenderer component -│ ├── loaders/ # Site definition loaders -│ ├── utils/ # Layout renderer utilities -│ └── types/ # Renderer types -├── shared/ # Shared components -│ └── ProtectedRoute.tsx -├── App.tsx # Unified router -└── main.tsx # Entry point -``` - -## Routing Structure - -### Public Routes (No Auth) -- `/:siteId/*` - Site renderer (public sites) -- `/` - Root page - -### Builder Routes (Auth Required) -- `/builder` - Wizard page -- `/builder/preview` - Preview canvas -- `/builder/dashboard` - Blueprint history - -## Key Changes - -### 1. Unified Router (`App.tsx`) -- Single router handles both builder and renderer routes -- Builder routes wrapped in `ProtectedRoute` component -- Builder routes wrapped in `BuilderLayout` component -- Code-splitting for builder routes (lazy loading) - -### 2. Authentication -- `ProtectedRoute` component checks for JWT token in localStorage -- Builder API client conditionally includes auth headers -- Public renderer routes have no authentication - -### 3. API Clients -- Builder API (`builder/api/builder.api.ts`): Includes auth token if available -- Renderer API (`renderer/loaders/loadSiteDefinition.ts`): No auth required - -### 4. Build Configuration -- Updated `vite.config.ts` with code-splitting -- Builder routes split into separate chunk -- Supports both `sites.igny8.com` and `builder.igny8.com` domains - -### 5. Docker Configuration -- Removed `igny8_site_builder` service from docker-compose -- Updated `igny8_sites` service comment -- Single container now handles both functions - -## Backend (No Changes) -- Backend Django views remain unchanged -- API endpoints: `/api/v1/site-builder/` (same as before) -- Database tables: No changes -- Authentication: Same JWT-based auth - -## Migration Checklist - -✅ Created merged directory structure -✅ Moved site-builder files to sites/src/builder/ -✅ Created unified App.tsx with routing -✅ Created ProtectedRoute component -✅ Created BuilderLayout component -✅ Merged package.json dependencies -✅ Updated vite.config.ts with code-splitting -✅ Updated main.tsx entry point -✅ Updated docker-compose.app.yml (removed site_builder service) -✅ Updated API clients with conditional authentication -✅ Updated index.css with builder styles - -## Next Steps - -1. **Test Builder Functionality** - - Navigate to `/builder` (should require auth) - - Test wizard flow - - Test preview - - Test dashboard - -2. **Test Renderer Functionality** - - Navigate to `/:siteId/*` (should work without auth) - - Test site loading from filesystem - - Test site loading from API - -3. **Build & Deploy** - - Build Docker image: `docker build -t igny8-sites-dev:latest -f Dockerfile.dev .` - - Update docker-compose: `docker compose -f docker-compose.app.yml up -d igny8_sites` - -4. **Cleanup** (Optional) - - Remove `/site-builder` directory after verification - - Update documentation - -## Notes - -- **No Backward Compatibility**: Old site-builder container is removed -- **Backend Unchanged**: All Django views and models remain the same -- **Code-Splitting**: Builder code is lazy-loaded, so public sites don't load builder code -- **Route Conflicts**: Builder routes are namespaced under `/builder/*` to avoid conflicts -