Taxonomy assignment, generation log linking, LLM content sanitization,
default author resolution, and image pipeline attachment moved to
PRAutoBlogger_Post_Assembler as static helpers. Publisher retains
create_post orchestration, publish/draft flow, and meta building.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract read-only reporting methods from PRAutoBlogger_Cost_Tracker into a new
PRAutoBlogger_Cost_Reporter class. This reduces Cost_Tracker from 313 to 206
lines and Reporter to 141 lines, both under the 300-line cap.
Changed files:
- Create includes/core/class-cost-reporter.php with reporting methods:
* get_monthly_spend(): float
* get_daily_spend(int $days = 30): array
* get_spend_by_stage(string $start_date, string $end_date): array
* get_budget_utilization(): float
- Update includes/core/class-cost-tracker.php:
* Remove reporting methods
* Update is_budget_exceeded() and would_exceed_budget() to use Cost_Reporter
* Keep get_current_run_cost() (tracks current pipeline run only)
* Add @see cross-reference to Cost_Reporter
- Update templates and admin classes to instantiate Cost_Reporter:
* templates/admin/metrics-page.php
* templates/admin/settings-page.php
* includes/admin/class-admin-notices.php
* includes/admin/class-dashboard-widget.php
- Split tests/unit/Core/CostTrackerTest.php:
* Create tests/unit/Core/CostReporterTest.php for reporter methods
* Keep run ID and budget enforcement tests in CostTrackerTest
Autoloader automatically discovers PRAutoBlogger_Cost_Reporter class.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Wrap cost_usd accumulation in is_wp_error() guard so WP_Error
returns from generate_image_a/b don't crash on array access
- Add PRAUTOBLOGGER_DEFAULT_IMAGE_STYLE_SUFFIX to test bootstrap
- Add is_wp_error, sanitize_title, esc_html__ mocks to ImagePipelineTest
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Union types (array|WP_Error, int|WP_Error, string|WP_Error) require
PHP 8.0+. Removed return type declarations while keeping @return
docblocks intact for IDE/static analysis support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add `would_exceed_budget(float)` to pre-check budget before API calls
- Add `log_image_generation()` for image pipeline cost logging
- Guard Logger::log() against null $wpdb in unit test environments
- Both methods called by image pipeline (commit 1b) but were missing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Completes the image + A/B experiment workstream by integrating
image generation into the post publishing pipeline.
New classes:
- class-image-pipeline.php: Orchestrates A/B generation (article-driven
Image A → featured; source-driven Image B → post meta). Each image
independently fallible; article publishes even if both fail.
- class-image-prompt-builder.php: Synthesizes visual prompts from article
title+content and Reddit source data. Appends CEO-locked 90s infomercial
style suffix. Keeps prompts concise for FLUX.1 quality.
- class-image-media-sideloader.php: Downloads image bytes, creates temp
file, sideloads via media_handle_sideload(), sets alt text and metadata,
cleans up temp files.
Changes to existing files:
- Publisher.attach_generated_images(): Runs image pipeline post-creation,
sets _thumbnail_id (Image A) and _prautoblogger_image_b_id (Image B).
Errors logged but don't block post publication.
- Settings: prautoblogger_image_enabled (toggle, default off).
Tests:
- ImagePipelineTest.php: Orchestration, cost tracking, graceful failures.
- ImagePromptBuilderTest.php: Prompt generation, length limits.
Docs:
- ARCHITECTURE.md: New step 6b in data flow, new files in file tree.
- CHANGELOG.md: Commit 1a/1b breakdown.
Co-authored-by: peptiderepo <peptiderepo@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Address CTO audit findings for PRAutoBlogger:
- CI pipeline now runs PHPCS (WordPress standards) and PHPUnit before deploy
- Removed TikTok/Instagram/YouTube stub providers (dead code, not registered)
- Rewrote PublisherTest with real behavioral assertions (post_status, metadata,
taxonomy, log linking, hooks) instead of method-existence checks
- Added cross-system LLM budget coordination docs to ARCHITECTURE.md
- Bumped version to 0.2.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
LLMs sometimes ignore format instructions and wrap content in markdown
code fences or full HTML document structures. Added sanitize_llm_content()
to the publisher that strips these before wp_kses_post() runs, preventing
raw ```html blocks and <html><head><body> wrappers from reaching post_content.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite encryption with "enc:" prefix to permanently eliminate
the double-encryption bug on settings save
- Add one-time migration to clear legacy non-prefixed encrypted values
- Rewrite content analyzer prompts to request N distinct diverse topics
across 5 categories (question, complaint, comparison, news, guide)
- Pass target_count*2 from pipeline to analyzer for headroom
- Add skip_dedup flag so manual Generate Now always produces content
- Generate Now button now sends force=1 to clear stale locks
- Rename OpenRouter provider files to PSR-4 convention (hyphenated)
- Switch default models to google/gemini-2.5-flash-lite
- Clean up reddit_debug log channel to standard 'reddit'
- Bump version to 0.2.1
Cost: ~$0.003/article with Gemini 2.0 Flash, ~34s pipeline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
WordPress plugin that auto-researches topics from Reddit, generates
SEO-optimized articles via OpenRouter LLMs, runs them through a chief
editor agent, and publishes on a daily schedule.
Includes:
- Full generation pipeline (collect → analyze → score → generate → review → publish)
- Cost tracking and budget enforcement
- Admin UI: settings, review queue, metrics, activity log
- CI/CD pipeline (GitHub Actions → WordPress REST deploy)
- Unit test suite (PHPUnit + Brain Monkey)
- Structured logging with configurable verbosity
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>