Release v2.0 — JSON-LD schema types, AI meta generation, XML sitemap & coverage dashboard #83

Merged
jmiller merged 42 commits from dev into main 2026-06-28 19:35:02 +00:00
Owner

Summary

Promotes the v2.0 — Schema & UX milestone (and code-quality work) from dev to main. 31 commits, ~3,144 insertions across the component and all three plugins.

Features

  • New JSON-LD schema types (JsonLdBuilder): FAQ, HowTo, Event, Recipe, LocalBusiness, VideoObject — several with auto-detection from article content (#62–#67)
  • AI-powered meta tag generation — AJAX endpoint in plg_system_mokoog to generate titles/descriptions (#71)
  • XML sitemap generation (SitemapBuilder) with configurable changefreq, noindex exclusion (#72)
  • Custom JSON-LD schema builder per article (#70)
  • SEO content scoring panel in the article editor (#68)
  • OG coverage dashboard in the tag manager (#69 area)
  • Discord / Mastodon / Slack preview cards in the editor (#69)
  • Per-platform image resizing (ImageHelper) (#74)

Quality & docs

  • PHPUnit test suite with JsonLdBuilder unit tests (#75)
  • Code-quality pass (#76, #77, #78, #79)
  • OpenAPI 3.0 spec for the REST API (openapi.yaml, #80)
  • SECURITY.md + GOVERNANCE.md synced from Template-Joomla
  • CHANGELOG / README updated for v2.0

Packaging

  • SQL update scripts through 01.05.00.sql
  • Manifest <files>/<media>/<languages> updated for new assets
  • Removed retired CI workflows (deploy-manual.yml, security-audit.yml — now handled by MokoGitea)

Notes

  • Merging triggers the auto-release + version-bump workflow.
  • Reviewed for CSRF/input-sanitization on the AI endpoint, JSON-LD output encoding (XSS), sitemap file-write safety, and manifest/SQL consistency prior to merge.

🤖 Generated with Claude Code

## Summary Promotes the **v2.0 — Schema & UX** milestone (and code-quality work) from `dev` to `main`. 31 commits, ~3,144 insertions across the component and all three plugins. ### Features - **New JSON-LD schema types** (`JsonLdBuilder`): FAQ, HowTo, Event, Recipe, LocalBusiness, VideoObject — several with auto-detection from article content (#62–#67) - **AI-powered meta tag generation** — AJAX endpoint in `plg_system_mokoog` to generate titles/descriptions (#71) - **XML sitemap generation** (`SitemapBuilder`) with configurable `changefreq`, noindex exclusion (#72) - **Custom JSON-LD schema builder** per article (#70) - **SEO content scoring panel** in the article editor (#68) - **OG coverage dashboard** in the tag manager (#69 area) - **Discord / Mastodon / Slack preview cards** in the editor (#69) - **Per-platform image resizing** (`ImageHelper`) (#74) ### Quality & docs - PHPUnit test suite with `JsonLdBuilder` unit tests (#75) - Code-quality pass (#76, #77, #78, #79) - OpenAPI 3.0 spec for the REST API (`openapi.yaml`, #80) - `SECURITY.md` + `GOVERNANCE.md` synced from Template-Joomla - CHANGELOG / README updated for v2.0 ### Packaging - SQL update scripts through `01.05.00.sql` - Manifest `<files>`/`<media>`/`<languages>` updated for new assets - Removed retired CI workflows (`deploy-manual.yml`, `security-audit.yml` — now handled by MokoGitea) ### Notes - Merging triggers the auto-release + version-bump workflow. - Reviewed for CSRF/input-sanitization on the AI endpoint, JSON-LD output encoding (XSS), sitemap file-write safety, and manifest/SQL consistency prior to merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jmiller added 31 commits 2026-06-28 18:42:10 +00:00
chore(version): pre-release bump to 01.03.07-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 7s
e939e90733
- Add exception logging to BatchController batch skip (#76)
- Align form maxlength with DB schema limits (#77)
- applySeoTags() already uses public API — no change needed (#78)
- Add strip_tags() input sanitization on OG text fields (#79)
Outputs VideoObject structured data when an article has a video URL
set, enabling Google video rich results. Closes #67
Shows how shared links will appear on Discord (dark theme with
accent bar), Mastodon (rounded card), and Slack (compact unfurl)
alongside the existing Facebook, Twitter, and LinkedIn previews.
Closes #69
feat: add LocalBusiness JSON-LD schema type
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 11s
44d9daf3bc
Adds configurable LocalBusiness structured data with address,
contact, geo coordinates, and opening hours. Enabled via plugin
parameters. Closes #65
chore(version): pre-release bump to 01.04.01-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 4s
c871b7d30d
feat: add FAQ, HowTo, Event, and Recipe JSON-LD schema types
Universal: Auto Version Bump / Version Bump (push) Successful in 10s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 23s
872074cd5b
- FAQ: auto-detects h3/h4 + paragraph patterns, outputs FAQPage (#62)
- HowTo: auto-detects ordered lists, outputs HowTo with steps (#63)
- Event: per-article fields (dates, venue, tickets), event_data JSON
  column, outputs Event schema (#64)
- Recipe: per-article fields (times, ingredients, nutrition),
  recipe_data JSON column, outputs Recipe schema (#66)
- DB migration 01.04.00: adds event_data and recipe_data columns

Closes #62, closes #63, closes #64, closes #66
chore(version): pre-release bump to 01.04.03-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 7s
7a38025b5e
JavaScript-based SEO analysis with 7 checks (OG title, description,
image, SEO title, meta description, title length, description
length). Shows pass/fail dots and overall score. Closes #68
Shows coverage percentage, article count with/without OG tags,
and counts of missing title, description, and image fields.
Closes #73
Documents the /api/v1/mokoog/tags endpoints with full request/response
schemas, authentication, and examples. Closes #80
16 unit tests covering FAQ, HowTo, Event, Recipe, LocalBusiness,
and VideoObject schema builders plus toScriptTag XSS escaping.
Closes #75
feat: add custom schema, AI generation, XML sitemap, platform images
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 11s
49d644566a
- Custom JSON-LD schema builder: per-article textarea for arbitrary
  structured data with JSON validation. Closes #70
- AI-powered meta generation: Generate with AI buttons for OG title
  and description, supports Claude and OpenAI APIs. Closes #71
- XML sitemap: auto-generates sitemap.xml on article save, respects
  noindex directives. Closes #72
- Per-platform image resizing: Twitter 1200x600, Pinterest 1000x1500,
  WhatsApp 400x400 alongside default Facebook 1200x630. Closes #74
- DB migration 01.05.00: adds custom_schema column
chore(version): pre-release bump to 01.04.05-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 37s
cf783c6b83
chore: remove deploy-manual.yml -- no longer needed
Universal: Auto Version Bump / Version Bump (push) Successful in 13s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 28s
a578ac3bb3
docs: update CHANGELOG and README for v2.0 release
Universal: Auto Version Bump / Version Bump (push) Successful in 25s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 26s
f1c6eb8f6e
Add all v2.0 features: 11+ JSON-LD types, 6 preview cards, AI
generation, XML sitemap, per-platform images, SEO scoring, PHPUnit
tests, OpenAPI spec, coverage dashboard, custom schema builder.
chore: remove security-audit.yml -- handled by MokoGitea
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 29s
a9fc5d2cf1
chore(version): pre-release bump to 01.04.06-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 7s
9793bd4031
chore(version): pre-release bump to 01.04.07-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 8s
8de243b181
chore(version): pre-release bump to 01.04.08-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 8s
281e742b54
chore: add SECURITY.md from Template-Joomla
Universal: Auto Version Bump / Version Bump (push) Has been cancelled
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Has been cancelled
d01b39841a
chore: sync ci-issue-reporter.yml from Template-Joomla
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 21s
94201082d2
Authored-by: Moko Consulting
chore: sync version-set.yml from Template-Joomla
Universal: Auto Version Bump / Version Bump (push) Successful in 7s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 11s
9991bb3099
Authored-by: Moko Consulting
chore: sync GOVERNANCE.md from Template-Joomla
Universal: Auto Version Bump / Version Bump (push) Successful in 7s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 13s
31da0a5980
Authored-by: Moko Consulting
chore(version): pre-release bump to 01.04.09-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 25s
c65ef345ef
chore(version): pre-release bump to 01.04.10-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 5s
7ef082a8de
chore(version): pre-release bump to 01.04.11-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 28s
5afbc75f23
jmiller added 2 commits 2026-06-28 18:55:51 +00:00
The install/uninstall/update SQL sections used driver="mysql" which
doesn't match the active mysqli driver, causing "SQL File not found"
on fresh installs and silently skipping schema updates on upgrades.
fix: harden input handling and output safety (#79)
Universal: PR Check / Branch Policy (pull_request) Successful in 2s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Generic: Repo Health / Access control (pull_request) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Validate PR (pull_request) Failing after 4s
Universal: PR Check / Secret Scan (pull_request) Successful in 6s
Universal: Auto Version Bump / Version Bump (push) Successful in 11s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 11s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Failing after 9s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 13s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report Issues (pull_request) Has been cancelled
b77054b769
- canonical_url: sanitize via sanitizeUrl() (scheme allowlist) instead of
  bare trim() — closes stored-XSS via addHeadLink() on the public frontend
- AI endpoint: replace die('Invalid Token') with a clean event result,
  and strip_tags + truncate article_title to 200 chars before use
- SitemapBuilder: whitelist changefreq against the sitemap spec enum,
  intval() noindex IDs, strict in_array comparison
- MokoOG: log a WARNING when sitemap.xml write fails instead of ignoring it
jmiller added 1 commit 2026-06-28 18:56:02 +00:00
jmiller added 1 commit 2026-06-28 18:56:14 +00:00
chore(version): pre-release bump to 01.04.13-dev [skip ci]
Publish to Composer / Publish Package (release) Successful in 5s
42ffb4b46c
jmiller added 2 commits 2026-06-28 19:19:36 +00:00
main carried template/governance syncs not in dev; dev carries the v2.0
feature work. Resolved per project convention:
- ours (dev): composer.json (main's was corrupted to 'mokojoomgallery'),
  all 5 manifests (01.04.13), README.md, CHANGELOG.md, all source
- theirs (main): GOVERNANCE.md, SECURITY.md, and workflow files (template syncs)
- kept dev's deliberate removal of deploy-manual.yml

This makes dev a superset of main so PR #83 (dev -> main) merges cleanly.
docs(api): require Joomla 6.0+ in OpenAPI metadata
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Generic: Repo Health / Access control (pull_request) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Failing after 12s
Generic: Project CI / Lint & Validate (pull_request) Successful in 48s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 59s
Universal: Auto Version Bump / Version Bump (push) Successful in 10s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 19s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Generic: Project CI / Tests (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report: Scripts Governance (pull_request) Has been cancelled
Generic: Repo Health / Report: Repository Health (pull_request) Has been cancelled
5ea422d75e
jmiller added 1 commit 2026-06-28 19:24:55 +00:00
jmiller added 1 commit 2026-06-28 19:25:12 +00:00
jmiller added 1 commit 2026-06-28 19:33:45 +00:00
refactor: rename MokoJoomOpenGraph -> MokoSuiteOpenGraph; require Joomla 6+
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Universal: PR Check / Validate PR (pull_request) Failing after 6s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Secret Scan (pull_request) Successful in 10s
Universal: Auto Version Bump / Version Bump (push) Successful in 14s
Generic: Project CI / Lint & Validate (pull_request) Successful in 16s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Failing after 14s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 16s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 47s
Generic: Project CI / Tests (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report: Scripts Governance (pull_request) Has been cancelled
Generic: Repo Health / Report: Repository Health (pull_request) Has been cancelled
7fb7e38762
Product rename (display name / docs / comments / language strings only —
technical element names mokoog/com_mokoog/MokoOG namespace unchanged):
- Replace "MokoJoom" -> "MokoSuite" across 55 files
- Fixes the update-site license lookup in script.php, which matched the
  old "%MokoJoomOpenGraph%" name and would never find a "MokoSuite" site

Joomla 6 compatibility:
- script.php: minimumJoomla 4.0.0 -> 6.0.0, minimumPhp 8.1.0 -> 8.2.0,
  and actually enforce the Joomla floor in preflight() (was PHP-only)
- Add PKG_MOKOOG_JOOMLA_VERSION_ERROR language strings (en-GB, en-US)
- openapi.yaml + README state Joomla 6.0+ requirement
- Audit confirmed the codebase already uses only Joomla-6-supported APIs
jmiller added 1 commit 2026-06-28 19:34:02 +00:00
jmiller added 1 commit 2026-06-28 19:34:15 +00:00
chore(version): pre-release bump to 01.04.17-dev [skip ci]
Branch Cleanup / Delete merged branch (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 24s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 33m1s
77cf557b71
jmiller merged commit 1c8f4e6867 into main 2026-06-28 19:35:02 +00:00
Sign in to join this conversation.
No Reviewers
Priority -
Type -
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MokoConsulting/MokoSuiteOpenGraph#83