The bulk workflow push introduced U+201C/U+201D smart quotes in
the Setup moko-platform tools step, causing git clone to fail
with "protocol '"https' is not supported".
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- #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>
Relocate CLAUDE.md from repo root to .mokogitea/ per project convention.
Content updated with focused, repo-specific architecture and rules.
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>
Add <licensing> section to manifest.xml with update-server URL
template and dlid flag. Add manifest_licensing.php step to
pre-release workflow to auto-ensure updateservers/dlid tags.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- #96: Move Facebook token from URL query string to Authorization
header in both publish() and validateCredentials()
- #97: Cache Bluesky AT Protocol session tokens in static property
with 90-minute TTL to avoid re-authenticating on every post
- #98: Add auto_send parameter to Mailchimp — calls campaign send
endpoint after creation when enabled (default: off for safety)
- #99: Batch duplicate guard and template loading in
CrossPostDispatcher — reduces N*M queries to 2 bulk queries
- #102: Remove duplicated renderTemplate() from DispatchController,
delegate to CrossPostDispatcher::renderTemplate() (now public)
- #103: Replace deprecated Sidebar API with Joomla 5 toolbar submenu
API, with legacy fallback for Joomla 4 compatibility
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- #92: Replace MySQL-only GET_LOCK with db-agnostic locking — adds
PostgreSQL pg_advisory_lock and timestamp-based fallback
- #94: retryFailed() now includes permanently_failed and cancelled
statuses, not just failed
- #95: Validate scheduled_at datetime via Factory::getDate() in both
PostModel::prepareTable() and PostsController::schedule()
- #100: Add clarifying comment to update SQL for duplicate table def
- #101: Replace fragile LIKE query with JSON_EXTRACT() for evergreen
article detection
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move dlid and blockChildUninstall elements before updateservers and
fix tab indentation to match the 4-space convention used in the rest
of the manifest.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds onAfterRoute hook that checks the update site for a valid
MOKO-XXXX license key and shows a warning message once per session
if missing — directs users to System > Update Sites.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merge duplicate ### Added and ### Fixed headings into single sections
and fix version format from 01.00.00 to 01.00.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restores the pre-release workflow without update-stream steps —
updates.xml is now generated dynamically by the license server.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standardize manifest.xml identity block: ensure <name> contains only
the machine identifier (PascalCase) and <display-name> contains the
human-readable label with Joomla extension type prefix. Remove duplicate
<version> tags where present. Update CONTRIBUTING.md from moko-platform
default.
Authored-by: Moko Consulting