Commit Graph

122 Commits

Author SHA1 Message Date
jmiller cc70e4abc2 feat: v1.1 competitive parity — proximity, directions, geocoding, CSV import (#55) 2026-06-23 17:26:45 +00:00
Jonathan Miller c56f3473b1 fix: review round 2 — geocode 0-coord, tel: sanitization, Factory ACL
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Failing after 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 3s
Universal: PR Check / Validate PR (pull_request) Failing after 4s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Secret Scan (pull_request) Successful in 5s
Joomla: Extension CI / Lint & Validate (pull_request) Successful in 7s
Universal: Auto Version Bump / Version Bump (push) Successful in 9s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 2s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 30s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 6s
Universal: Build & Release / Build & Release Pipeline (pull_request) Failing after 17s
- Fix geocoding trigger: use isset+is_numeric instead of !empty for
  coordinate detection (same 0.0 bug pattern as Haversine fix)
- Sanitize tel: href to digits/+/-/() only (prevents URI injection)
- Use Factory::getApplication() for ACL check (consistent with codebase)

Authored-by: Moko Consulting
2026-06-23 12:26:18 -05:00
Jonathan Miller ddb25fa99f chore: remove legacy source/src/ directory (old MokoJoom naming)
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Generic: Repo Health / Access control (pull_request) Successful in 3s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 8s
Universal: PR Check / Secret Scan (pull_request) Successful in 8s
Universal: PR Check / Validate PR (pull_request) Failing after 8s
Universal: Auto Version Bump / Version Bump (push) Successful in 15s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 14s
Joomla: Extension CI / Lint & Validate (pull_request) Successful in 34s
Delete 26 files from the pre-rename MokoJoomStoreLocator structure.
These were superseded by source/packages/ with MokoSuite naming.
No workflow or manifest references remain to the old paths.

Closes #52

Authored-by: Moko Consulting
2026-06-23 12:23:05 -05:00
Jonathan Miller c8a3c58495 fix: code review fixes — security, 0-coord bug, BOM, ACL
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Joomla: Extension CI / Lint & Validate (pull_request) Successful in 9s
Universal: PR Check / Secret Scan (pull_request) Successful in 5s
Universal: PR Check / Validate PR (pull_request) Failing after 4s
Universal: Auto Version Bump / Version Bump (push) Successful in 10s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 52s
Security:
- ACL check (core.create) in ImportController before processing
- File extension validation (.csv/.txt only) on upload
- Website href restricted to http/https scheme (prevents javascript: XSS)

Bug fixes:
- Fix 0.0 coordinate rejection: use null checks instead of != 0.0
  (coordinates at equator/prime meridian are valid locations)
- Fix Haversine guard using !== null instead of PHP truthiness
- Fix geocoding result check: isset+is_numeric instead of !empty
- Strip UTF-8 BOM from first CSV header (fixes Excel-generated imports)
- Cap radius at 25000 to prevent unreasonable distance queries

Authored-by: Moko Consulting
2026-06-23 12:07:03 -05:00
Jonathan Miller 7ef9a23ef8 feat: v1.1 competitive parity — proximity search, directions, geocoding, CSV import
Universal: Auto Version Bump / Version Bump (push) Successful in 9s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Joomla: Extension CI / Build RC Pre-Release (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Generic: Repo Health / Access control (pull_request) Successful in 3s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Validate PR (pull_request) Failing after 6s
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Universal: Build & Release / Promote to RC (pull_request) Failing after 15s
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Successful in 38s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 43s
Haversine proximity search:
- LocationsModel filters by distance using Haversine formula
- populateState captures lat/lng/radius/radius_unit from search form
- Distance-sorted results when proximity filter is active
- Hidden radius_unit field added to search module form

Get Directions:
- Google Maps directions link on location detail page (no API key)
- Directions link in Leaflet popup markers

Auto-geocoding:
- LocationModel::save() override auto-geocodes empty coordinates
- Calls Nominatim/OSM API when address present but coords missing
- Success/failure messages via Joomla enqueueMessage

CSV Import:
- ImportController handles file upload with CSRF token check
- ImportModel parses CSV via SplFileObject with configurable delimiter
- Auto-detects column headers (title/name, address/street, city, etc.)
- Per-row validation via LocationTable::bind()->check()->store()
- Import view with upload form, delimiter picker, and column help
- Toolbar button and submenu item for import access

Addresses #54

Authored-by: Moko Consulting
2026-06-23 11:50:02 -05:00
jmiller d3e73a0ea4 feat: complete store locator implementation (Phases 1-3) (#53) 2026-06-23 16:10:29 +00:00
Jonathan Miller e26d0ed400 fix: code review fixes, Joomla 5/6 compat, XSS prevention
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Generic: Repo Health / Access control (push) Successful in 2s
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Access control (pull_request) Successful in 3s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 8s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 7s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 9s
Generic: Project CI / Lint & Validate (pull_request) Successful in 34s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 2s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 3s
Universal: Build & Release / Build & Release Pipeline (pull_request) Failing after 10s
Security:
- Fix stored XSS in Leaflet popup — HTML-escape loc.title/address/phone
- Use HTMLHelper::_('content.prepare') for description output

Joomla 5/6 compatibility:
- Bump PHP minimum to 8.2, Joomla minimum to 5.0.0
- script.php implements InstallerScriptInterface with typed signatures
- Restore updateservers and dlid in package manifest
- Update all manifest creationDates to 2026-06-23

Code quality:
- Replace hard-coded English errors with Text::_() language strings
- Add COM_MOKOJOOMSTORELOCATOR_ERROR_* language keys
- Use Text::_() for Locations list toolbar title
- Import missing Text class in LocationTable and Locations HtmlView

Documentation:
- Update CLAUDE.md: MokoSuite naming, source/ paths, PHP 8.2, namespace
- Update README: Joomla 5/6, PHP 8.2+, MySQL 8.0+

Authored-by: Moko Consulting
2026-06-23 11:08:46 -05:00
Jonathan Miller f73e536d05 chore: fix script.php location, update README and changelog for release
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: PR Check / Branch Policy (pull_request) Failing after 1s
Generic: Repo Health / Access control (pull_request) Successful in 1s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 4s
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 5s
Universal: PR Check / Validate PR (pull_request) Failing after 4s
Generic: Project CI / Lint & Validate (pull_request) Successful in 33s
- Move script.php to source/ (alongside package manifest) with MokoSuite naming
- Update README: map and search now listed as implemented, not planned
- Set changelog version to 1.0.0

Authored-by: Moko Consulting
2026-06-23 11:02:19 -05:00
Jonathan Miller 4894a703c2 feat: wire up map and search modules with Leaflet and geolocation (Phase 3)
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Generic: Project CI / Tests (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Blocked by required conditions
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Blocked by required conditions
Joomla: Extension CI / PHPStan Analysis (pull_request) Blocked by required conditions
Universal: PR Check / Build RC Package (pull_request) Blocked by required conditions
Universal: PR Check / Report Issues (pull_request) Blocked by required conditions
Generic: Repo Health / Scripts governance (pull_request) Blocked by required conditions
Generic: Repo Health / Repository health (pull_request) Blocked by required conditions
Generic: Repo Health / Report Issues (pull_request) Blocked by required conditions
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Universal: Build & Release / Promote to RC (pull_request) Failing after 7s
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 7s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: Secret Scanning / Gitleaks Secret Scan (pull_request) Successful in 7s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Validate PR (pull_request) Failing after 6s
Generic: Project CI / Lint & Validate (pull_request) Successful in 27s
Map module:
- Dispatcher queries published locations with coordinates from DB
- Leaflet.js + OpenStreetMap tile layer integration
- Markers with popup info (name, address, phone)
- Auto-fit bounds to show all markers
- Leaflet CSS/JS via Joomla Web Asset Manager

Search module:
- Dispatcher loads distinct cities/states for dropdown filters
- Builds radius options from module params
- City dropdown filter (toggled by show_city_filter param)
- Radius dropdown with configurable values and unit (miles/km)
- Geolocation "Use My Location" button via browser API
- Hidden lat/lng fields for proximity search passthrough
- New language strings for all search UI elements

Both dispatchers now implement DatabaseAwareInterface for DB access.

Addresses #51, #3, #35

Authored-by: Moko Consulting
2026-06-23 10:45:50 -05:00
Jonathan Miller 07a4fcc0b5 docs: update README with MokoSuite naming and current feature status
Rename from MokoJoomStoreLocator to MokoSuiteStoreLocator, update
package element names, add implemented vs planned feature sections,
add development instructions.

Authored-by: Moko Consulting
2026-06-23 10:34:00 -05:00
Jonathan Miller 4b37489c41 feat: add site frontend with locations list, detail view, and SEF router (Phase 2)
Build the complete public-facing frontend for the store locator:
- Site DisplayController routing to list and detail views
- LocationsModel with search, city, and state filters (published only)
- LocationModel for single location by ID
- Locations list template with Schema.org LocalBusiness markup
- Location detail template with address, contact, hours, map placeholder
- SEF URL router with menu/standard/nomenu rules
- Menu item types: "All Locations" list and "Location Detail" picker
- Site language strings for views and menu items
- Router wired into component extension class and service provider
- .gitignore exception for source/packages/*/site/

Addresses #50

Authored-by: Moko Consulting
2026-06-23 08:49:07 -05:00
Jonathan Miller c415d4813f feat: complete admin CRUD for locations (Phase 1)
Add full admin editing capability for store locations:
- LocationController (FormController) for save/cancel/apply
- LocationsController (AdminController) for bulk publish/unpublish/delete
- Location edit view with tabbed form (Details, Address, Contact)
- Admin list renders data rows with edit links and published toggle
- LocationTable::check() validates title, auto-alias, lat/lng, timestamps
- LocationsModel with populateState(), search/published filters, ordering
- filter_locations.xml with search tools bar
- Language strings for filters, sort options, save messages

Also includes MokoSuite-renamed package scaffolding (source/packages/).
Removes unused Makefile.

Closes #32 — populateState for filter persistence
Closes #33 — filter XML forms for admin list

Authored-by: Moko Consulting
2026-06-23 08:40:02 -05:00
jmiller 72cde2c8ca chore: sync auto-release.yml from Template-Generic [skip ci] 2026-06-22 00:35:24 +00:00
jmiller 4628291217 chore: remove unused Makefile - builds handled by CI auto-release 2026-06-21 23:55:24 +00:00
jmiller cf2035abbe Merge pull request 'chore: remove automation directory' (#46) from fix/remove-automation into main 2026-06-21 23:10:34 +00:00
Jonathan Miller 9bffe09a1f chore: remove automation directory
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 10s
Universal: PR Check / Branch Policy (pull_request) Failing after 1s
Universal: PR Check / Secret Scan (pull_request) Successful in 6s
Universal: PR Check / Validate PR (pull_request) Failing after 7s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Failing after 18s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 14s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Failing after 13s
Branch Cleanup / Delete merged branch (pull_request) Failing after 2s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 5s
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
2026-06-21 18:03:25 -05:00
jmiller b7c0e70e44 chore: sync auto-release.yml from Template-Generic [skip ci] 2026-06-21 22:03:05 +00:00
jmiller f66228872b chore: sync pre-release.yml from Template-Generic [skip ci] 2026-06-21 16:05:52 +00:00
jmiller 3b324feda0 chore: sync composer-publish.yml from Template-Generic [skip ci] 2026-06-21 06:35:14 +00:00
jmiller e55d8d0dea chore: sync workflow-sync-trigger.yml from Template-Generic [skip ci] 2026-06-21 01:29:04 +00:00
jmiller 5a9bf8257b chore: sync auto-release.yml from Template-Generic [skip ci] 2026-06-21 01:29:02 +00:00
jmiller 8db35e5d30 ci: sync rc-revert.yml from Template-Joomla [skip ci] 2026-06-21 00:15:05 +00:00
jmiller 2821d07208 ci: sync issue-branch.yml from Template-Joomla [skip ci] 2026-06-21 00:14:36 +00:00
jmiller fd578d543d ci: sync ci-joomla.yml from Template-Joomla [skip ci] 2026-06-21 00:14:11 +00:00
jmiller 331eca3b49 chore: sync pr-check.yml from Template-Generic [skip ci] 2026-06-20 23:46:42 +00:00
jmiller 0cdbc677c5 chore: sync gitleaks.yml from Template-Generic [skip ci] 2026-06-20 23:46:41 +00:00
jmiller 716446c9a4 chore: sync ci-generic.yml from Template-Generic [skip ci] 2026-06-20 23:46:40 +00:00
jmiller 221697b0c7 chore: sync repo-health.yml from Template-Generic [skip ci] 2026-06-20 22:30:14 +00:00
jmiller cc7baa540d chore: sync rc-revert.yml from Template-Generic [skip ci] 2026-06-20 22:30:13 +00:00
jmiller efd1d2bcd3 chore: sync pr-check.yml from Template-Generic [skip ci] 2026-06-20 22:30:13 +00:00
jmiller 9581355985 chore: sync cleanup.yml from Template-Generic [skip ci] 2026-06-20 22:30:12 +00:00
jmiller 891cf049f5 ci: sync security-audit.yml from Template-Joomla [skip ci] 2026-06-20 22:26:31 +00:00
jmiller 183fcdb8bb ci: sync repo-health.yml from Template-Joomla [skip ci] 2026-06-20 22:26:02 +00:00
jmiller 15550b975c ci: sync rc-revert.yml from Template-Joomla [skip ci] 2026-06-20 22:25:53 +00:00
jmiller d0cc4c9505 ci: sync pr-check.yml from Template-Joomla [skip ci] 2026-06-20 22:24:46 +00:00
jmiller 36e771963c ci: sync issue-branch.yml from Template-Joomla [skip ci] 2026-06-20 22:22:21 +00:00
jmiller 73bdc3c456 ci: sync cleanup.yml from Template-Joomla [skip ci] 2026-06-20 22:15:35 +00:00
jmiller 0d1473e433 chore: sync ci-generic.yml from Template-Generic [skip ci] 2026-06-20 21:35:32 +00:00
jmiller e2adb9d964 ci: sync ci-generic.yml from Template-Joomla [skip ci] 2026-06-20 21:34:02 +00:00
jmiller 68fe793008 ci: sync cascade-dev.yml from Template-Joomla [skip ci] 2026-06-20 21:31:34 +00:00
jmiller b98878880d ci: sync branch-cleanup.yml from Template-Joomla [skip ci] 2026-06-20 21:28:09 +00:00
jmiller 0acd87ebf8 ci: sync auto-release.yml from Template-Joomla [skip ci] 2026-06-20 21:26:57 +00:00
jmiller 02d72c8f34 chore: sync workflow-sync-trigger.yml from Template-Generic [skip ci] 2026-06-20 20:53:36 +00:00
jmiller 77a401d606 chore: sync rc-revert.yml from Template-Generic [skip ci] 2026-06-20 20:53:34 +00:00
jmiller e8080a22d4 ci: sync ci-generic.yml from Template-Joomla [skip ci] 2026-06-20 20:35:05 +00:00
jmiller 12ec46e5a6 ci: sync cascade-dev.yml from Template-Joomla [skip ci] 2026-06-20 20:32:51 +00:00
jmiller d7b5f4ee8e ci: sync branch-cleanup.yml from Template-Joomla [skip ci] 2026-06-20 20:31:53 +00:00
jmiller fd8a6c1380 ci: sync auto-release.yml from Template-Joomla [skip ci] 2026-06-20 20:30:59 +00:00
jmiller 26e145afe4 ci: sync auto-bump.yml from Template-Joomla [skip ci] 2026-06-20 19:59:08 +00:00
jmiller e38de4578d ci: sync ci-generic.yml from Template-Joomla [skip ci] 2026-06-20 19:05:59 +00:00