- #116: Batch N+1 queries in processEvergreen() — pre-load
posted_at and pending status in 2 queries instead of N*M
- #117: Extract buildArticleMeta() from renderTemplate() — category,
author, tags resolved once per article instead of per service
- #118: Wire up media attachments in Threads, WordPress, Medium,
Tumblr, Teams, Google Business, Pinterest, TikTok
- #119: Rewrite 7 stub plugins with correct API implementations:
Dev.to (api-key header), Brevo (api-key header, campaign format),
ConvertKit (api_secret body), Reddit (form-encoded, subreddit),
Pinterest (v5 pins with media_source), SendGrid (single sends),
Constant Contact (email campaigns), TikTok (content init)
- #124: Teams — migrate to Adaptive Cards format, remove dead
resolveCredential() method and duplicate webhook_url fallback
- #125: Google Business — fix URL path segments (accounts/locations)
and add media attachment support
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- #121: schedule() now only allows re-scheduling posts with status
queued/failed/permanently_failed/cancelled — prevents duplicates
- #122: updateLastRunTimestamp() uses JSON_SET for atomic update
with fallback for databases without JSON function support
- #123: Add curl_error() handling to all 32 service plugins — DNS
failures, SSL errors, and timeouts now return actionable messages
- #126: Fix Ntfy supportsMedia() to return false (consistent with
empty getSupportedMediaTypes())
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename root source directory from src/ to source/ and update all
references in Makefile, manifest.xml, .gitignore, CI workflows,
and wiki documentation. Internal Joomla namespace paths (src/Extension)
are unchanged as they are plugin-internal structure.
CI workflows updated to check source/ first with src/ fallback for
backward compatibility across repos.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>