Release: MokoJoomCross v01.01.00 #106

Closed
jmiller wants to merge 116 commits from dev into main

116 Commits

Author SHA1 Message Date
jmiller dfd7dd1c9e chore: add dlid and blockChildUninstall to package manifest [skip ci] 2026-06-04 22:02:36 +00:00
jmiller 78a4fa1778 chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:56:52 +00:00
jmiller 47f6061b6f chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:39:20 +00:00
jmiller bf13bd5075 chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:30:27 +00:00
jmiller b2459dc6cd chore: remove updates.xml [skip ci] 2026-06-04 15:27:09 +00:00
jmiller 09211b6e3d chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-04 15:14:27 +00:00
jmiller 9f8ebaeb5c feat(update): migrate update server URL to Gitea Pages [skip ci] 2026-06-04 14:34:02 +00:00
jmiller 7cd81a8ae5 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-06-04 14:21:16 +00:00
jmiller aebd01a5c4 chore: sync .mokogitea/workflows/repo-health.yml from moko-platform [skip ci] 2026-06-03 09:37:36 +00:00
jmiller 2b433fd569 chore: sync .mokogitea/workflows/repo-health.yml from moko-platform [skip ci] 2026-06-03 03:11:23 +00:00
jmiller b97c5bb8d4 chore: add .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-06-02 23:48:01 +00:00
jmiller cff210ec96 chore: sync .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-06-02 21:52:14 +00:00
Moko Consulting c1a063be27 chore(ci): add CI issue reporter for auto-filing gate failures
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
2026-06-02 20:38:42 +00:00
Moko Consulting bd03dbab09 chore(ci): add CI issue reporter for auto-filing gate failures
Generic: Repo Health / Access control (push) Successful in 2s
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
2026-06-02 20:38:41 +00:00
Moko Consulting 0ac43185e5 chore(ci): add CI issue reporter for auto-filing gate failures
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Generic: Repo Health / Release configuration (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
2026-06-02 20:38:40 +00:00
gitea-actions[bot] 66704c9cee chore(ci): remove update-server.yml for update server migration [skip ci] 2026-05-31 03:46:56 +00:00
gitea-actions[bot] dc2497a513 chore(ci): remove cascade-dev.yml for update server migration [skip ci] 2026-05-31 03:46:55 +00:00
gitea-actions[bot] 38fba65a3d chore(ci): remove auto-bump.yml for update server migration [skip ci] 2026-05-31 03:46:53 +00:00
gitea-actions[bot] c00a658c0b chore(ci): remove pre-release.yml for update server migration [skip ci] 2026-05-31 03:46:51 +00:00
gitea-actions[bot] f47a928cd5 chore(ci): remove auto-release.yml for update server migration [skip ci] 2026-05-31 03:46:49 +00:00
jmiller 1ee8269b8e chore: sync .mokogitea/workflows/cascade-dev.yml from moko-platform [skip ci] 2026-05-31 01:46:12 +00:00
Jonathan Miller 2c480e8d31 chore(manifest): fix display-name structure and update CONTRIBUTING.md
Universal: Auto Version Bump / Version Bump (push) Failing after 4s
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
2026-05-30 19:11:09 -05:00
jmiller 5d2c32422a chore: add .mokogitea/workflows/pr-check.yml from moko-platform [skip ci] 2026-05-30 16:03:58 +00:00
jmiller 49c0484061 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-05-30 15:05:05 +00:00
jmiller 4708bb66fd chore: sync .mokogitea/workflows/auto-bump.yml from moko-platform [skip ci] 2026-05-30 15:02:30 +00:00
jmiller 17be4ff0f1 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-05-30 01:17:13 +00:00
jmiller 0ad4963115 chore: sync .mokogitea/workflows/auto-bump.yml from moko-platform [skip ci] 2026-05-29 10:32:38 +00:00
gitea-actions[bot] f88c760c0f chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 05:29:02 +00:00
gitea-actions[bot] 40e540461e chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 05:29:01 +00:00
Jonathan Miller 8dd6fdd926 fix: critical and high severity audit fixes
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update Server (push) Successful in 10s
C-1: CSRF nonce on OAuth authorize/callback flow
C-2: POST method enforcement on REST dispatch endpoint
C-5: Service credential fields now saved from form to JSON column
     (collect cred_* fields, strip prefix, JSON encode on save;
      expand back on load for editing)
H-1: Joomla 5 event ArrayAccess pattern for service plugin collection
     (reads from Event indices instead of broken by-reference)
H-4: ServiceTable::check() with alias generation, required validation
H-9: WebhookService credential keys match form XML field names,
     Bearer/Basic auth headers implemented correctly
M-4: XSS fix — escape $extraClass in ServiceIconHelper::renderIcon()
M-5: Article history HTML injection via setFieldAttribute() instead
     of double-escaped XML description attribute

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-29 00:28:36 -05:00
gitea-actions[bot] 353c037907 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 05:13:42 +00:00
gitea-actions[bot] fcb332ea00 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 05:13:40 +00:00
Jonathan Miller 20ee39f54b feat: 5 final features — category routing, char counter, service icons, drill-down analytics, article history
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
1. Category routing rules — new DB table #__mokojoomcross_category_rules
   maps Joomla categories to specific services (whitelist). Integrated
   into CrossPostDispatcher before per-article filters.
2. Character counter — live JS counter in template editor shows
   remaining chars per platform with color coding (green/yellow/red)
3. Service type icons — ServiceIconHelper maps 34 types to Bootstrap
   icons, used in services list, posts list, and dashboard
4. Per-service analytics drill-down — ServiceStats view with stats
   cards, daily trend chart, recent posts, top articles. Dashboard
   service rows are now clickable links.
5. Article editor cross-post history — read-only panel in the
   Cross-Posting fieldset showing last 10 post results with status
   badges, service names, and timestamps

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-29 00:13:30 -05:00
gitea-actions[bot] 57f34f0fc7 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 03:56:02 +00:00
gitea-actions[bot] 58a9641b94 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 03:56:01 +00:00
Jonathan Miller 16c068b4b0 feat: getSupportedMediaTypes() on all 36 service plugins
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
Add media capability reporting to MokoJoomCrossServiceInterface.
Each plugin now returns its supported media types:
- image, video, gif, document (per platform capability)
- Empty array for text-only services (Nostr, Ntfy, ConvertKit)

Enables the dispatcher to skip media attachments for text-only
services and choose appropriate media types per platform.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 22:55:51 -05:00
gitea-actions[bot] de869c2b5d chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 03:52:43 +00:00
gitea-actions[bot] b8cd0253e1 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 03:52:42 +00:00
Jonathan Miller c3899b65d3 feat: bulk re-queue, purge posted, CSV export, package manifest update
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 8s
- PostsController: retryFailed(), purgePosted(), exportCsv() tasks
- Posts HtmlView: Retry Failed, Purge Posted, Export CSV toolbar buttons
- pkg_mokojoomcross.xml: added new sub-extension entries

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 22:52:30 -05:00
gitea-actions[bot] 7777ffca32 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 03:48:32 +00:00
gitea-actions[bot] 90340dd499 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 03:48:31 +00:00
Jonathan Miller 7747fef50e refactor: split content-type dispatch into pluggable source plugins
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 8s
Extract dispatch logic from monolithic system plugin into a shared
CrossPostDispatcher helper. Each content type now has its own plugin:

- plg_content_mokojoomcross — articles (onContentAfterSave/ChangeState)
- plg_system_mokojoomcross_events — MokoJoomCalendar events
- plg_system_mokojoomcross_gallery — MokoJoomGallery galleries/images
- plg_mokojoomcross_mokojoomcalendar — calendar service enrichment
- plg_mokojoomcross_mokojoomgallery — gallery service enrichment

System plugin stripped to page-load queue processing only.

Also fixes: onContentBeforeDisplay Joomla 5/6 BeforeDisplayEvent
compatibility (was crashing with wrong argument type).

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 22:48:18 -05:00
gitea-actions[bot] 3586ce7661 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 03:33:54 +00:00
gitea-actions[bot] 83dc2fa013 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 03:33:52 +00:00
Jonathan Miller 9544f4f0bb feat: 7 medium-effort enhancements
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update Server (push) Successful in 10s
1. Image attachment pipeline — article intro image passed to publish()
   via $media array (system plugin + QueueProcessor)
2. Custom fields as placeholders — {field:xxx} resolves Joomla custom
   fields in templates
3. Lifecycle events — onMokoJoomCrossBeforePost (cancellable),
   AfterPost, PostFailed for third-party hooks
4. Token auto-refresh — OAuthHelper::refreshTokenIfNeeded() checks
   token_expires and refreshes via refresh_token before each publish
5. DB lock race fix — MySQL GET_LOCK() replaces read-then-write pattern
6. WordPress canonical URL — appends source link to cross-posted content
7. REST API dispatch — POST /api/v1/mokojoomcross/dispatch triggers
   cross-posting programmatically with article_id + optional service_ids

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 22:33:42 -05:00
gitea-actions[bot] 288dbb2240 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-29 00:14:13 +00:00
gitea-actions[bot] 37b32a56b3 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-29 00:14:12 +00:00
Jonathan Miller 3b501719ff feat: 10 quick-win enhancements
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
1. Test Connection button — AJAX validation on service edit sidebar
2. Bulk re-queue failed + purge posted — toolbar buttons on Posts list
3. Exponential backoff — retry_delay * 2^retry_count replaces fixed delay
4. Queue depth warning — dashboard alert when queued > 50
5. First-publish-only toggle — skip cross-posting on article re-saves
6. Dashboard trend chart — Chart.js line chart for daily posted/failed
7. Hashtag injection — {tags} and {hashtags} template placeholders
8. Posts list filters — service dropdown + search by article/message
9. CSV export — download filtered post history as spreadsheet
10. Dashboard date range — 7d/30d/90d/all filter on analytics

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 19:14:03 -05:00
gitea-actions[bot] 5325293db4 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-28 23:56:27 +00:00
gitea-actions[bot] 06b27095ab chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-28 23:56:26 +00:00
Jonathan Miller 362ce47e71 feat: post edit form, manual post creator, and scheduled posts
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
Complete the Post CRUD that was previously stub-only:
- PostModel (AdminModel) for loading/saving individual posts
- Post HtmlView with toolbar (apply, save, cancel, dashboard)
- post.xml form with article selector, service selector, message
  textarea, status dropdown, and scheduled_at calendar picker
- Post edit template with results sidebar and re-queue button
- Posts list: New button in toolbar, clickable article titles,
  scheduled_at display with clock icon
- 20 new language strings for the post edit UI

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 18:56:13 -05:00
gitea-actions[bot] 911aac785b chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-28 23:47:05 +00:00
gitea-actions[bot] 865a877f99 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-28 23:47:04 +00:00
Jonathan Miller 1acb7f3778 feat: evergreen content re-sharing
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
Articles can be marked as "evergreen" in the Cross-Posting fieldset,
with a configurable re-share interval (default 30 days). The queue
processor checks for due articles and re-queues them automatically,
bypassing the duplicate guard for articles whose last successful post
exceeds the interval.

- Per-article: evergreen toggle + interval (days) in article editor
- Global config: enable/disable, default interval, max per run
- QueueProcessor::processEvergreen() finds and re-queues due articles
- Task plugin calls processEvergreen() before processQueue()

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 18:46:56 -05:00
gitea-actions[bot] f8d1934d14 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-28 22:40:18 +00:00
gitea-actions[bot] 435d4e8392 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-28 22:40:15 +00:00
Jonathan Miller dc53ef48d1 feat: per-service help links to KB articles on mokoconsulting.tech
Universal: Auto Version Bump / Version Bump (push) Successful in 5s
Update Server / Update Server (push) Successful in 16s
Service edit sidebar now shows a contextual "Setup Guide" button when
a service type is selected. Links to the matching KB article on the
live site (e.g., /kb/mokojoomcross/service-twitter-mokojoomcross).
All 34 service types mapped.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 17:40:03 -05:00
gitea-actions[bot] 1f76d7d2e9 chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-28 22:05:04 +00:00
gitea-actions[bot] 7262506d8e chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-28 22:05:02 +00:00
Jonathan Miller 12074b71c3 fix: rewrite 13 broken service plugins with correct API implementations
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 10s
All 13 plugins had copy-paste stub code with literal placeholder URLs
(e.g. '{site_url}/api/endpoint') that were never substituted with
actual credential values. Each plugin now has correct:
- URL construction from credentials
- Auth method (Basic Auth for WP, JWT for Ghost, GraphQL for Hashnode)
- API payload format per platform spec
- Credential validation with live API checks

Fixed: ActivityPub, Blogger, Ghost, Google Business, Hashnode, Matrix,
Medium, Nostr (stub), RSS Feed, Threads, Tumblr, WhatsApp, WordPress.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 17:04:52 -05:00
gitea-actions[bot] 949f58506c chore: update development channel 01.00.13-dev [skip ci] 2026-05-28 21:51:14 +00:00
gitea-actions[bot] e23ddf9344 chore(version): auto-bump 01.00.13-dev [skip ci] 2026-05-28 21:51:12 +00:00
Jonathan Miller 5c86bdc24c fix: add missing Toolbar and Route imports in 5 admin views
Universal: Auto Version Bump / Version Bump (push) Successful in 5s
Update Server / Update Server (push) Successful in 12s
Dashboard link buttons in Logs, Posts, Services, Template, and
Templates views used Toolbar::getInstance() and Route::_ without
importing the classes — causing fatal errors on page load.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 16:50:58 -05:00
jmiller e25c6a9885 chore: sync .mokogitea/workflows/update-server.yml from moko-platform [skip ci] 2026-05-28 20:51:51 +00:00
jmiller 39d9d6fe1d chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-05-28 20:47:01 +00:00
gitea-actions[bot] b57910f63b chore: update development channel 01.00.12-dev [skip ci] 2026-05-28 20:38:48 +00:00
gitea-actions[bot] 77cac8c8c3 chore(version): auto-bump 01.00.12-dev [skip ci] 2026-05-28 20:38:46 +00:00
Jonathan Miller 430d6a79f4 feat: complete service credential fields + fix Twitter OAuth 1.0a
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update Server (push) Successful in 12s
Fix Twitter posting by replacing Bearer token (app-only, read-only)
with OAuth 1.0a HMAC-SHA1 signing using all 4 keys. Add credential
fields for 19 previously missing services and optional fields for
7 existing services. Add Developer Guide wiki page.

Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 15:37:25 -05:00
jmiller bf835e9063 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-05-28 20:29:05 +00:00
jmiller 044bcdae76 chore: sync .mokogitea/workflows/pre-release.yml from moko-platform [skip ci] 2026-05-28 20:09:56 +00:00
gitea-actions[bot] 226fb84dd4 chore: update development channel 01.00.11-dev [skip ci] 2026-05-28 20:07:05 +00:00
jmiller b2e2630d44 chore: sync .mokogitea/workflows/update-server.yml from moko-platform [skip ci] 2026-05-28 20:06:52 +00:00
gitea-actions[bot] f0c79b3f32 chore: update development channel 01.00.11-dev [skip ci] 2026-05-28 20:06:51 +00:00
gitea-actions[bot] fe3ac2f54a chore(version): auto-bump 01.00.11-dev [skip ci] 2026-05-28 20:06:48 +00:00
Jonathan Miller dabce55cc7 feat: user-friendly service form + Dashboard toolbar button
Universal: Auto Version Bump / Version Bump (push) Successful in 5s
Update Server / Update Server (push) Successful in 15s
Replaced raw JSON credentials textarea with individual form fields
per service type using Joomla showon directives. Each service now
has labeled inputs with help descriptions:

- Telegram: Chat ID + Bot Token (custom mode only)
- Discord/Slack/Teams/Google Chat: Webhook URL
- Facebook: Page ID + Page Access Token
- Twitter: Bearer Token + API Key + API Secret
- LinkedIn: Access Token + Organization ID
- Mastodon: Instance URL + Access Token
- Bluesky: Handle + App Password
- WhatsApp: Access Token + Phone Number ID + Recipient
- Mailchimp/SendGrid: API Key + List ID
- WordPress: Site URL + Username + App Password
- Webhook: URL + HTTP Method
- Matrix: Homeserver + Token + Room ID
- Ntfy: Server + Topic + Token
- Reddit: Client ID + Secret + Username + Subreddit
- Medium/Dev.to/Ghost/Blogger: API keys/tokens

Default/Custom mode selector for services with MokoWaaS bot support.

Authorize button for OAuth services (Facebook, LinkedIn, Twitter,
Threads) — visible after first save.

Dashboard button added to toolbar on ALL views (Services, Posts,
Templates, Logs, Service edit, Template edit).

Help panel sidebar in service edit with setup steps.
90+ new language strings for credential fields and help text.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 15:06:32 -05:00
jmiller 6d477d9f23 chore: sync .mokogitea/workflows/auto-release.yml from moko-platform [skip ci] 2026-05-28 20:03:31 +00:00
gitea-actions[bot] 5d3da335f3 chore: update development channel 01.00.10-dev [skip ci] 2026-05-28 19:53:56 +00:00
gitea-actions[bot] c463950990 chore: update development channel 01.00.10-dev [skip ci] 2026-05-28 19:53:46 +00:00
gitea-actions[bot] f90e0954f0 chore(version): auto-bump 01.00.10-dev [skip ci] 2026-05-28 19:53:44 +00:00
Jonathan Miller 7a57b001e3 fix: add Service edit view + more default templates
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
- Added View/Service/HtmlView.php and tmpl/service/edit.php for the
  service edit form (was causing 404 "View not found" error)
- Added credential hint panel in service edit sidebar
- Added 16 more default templates (telegram, discord, slack, facebook,
  linkedin, bluesky, threads, teams, medium, wordpress, webhook,
  sendgrid, brevo, ntfy, reddit, pinterest) — total 20 default templates
- Added credential hint language strings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 14:53:31 -05:00
Moko Consulting 6cba84bde5 fix(workflows): rename remaining old secrets in repo-specific workflows [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 14:48:22 -05:00
gitea-actions[bot] 5b8aa86357 chore: update development channel 01.00.09-dev [skip ci] 2026-05-28 19:42:06 +00:00
gitea-actions[bot] 9982a4bffd chore: update development channel 01.00.09-dev [skip ci] 2026-05-28 19:41:41 +00:00
gitea-actions[bot] cf7fd55eca chore(version): auto-bump 01.00.09-dev [skip ci] 2026-05-28 19:41:40 +00:00
Jonathan Miller 994cbf2701 fix: filterForm null error + PrepareFormEvent compat + API routes
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 9s
Fixes three issues found during dev site testing:

1. All 4 list views (Services, Posts, Logs, Templates) missing
   filterForm and activeFilters properties. Joomla searchtools
   layout calls getGroup() on null filterForm. Added get('FilterForm')
   and get('ActiveFilters') to all list HtmlView classes.

2. Content plugin onContentPrepareForm typed as Form but Joomla 5/6
   passes PrepareFormEvent. Now accepts both: extracts Form from
   PrepareFormEvent when available, falls back to legacy Form type.

3. WebServices API routes expanded: added templates and logs CRUD
   endpoints alongside posts and services.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 14:41:24 -05:00
Moko Consulting 4e0c776c70 fix(workflows): GITHUB_TOKEN→GH_MIRROR_TOKEN (reserved name) [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 14:37:15 -05:00
gitea-actions[bot] 207ad9c2c6 chore: update development channel 01.00.08-dev [skip ci] 2026-05-28 19:33:40 +00:00
gitea-actions[bot] 973f83dc32 chore: update development channel 01.00.08-dev [skip ci] 2026-05-28 19:33:23 +00:00
gitea-actions[bot] 55596a1024 chore(version): auto-bump 01.00.08-dev [skip ci] 2026-05-28 19:33:21 +00:00
Jonathan Miller 73d8425130 fix: remove DEFAULT '' from TEXT column error_message
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update Server (push) Successful in 10s
MySQL strict mode does not allow default values on TEXT/BLOB columns.
Removes DEFAULT '' from error_message in #__mokojoomcross_posts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 14:33:09 -05:00
Moko Consulting 50152524b9 chore(workflows): sync all universal workflows from moko-platform [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 14:25:15 -05:00
Moko Consulting b4d8ff3336 refactor(workflows): rename secrets MOKOGITEA_TOKEN/GITHUB_TOKEN, use x-access-token [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 14:23:40 -05:00
Moko Consulting 003bd1624a fix(workflows): proper suffix handling — use version_set_platform instead of sed [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 14:15:20 -05:00
gitea-actions[bot] 13b6cf2016 chore: update development channel 01.00.07-dev [skip ci] 2026-05-28 19:04:24 +00:00
Jonathan Miller d70acbc35d docs: restructure CHANGELOG by feature area
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Reorganized from chronological bullet dump into structured sections:
Core Engine, Admin Component, Queue Processing, Per-Article Controls,
OAuth, Migration, Service Plugins (34 platforms by category), Plugin
Configuration, Infrastructure.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 14:02:00 -05:00
gitea-actions[bot] 3b089f8d72 chore: update development channel 01.00.07-dev [skip ci] 2026-05-28 19:00:06 +00:00
gitea-actions[bot] fc57c51004 chore(version): auto-bump 01.00.07-dev [skip ci] 2026-05-28 19:00:04 +00:00
Jonathan Miller 3b1b0e8844 feat: 25 expansion service plugins (#23-#47)
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update Server (push) Successful in 10s
Social Media: Threads (Meta), Pinterest, Reddit, Tumblr, TikTok,
Nostr, ActivityPub (generic Fediverse)

Chat/Messaging: Microsoft Teams, Google Chat, WhatsApp Business,
Matrix/Element, Ntfy (push notifications)

Email/Newsletter: SendGrid, Brevo (Sendinblue), ConvertKit,
Constant Contact

Publishing/Blogging: Medium, WordPress, Dev.to, Ghost, Hashnode,
Google Blogger

Business: Google Business Profile

Universal: Generic Webhook (IFTTT/Zapier/n8n/Make/custom endpoints),
RSS Feed (dedicated cross-post feed)

Each plugin implements MokoJoomCrossServiceInterface with publish(),
validateCredentials(), getServiceType(), getServiceName(),
getMaxLength(), supportsMedia(). Teams and Threads have default
MokoWaaS bot modes.

Package now contains 40 sub-extensions (1 component + 5 core
plugins + 34 service plugins). Service type dropdown organized
by category with all 34 platforms.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:59:54 -05:00
gitea-actions[bot] e31552259d chore: update development channel 01.00.06-dev-dev [skip ci] 2026-05-28 18:42:22 +00:00
gitea-actions[bot] 97915d9f30 chore(version): auto-bump 01.00.06-dev-dev [skip ci] 2026-05-28 18:42:20 +00:00
Jonathan Miller 2872ae2b97 feat: low-priority issues #19-#22
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update Server (push) Successful in 13s
#19 Per-article cross-posting: Content plugin injects "Cross-Posting"
    fieldset into article editor via onContentPrepareForm. Dynamic
    checkbox list of all enabled services. Skip toggle. System plugin
    reads article attribs for mokojoomcross_services (array of service
    IDs) and mokojoomcross_skip (boolean). Unchecked = post to all.

#20 Analytics dashboard: Posts-by-service breakdown table with
    success rate column (color-coded). Top cross-posted articles
    list. DashboardModel methods: getServiceBreakdown(),
    getDailyTrend(), getTopArticles().

#21 OAuth flows: OAuthHelper with authorize URL generation (Facebook,
    LinkedIn, Twitter), PKCE for Twitter, code→token exchange, token
    storage in service credentials. OauthController with authorize
    and callback actions. Reads client ID/secret from plugin params.

#22 Wiki documentation: Services guide (all 9 platforms, default vs
    custom mode), REST API reference, Message Templates guide with
    examples per platform, Troubleshooting guide.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:42:07 -05:00
Moko Consulting 3664f547ee feat(workflows): append stability suffix to manifest versions [skip bump]
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-05-28 13:41:34 -05:00
gitea-actions[bot] 6521edaab9 chore: update updates.xml (development: 01.00.05-dev-dev) [skip ci] 2026-05-28 18:36:31 +00:00
gitea-actions[bot] 3f6f286ffe chore(version): auto-bump patch 01.00.05-dev [skip ci] 2026-05-28 18:36:29 +00:00
Jonathan Miller 342f6fa3b8 feat: medium-priority issues #12-#18
Universal: Auto Version Bump / Version Bump (push) Successful in 4s
Update Server / Update updates.xml (push) Failing after 14s
#12 LinkedIn: plugin config form (OAuth client ID/secret, redirect URI)
#13 Mastodon: plugin config (default instance, visibility, hashtags)
#14 Bluesky: plugin config (default PDS URL, auto link cards)
#15 Mailchimp: plugin config (sender name/email, auto-send toggle)

#17 Template management: full CRUD with TemplatesController,
    TemplateController, TemplatesModel, TemplateModel, TemplateTable.
    List view with service type badges and body preview. Edit view
    with placeholder reference panel showing all 8 placeholders.
    Filter form with search, published, service_type filters.
    Added Templates submenu item and dashboard quick link.

#18 Logs: added filter form with level and search filters.

#16 WebServices: implementation already in place from scaffold,
    routes registered for posts and services CRUD.

Admin component now has 5 submenu items: Dashboard, Post Queue,
Services, Templates, Activity Logs.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:36:11 -05:00
gitea-actions[bot] 2f60ede713 chore: update updates.xml (development: 01.00.04-dev-dev) [skip ci] 2026-05-28 18:29:39 +00:00
gitea-actions[bot] 8fba003d64 chore(version): auto-bump patch 01.00.04-dev [skip ci] 2026-05-28 18:29:37 +00:00
Jonathan Miller 76dfa177c4 feat: high-priority issues #6-#10 — migration + service plugins
Universal: Auto Version Bump / Version Bump (push) Successful in 5s
Update Server / Update updates.xml (push) Failing after 13s
#6 PP Pro migration rewritten to read #__autotweet_channels table
   directly, mapping channeltype names to MokoJoomCross service types.
   Credential extraction per platform (Facebook page tokens, Twitter
   OAuth, Telegram bot tokens, Discord/Slack webhooks). Falls back to
   component params extraction when channel table doesn't exist.

#7 Facebook plugin: config form with default_page_access_token and
   default_page_id. resolveToken() reads from plugin params.

#8 Discord plugin: config form with default_webhook_url and
   embed_color. resolveWebhook() reads from plugin params.

#9 Twitter plugin: implementation already complete from scaffold.

#10 Slack plugin: config form with default_webhook_url.
    resolveWebhook() reads from plugin params.

All service plugins with universal bot support now store default
credentials in their own plugin params (Extensions → Plugins)
rather than component params. This keeps sensitive tokens scoped
to the plugin that uses them.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:29:22 -05:00
gitea-actions[bot] 4edc5a4765 chore: update updates.xml (development: 01.00.03-dev-dev) [skip ci] 2026-05-28 18:19:51 +00:00
gitea-actions[bot] a67a2a3c5d chore(version): auto-bump patch 01.00.03-dev [skip ci] 2026-05-28 18:19:49 +00:00
Jonathan Miller 9bbf2a74fb feat: queue processor — scheduled task + page-load fallback (#11)
Universal: Auto Version Bump / Version Bump (push) Successful in 5s
Update Server / Update updates.xml (push) Failing after 14s
Three-pronged queue processing:

1. Joomla Scheduled Task (preferred): New plg_task_mokojoomcross plugin
   registers "MokoJoomCross - Process Queue" task type. Admin creates
   a scheduled task in System → Scheduled Tasks with desired interval.

2. Page-load fallback: System plugin onAfterRender with configurable
   throttle interval. Runs on backend, frontend, or both. Small batch
   size (5) to avoid slowing page loads.

3. Both can run simultaneously — QueueProcessor uses DB-based lock
   to prevent concurrent execution (120s safety timeout).

Shared QueueProcessor helper handles:
- Queued post dispatch to service plugins
- Failed post retry with configurable max retries + delay
- Scheduled post firing (when scheduled_at <= now)
- Log cleanup based on retention period

Dashboard shows warning banner when page-load processing is active,
recommending switch to Joomla Scheduled Tasks for production.

Config options: queue_processing (scheduler/pageload/both),
pageload_client (admin/site/both), pageload_interval (seconds).

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:19:31 -05:00
gitea-actions[bot] 04e7720268 chore: update updates.xml (development: 01.00.02-dev-dev) [skip ci] 2026-05-28 18:11:32 +00:00
gitea-actions[bot] d4c2ff00c3 chore(version): auto-bump patch 01.00.02-dev [skip ci] 2026-05-28 18:11:31 +00:00
Jonathan Miller 559b9ca30c feat: implement critical issues #1-#5
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Update Server / Update updates.xml (push) Failing after 9s
#1 Core engine: System plugin now dispatches to service plugins via
onMokoJoomCrossGetServices event, executes publish() immediately,
handles success/failure, duplicate guard prevents re-posting, listens
to both onContentAfterSave and onContentChangeState events. Template
rendering now resolves {category}, {author}, {date}, {fulltext}.

#3 Services CRUD: Admin list template with service type icons,
default/custom mode badges, publish toggle. Service edit form template.

#4 Post Queue: Admin list template with status badges (color-coded),
article title, service, message preview, platform post ID, error
messages, retry count, timestamps.

#5 Dashboard: Enhanced with recent activity feed from logs table,
migration controller action for PP Pro import, quick links sidebar.

#2 Telegram: Already implemented in scaffold, provider.php fixed.

Also fixes: All 9 service plugin provider.php files had broken
namespace references from bash heredoc escaping.

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-28 13:11:20 -05:00
gitea-actions[bot] 7e4cce51de chore: update updates.xml (development: 01.00.01-dev-dev) [skip ci] 2026-05-28 17:55:19 +00:00
gitea-actions[bot] a2e2a60dea chore(version): auto-bump patch 01.00.01-dev [skip ci] 2026-05-28 17:55:17 +00:00