diff --git a/CHANGELOG.md b/CHANGELOG.md index e1135457..15a32d6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # IGNY8 Change Log -**Current Version:** 1.3.1 -**Last Updated:** January 2, 2026 +**Current Version:** 1.3.2 +**Last Updated:** January 3, 2026 --- @@ -9,6 +9,7 @@ | 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.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 | @@ -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 ### Design System Consolidation (Pre-Launch Section 1) diff --git a/docs/10-MODULES/AUTOMATION.md b/docs/10-MODULES/AUTOMATION.md index 502eab02..c4da6c3e 100644 --- a/docs/10-MODULES/AUTOMATION.md +++ b/docs/10-MODULES/AUTOMATION.md @@ -1,7 +1,7 @@ # Automation Module -**Last Verified:** January 1, 2026 -**Version:** 1.3.0 +**Last Verified:** January 3, 2026 +**Version:** 1.3.2 **Status:** βœ… Active **Backend Path:** `backend/igny8_core/business/automation/` **Frontend Path:** `frontend/src/pages/Automation/` @@ -16,6 +16,7 @@ | Service | `business/automation/services/automation_service.py` | `AutomationService` | | Logger | `business/automation/services/automation_logger.py` | `AutomationLogger` | | 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 | | Progress Bar | `components/Automation/GlobalProgressBar.tsx` | Full pipeline 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 | | 5 | Content β†’ Image Prompts | `GenerateImagePromptsFunction` | Per prompt | | 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. --- diff --git a/docs/10-MODULES/INTEGRATIONS.md b/docs/10-MODULES/INTEGRATIONS.md index 0af713d9..c83410a3 100644 --- a/docs/10-MODULES/INTEGRATIONS.md +++ b/docs/10-MODULES/INTEGRATIONS.md @@ -1,7 +1,7 @@ # Integrations Module -**Last Verified:** January 1, 2026 -**Version:** 1.3.0 +**Last Verified:** January 3, 2026 +**Version:** 1.3.2 **Status:** βœ… Active **Backend Path:** `backend/igny8_core/modules/integration/` + `backend/igny8_core/business/integration/` **Frontend Path:** `frontend/src/pages/Settings/IntegrationSettings.tsx` @@ -117,6 +117,29 @@ The Integrations module manages: | metadata | JSON | Additional data | | 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 diff --git a/docs/10-MODULES/PUBLISHER.md b/docs/10-MODULES/PUBLISHER.md index e4c0d1d1..e25a32ad 100644 --- a/docs/10-MODULES/PUBLISHER.md +++ b/docs/10-MODULES/PUBLISHER.md @@ -1,9 +1,10 @@ # Publisher Module -**Last Verified:** December 25, 2025 +**Last Verified:** January 3, 2026 **Status:** βœ… Active +**Version:** 1.3.2 **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` | | Models | `business/publishing/models.py` | `PublishingRecord`, `DeploymentRecord` | +| Integration Models | `modules/integration/models.py` | `PublishingSettings` | | 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 | +| Frontend | `pages/Publisher/ContentCalendar.tsx` | Content calendar view | --- @@ -22,9 +26,11 @@ The Publisher module manages: - Content publishing pipeline +- **Publishing scheduler (automated publishing)** - Publishing record tracking - Deployment management - Multi-destination publishing +- **Content calendar visualization** --- @@ -59,6 +65,31 @@ The Publisher module manages: | error_log | TextField | Errors encountered | | 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 @@ -71,6 +102,85 @@ The Publisher module manages: | POST | `/api/v1/publisher/publish/` | `PublishContentViewSet.publish` | Publish content | | GET | `/api/v1/publisher/publish/status/` | `PublishContentViewSet.status` | Get publishing status | | 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 | | 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 | -| 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 | diff --git a/docs/20-API/ENDPOINTS.md b/docs/20-API/ENDPOINTS.md index 0d622edb..0782d199 100644 --- a/docs/20-API/ENDPOINTS.md +++ b/docs/20-API/ENDPOINTS.md @@ -1,7 +1,7 @@ # API Endpoints Reference -**Last Verified:** December 27, 2025 -**Version:** 1.2.0 +**Last Verified:** January 3, 2026 +**Version:** 1.3.2 **Base URL:** `/api/v1/` **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}/generate_images/` | `ContentViewSet.generate_images` | Generate images | | 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 | | POST | `/images/generate_for_content/` | `ImageViewSet.generate_for_content` | Generate images | | POST | `/images/regenerate/` | `ImageViewSet.regenerate` | Regenerate image | | 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/`) @@ -125,6 +149,31 @@ All endpoints require authentication unless noted. | POST | `/site_sync/` | Site-level sync | Sync by site ID | | 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/`) diff --git a/docs/30-FRONTEND/COMPONENT-SYSTEM.md b/docs/30-FRONTEND/COMPONENT-SYSTEM.md index bd942115..f410cb4b 100644 --- a/docs/30-FRONTEND/COMPONENT-SYSTEM.md +++ b/docs/30-FRONTEND/COMPONENT-SYSTEM.md @@ -1,5 +1,8 @@ # IGNY8 Frontend Component System +**Last Updated:** January 3, 2026 +**Version:** 1.3.2 + > **πŸ”’ ENFORCED BY ESLINT** - Violations will trigger warnings/errors during build. > This document is the single source of truth for all UI components. @@ -11,6 +14,7 @@ |---------|-----------|-------------| | Button | `Button` | `components/ui/button/Button` | | Icon Button | `IconButton` | `components/ui/button/IconButton` | +| Button Group | `ButtonGroup` | `components/ui/button-group/ButtonGroup` | | Text Input | `InputField` | `components/form/input/InputField` | | Checkbox | `Checkbox` | `components/form/input/Checkbox` | | Radio | `Radio` | `components/form/input/Radio` | @@ -27,6 +31,7 @@ | Spinner | `Spinner` | `components/ui/spinner/Spinner` | | Tabs | `Tabs` | `components/ui/tabs/Tabs` | | Tooltip | `Tooltip` | `components/ui/tooltip/Tooltip` | +| Calendar Tooltip | `CalendarItemTooltip` | `components/ui/tooltip/CalendarItemTooltip` | | Toast | `useToast` | `components/ui/toast/ToastContainer` | | 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'; + + +``` + +### 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'; + + +``` + +--- + +## 9. LIVE REFERENCE 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: @@ -611,6 +663,20 @@ When working on this codebase, AI agents MUST: 2. **Import icons only from `src/icons`** - never from external libraries 3. **Follow the import paths** specified in this document 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 6. **Use consistent icon sizing**: `className="w-4 h-4"` for small, `w-5 h-5` for medium diff --git a/docs/30-FRONTEND/DESIGN-GUIDE.md b/docs/30-FRONTEND/DESIGN-GUIDE.md index a682ed45..acecb920 100644 --- a/docs/30-FRONTEND/DESIGN-GUIDE.md +++ b/docs/30-FRONTEND/DESIGN-GUIDE.md @@ -4,7 +4,8 @@ > > πŸ”’ **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 --- diff --git a/docs/30-FRONTEND/DESIGN-TOKENS.md b/docs/30-FRONTEND/DESIGN-TOKENS.md index ba0486d0..ef0d9949 100644 --- a/docs/30-FRONTEND/DESIGN-TOKENS.md +++ b/docs/30-FRONTEND/DESIGN-TOKENS.md @@ -1,64 +1,127 @@ # 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 -**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: -- `var(--color-primary)` - Primary brand blue (#0693e3) -- `var(--color-primary-dark)` - Primary dark (#0472b8) -- `var(--color-success)` - Success green (#0bbf87) -- `var(--color-warning)` - Warning amber (#ff7a00) -- `var(--color-danger)` - Danger red (#ef4444) -- `var(--color-purple)` - Purple accent (#5d4ae3) +### The 6 Base Colors + +| Token | Hex | Purpose | +|-------|-----|---------| +| `--color-primary` | `#0077B6` | Brand blue | +| `--color-success` | `#00B894` | Success green | +| `--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 **βœ… DO:** ```tsx -// Use Tailwind utilities with brand colors -
Content
+// Use semantic Tailwind utilities +
Primary action
+
Success message
+
Error alert
-// Use CSS variables for custom values -
Content
+// Use CSS variables for custom cases +
Custom
-// Use React components - +// Use React components with tone prop + + +Pending ``` **❌ DON'T:** ```tsx -// Don't use deprecated .igny8-* utility classes -
Content
+// Don't use Tailwind default colors (DISABLED) +
Won't work!
+
Won't work!
-// Don't hardcode color values -
Content
- -// Don't use inline styles -
Content
+// Don't hardcode hex values +
Bad!
+
Bad!
``` ## πŸ”’ Style System Lock Status **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 -- ❌ 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:** -- βœ… Check this document before creating any styles -- βœ… Use design tokens from `tokens.css` via CSS variables -- βœ… Use Tailwind utilities (bg-brand-500, text-brand-500, etc.) -- βœ… Use React components (Button, Badge, Card) from `/components/ui/` -- βœ… Follow component patterns from this guide -- βœ… Update this document if you MUST add something new +- βœ… Use semantic color tokens (brand-*, success-*, etc.) +- βœ… Import icons from `src/icons` +- βœ… Use React components (Button, Badge, Card, InputField) +- βœ… Run `npm run lint` to check for violations +- βœ… Check `/ui-elements` for component examples + +--- + +## 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 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) | 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 | |--------|---------------|-------| -| Keywords | `brand-500` (blue) | Icons, progress bars, badges | -| Clusters | `purple-500` | Icons, progress bars, badges | -| Ideas | `purple-600` | Icons, progress bars, badges | -| Tasks | `success-600` (green) | Icons, progress bars, badges | -| Content | `success-500` | Icons, progress bars, badges | -| Images | `purple-500` | Icons, progress bars, badges | +| Planner (Keywords) | `brand-500` (blue) | Icons, progress bars, badges | +| Planner (Clusters) | `purple-500` | Icons, progress bars, badges | +| Planner (Ideas) | `purple-600` | Icons, progress bars, badges | +| Writer (Tasks) | `success-600` (green) | Icons, progress bars, badges | +| Writer (Content) | `success-500` | Icons, progress bars, badges | +| Writer (Images) | `purple-500` | Icons, progress bars, badges | | Automation | `brand-500` | Pipeline cards | -| Billing | `warning-500` (amber) | Credit displays | +| Publisher | `warning-500` (amber) | Calendar, scheduling | +| Billing | `purple-500` | Credit displays | ```tsx 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 --- @@ -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 | | **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 | ### BANNED IMPORTS (DO NOT USE) @@ -254,11 +318,12 @@ const MyButton = () => +``` + +--- + ## Store Files Location ``` diff --git a/docs/90-REFERENCE/MODELS.md b/docs/90-REFERENCE/MODELS.md index 3de08b82..49a288b1 100644 --- a/docs/90-REFERENCE/MODELS.md +++ b/docs/90-REFERENCE/MODELS.md @@ -1,6 +1,6 @@ # 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) | | **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_description = TextField(blank=True) + # Workflow status 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) created_by = ForeignKey(User) @@ -279,12 +290,19 @@ class Content(models.Model): updated_at = DateTimeField(auto_now=True) ``` -**Status Values:** +**Workflow Status Values (status):** - `draft` - Initial state after generation - `review` - Pending human review -- `approved` - Ready for publishing +- `approved` - Ready for publishing (v1.3.2: NEW status) - `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 @@ -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 @@ -321,7 +339,7 @@ class SiteIntegration(models.Model): name = CharField(max_length=255) site = ForeignKey(Site, related_name='integrations') - integration_type = CharField(max_length=50) # wordpress + platform = CharField(max_length=50) # wordpress # Credentials (encrypted) 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 diff --git a/docs/INDEX.md b/docs/INDEX.md index bda2df4a..c0778a56 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -1,7 +1,7 @@ # IGNY8 Technical Documentation -**Version:** 1.3.1 -**Last Updated:** January 2, 2026 +**Version:** 1.3.2 +**Last Updated:** January 3, 2026 **Purpose:** Complete technical reference for the IGNY8 AI content platform --- @@ -21,6 +21,7 @@ | Trace a workflow end-to-end | [40-WORKFLOWS/](#workflows) | | Look up model fields | [90-REFERENCE/MODELS.md](90-REFERENCE/MODELS.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) | | **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) | -| **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) | | **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 | | [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/wizard β†’ Onboarding Wizard (SetupWizard.tsx) [NEW v1.3.2] β”‚ /setup/add-keywords β†’ Add Keywords (AddKeywords.tsx) β”‚ /account/content-settings β†’ Content Settings (ContentSettingsPage.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/author-profiles β†’ Author Profiles (AuthorProfiles.tsx) [Admin] β”œβ”€β”€ WORKFLOW @@ -92,10 +95,14 @@ β”‚ /writer/images β†’ Images (Images.tsx) β”‚ /writer/review β†’ Review (Review.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] β”‚ /optimizer/content β†’ Optimizer [if enabled] β”œβ”€β”€ ACCOUNT +β”‚ /account/notifications β†’ Notifications (NotificationsPage.tsx) β”‚ /account/settings β†’ Account Settings (AccountSettingsPage.tsx) β”‚ - Tabs: Account, Profile, Team β”‚ /account/plans β†’ Plans & Billing (PlansAndBillingPage.tsx) @@ -103,8 +110,10 @@ β”‚ /account/usage β†’ Usage Analytics (UsageAnalyticsPage.tsx) β”‚ - Tabs: Limits, Credit History, API Activity β”‚ /settings/integration β†’ AI Models (IntegrationPage.tsx) [Admin] -└── HELP - /help β†’ Help Center (HelpCenter.tsx) +β”œβ”€β”€ HELP +β”‚ /help β†’ Help Center (HelpCenter.tsx) +└── INTERNAL + /ui-elements β†’ UI Elements (UIElements.tsx) [Design System Ref] ``` --- @@ -114,8 +123,7 @@ | Document | Purpose | |----------|---------| | [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 | -| [WORDPRESS-SYNC.md](40-WORKFLOWS/WORDPRESS-SYNC.md) | Two-way WordPress synchronization | +| [CREDIT-SYSTEM.md](40-WORKFLOWS/CREDIT-SYSTEM.md) | When and how credits are used | ---