VErsion 1.3.2

This commit is contained in:
IGNY8 VPS (Salman)
2026-01-03 09:35:43 +00:00
parent f1ba0aa531
commit f10916bfab
12 changed files with 957 additions and 110 deletions

View File

@@ -1,7 +1,7 @@
# IGNY8 Change Log # IGNY8 Change Log
**Current Version:** 1.3.1 **Current Version:** 1.3.2
**Last Updated:** January 2, 2026 **Last Updated:** January 3, 2026
--- ---
@@ -9,6 +9,7 @@
| Version | Date | Summary | | Version | Date | Summary |
|---------|------|---------| |---------|------|---------|
| 1.3.2 | Jan 3, 2026 | **Major** - Publishing Scheduler, Onboarding Wizard, Content Calendar, Design System Consolidation, Site Dashboard redesign |
| 1.3.1 | Jan 2, 2026 | **Design System Consolidation** - Updated .rules with comprehensive design system & component rules, ESLint enforcement | | 1.3.1 | Jan 2, 2026 | **Design System Consolidation** - Updated .rules with comprehensive design system & component rules, ESLint enforcement |
| 1.3.0 | Jan 1, 2026 | **Major** - Automation overhaul, AI provider integrations (Anthropic/Bria), Model Registry, Global Progress tracking, CSS globalization | | 1.3.0 | Jan 1, 2026 | **Major** - Automation overhaul, AI provider integrations (Anthropic/Bria), Model Registry, Global Progress tracking, CSS globalization |
| 1.2.2 | Dec 28, 2025 | **NEW** - Full notifications page with filtering and bulk actions | | 1.2.2 | Dec 28, 2025 | **NEW** - Full notifications page with filtering and bulk actions |
@@ -33,6 +34,315 @@
--- ---
## v1.3.2 - January 3, 2026
### Major Release: Publishing Scheduler, Onboarding Wizard & Content Calendar
This release introduces automated publishing scheduling, a streamlined onboarding wizard for new users, a content calendar for managing publishing schedules, comprehensive design system consolidation, and site-specific dashboard improvements.
---
### 📅 Publishing Scheduler System (NEW)
**Backend: Publishing Scheduler Tasks**
- **NEW FILE**: `backend/igny8_core/tasks/publishing_scheduler.py`
- `schedule_approved_content` - Hourly task that schedules approved content based on site's publishing settings
- `process_scheduled_publications` - Every 5 minutes, publishes content that's due
- `update_content_site_status` - Callback task for status updates after WordPress publish
- Calculates available slots based on publish_days, publish_time_slots, and daily/weekly/monthly limits
- Respects site-specific publishing limits
**Content Model Updates:**
- **NEW MIGRATION**: `0014_add_approved_status.py`
- Added `approved` status to Content model: `draft → review → approved → published`
- Created `ImagePrompts` proxy model
- **NEW MIGRATION**: `0015_add_publishing_scheduler_fields.py`
- `site_status` field: `not_published | scheduled | publishing | published | failed`
- `scheduled_publish_at` field: DateTime for scheduled publishing
- `site_status_updated_at` field: Timestamp for status tracking
**PublishingSettings Model (NEW):**
- **NEW MODEL**: `backend/igny8_core/business/integration/models.py`
- `auto_approval_enabled` - Auto-approve content after review
- `auto_publish_enabled` - Auto-publish approved content
- `daily_publish_limit`, `weekly_publish_limit`, `monthly_publish_limit`
- `publish_days` - JSON array of allowed days (mon, tue, wed, etc.)
- `publish_time_slots` - JSON array of times (09:00, 14:00, 18:00)
- Default: 3/day, 15/week, 50/month, Mon-Fri at 9am/2pm/6pm
**DefaultsService (NEW):**
- **NEW FILE**: `backend/igny8_core/business/integration/services/defaults_service.py`
- `create_site_with_defaults()` - Creates site with publishing and automation settings
- `apply_defaults_to_existing_site()` - Applies defaults to existing sites
- Optimized defaults for automated content publishing
**API Endpoints (NEW):**
- `GET /api/v1/integration/sites/{site_id}/publishing-settings/` - Get publishing settings
- `PUT/PATCH /api/v1/integration/sites/{site_id}/publishing-settings/` - Update settings
- `POST /api/v1/writer/content/{id}/schedule/` - Schedule content for publishing
- `POST /api/v1/writer/content/{id}/unschedule/` - Remove from schedule
- `GET /api/v1/writer/content/?status__in=` - Filter by multiple statuses
**Celery Beat Schedule:**
- Added `schedule-approved-content` task (hourly)
- Added `process-scheduled-publications` task (every 5 minutes)
---
### 🧙 Onboarding Wizard (NEW)
**NEW COMPONENTS**: `frontend/src/components/onboarding/`
**OnboardingWizard.tsx:**
- 5-step wizard for new user setup
- Manages wizard state and navigation
- Creates site with optimized defaults
**Step Components:**
- `Step1Welcome.tsx` - Welcome screen with feature overview
- `Step2AddSite.tsx` - Site creation with industry/sector selection
- Uses SelectDropdown for industry
- Badge-based sector selection (up to 5)
- Shows optimized defaults info card
- `Step3ConnectIntegration.tsx` - WordPress plugin installation
- API key display with copy button
- 4-step installation guide
- Connection test functionality
- Optional - can skip
- `Step4AddKeywords.tsx` - Initial keyword entry
- Multi-keyword input with paste support
- Keyword suggestions
- Optional - can skip
- `Step5Complete.tsx` - Success screen with next steps
- Setup summary
- Expected timeline
- Quick links to key areas
**Route:** `/setup/wizard` - New onboarding wizard page
---
### 📆 Content Calendar (NEW)
**NEW PAGE**: `frontend/src/pages/Publisher/ContentCalendar.tsx`
- Calendar view of scheduled content
- List view with drag-and-drop reordering
- Schedule/unschedule content
- View scheduled vs published vs approved content
- Month navigation
- Stats: scheduled, publishing, published counts
**Features:**
- Drag content from approved list to calendar dates
- Click to view content details
- Remove from queue functionality
- Publishing status badges (Scheduled, Publishing, Published, Failed)
- Real-time updates
**Route:** `/publisher/content-calendar` (main)
**Redirect:** `/sites/:id/publishing-queue``/publisher/content-calendar`
---
### 🎨 Design System Consolidation
**CSS Consolidation:**
- **NEW FILE**: `frontend/src/styles/design-system.css` (836 lines)
- Single source of truth for all design tokens
- Only 6 base hex values - everything else derived
- Tailwind default colors DISABLED
- Color scales: brand-*, success-*, warning-*, error-*, purple-*, gray-*
- Module-specific color schemes
- Dark mode support
- **DELETED FILES**:
- `frontend/src/styles/global.css`
- `frontend/src/styles/tokens.css`
- `frontend/src/index.css` (571 lines removed)
**ESLint Plugin (NEW):**
- **NEW FILE**: `frontend/eslint/eslint-plugin-igny8-design-system.cjs`
- `no-tailwind-default-colors` - Blocks blue-*, red-*, green-*, etc.
- `no-hardcoded-colors` - Blocks inline hex colors
- `no-lucide-imports` - Enforces local icon imports
- `no-icon-children` - Blocks children in icon components
**Module Color Scheme:**
- Planner (Keywords/Clusters/Ideas): Purple theme
- Writer (Tasks/Content/Images): Green theme
- Automation: Blue theme
- Publisher: Brand/Orange theme
- Unified visual distinction across pipeline
**Component Updates:**
- 100+ files updated for semantic color tokens
- All hardcoded Tailwind colors replaced
- All inline hex colors replaced
- Badge, Button, Card components updated
---
### 🏠 Site Dashboard Redesign
**Site Dashboard (`/sites/:id`):**
- **NEW**: SiteInfoBar component for site-specific pages
- **NEW**: Quick Actions grid (2-column card layout)
- **FIXED**: Race condition in Dashboard.tsx - async loadSiteData using stale closure
- AI Operations widget now loads real data from getDashboardStats API
- Proper site filtering for all widgets
**Site Settings Page:**
- Industry/Sector selector redesigned to match wizard style
- SelectDropdown for industry selection
- Badge-based sector selection with visual feedback
- Publishing Settings tab (NEW)
- Auto-approval toggle
- Auto-publish toggle
- Daily/Weekly/Monthly limits
- Publish days selection
- Time slots configuration
**Site List Page:**
- Enhanced site cards with setup progress
- WordPress connection status indicators
- Quick actions per site
---
### 📄 New Pages & Routes
| Route | File | Description |
|-------|------|-------------|
| `/setup/wizard` | `Setup/SetupWizard.tsx` | Onboarding wizard |
| `/publisher/content-calendar` | `Publisher/ContentCalendar.tsx` | Content calendar |
| `/ui-elements` | `UIElements.tsx` | Design system reference (internal) |
**Legacy Redirects:**
- `/sites/:id/publishing-queue``/publisher/content-calendar`
---
### 🔧 Backend Improvements
**New Migrations:**
- `0014_add_approved_status.py` - Content approved status
- `0015_add_publishing_scheduler_fields.py` - Scheduling fields
- `0003_add_publishing_settings.py` - PublishingSettings model
**Celery Configuration:**
- Added publishing scheduler tasks to celery beat
- New `tasks/__init__.py` consolidating all task imports
**WordPress Publishing:**
- Updated `publish_content_to_wordpress` to update `site_status`
- On success: site_status='published'
- On failure: site_status='failed'
---
### 🐛 Bug Fixes
**Dashboard:**
- Fixed race condition where async loadSiteData used stale siteId closure
- Now passes currentSiteId as parameter to loadSiteData function
- Fixed site 5 showing site 21 data issue
**Content Filtering:**
- Added `status__in` query parameter support for multiple status filtering
- Content serializer includes new `site_status` and `scheduled_publish_at` fields
**UI/UX:**
- Fixed industry/sector selector styling inconsistency
- Fixed Site Dashboard quick actions layout
- Fixed notification dropdown styling in dark mode
---
### 📚 Documentation Updates
**New Documentation:**
- `docs/30-FRONTEND/COMPONENT-SYSTEM.md` - Complete UI components reference
- `docs/30-FRONTEND/DESIGN-GUIDE.md` - Design system guidelines
- `docs/50-DEPLOYMENT/WORDPRESS-INTEGRATION-FLOW.md` - WordPress setup guide
- `docs/plans/FINAL-PRELAUNCH.md` - Pre-launch checklist
- `docs/plans/implemented/FRONTEND-AUDIT-PLAN.md` - Frontend audit plan
- `docs/plans/implemented/PUBLISHING-ONBOARDING-IMPLEMENTATION-PLAN.md` - Implementation plan
**Moved/Reorganized:**
- `IGNY8-APP.md``docs/00-SYSTEM/IGNY8-APP.md`
- `fixes-kb.md``docs/90-REFERENCE/FIXES-KB.md`
- Various plan docs → `docs/plans/implemented/`
**Updated Documentation:**
- `docs/INDEX.md` - Added new doc links, updated version
- `docs/30-FRONTEND/DESIGN-TOKENS.md` - Expanded with color scales
- `frontend/src/styles/README.md` - Updated for design-system.css
---
### 📁 Files Summary
**New Files (20+):**
```
backend/igny8_core/tasks/__init__.py
backend/igny8_core/tasks/publishing_scheduler.py
backend/igny8_core/business/integration/services/defaults_service.py
backend/igny8_core/modules/writer/migrations/0014_add_approved_status.py
backend/igny8_core/modules/writer/migrations/0015_add_publishing_scheduler_fields.py
backend/igny8_core/business/content/migrations/0003_add_publishing_settings.py
frontend/src/components/onboarding/OnboardingWizard.tsx
frontend/src/components/onboarding/steps/Step1Welcome.tsx
frontend/src/components/onboarding/steps/Step2AddSite.tsx
frontend/src/components/onboarding/steps/Step3ConnectIntegration.tsx
frontend/src/components/onboarding/steps/Step4AddKeywords.tsx
frontend/src/components/onboarding/steps/Step5Complete.tsx
frontend/src/components/onboarding/steps/index.ts
frontend/src/components/common/SiteInfoBar.tsx
frontend/src/components/ui/button/IconButton.tsx
frontend/src/components/ui/tooltip/CalendarItemTooltip.tsx
frontend/src/pages/Publisher/ContentCalendar.tsx
frontend/src/pages/Setup/SetupWizard.tsx
frontend/src/pages/UIElements.tsx
frontend/src/styles/design-system.css
frontend/eslint/eslint-plugin-igny8-design-system.cjs
frontend/audit-results/*.txt
```
**Major Changes (50+ files):**
- All frontend components updated for semantic colors
- Site Dashboard, Settings, Content pages redesigned
- Automation page color scheme updated
- 100+ files with color token replacements
**Deleted Files:**
- `frontend/src/styles/global.css`
- `frontend/src/styles/tokens.css`
- `frontend/src/index.css` (content moved to design-system.css)
- Various old logo files
- `docs/plans/final-fixes.md` (moved to implemented)
- `docs/plans/flexible-model-configuration-plan.md` (moved)
---
### Git Reference
```bash
# Commits since v1.3.0 (21 commits)
git log af408d0747429d94ab9168884c8f0e8e97add810..HEAD --oneline
# Key commits:
# f1ba0aa5 - Section 2 Completed
# 4d6ee214 - Section 2 Part 3
# e2d462d8 - Update dashboard and automation colors
# f28f641f - Components standardization 2
# e9606977 - Global Styling part 1
# f81fffc9 - Section 1 & 2 - Migration Run
# 03400169 - Section 3-8 - Migration Run
```
---
## v1.3.1 - January 2, 2026 ## v1.3.1 - January 2, 2026
### Design System Consolidation (Pre-Launch Section 1) ### Design System Consolidation (Pre-Launch Section 1)

View File

@@ -1,7 +1,7 @@
# Automation Module # Automation Module
**Last Verified:** January 1, 2026 **Last Verified:** January 3, 2026
**Version:** 1.3.0 **Version:** 1.3.2
**Status:** ✅ Active **Status:** ✅ Active
**Backend Path:** `backend/igny8_core/business/automation/` **Backend Path:** `backend/igny8_core/business/automation/`
**Frontend Path:** `frontend/src/pages/Automation/` **Frontend Path:** `frontend/src/pages/Automation/`
@@ -16,6 +16,7 @@
| Service | `business/automation/services/automation_service.py` | `AutomationService` | | Service | `business/automation/services/automation_service.py` | `AutomationService` |
| Logger | `business/automation/services/automation_logger.py` | `AutomationLogger` | | Logger | `business/automation/services/automation_logger.py` | `AutomationLogger` |
| Celery Tasks | `business/automation/tasks.py` | `run_automation_task`, `check_scheduled_automations` | | Celery Tasks | `business/automation/tasks.py` | `run_automation_task`, `check_scheduled_automations` |
| Publishing Tasks | `igny8_core/tasks/publishing_scheduler.py` | Scheduled publishing (v1.3.2) |
| Frontend | `pages/Automation/AutomationPage.tsx` | Main automation UI | | Frontend | `pages/Automation/AutomationPage.tsx` | Main automation UI |
| Progress Bar | `components/Automation/GlobalProgressBar.tsx` | Full pipeline progress | | Progress Bar | `components/Automation/GlobalProgressBar.tsx` | Full pipeline progress |
| Processing Card | `components/Automation/CurrentProcessingCard.tsx` | Real-time progress | | Processing Card | `components/Automation/CurrentProcessingCard.tsx` | Real-time progress |
@@ -42,9 +43,9 @@ Keywords → Clusters → Ideas → Tasks → Content → Image Prompts → Imag
| 4 | Tasks → Content | `GenerateContentFunction` | Per 100 words | | 4 | Tasks → Content | `GenerateContentFunction` | Per 100 words |
| 5 | Content → Image Prompts | `GenerateImagePromptsFunction` | Per prompt | | 5 | Content → Image Prompts | `GenerateImagePromptsFunction` | Per prompt |
| 6 | Image Prompts → Images | `process_image_generation_queue` | Per image | | 6 | Image Prompts → Images | `process_image_generation_queue` | Per image |
| 7 | Review → Published | None (auto-approve) | None | | 7 | Review → Published | Publishing Scheduler (v1.3.2) | None |
**Note:** Stage 7 changed from "Manual Review Gate" to auto-approve and publish in v1.3.0. **Note:** Stage 7 uses the Publishing Scheduler with `PublishingSettings` to auto-approve and schedule content for publication. See [PUBLISHER.md](PUBLISHER.md) for details.
--- ---

View File

@@ -1,7 +1,7 @@
# Integrations Module # Integrations Module
**Last Verified:** January 1, 2026 **Last Verified:** January 3, 2026
**Version:** 1.3.0 **Version:** 1.3.2
**Status:** ✅ Active **Status:** ✅ Active
**Backend Path:** `backend/igny8_core/modules/integration/` + `backend/igny8_core/business/integration/` **Backend Path:** `backend/igny8_core/modules/integration/` + `backend/igny8_core/business/integration/`
**Frontend Path:** `frontend/src/pages/Settings/IntegrationSettings.tsx` **Frontend Path:** `frontend/src/pages/Settings/IntegrationSettings.tsx`
@@ -117,6 +117,29 @@ The Integrations module manages:
| metadata | JSON | Additional data | | metadata | JSON | Additional data |
| created_at | DateTime | Event time | | created_at | DateTime | Event time |
### PublishingSettings (v1.3.2)
Site-level publishing configuration. Used by the publishing scheduler.
| Field | Type | Purpose |
|-------|------|---------|
| site | OneToOneField | Parent site (unique per site) |
| auto_approval_enabled | BooleanField | Auto-approve content (default: False) |
| auto_publish_enabled | BooleanField | Auto-publish approved content (default: False) |
| daily_publish_limit | IntegerField | Max publications per day (default: 5) |
| weekly_publish_limit | IntegerField | Max per week (default: 20) |
| monthly_publish_limit | IntegerField | Max per month (default: 60) |
| publish_days | JSONField | Days for publishing ["mon","wed","fri"] |
| publish_time_slots | JSONField | Time slots [{"start":"09:00","end":"17:00"}] |
**Helper Method:**
```python
# Get or create settings for a site
settings, created = PublishingSettings.get_or_create_for_site(site)
```
**Related:** See [PUBLISHER.md](PUBLISHER.md) for publishing scheduler details.
--- ---
## API Endpoints ## API Endpoints

View File

@@ -1,9 +1,10 @@
# Publisher Module # Publisher Module
**Last Verified:** December 25, 2025 **Last Verified:** January 3, 2026
**Status:** ✅ Active **Status:** ✅ Active
**Version:** 1.3.2
**Backend Path:** `backend/igny8_core/modules/publisher/` + `backend/igny8_core/business/publishing/` **Backend Path:** `backend/igny8_core/modules/publisher/` + `backend/igny8_core/business/publishing/`
**Frontend Path:** N/A (API-only module) **Frontend Path:** `frontend/src/pages/Publisher/`
--- ---
@@ -13,8 +14,11 @@
|------|------|-----------| |------|------|-----------|
| Views | `modules/publisher/views.py` | `PublishingRecordViewSet`, `DeploymentViewSet`, `PublishContentViewSet` | | Views | `modules/publisher/views.py` | `PublishingRecordViewSet`, `DeploymentViewSet`, `PublishContentViewSet` |
| Models | `business/publishing/models.py` | `PublishingRecord`, `DeploymentRecord` | | Models | `business/publishing/models.py` | `PublishingRecord`, `DeploymentRecord` |
| Integration Models | `modules/integration/models.py` | `PublishingSettings` |
| Services | `business/publishing/services/*.py` | Publishing orchestration | | Services | `business/publishing/services/*.py` | Publishing orchestration |
| Scheduler Tasks | `igny8_core/tasks/publishing_scheduler.py` | Celery beat tasks |
| URLs | `modules/publisher/urls.py` | Publisher endpoints | | URLs | `modules/publisher/urls.py` | Publisher endpoints |
| Frontend | `pages/Publisher/ContentCalendar.tsx` | Content calendar view |
--- ---
@@ -22,9 +26,11 @@
The Publisher module manages: The Publisher module manages:
- Content publishing pipeline - Content publishing pipeline
- **Publishing scheduler (automated publishing)**
- Publishing record tracking - Publishing record tracking
- Deployment management - Deployment management
- Multi-destination publishing - Multi-destination publishing
- **Content calendar visualization**
--- ---
@@ -59,6 +65,31 @@ The Publisher module manages:
| error_log | TextField | Errors encountered | | error_log | TextField | Errors encountered |
| metadata | JSON | Deployment details | | metadata | JSON | Deployment details |
### PublishingSettings (v1.3.2)
Site-level publishing configuration:
| Field | Type | Purpose |
|-------|------|---------|
| site | OneToOne | Parent site (unique) |
| auto_approval_enabled | Boolean | Auto-approve content |
| auto_publish_enabled | Boolean | Auto-publish approved content |
| daily_publish_limit | Integer | Max publications per day |
| weekly_publish_limit | Integer | Max publications per week |
| monthly_publish_limit | Integer | Max publications per month |
| publish_days | JSON | Days of week for publishing ["mon","wed","fri"] |
| publish_time_slots | JSON | Time slots for publishing [{"start":"09:00","end":"17:00"}] |
### Content Site Status Fields (v1.3.2)
Added to Content model for scheduling:
| Field | Type | Values |
|-------|------|--------|
| site_status | CharField | not_published, scheduled, publishing, published, failed |
| scheduled_publish_at | DateTime | Future publication time (nullable) |
| site_status_updated_at | DateTime | Last status change timestamp |
--- ---
## API Endpoints ## API Endpoints
@@ -71,6 +102,85 @@ The Publisher module manages:
| POST | `/api/v1/publisher/publish/` | `PublishContentViewSet.publish` | Publish content | | POST | `/api/v1/publisher/publish/` | `PublishContentViewSet.publish` | Publish content |
| GET | `/api/v1/publisher/publish/status/` | `PublishContentViewSet.status` | Get publishing status | | GET | `/api/v1/publisher/publish/status/` | `PublishContentViewSet.status` | Get publishing status |
| GET | `/api/v1/publisher/site-definition/` | `SiteDefinitionViewSet.list` | Public site definitions | | GET | `/api/v1/publisher/site-definition/` | `SiteDefinitionViewSet.list` | Public site definitions |
| **POST** | `/api/v1/content/{id}/schedule/` | Schedule content | Schedule content for future publish |
| **POST** | `/api/v1/content/{id}/unschedule/` | Unschedule content | Remove from publishing schedule |
| **GET** | `/api/v1/sites/{site_id}/publishing-settings/` | `PublishingSettingsViewSet` | Get site publishing settings |
| **PUT** | `/api/v1/sites/{site_id}/publishing-settings/` | `PublishingSettingsViewSet` | Update publishing settings |
---
## Publishing Scheduler (v1.3.2)
### Celery Beat Tasks
Located in `igny8_core/tasks/publishing_scheduler.py`:
| Task | Schedule | Purpose |
|------|----------|---------|
| `schedule_approved_content` | Every 15 minutes | Assigns publish times to approved content |
| `process_scheduled_publications` | Every 5 minutes | Publishes content when scheduled time arrives |
| `cleanup_failed_publications` | Daily at midnight | Retries or cleans up failed publications |
### Scheduling Flow
```
Approved Content → schedule_approved_content (every 15 min)
Check PublishingSettings
Assign scheduled_publish_at based on:
- publish_days configuration
- publish_time_slots configuration
- daily/weekly/monthly limits
Set site_status = "scheduled"
process_scheduled_publications (every 5 min)
If scheduled_publish_at <= now:
- Set site_status = "publishing"
- Execute publication
- Set site_status = "published" or "failed"
```
### Site Status State Machine
```
not_published → scheduled → publishing → published
↓ ↓
↓ → failed
not_published (if unscheduled)
```
---
## Frontend Pages (v1.3.2)
### Content Calendar (`/publisher/content-calendar`)
**Purpose:** Visualize and manage scheduled content
**Features:**
- Calendar view of scheduled publications
- List view alternative
- Filter by site
- Schedule/unschedule actions
- Drag-and-drop rescheduling (planned)
**Components:**
- `ContentCalendar.tsx` - Main page component
- `CalendarItemTooltip` - Hover details for calendar items
- `SiteInfoBar` - Site context header
### Publishing Queue (`/publisher/publishing-queue`)
**Purpose:** Review upcoming publications
**Features:**
- List of content pending publication
- Status indicators (scheduled, publishing, failed)
- Publish now / unschedule actions
--- ---
@@ -179,6 +289,7 @@ Returns site structure for external consumption:
|---------|--------|-------------| |---------|--------|-------------|
| Ghost integration | 🔜 Planned | Ghost CMS publishing | | Ghost integration | 🔜 Planned | Ghost CMS publishing |
| Webflow integration | 🔜 Planned | Webflow publishing | | Webflow integration | 🔜 Planned | Webflow publishing |
| Scheduled publishing | 🔜 Planned | Future-date publishing | | ~~Scheduled publishing~~ | ✅ Implemented (v1.3.2) | Future-date publishing |
| Republish detection | 🔜 Planned | Detect and handle updates | | Republish detection | 🔜 Planned | Detect and handle updates |
| Publishing queue | 🔜 Planned | Batch publishing with queue | | ~~Publishing queue~~ | ✅ Implemented (v1.3.2) | Batch publishing with queue |
| Drag-and-drop calendar | 🔜 Planned | Reschedule via drag-and-drop |

View File

@@ -1,7 +1,7 @@
# API Endpoints Reference # API Endpoints Reference
**Last Verified:** December 27, 2025 **Last Verified:** January 3, 2026
**Version:** 1.2.0 **Version:** 1.3.2
**Base URL:** `/api/v1/` **Base URL:** `/api/v1/`
**Documentation:** `/api/docs/` (Swagger) | `/api/redoc/` (ReDoc) **Documentation:** `/api/docs/` (Swagger) | `/api/redoc/` (ReDoc)
@@ -88,11 +88,35 @@ All endpoints require authentication unless noted.
| POST | `/content/{id}/update_content/` | `ContentViewSet.update_content` | Update with validation | | POST | `/content/{id}/update_content/` | `ContentViewSet.update_content` | Update with validation |
| POST | `/content/{id}/generate_images/` | `ContentViewSet.generate_images` | Generate images | | POST | `/content/{id}/generate_images/` | `ContentViewSet.generate_images` | Generate images |
| POST | `/content/{id}/publish_to_wordpress/` | `ContentViewSet.publish_to_wordpress` | Publish to WP | | POST | `/content/{id}/publish_to_wordpress/` | `ContentViewSet.publish_to_wordpress` | Publish to WP |
| POST | `/content/{id}/schedule/` | `ContentViewSet.schedule` | Schedule for publishing (v1.3.2) |
| POST | `/content/{id}/unschedule/` | `ContentViewSet.unschedule` | Remove from schedule (v1.3.2) |
| GET | `/images/` | `ImageViewSet.list` | List images | | GET | `/images/` | `ImageViewSet.list` | List images |
| POST | `/images/generate_for_content/` | `ImageViewSet.generate_for_content` | Generate images | | POST | `/images/generate_for_content/` | `ImageViewSet.generate_for_content` | Generate images |
| POST | `/images/regenerate/` | `ImageViewSet.regenerate` | Regenerate image | | POST | `/images/regenerate/` | `ImageViewSet.regenerate` | Regenerate image |
| GET | `/taxonomies/` | `TaxonomyViewSet.list` | List taxonomies | | GET | `/taxonomies/` | `TaxonomyViewSet.list` | List taxonomies |
**Content Query Parameters (v1.3.2):**
- `?status__in=draft,review,approved` - Filter by multiple workflow statuses
- `?site_status=scheduled` - Filter by publishing status
- `?site_id=` - Filter by site
**Schedule Endpoint Request:**
```json
POST /api/v1/writer/content/{id}/schedule/
{
"scheduled_publish_at": "2026-01-15T09:00:00Z"
}
```
**Schedule Endpoint Response:**
```json
{
"content_id": 123,
"site_status": "scheduled",
"scheduled_publish_at": "2026-01-15T09:00:00Z"
}
```
--- ---
## Billing Endpoints (`/api/v1/billing/`) ## Billing Endpoints (`/api/v1/billing/`)
@@ -125,6 +149,31 @@ All endpoints require authentication unless noted.
| POST | `/site_sync/` | Site-level sync | Sync by site ID | | POST | `/site_sync/` | Site-level sync | Sync by site ID |
| POST | `/webhook/wordpress/` | WordPress webhook | Receive WP updates | | POST | `/webhook/wordpress/` | WordPress webhook | Receive WP updates |
### Publishing Settings Endpoints (v1.3.2)
| Method | Path | Handler | Purpose |
|--------|------|---------|---------|
| GET | `/sites/{site_id}/publishing-settings/` | `PublishingSettingsViewSet.retrieve` | Get publishing settings |
| PUT | `/sites/{site_id}/publishing-settings/` | `PublishingSettingsViewSet.update` | Update settings (full) |
| PATCH | `/sites/{site_id}/publishing-settings/` | `PublishingSettingsViewSet.partial_update` | Update settings (partial) |
**Publishing Settings Response:**
```json
{
"id": 1,
"site": 5,
"auto_approval_enabled": true,
"auto_publish_enabled": true,
"daily_publish_limit": 3,
"weekly_publish_limit": 15,
"monthly_publish_limit": 50,
"publish_days": ["mon", "tue", "wed", "thu", "fri"],
"publish_time_slots": ["09:00", "14:00", "18:00"],
"created_at": "2026-01-03T10:00:00Z",
"updated_at": "2026-01-03T10:00:00Z"
}
```
--- ---
## System Endpoints (`/api/v1/system/`) ## System Endpoints (`/api/v1/system/`)

View File

@@ -1,5 +1,8 @@
# IGNY8 Frontend Component System # IGNY8 Frontend Component System
**Last Updated:** January 3, 2026
**Version:** 1.3.2
> **🔒 ENFORCED BY ESLINT** - Violations will trigger warnings/errors during build. > **🔒 ENFORCED BY ESLINT** - Violations will trigger warnings/errors during build.
> This document is the single source of truth for all UI components. > This document is the single source of truth for all UI components.
@@ -11,6 +14,7 @@
|---------|-----------|-------------| |---------|-----------|-------------|
| Button | `Button` | `components/ui/button/Button` | | Button | `Button` | `components/ui/button/Button` |
| Icon Button | `IconButton` | `components/ui/button/IconButton` | | Icon Button | `IconButton` | `components/ui/button/IconButton` |
| Button Group | `ButtonGroup` | `components/ui/button-group/ButtonGroup` |
| Text Input | `InputField` | `components/form/input/InputField` | | Text Input | `InputField` | `components/form/input/InputField` |
| Checkbox | `Checkbox` | `components/form/input/Checkbox` | | Checkbox | `Checkbox` | `components/form/input/Checkbox` |
| Radio | `Radio` | `components/form/input/Radio` | | Radio | `Radio` | `components/form/input/Radio` |
@@ -27,6 +31,7 @@
| Spinner | `Spinner` | `components/ui/spinner/Spinner` | | Spinner | `Spinner` | `components/ui/spinner/Spinner` |
| Tabs | `Tabs` | `components/ui/tabs/Tabs` | | Tabs | `Tabs` | `components/ui/tabs/Tabs` |
| Tooltip | `Tooltip` | `components/ui/tooltip/Tooltip` | | Tooltip | `Tooltip` | `components/ui/tooltip/Tooltip` |
| Calendar Tooltip | `CalendarItemTooltip` | `components/ui/tooltip/CalendarItemTooltip` |
| Toast | `useToast` | `components/ui/toast/ToastContainer` | | Toast | `useToast` | `components/ui/toast/ToastContainer` |
| Icons | `*Icon` | `icons` (e.g., `../../icons`) | | Icons | `*Icon` | `icons` (e.g., `../../icons`) |
@@ -595,7 +600,54 @@ import { CloseIcon } from '../../icons';
--- ---
## 8. LIVE REFERENCE ## 8. SITE-SPECIFIC COMPONENTS (v1.3.2)
### SiteInfoBar
Reusable site info header component for site-specific pages.
```tsx
import { SiteInfoBar } from '../../components/common/SiteInfoBar';
<SiteInfoBar
site={currentSite} // Site object with name, domain, etc.
onSiteChange={handleSiteChange} // Optional: Callback when site changes
showSelector={true} // Whether to show site selector dropdown
/>
```
### OnboardingWizard Components
Located in `components/onboarding/`:
```tsx
import { OnboardingWizard } from '../../components/onboarding/OnboardingWizard';
import {
Step1Welcome,
Step2AddSite,
Step3ConnectIntegration,
Step4AddKeywords,
Step5Complete,
} from '../../components/onboarding/steps';
```
### CalendarItemTooltip
Tooltip specifically designed for calendar items.
```tsx
import { CalendarItemTooltip } from '../../components/ui/tooltip';
<CalendarItemTooltip
item={contentItem} // Content object
onView={handleView} // Optional: View callback
onRemove={handleRemove} // Optional: Remove callback
/>
```
---
## 9. LIVE REFERENCE
View all components with live examples at: `/ui-elements` View all components with live examples at: `/ui-elements`
@@ -603,7 +655,7 @@ This page shows every component with all prop variations.
--- ---
## 9. AI AGENT INSTRUCTIONS ## 10. AI AGENT INSTRUCTIONS
When working on this codebase, AI agents MUST: When working on this codebase, AI agents MUST:
@@ -611,6 +663,20 @@ When working on this codebase, AI agents MUST:
2. **Import icons only from `src/icons`** - never from external libraries 2. **Import icons only from `src/icons`** - never from external libraries
3. **Follow the import paths** specified in this document 3. **Follow the import paths** specified in this document
4. **Check ESLint** after making changes: `npm run lint` 4. **Check ESLint** after making changes: `npm run lint`
5. **Use semantic color tokens** - never hardcoded hex values or Tailwind defaults
### Color Rules
```tsx
// ✅ CORRECT - Use semantic tokens
className="bg-brand-500 text-gray-900 border-success-500"
// ❌ WRONG - Tailwind defaults (DISABLED)
className="bg-blue-500 text-slate-900 border-green-500"
// ❌ WRONG - Hardcoded hex
className="bg-[#0077B6]"
style={{ color: '#DC2626' }}
```
5. **Reference this document** for correct component usage 5. **Reference this document** for correct component usage
6. **Use consistent icon sizing**: `className="w-4 h-4"` for small, `w-5 h-5` for medium 6. **Use consistent icon sizing**: `className="w-4 h-4"` for small, `w-5 h-5` for medium

View File

@@ -4,7 +4,8 @@
> >
> 🔒 **STYLE LOCKED** - This design system is enforced by ESLint. All frontend code must comply. > 🔒 **STYLE LOCKED** - This design system is enforced by ESLint. All frontend code must comply.
**Last Updated:** January 2, 2026 **Last Updated:** January 3, 2026
**Version:** 1.3.2
--- ---

View File

@@ -1,64 +1,127 @@
# Design System & Component Guidelines # Design System & Component Guidelines
> 🔒 **STYLE SYSTEM LOCKED** - This design system is **LOCKED** as of 2025-01-XX. Read this entire document before making any styling changes. **Last Updated:** January 3, 2026
**Version:** 1.3.2
> 🔒 **STYLE SYSTEM LOCKED** - This design system is **LOCKED**. Read this entire document before making any styling changes.
## 🎨 Design Token System ## 🎨 Design Token System
**Single Source of Truth**: All design tokens (colors, gradients, shadows) are defined in `/src/styles/tokens.css` **Single Source of Truth**: `/src/styles/design-system.css`
### Color Tokens ⚠️ **CRITICAL**: Only 6 hex color values exist in the entire system. Everything else is derived using `color-mix()`.
Use CSS variables for colors: ### The 6 Base Colors
- `var(--color-primary)` - Primary brand blue (#0693e3)
- `var(--color-primary-dark)` - Primary dark (#0472b8) | Token | Hex | Purpose |
- `var(--color-success)` - Success green (#0bbf87) |-------|-----|---------|
- `var(--color-warning)` - Warning amber (#ff7a00) | `--color-primary` | `#0077B6` | Brand blue |
- `var(--color-danger)` - Danger red (#ef4444) | `--color-success` | `#00B894` | Success green |
- `var(--color-purple)` - Purple accent (#5d4ae3) | `--color-warning` | `#F59E0B` | Warning amber |
| `--color-danger` | `#DC2626` | Error red |
| `--color-purple` | `#7C3AED` | Premium purple |
| `--color-gray-base` | `#667085` | Neutral gray |
### Color Scales (Derived)
Each base color generates a full scale (50-950) via `color-mix()`:
```css
/* Example: brand color scale */
--color-brand-50 /* Lightest */
--color-brand-100
--color-brand-200
--color-brand-300
--color-brand-400
--color-brand-500 /* Base = --color-primary */
--color-brand-600
--color-brand-700
--color-brand-800
--color-brand-900
--color-brand-950 /* Darkest */
```
### Tailwind Color Classes
**Available (Use These):**
```css
/* Brand */ bg-brand-50 ... bg-brand-950, text-brand-*, border-brand-*
/* Success */ bg-success-50 ... bg-success-950, text-success-*, border-success-*
/* Warning */ bg-warning-50 ... bg-warning-950, text-warning-*, border-warning-*
/* Error */ bg-error-50 ... bg-error-950, text-error-*, border-error-*
/* Purple */ bg-purple-50 ... bg-purple-950, text-purple-*, border-purple-*
/* Gray */ bg-gray-50 ... bg-gray-950, text-gray-*, border-gray-*
/* Info */ bg-info-50 ... bg-info-950 (alias for brand)
```
**DISABLED (DO NOT USE):**
```css
/* These Tailwind defaults are DISABLED and won't work */
blue-*, red-*, green-*, yellow-*, orange-*, indigo-*, violet-*,
pink-*, rose-*, cyan-*, teal-*, emerald-*, lime-*, amber-*,
slate-*, zinc-*, neutral-*, stone-*
```
### Using Colors ### Using Colors
**✅ DO:** **✅ DO:**
```tsx ```tsx
// Use Tailwind utilities with brand colors // Use semantic Tailwind utilities
<div className="bg-brand-500 text-white">Content</div> <div className="bg-brand-500 text-white">Primary action</div>
<div className="bg-success-100 text-success-700">Success message</div>
<div className="bg-error-50 border-error-500">Error alert</div>
// Use CSS variables for custom values // Use CSS variables for custom cases
<div className="bg-[var(--color-primary)]">Content</div> <div className="bg-[var(--color-primary)]">Custom</div>
// Use React components // Use React components with tone prop
<Button tone="brand" variant="gradient">Click me</Button> <Button tone="brand">Primary</Button>
<Button tone="success">Approve</Button>
<Badge tone="warning">Pending</Badge>
``` ```
**❌ DON'T:** **❌ DON'T:**
```tsx ```tsx
// Don't use deprecated .igny8-* utility classes // Don't use Tailwind default colors (DISABLED)
<div className="igny8-bg-blue">Content</div> <div className="bg-blue-500">Won't work!</div>
<div className="text-slate-700">Won't work!</div>
// Don't hardcode color values // Don't hardcode hex values
<div className="bg-[#0693e3]">Content</div> <div className="bg-[#0077B6]">Bad!</div>
<div style={{ backgroundColor: '#DC2626' }}>Bad!</div>
// Don't use inline styles
<div style={{ backgroundColor: '#0693e3' }}>Content</div>
``` ```
## 🔒 Style System Lock Status ## 🔒 Style System Lock Status
**DO NOT:** **DO NOT:**
-Create new CSS classes without documenting in this file -Use Tailwind default color classes (blue-*, red-*, green-*, etc.)
- ❌ Hardcode hex color values anywhere
- ❌ Use inline styles for colors/spacing/typography
- ❌ Import from external icon libraries (lucide-react, @heroicons)
- ❌ Create new CSS classes without documenting
- ❌ Duplicate existing styling patterns - ❌ Duplicate existing styling patterns
- ❌ Create custom colors/utilities that already exist
- ❌ Use deprecated `.igny8-*` utility classes (except `.igny8-table-*` and `.igny8-header-metric-*`)
- ❌ Add inline styles for colors/spacing/typography
- ❌ Hardcode color hex values
**DO:** **DO:**
-Check this document before creating any styles -Use semantic color tokens (brand-*, success-*, etc.)
-Use design tokens from `tokens.css` via CSS variables -Import icons from `src/icons`
- ✅ Use Tailwind utilities (bg-brand-500, text-brand-500, etc.) - ✅ Use React components (Button, Badge, Card, InputField)
-Use React components (Button, Badge, Card) from `/components/ui/` -Run `npm run lint` to check for violations
-Follow component patterns from this guide -Check `/ui-elements` for component examples
- ✅ Update this document if you MUST add something new
---
## Module Color Scheme (v1.3.2)
Each module has a distinct color for visual identification:
| Module | Color | Tailwind Classes |
|--------|-------|------------------|
| **Planner** (Keywords/Clusters/Ideas) | Purple | `bg-purple-*`, `text-purple-*` |
| **Writer** (Tasks/Content/Images) | Green | `bg-success-*`, `text-success-*` |
| **Automation** | Blue | `bg-brand-*`, `text-brand-*` |
| **Publisher** | Orange | `bg-warning-*`, `text-warning-*` |
| **Billing** | Purple | `bg-purple-*`, `text-purple-*` |
| **Settings** | Gray | `bg-gray-*`, `text-gray-*` |
--- ---
@@ -148,7 +211,7 @@ Before implementing any UI element:
## 📝 Typography Scale ## 📝 Typography Scale
Typography tokens are defined in `index.css` and should be used consistently: Typography tokens are defined in `design-system.css` and should be used consistently:
### Title Sizes (for page/section headings) ### Title Sizes (for page/section headings)
| Token | Size | Line Height | Use Case | | Token | Size | Line Height | Use Case |
@@ -192,14 +255,15 @@ Module-specific colors are defined in `src/config/colors.config.ts`:
| Module | Primary Color | Usage | | Module | Primary Color | Usage |
|--------|---------------|-------| |--------|---------------|-------|
| Keywords | `brand-500` (blue) | Icons, progress bars, badges | | Planner (Keywords) | `brand-500` (blue) | Icons, progress bars, badges |
| Clusters | `purple-500` | Icons, progress bars, badges | | Planner (Clusters) | `purple-500` | Icons, progress bars, badges |
| Ideas | `purple-600` | Icons, progress bars, badges | | Planner (Ideas) | `purple-600` | Icons, progress bars, badges |
| Tasks | `success-600` (green) | Icons, progress bars, badges | | Writer (Tasks) | `success-600` (green) | Icons, progress bars, badges |
| Content | `success-500` | Icons, progress bars, badges | | Writer (Content) | `success-500` | Icons, progress bars, badges |
| Images | `purple-500` | Icons, progress bars, badges | | Writer (Images) | `purple-500` | Icons, progress bars, badges |
| Automation | `brand-500` | Pipeline cards | | Automation | `brand-500` | Pipeline cards |
| Billing | `warning-500` (amber) | Credit displays | | Publisher | `warning-500` (amber) | Calendar, scheduling |
| Billing | `purple-500` | Credit displays |
```tsx ```tsx
import { MODULE_COLORS } from '@/config/colors.config'; import { MODULE_COLORS } from '@/config/colors.config';
@@ -211,7 +275,7 @@ import { MODULE_COLORS } from '@/config/colors.config';
--- ---
**Last Updated**: January 2, 2026 **Last Updated**: January 3, 2026
**Status**: Active Design System Rules - 🔒 LOCKED **Status**: Active Design System Rules - 🔒 LOCKED
--- ---
@@ -228,7 +292,7 @@ import { MODULE_COLORS } from '@/config/colors.config';
|----------|--------------|------------| |----------|--------------|------------|
| **UI Components** | `@/components/ui/` or relative `../components/ui/` | Button, Card, Modal, Alert, Badge, Dropdown, Tooltip, Spinner, Tabs, Toast, Pagination, Progress, Avatar, Breadcrumb | | **UI Components** | `@/components/ui/` or relative `../components/ui/` | Button, Card, Modal, Alert, Badge, Dropdown, Tooltip, Spinner, Tabs, Toast, Pagination, Progress, Avatar, Breadcrumb |
| **Common Components** | `@/components/common/` | PageHeader, ComponentCard, ConfirmDialog, FormModal, TablePageTemplate | | **Common Components** | `@/components/common/` | PageHeader, ComponentCard, ConfirmDialog, FormModal, TablePageTemplate |
| **Icons** | `@/icons` or `@heroicons/react` | All SVG icons | | **Icons** | `@/icons` | All SVG icons (local icons only - external libraries disabled) |
| **Templates** | `@/templates/` | TablePageTemplate, ContentViewTemplate | | **Templates** | `@/templates/` | TablePageTemplate, ContentViewTemplate |
### BANNED IMPORTS (DO NOT USE) ### BANNED IMPORTS (DO NOT USE)
@@ -254,11 +318,12 @@ const MyButton = () => <button className="...">; // If used more than once, crea
| File | Purpose | When to Use | | File | Purpose | When to Use |
|------|---------|-------------| |------|---------|-------------|
| `src/index.css` | Main Tailwind config, utilities | Auto-imported, don't import manually | | `src/styles/design-system.css` | ALL design tokens, colors, shadows, typography | Single source - auto-imported via main.tsx |
| `src/styles/tokens.css` | CSS variables (colors, shadows) | Use via `var(--color-name)` |
**DO NOT CREATE OR USE:** **DO NOT CREATE OR USE:**
-`styles/global.css` - Deprecated -`src/styles/global.css` - **Deleted** (consolidated into design-system.css)
-`src/styles/tokens.css` - **Deleted** (consolidated into design-system.css)
-`src/styles/index.css` - **Deleted** (consolidated into design-system.css)
-`components/shared/blocks/blocks.css` - For marketing only -`components/shared/blocks/blocks.css` - For marketing only
-`components/shared/layouts/layouts.css` - For marketing only -`components/shared/layouts/layouts.css` - For marketing only
- ❌ Any new `.css` files in component folders - ❌ Any new `.css` files in component folders
@@ -375,8 +440,10 @@ src/components/ui/
|--------|-------|------| |--------|-------|------|
| Planner | Keywords, Clusters, Ideas | `src/pages/Planner/` | | Planner | Keywords, Clusters, Ideas | `src/pages/Planner/` |
| Writer | Review, Approved, Content | `src/pages/Writer/` | | Writer | Review, Approved, Content | `src/pages/Writer/` |
| Publisher | ContentCalendar, PublishingQueue | `src/pages/Publisher/` |
| Sites | List, Settings | `src/pages/Sites/` | | Sites | List, Settings | `src/pages/Sites/` |
| Dashboard | Home | `src/pages/Dashboard/` | | Dashboard | Home | `src/pages/Dashboard/` |
| Setup | SetupWizard (Onboarding) | `src/pages/Setup/` |
### AUDIT CHECKLIST FOR CODE REVIEW ### AUDIT CHECKLIST FOR CODE REVIEW

View File

@@ -1,7 +1,7 @@
# Frontend Pages & Routes # Frontend Pages & Routes
**Last Verified:** January 1, 2026 **Last Verified:** January 3, 2026
**Version:** 1.3.0 **Version:** 1.3.2
**Framework:** React 19 + TypeScript + React Router 6 + Vite **Framework:** React 19 + TypeScript + React Router 6 + Vite
--- ---
@@ -60,6 +60,27 @@ Routes defined in `/frontend/src/App.tsx`:
## SETUP Routes ## SETUP Routes
### Onboarding Wizard (NEW v1.3.2)
| Route | File | Description |
|-------|------|-------------|
| `/setup/wizard` | `Setup/SetupWizard.tsx` | 5-step onboarding wizard for new users |
**Steps:**
1. **Welcome** - Feature overview, get started CTA
2. **Add Site** - Site name, industry/sector selection, creates site with defaults
3. **Connect Integration** - WordPress plugin installation (optional, can skip)
4. **Add Keywords** - Initial keyword entry with paste support (optional)
5. **Complete** - Success summary, next steps, go to dashboard
**Components:** `frontend/src/components/onboarding/`
- `OnboardingWizard.tsx` - Main wizard container and state
- `steps/Step1Welcome.tsx` - Welcome screen
- `steps/Step2AddSite.tsx` - Site creation with SelectDropdown + Badge sectors
- `steps/Step3ConnectIntegration.tsx` - WordPress setup
- `steps/Step4AddKeywords.tsx` - Keyword input
- `steps/Step5Complete.tsx` - Completion summary
### Add Keywords ### Add Keywords
| Route | File | Description | | Route | File | Description |
@@ -86,11 +107,19 @@ Routes defined in `/frontend/src/App.tsx`:
| Route | File | Description | | Route | File | Description |
|-------|------|-------------| |-------|------|-------------|
| `/sites` | `Sites/List.tsx` | Site listing with setup checklist per site | | `/sites` | `Sites/List.tsx` | Site listing with setup checklist per site |
| `/sites/:id/dashboard` | `Sites/Dashboard.tsx` | Site overview with setup checklist | | `/sites/:id` | `Sites/Dashboard.tsx` | Site dashboard with quick actions and widgets |
| `/sites/:id/settings` | `Sites/Settings.tsx` | Site settings (General, Integrations, Content Types) | | `/sites/:id/settings` | `Sites/Settings.tsx` | Site settings (General, Integrations, Publishing, Content Types) |
**v1.3.2 Changes:**
- Site Dashboard redesigned with SiteInfoBar component
- Quick actions now 2-column card grid layout
- AI Operations widget loads real data from getDashboardStats API
- Fixed race condition in async loadSiteData
- Settings page has new Publishing Settings tab
**Components:** **Components:**
- `SiteSetupChecklist` - Shows setup progress (site created, industry/sectors, WordPress, keywords) - `SiteSetupChecklist` - Shows setup progress (site created, industry/sectors, WordPress, keywords)
- `SiteInfoBar` - Reusable site info header for site-specific pages
### Thinker (Admin Only) ### Thinker (Admin Only)
@@ -136,7 +165,42 @@ Routes defined in `/frontend/src/App.tsx`:
| Route | File | Description | | Route | File | Description |
|-------|------|-------------| |-------|------|-------------|
| `/automation` | `Automation/Dashboard.tsx` | 7-stage pipeline, schedule config, run controls | | `/automation` | `Automation/AutomationPage.tsx` | 7-stage pipeline, schedule config, run controls |
---
## PUBLISHER Routes (NEW v1.3.2)
### Content Calendar
| Route | File | Description |
|-------|------|-------------|
| `/publisher` | → `/publisher/content-calendar` | Redirect |
| `/publisher/content-calendar` | `Publisher/ContentCalendar.tsx` | Content calendar with scheduling |
**Features:**
- Calendar view with month navigation
- List view with drag-and-drop reordering
- Schedule content by dragging to calendar dates
- Unschedule content from queue
- Stats: scheduled, publishing, published counts
- Filter by site (inherited from layout)
**Content Status Fields:**
- `status`: `draft | review | approved | published` (workflow status)
- `site_status`: `not_published | scheduled | publishing | published | failed` (publishing status)
- `scheduled_publish_at`: DateTime for scheduled publishing
**API Integration:**
- `POST /api/v1/writer/content/{id}/schedule/` - Schedule content
- `POST /api/v1/writer/content/{id}/unschedule/` - Remove from schedule
- `GET /api/v1/writer/content/?status__in=approved,published` - Multi-status filter
### Legacy Redirects
| Old Route | Redirects To |
|-----------|--------------|
| `/sites/:id/publishing-queue` | `/publisher/content-calendar` |
### Linker (Optional Module) ### Linker (Optional Module)
@@ -269,9 +333,20 @@ These routes redirect to their new locations:
| `/profile` | `/account/settings` | | `/profile` | `/account/settings` |
| `/import-export` | `/account/settings` | | `/import-export` | `/account/settings` |
| `/billing/overview` | `/account/plans` | | `/billing/overview` | `/account/plans` |
| `/billing/credits` | `/account/plans` (separate page exists at `Billing/CreditPurchase.tsx`) | | `/billing/credits` | `/account/plans` |
| `/billing/history` | `/account/plans` | | `/billing/history` | `/account/plans` |
| `/publishing` | `/account/content-settings` | | `/publishing` | `/account/content-settings` |
| `/writer/published` | `/writer/approved` |
| `/sites/:id/publishing-queue` | `/publisher/content-calendar` |
---
## Internal Pages (Non-Indexed)
| Route | File | Description |
|-------|------|-------------|
| `/ui-elements` | `UIElements.tsx` | Design system reference page |
| `/components` | `Components.tsx` | Component showcase |
--- ---
@@ -282,6 +357,7 @@ frontend/src/pages/
├── account/ ├── account/
│ ├── AccountSettingsPage.tsx # Account, Profile, Team tabs │ ├── AccountSettingsPage.tsx # Account, Profile, Team tabs
│ ├── ContentSettingsPage.tsx # Content Gen, Publishing, Images tabs │ ├── ContentSettingsPage.tsx # Content Gen, Publishing, Images tabs
│ ├── NotificationsPage.tsx # Full notifications with filters
│ ├── PlansAndBillingPage.tsx # Plan, Upgrade, History tabs │ ├── PlansAndBillingPage.tsx # Plan, Upgrade, History tabs
│ ├── UsageAnalyticsPage.tsx # Limits, Credit History, API tabs │ ├── UsageAnalyticsPage.tsx # Limits, Credit History, API tabs
│ ├── UsageLimits.tsx # Limits tab component │ ├── UsageLimits.tsx # Limits tab component
@@ -293,7 +369,7 @@ frontend/src/pages/
│ ├── ResetPassword.tsx │ ├── ResetPassword.tsx
│ └── VerifyEmail.tsx │ └── VerifyEmail.tsx
├── Automation/ ├── Automation/
│ └── Dashboard.tsx │ └── AutomationPage.tsx
├── Billing/ ├── Billing/
│ └── CreditPurchase.tsx │ └── CreditPurchase.tsx
├── Dashboard/ ├── Dashboard/
@@ -310,28 +386,34 @@ frontend/src/pages/
├── Planner/ ├── Planner/
│ ├── Keywords.tsx │ ├── Keywords.tsx
│ ├── Clusters.tsx │ ├── Clusters.tsx
│ ├── ClusterView.tsx │ ├── ClusterDetail.tsx
│ └── Ideas.tsx │ └── Ideas.tsx
├── Publisher/ # NEW v1.3.2
│ └── ContentCalendar.tsx
├── Settings/ ├── Settings/
│ └── IntegrationPage.tsx # AI Models (admin) │ └── IntegrationPage.tsx # AI Models (admin)
├── Setup/ ├── Setup/
── IndustriesSectorsKeywords.tsx # Add Keywords page ── IndustriesSectorsKeywords.tsx # Add Keywords page
│ └── SetupWizard.tsx # NEW v1.3.2 - Onboarding wizard
├── Sites/ ├── Sites/
│ ├── List.tsx # Site listing │ ├── List.tsx # Site listing
│ ├── Dashboard.tsx # Site overview + checklist │ ├── Dashboard.tsx # Site overview + quick actions
── Settings.tsx # Site configuration ── Settings.tsx # Site config with Publishing tab
│ ├── Content.tsx # Site content listing
│ └── SyncDashboard.tsx # Sync status
├── Thinker/ ├── Thinker/
│ ├── Prompts.tsx │ ├── Prompts.tsx
│ ├── AuthorProfiles.tsx │ ├── AuthorProfiles.tsx
│ ├── Strategies.tsx # Coming Soon │ ├── Strategies.tsx # Coming Soon
│ └── ImageTesting.tsx # Coming Soon │ └── ImageTesting.tsx # Coming Soon
── Writer/ ── Writer/
├── Tasks.tsx ├── Tasks.tsx
├── Drafts.tsx ├── Content.tsx
├── ContentView.tsx ├── ContentView.tsx
├── Images.tsx ├── Images.tsx
├── Review.tsx ├── Review.tsx
└── Approved.tsx # Renamed from Published.tsx (v1.2.0) └── Approved.tsx # Renamed from Published.tsx (v1.2.0)
└── UIElements.tsx # NEW v1.3.2 - Design system ref
``` ```
--- ---
@@ -353,14 +435,15 @@ frontend/src/pages/
--- ---
## Navigation Structure (Sidebar) ## Navigation Structure (Sidebar v1.3.2)
``` ```
Dashboard Dashboard
├── SETUP ├── SETUP
│ ├── Setup Wizard [first-time users]
│ ├── Add Keywords │ ├── Add Keywords
│ ├── Content Settings │ ├── Content Settings
│ ├── Sites [if site_builder enabled] │ ├── Sites
│ └── Thinker [admin only, if thinker enabled] │ └── Thinker [admin only, if thinker enabled]
├── WORKFLOW ├── WORKFLOW
│ ├── Planner [if planner enabled] │ ├── Planner [if planner enabled]
@@ -368,9 +451,12 @@ Dashboard
│ ├── Writer [if writer enabled] │ ├── Writer [if writer enabled]
│ │ └── In-page: Queue → Drafts → Images → Review → Approved │ │ └── In-page: Queue → Drafts → Images → Review → Approved
│ ├── Automation [if automation enabled] │ ├── Automation [if automation enabled]
│ ├── Publisher
│ │ └── Content Calendar
│ ├── Linker [if linker enabled] │ ├── Linker [if linker enabled]
│ └── Optimizer [if optimizer enabled] │ └── Optimizer [if optimizer enabled]
├── ACCOUNT ├── ACCOUNT
│ ├── Notifications
│ ├── Account Settings (Account → Profile → Team) │ ├── Account Settings (Account → Profile → Team)
│ ├── Plans & Billing (Plan → Upgrade → History) │ ├── Plans & Billing (Plan → Upgrade → History)
│ ├── Usage (Limits → Credit History → API Activity) │ ├── Usage (Limits → Credit History → API Activity)
@@ -381,11 +467,15 @@ Dashboard
--- ---
## Known Issues (from Audit) ## Component Updates (v1.3.2)
1. **Linker/Optimizer Dashboards** exist but not exposed in navigation **New Components:**
2. **Help sub-pages** are placeholders - `SiteInfoBar` - Reusable site info header for site-specific pages
3. **ContentView** is read-only (no editing capability) - `IconButton` - Icon-only button component
4. Legacy redirects may cause confusion - `CalendarItemTooltip` - Tooltip for calendar items
- `OnboardingWizard` + 5 step components
See `/PRE-LAUNCH-AUDIT.md` for complete issue list. **Updated Components:**
- All components updated for semantic color tokens
- Badge, Button, Card use design system colors
- 100+ files with color standardization

View File

@@ -1,7 +1,7 @@
# Zustand State Management # Zustand State Management
**Last Verified:** December 27, 2025 **Last Verified:** January 3, 2026
**Version:** 1.2.0 **Version:** 1.3.2
**Framework:** Zustand 4 with persist middleware **Framework:** Zustand 4 with persist middleware
--- ---
@@ -15,6 +15,19 @@ All stores in `/frontend/src/store/` use Zustand with TypeScript.
- Async actions for API calls - Async actions for API calls
- Selectors for derived state - Selectors for derived state
**Available Stores:**
- `authStore.ts` - Authentication state
- `siteStore.ts` - Site selection/management
- `sectorStore.ts` - Sector management
- `plannerStore.ts` - Planner module state
- `billingStore.ts` - Billing/credits
- `notificationStore.ts` - Notifications
- `settingsStore.ts` - User preferences
- `moduleStore.ts` - Module navigation
- `columnVisibilityStore.ts` - Table column prefs
- `pageSizeStore.ts` - Table pagination prefs
- **`onboardingStore.ts`** - Onboarding wizard state (v1.3.2)
--- ---
## Auth Store (`authStore.ts`) ## Auth Store (`authStore.ts`)
@@ -408,11 +421,57 @@ notificationStore (global, polls/syncs independently)
moduleStore (global, loads once per account) moduleStore (global, loads once per account)
billingStore (global, loads once per account) billingStore (global, loads once per account)
onboardingStore (global, syncs with UserSettings backend)
uiStore (local only, no API) uiStore (local only, no API)
``` ```
--- ---
## Onboarding Store (`onboardingStore.ts`) (v1.3.2)
**Purpose:** Manages onboarding wizard and guide screen state
```typescript
interface OnboardingState {
isGuideDismissed: boolean;
isGuideVisible: boolean;
isLoading: boolean;
lastSyncedAt: Date | null;
}
interface OnboardingActions {
dismissGuide(): Promise<void>;
showGuide(): void;
toggleGuide(): void;
loadFromBackend(): Promise<void>;
syncToBackend(dismissed: boolean): Promise<void>;
}
```
**Persistence:**
- Local: `onboarding-storage` in localStorage
- Backend: `UserSettings` with key `workflow_guide_dismissed`
**Features:**
- Cross-device sync via backend UserSettings
- Rate-limited sync (max every 5 minutes)
- Graceful fallback if backend unavailable
**Usage:**
```typescript
const { isGuideVisible, dismissGuide, showGuide } = useOnboardingStore();
// Show onboarding wizard
if (isGuideVisible) {
return <OnboardingWizard onDismiss={dismissGuide} />;
}
// Re-show guide button
<Button onClick={showGuide}>Show Guide</Button>
```
---
## Store Files Location ## Store Files Location
``` ```

View File

@@ -1,6 +1,6 @@
# Database Models Reference # Database Models Reference
**Last Verified:** December 27, 2025 **Last Verified:** January 3, 2026
--- ---
@@ -10,7 +10,8 @@
|-------|--------|------------|-----------| |-------|--------|------------|-----------|
| **Global** | `GlobalIntegrationSettings`, `GlobalAIPrompt`, `GlobalAuthorProfile`, `GlobalStrategy`, `GlobalModuleSettings`, `Industry`, `SeedKeyword` | `models.Model` | None (platform-wide) | | **Global** | `GlobalIntegrationSettings`, `GlobalAIPrompt`, `GlobalAuthorProfile`, `GlobalStrategy`, `GlobalModuleSettings`, `Industry`, `SeedKeyword` | `models.Model` | None (platform-wide) |
| **Account** | `Account`, `User`, `Plan`, `IntegrationSettings`, `ModuleEnableSettings`, `AISettings`, `AIPrompt`, `AuthorProfile`, `CreditBalance` | `AccountBaseModel` | `account` | | **Account** | `Account`, `User`, `Plan`, `IntegrationSettings`, `ModuleEnableSettings`, `AISettings`, `AIPrompt`, `AuthorProfile`, `CreditBalance` | `AccountBaseModel` | `account` |
| **Site+Sector** | `Keywords`, `Clusters`, `ContentIdeas`, `Tasks`, `Content`, `Images`, `AutomationConfig` | `SiteSectorBaseModel` | `site`, `sector` | | **Site** | `Site`, `PublishingSettings`, `AutomationConfig`, `SiteIntegration` | `AccountBaseModel` | `account`, `site` |
| **Site+Sector** | `Keywords`, `Clusters`, `ContentIdeas`, `Tasks`, `Content`, `Images` | `SiteSectorBaseModel` | `site`, `sector` |
--- ---
@@ -270,8 +271,18 @@ class Content(models.Model):
meta_title = CharField(max_length=255, blank=True) meta_title = CharField(max_length=255, blank=True)
meta_description = TextField(blank=True) meta_description = TextField(blank=True)
# Workflow status
status = CharField(choices=CONTENT_STATUS) # draft, review, approved, published status = CharField(choices=CONTENT_STATUS) # draft, review, approved, published
# Publishing status (v1.3.2)
site_status = CharField(choices=SITE_STATUS) # not_published, scheduled, publishing, published, failed
scheduled_publish_at = DateTimeField(null=True)
site_status_updated_at = DateTimeField(null=True)
# External site reference
external_id = CharField(max_length=255, blank=True) # WordPress post ID
external_url = URLField(blank=True) # Published URL
word_count = IntegerField(default=0) word_count = IntegerField(default=0)
created_by = ForeignKey(User) created_by = ForeignKey(User)
@@ -279,12 +290,19 @@ class Content(models.Model):
updated_at = DateTimeField(auto_now=True) updated_at = DateTimeField(auto_now=True)
``` ```
**Status Values:** **Workflow Status Values (status):**
- `draft` - Initial state after generation - `draft` - Initial state after generation
- `review` - Pending human review - `review` - Pending human review
- `approved` - Ready for publishing - `approved` - Ready for publishing (v1.3.2: NEW status)
- `published` - Published to WordPress - `published` - Published to WordPress
**Publishing Status Values (site_status) - v1.3.2:**
- `not_published` - Not yet scheduled for external site
- `scheduled` - Scheduled for future publishing
- `publishing` - Currently being published
- `published` - Successfully published to external site
- `failed` - Publishing failed
--- ---
### ContentImage ### ContentImage
@@ -311,7 +329,7 @@ class ContentImage(models.Model):
--- ---
## Integration Models (`igny8_core/modules/integration/models.py`) ## Integration Models (`igny8_core/business/integration/models.py`)
### SiteIntegration ### SiteIntegration
@@ -321,7 +339,7 @@ class SiteIntegration(models.Model):
name = CharField(max_length=255) name = CharField(max_length=255)
site = ForeignKey(Site, related_name='integrations') site = ForeignKey(Site, related_name='integrations')
integration_type = CharField(max_length=50) # wordpress platform = CharField(max_length=50) # wordpress
# Credentials (encrypted) # Credentials (encrypted)
url = URLField() url = URLField()
@@ -344,7 +362,51 @@ class SiteIntegration(models.Model):
--- ---
## Billing Models (`igny8_core/modules/billing/models.py`) ### PublishingSettings (NEW v1.3.2)
```python
class PublishingSettings(AccountBaseModel):
"""Site-level publishing configuration. Controls auto-approval, publishing limits, and scheduling."""
site = OneToOneField(Site, related_name='publishing_settings')
# Auto-approval settings
auto_approval_enabled = BooleanField(default=True)
# Auto-publish settings
auto_publish_enabled = BooleanField(default=True)
# Publishing limits
daily_publish_limit = PositiveIntegerField(default=3)
weekly_publish_limit = PositiveIntegerField(default=15)
monthly_publish_limit = PositiveIntegerField(default=50)
# Publishing schedule
publish_days = JSONField(default=['mon', 'tue', 'wed', 'thu', 'fri'])
publish_time_slots = JSONField(default=['09:00', '14:00', '18:00'])
created_at = DateTimeField(auto_now_add=True)
updated_at = DateTimeField(auto_now=True)
```
**Default Values:**
- `auto_approval_enabled`: True (auto-approve after review)
- `auto_publish_enabled`: True (auto-publish approved content)
- `daily_publish_limit`: 3 articles per day
- `weekly_publish_limit`: 15 articles per week
- `monthly_publish_limit`: 50 articles per month
- `publish_days`: Monday through Friday
- `publish_time_slots`: 9:00 AM, 2:00 PM, 6:00 PM
**Usage:**
```python
# Get or create with defaults
settings, created = PublishingSettings.get_or_create_for_site(site)
```
---
## Billing Models (`igny8_core/business/billing/models.py`)
### Plan ### Plan

View File

@@ -1,7 +1,7 @@
# IGNY8 Technical Documentation # IGNY8 Technical Documentation
**Version:** 1.3.1 **Version:** 1.3.2
**Last Updated:** January 2, 2026 **Last Updated:** January 3, 2026
**Purpose:** Complete technical reference for the IGNY8 AI content platform **Purpose:** Complete technical reference for the IGNY8 AI content platform
--- ---
@@ -21,6 +21,7 @@
| Trace a workflow end-to-end | [40-WORKFLOWS/](#workflows) | | Trace a workflow end-to-end | [40-WORKFLOWS/](#workflows) |
| Look up model fields | [90-REFERENCE/MODELS.md](90-REFERENCE/MODELS.md) | | Look up model fields | [90-REFERENCE/MODELS.md](90-REFERENCE/MODELS.md) |
| See prelaunch checklist | [plans/FINAL-PRELAUNCH.md](plans/FINAL-PRELAUNCH.md) | | See prelaunch checklist | [plans/FINAL-PRELAUNCH.md](plans/FINAL-PRELAUNCH.md) |
| **Understand publishing flow** | [50-DEPLOYMENT/WORDPRESS-INTEGRATION-FLOW.md](50-DEPLOYMENT/WORDPRESS-INTEGRATION-FLOW.md) |
--- ---
@@ -46,7 +47,7 @@
| **Integrations** | ✅ Active | WordPress sync, webhooks | [INTEGRATIONS.md](10-MODULES/INTEGRATIONS.md) | | **Integrations** | ✅ Active | WordPress sync, webhooks | [INTEGRATIONS.md](10-MODULES/INTEGRATIONS.md) |
| **Notifications** | ✅ Active | Real-time notifications for AI tasks | [NOTIFICATIONS.md](10-MODULES/NOTIFICATIONS.md) | | **Notifications** | ✅ Active | Real-time notifications for AI tasks | [NOTIFICATIONS.md](10-MODULES/NOTIFICATIONS.md) |
| **System** | ✅ Active | Settings, prompts, AI config | [SYSTEM-SETTINGS.md](10-MODULES/SYSTEM-SETTINGS.md) | | **System** | ✅ Active | Settings, prompts, AI config | [SYSTEM-SETTINGS.md](10-MODULES/SYSTEM-SETTINGS.md) |
| **Publisher** | ✅ Active | Content publishing pipeline | [PUBLISHER.md](10-MODULES/PUBLISHER.md) | | **Publisher** | ✅ Active | Content calendar, scheduled publishing | [PUBLISHER.md](10-MODULES/PUBLISHER.md) |
| **Linker** | ⏸️ Inactive | Internal linking (disabled by default) | [LINKER.md](10-MODULES/LINKER.md) | | **Linker** | ⏸️ Inactive | Internal linking (disabled by default) | [LINKER.md](10-MODULES/LINKER.md) |
| **Optimizer** | ⏸️ Inactive | Content optimization (disabled by default) | [OPTIMIZER.md](10-MODULES/OPTIMIZER.md) | | **Optimizer** | ⏸️ Inactive | Content optimization (disabled by default) | [OPTIMIZER.md](10-MODULES/OPTIMIZER.md) |
@@ -72,15 +73,17 @@
| [PAGE-REQUIREMENTS.md](30-FRONTEND/PAGE-REQUIREMENTS.md) | Site/sector selector requirements | | [PAGE-REQUIREMENTS.md](30-FRONTEND/PAGE-REQUIREMENTS.md) | Site/sector selector requirements |
| [STORES.md](30-FRONTEND/STORES.md) | Zustand state management | | [STORES.md](30-FRONTEND/STORES.md) | Zustand state management |
### Current Page Structure (v1.2.0) ### Current Page Structure (v1.3.2)
``` ```
/ → Dashboard (Home.tsx) - with new widgets / → Dashboard (Home.tsx) - with workflow widgets
├── SETUP ├── SETUP
│ /setup/wizard → Onboarding Wizard (SetupWizard.tsx) [NEW v1.3.2]
│ /setup/add-keywords → Add Keywords (AddKeywords.tsx) │ /setup/add-keywords → Add Keywords (AddKeywords.tsx)
│ /account/content-settings → Content Settings (ContentSettingsPage.tsx) │ /account/content-settings → Content Settings (ContentSettingsPage.tsx)
│ /sites → Sites List (List.tsx) │ /sites → Sites List (List.tsx)
│ /sites/:id/settings → Site Settings (SiteSettings.tsx) │ /sites/:id → Site Dashboard (Dashboard.tsx)
│ /sites/:id/settings → Site Settings (Settings.tsx) - with Publishing tab
│ /thinker/prompts → Thinker Prompts (Prompts.tsx) [Admin] │ /thinker/prompts → Thinker Prompts (Prompts.tsx) [Admin]
│ /thinker/author-profiles → Author Profiles (AuthorProfiles.tsx) [Admin] │ /thinker/author-profiles → Author Profiles (AuthorProfiles.tsx) [Admin]
├── WORKFLOW ├── WORKFLOW
@@ -92,10 +95,14 @@
│ /writer/images → Images (Images.tsx) │ /writer/images → Images (Images.tsx)
│ /writer/review → Review (Review.tsx) │ /writer/review → Review (Review.tsx)
│ /writer/approved → Approved (Approved.tsx) │ /writer/approved → Approved (Approved.tsx)
│ /automation → Automation Dashboard (Dashboard.tsx) │ /automation → Automation Dashboard (AutomationPage.tsx)
├── PUBLISHER [NEW v1.3.2]
│ /publisher/content-calendar → Content Calendar (ContentCalendar.tsx)
├── OPTIONAL MODULES
│ /linker/content → Linker [if enabled] │ /linker/content → Linker [if enabled]
│ /optimizer/content → Optimizer [if enabled] │ /optimizer/content → Optimizer [if enabled]
├── ACCOUNT ├── ACCOUNT
│ /account/notifications → Notifications (NotificationsPage.tsx)
│ /account/settings → Account Settings (AccountSettingsPage.tsx) │ /account/settings → Account Settings (AccountSettingsPage.tsx)
│ - Tabs: Account, Profile, Team │ - Tabs: Account, Profile, Team
│ /account/plans → Plans & Billing (PlansAndBillingPage.tsx) │ /account/plans → Plans & Billing (PlansAndBillingPage.tsx)
@@ -103,8 +110,10 @@
│ /account/usage → Usage Analytics (UsageAnalyticsPage.tsx) │ /account/usage → Usage Analytics (UsageAnalyticsPage.tsx)
│ - Tabs: Limits, Credit History, API Activity │ - Tabs: Limits, Credit History, API Activity
│ /settings/integration → AI Models (IntegrationPage.tsx) [Admin] │ /settings/integration → AI Models (IntegrationPage.tsx) [Admin]
── HELP ── HELP
/help → Help Center (HelpCenter.tsx) /help → Help Center (HelpCenter.tsx)
└── INTERNAL
/ui-elements → UI Elements (UIElements.tsx) [Design System Ref]
``` ```
--- ---
@@ -114,8 +123,7 @@
| Document | Purpose | | Document | Purpose |
|----------|---------| |----------|---------|
| [CONTENT-PIPELINE.md](40-WORKFLOWS/CONTENT-PIPELINE.md) | Keyword → Published article flow | | [CONTENT-PIPELINE.md](40-WORKFLOWS/CONTENT-PIPELINE.md) | Keyword → Published article flow |
| [CREDIT-DEDUCTION.md](40-WORKFLOWS/CREDIT-DEDUCTION.md) | When and how credits are used | | [CREDIT-SYSTEM.md](40-WORKFLOWS/CREDIT-SYSTEM.md) | When and how credits are used |
| [WORDPRESS-SYNC.md](40-WORKFLOWS/WORDPRESS-SYNC.md) | Two-way WordPress synchronization |
--- ---