First commit of the image + Instagram A/B pipeline workstream. Ships the Cloudflare Workers AI image provider, its pricing + validator helpers, four new settings fields in a new "Images" admin section, and unit tests with mocked HTTP. Nothing calls the provider yet from the article pipeline — integration lands in commit 1b. Why: CEO-approved on 2026-04-15 (see convo/prautoblogger/threads/2026-04-image-pipeline/01-cto-handoff.md). Style is locked to the 90s infomercial pastiche; default model is FLUX.1 [schnell] at ~$0.0011/MP (~$0.01/article for 8 images across 4 placements x 2 variants). Risk flags: - Direct call to Cloudflare Workers AI bypassing AI Gateway (decision D-001, documented in convo/prautoblogger/decisions/). Gateway route to Workers AI currently 403s; OpenRouter gateway path unaffected. - prab_event_log structured writes deferred to commit 1b when the table lands (decision D-002). Logger-based logging is in place now. - No schema changes. No existing code paths touched outside settings. - Backward compatible: provider is instantiable but not wired to any consumer yet. Test plan: - CI runs PHPUnit including the new CloudflareImageProviderTest. - After merge: verify the new Images section appears on the settings page, the style-suffix textarea pre-fills with the infomercial prompt, and entering the existing CLOUDFLARE_AI_TOKEN + account UUID lets a future "Test Connection" button return OK (button ships in a later commit; the underlying validate_credentials_detailed() works today). Files: - includes/providers/interface-image-provider.php (adopted from CTO draft) - includes/providers/class-cloudflare-image-provider.php (283 lines) - includes/providers/class-cloudflare-image-pricing.php (78 lines) - includes/providers/class-cloudflare-image-validator.php (107 lines) - includes/admin/class-settings-fields.php (+ Images section, 4 fields) - prautoblogger.php (+ PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL, _STYLE_SUFFIX) - tests/unit/Providers/CloudflareImageProviderTest.php - ARCHITECTURE.md (file tree, integrations table, options table, decision #16) - CONVENTIONS.md (How To: Add a New Image Provider) - CHANGELOG.md (Unreleased section) Agent-Session: cowork-2026-04-15-image-pipeline-commit-1a
6.8 KiB
Executable File
6.8 KiB
Executable File
Changelog
All notable changes to PRAutoBlogger will be documented in this file.
Format follows Keep a Changelog, and this project uses Semantic Versioning.
[Unreleased]
Added
- Image provider: Cloudflare Workers AI (FLUX.1 family). First commit of
the image + Instagram A/B pipeline workstream. Ships the provider, its
pricing + validator helpers, four new settings fields in a new "Images"
admin section, and unit tests with mocked HTTP. Nothing calls the provider
yet from the article pipeline — integration lands in commit 1b.
includes/providers/interface-image-provider.php(adopted from the CTO's uncommitted draft) — contract for any image provider.includes/providers/class-cloudflare-image-provider.php— FLUX on Workers AI, direct call to/accounts/{id}/ai/run/...(bypassing AI Gateway per decision D-001); exponential-backoff retries on 429 / 5xx / network, loud fail on 4xx; handles both raw-bytes and JSON-envelope response shapes.includes/providers/class-cloudflare-image-pricing.php— model alias → full Workers AI id resolution + per-megapixel cost estimation.includes/providers/class-cloudflare-image-validator.php— non-destructive "Test Connection" credential check that never generates a real image.- Settings:
prautoblogger_cloudflare_ai_token(encrypted),prautoblogger_cloudflare_account_id,prautoblogger_image_model(schnell / dev),prautoblogger_image_style_suffix(default = CEO-locked 90s infomercial prompt). - Constants:
PRAUTOBLOGGER_DEFAULT_IMAGE_MODEL,PRAUTOBLOGGER_DEFAULT_IMAGE_STYLE_SUFFIX. - Tests:
tests/unit/Providers/CloudflareImageProviderTest.phpcovers happy path (raw bytes + JSON envelope), dimension + empty-prompt validation, 4xx loud-fail without retry, unexpected response shape, cost scaling across models and dimensions, and missing-token diagnostics.
- ARCHITECTURE.md: new key decision #16 (image pipeline: Cloudflare Workers AI), new external API integration row, new options rows, file tree updates.
- CONVENTIONS.md: new "How To: Add a New Image Provider" section.
[0.2.2] — 2026-04-12
Changed
- CI/CD pipeline now runs PHPCS and PHPUnit before deploying.
Added
shivammathur/setup-php@v2for PHP 8.1, Composer install, WordPress Coding Standards check, and full PHPUnit test suite. PHPCS runs in report-only mode (|| true) while codebase is brought into full compliance; PHPUnit failures block deploy. - Removed stub source providers (TikTok, Instagram, YouTube).
These were dead code — not registered in Source_Collector, threw
RuntimeException if enabled, and confused AI agents reading the
codebase. The
Source_Provider_Interfaceremains the contract for adding future platforms (see CONVENTIONS.md). - Removed "coming soon" checkboxes from Enabled Sources setting.
- Updated ARCHITECTURE.md: removed stub file references, added cross-system LLM budget coordination section documenting how PRAutoBlogger and Peptide News share an OpenRouter account.
Improved
- PublisherTest rewritten with real behavioral assertions. Now tests: post_status ('publish' vs 'draft'), generation metadata storage, title from idea, taxonomy assignment, tag assignment, run_id-based log linking, RuntimeException on WP_Error, action/filter hook firing. Replaces previous method-existence-only checks.
[0.2.1] — 2026-04-12
Changed
- Reddit data source switched to RSS primary, .json fallback. PullPush.io was frequently stale/unavailable. Reddit RSS/Atom feeds work reliably from datacenter IPs (Hostinger) where .json gets 403. Comments are still fetched via .json (unavailable in RSS).
- Updated "Enabled Sources" checkbox label to "Reddit (RSS + .json)".
- Updated "Test Connections" to show RSS + .json status.
- Source status indicator now shows Reddit RSS (Primary) and .json (Fallback).
Removed
class-pull-push-client.php— replaced by RSS feeds inclass-reddit-json-client.php.- All PullPush.io references from admin UI, docs, and provider code.
Fixed
- Generate Now button now always sends
force: '1'to clear stale generation locks. - Fixed encryption double-encryption bug with
enc:prefix detection.
[0.2.0] — 2026-04-12
Changed
- Reddit data source migrated from OAuth to RSS + .json (no auth required). Reddit rejected our API application; RSS feeds and .json endpoints are free and require no authentication.
- Removed Reddit Client ID and Client Secret fields from admin API Keys tab.
- Updated "Test Connections" results to show Reddit source status.
Added
- Source status indicator in API Keys tab showing RSS and .json availability with live status dots and last-collection timestamp.
- Configurable research cache TTL (1–72 hours) in Sources tab.
- Reddit time window selector (24h / week / month) in Sources tab.
- Posts-per-subreddit limit (5–100) in Sources tab.
- LiteSpeed cache purge step in CI/CD deploy pipeline.
Removed
class-reddit-api-client.php— replaced byclass-reddit-json-client.php.- Reddit OAuth credential fields and encrypted storage entry.
Fixed
- Deploy pipeline now purges LiteSpeed/OPcache after file extraction, preventing stale PHP bytecode from being served.
[0.1.0] — 2026-04-10
Added
- Initial plugin scaffold with WordPress-native architecture.
- OpenRouter LLM provider with configurable model selection and retry logic.
- Reddit API source provider (OAuth2 script app) for collecting posts and comments.
- Content analysis engine: detects recurring questions, complaints, and comparisons.
- Idea scorer with deduplication against existing posts.
- Configurable writer agent pipeline (single-pass or multi-step: outline → draft → polish).
- Chief editor agent for LLM-powered editorial review before publishing.
- Publisher with full generation metadata stored as post_meta.
- Cost tracker with per-call logging, monthly budget enforcement, and hard-stop.
- Metrics collector: WordPress native + GA4 integration + composite content scoring.
- Admin settings page with sections for API keys, models, content, sources, schedule, and analytics.
- Metrics dashboard showing monthly spend, budget utilization, cost by stage, and daily spend.
- Post metabox showing generation metadata on PRAutoBlogger-generated posts.
- Admin notices for missing API keys, budget warnings, and configuration hints.
- Stub providers for TikTok, Instagram, and YouTube (future implementation).
- Encrypted storage for API keys using AES-256-CBC with wp_salt().
- AJAX-powered "Generate Now" and "Test Connections" buttons.
- Custom database tables for source data, analysis results, generation logs, and content scores.
- Clean uninstall handler removing all plugin data.
- ARCHITECTURE.md and CONVENTIONS.md for AI-readable codebase documentation.