Release: dev -> main (restore fixes, theming, schema-checker, quickicon hardening) #300

Merged
jmiller merged 27 commits from release/dev-to-main-r2 into main 2026-07-16 18:43:06 +00:00

27 Commits

Author SHA1 Message Date
jmiller 9a82fc97f2 Merge remote-tracking branch 'origin/dev' into release/dev-to-main-r2
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 32s
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Generic: Project CI / Lint & Validate (pull_request) Successful in 10s
Universal: PR Check / Secret Scan (pull_request) Successful in 6s
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Standards Compliance / Secret Scanning (pull_request) Failing after 4s
Generic: Standards Compliance / License Header Validation (pull_request) Successful in 4s
Generic: Standards Compliance / Repository Structure Validation (pull_request) Successful in 4s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 20s
Generic: Standards Compliance / Coding Standards Check (pull_request) Successful in 5s
Generic: Standards Compliance / Workflow Configuration Check (pull_request) Failing after 5s
Generic: Standards Compliance / Documentation Quality Check (pull_request) Successful in 4s
Generic: Standards Compliance / README Completeness Check (pull_request) Failing after 4s
Generic: Standards Compliance / Git Repository Hygiene (pull_request) Successful in 6s
Generic: Standards Compliance / Script Integrity Validation (pull_request) Successful in 6s
Generic: Standards Compliance / Line Length Check (pull_request) Successful in 5s
Generic: Standards Compliance / File Naming Standards (pull_request) Successful in 4s
Generic: Standards Compliance / Insecure Code Pattern Detection (pull_request) Successful in 4s
Generic: Standards Compliance / Version Consistency Check (pull_request) Successful in 49s
Generic: Standards Compliance / Dead Code Detection (pull_request) Successful in 8s
Generic: Standards Compliance / File Size Limits (pull_request) Successful in 4s
Generic: Standards Compliance / Binary File Detection (pull_request) Successful in 6s
Generic: Standards Compliance / TODO/FIXME Tracking (pull_request) Successful in 4s
Generic: Standards Compliance / Code Complexity Analysis (pull_request) Successful in 51s
Generic: Standards Compliance / Code Duplication Detection (pull_request) Successful in 52s
Generic: Standards Compliance / Broken Link Detection (pull_request) Successful in 4s
Generic: Standards Compliance / API Documentation Coverage (pull_request) Successful in 4s
Generic: Standards Compliance / Accessibility Check (pull_request) Successful in 4s
Generic: Standards Compliance / Performance Metrics (pull_request) Successful in 4s
Generic: Standards Compliance / Dependency Vulnerability Scanning (pull_request) Successful in 50s
Generic: Standards Compliance / Unused Dependencies Check (pull_request) Successful in 53s
Generic: Standards Compliance / Terraform Configuration Validation (pull_request) Successful in 8s
Generic: Standards Compliance / Enterprise Readiness Check (pull_request) Failing after 51s
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Generic: Standards Compliance / Repository Health Check (pull_request) Failing after 52s
Generic: Project CI / Tests (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
Generic: Standards Compliance / Compliance Summary (pull_request) Has been cancelled
# Conflicts:
#	.mokogit/workflows/issue-branch.yml
2026-07-16 13:40:57 -05:00
mokogit-actions[bot] 22e8ebe832 chore(version): pre-release bump to 02.64.13-dev [skip ci] 2026-07-16 18:09:26 +00:00
jmiller b1b81fd107 Merge pull request 'fix(quickicon): never let the dashboard widget crash the admin page' (#298) from fix/quickicon-harden into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 22s
2026-07-16 18:09:12 +00:00
mokogit-actions[bot] 747e50bf62 chore(version): pre-release bump to 02.64.12-dev [skip ci]
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
2026-07-16 18:09:03 +00:00
jmiller 7e58ca7598 fix(quickicon): never let the dashboard widget crash the admin page (#297)
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Generic: Project CI / Lint & Validate (pull_request) Successful in 11s
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 8s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 23s
Generic: Project CI / Tests (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
The mod_quickicon helper array_merge()s a defaults array into each icon a
plugin returns; if a plugin's DB query throws or it returns a malformed
(unwrapped) icon, the whole admin dashboard can 500 with an array_merge
TypeError. The current handler is structurally correct (icons are wrapped
in a list, matching core plg_quickicon_joomlaupdate), so this hardens it:

- Extract the query/state logic into buildStatusIcon().
- Wrap it in try/catch — on any Throwable, log and contribute no icon
  instead of bubbling into the dashboard render.
- Document why the [$icon] list-wrapping is load-bearing.

Closes #297.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 13:07:26 -05:00
mokogit-actions[bot] 54d7710783 chore(version): pre-release bump to 02.64.11-dev [skip ci] 2026-07-16 18:07:20 +00:00
jmiller f3bcf9d79e Merge pull request 'fix(restore): surface DatabaseImporter errors + quote-aware split' (#294) from fix/databaseimporter-surface-errors into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 30s
2026-07-16 18:06:56 +00:00
jmiller 028e1c7e80 fix(restore): surface DatabaseImporter errors + quote-aware split (#188)
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Failing after 7s
Universal: PR Check / Branch Policy (pull_request) Successful in 2s
Universal: PR Check / Secret Scan (pull_request) Successful in 8s
Universal: PR Check / Validate PR (pull_request) Failing after 12s
Generic: Project CI / Lint & Validate (pull_request) Successful in 15s
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 12s
Generic: Project CI / Tests (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
RestoreEngine ignored DatabaseImporter::hasErrors(), so the non-stepped
restore always reported success even when SQL statements failed. It now
logs the failures and returns a warning ("database may be incomplete").
DatabaseImporter's splitter is also quote/backtick/escape-aware so a ; or
newline inside a value no longer splits a statement, and comments are only
skipped between statements — matching the stepped-engine fix (#291).

Closes #188.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 13:06:44 -05:00
mokogit-actions[bot] c42962c919 chore(version): pre-release bump to 02.64.10-dev [skip ci] 2026-07-16 18:02:27 +00:00
mokogit-actions[bot] 3616f49570 chore(version): pre-release bump to 02.64.09-dev [skip ci] 2026-07-16 18:02:01 +00:00
jmiller ed2dbee579 Merge pull request 'fix: default ntfy server to ntfy.mokoconsulting.tech' (#293) from fix/ntfy-default-url into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 21s
2026-07-16 18:01:33 +00:00
jmiller 95d2b3375c Merge pull request 'fix: snapshots restore type labels show raw type' (#295) from fix/snapshots-typelabel into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 37s
2026-07-16 18:01:24 +00:00
jmiller 2b6dbdac23 fix: snapshots restore type labels show raw type (#170)
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 4s
typeLabels[TYPE] referenced an undefined uppercase variable; the forEach
parameter is lowercase `type`, so every type label rendered as the raw
type string instead of its translated label.

Closes #170.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 12:04:02 -05:00
jmiller 313b96b070 fix: default ntfy server to ntfy.mokoconsulting.tech (#166)
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 3s
Replaces the old public ntfy.sh default in the runtime defaults: profile
form default/hint, NotificationSender fallbacks, the ntfy_server column
default in install.mysql.sql, and the en-GB field description. ntfy.sh is
still documented as the public alternative.

Closes #166.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 11:57:26 -05:00
jmiller 57e7dd98b1 Merge pull request 'fix(restore): surface partial DB-import failures + quote-aware SQL split' (#292) from fix/restore-silent-sql-import into dev
Universal: Auto Version Bump / Version Bump (push) Has been skipped
2026-07-16 16:49:14 +00:00
jmiller 9323de955f fix(restore): surface partial DB-import failures + quote-aware SQL split
Stepped restore silently swallowed every failed SQL statement and always
reported "Restore complete", so a half-imported database looked fine.

- SteppedRestoreEngine::stepDatabase() now records a failure count + first
  few messages (recordSqlError) instead of only error_log(), and the
  completion step returns the count with a warning; the modal shows
  "Restore Complete (with warnings)" and does NOT auto-return.
- New quote/backtick/escape-aware isCompleteStatement() replaces the naive
  "line ends with ;" terminator, so a ; or newline inside a string value no
  longer splits a statement mid-value.
- Comment/blank lines are only skipped BETWEEN statements, never inside an
  accumulating multi-line statement.

Relates to #188 (DatabaseImporter) and the standalone MokoRestore splitter;
tracked in #291.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 11:48:41 -05:00
jmiller b0590bef80 Merge pull request 'fix(restore): clean up staging + session state on cancel/abandon' (#287) from fix/restore-cancel-cleanup into dev 2026-07-16 16:47:00 +00:00
jmiller ab6bee7b51 fix(restore): clean up staging + session state on cancel/abandon
The stepped-restore Cancel button (added with the progress-modal controls)
stopped the client loop and reloaded, but left the server-side restore
session, *.restore.json state, and the extracted staging directory behind
with no reaper — so cancelled/abandoned restores leaked disk indefinitely.

- SteppedRestoreEngine::cancel() mirrors the failure-cleanup path (delete
  staging dir + restore state + session).
- AjaxController::restoreCancel() exposes it (token + restore ACL gated).
- Restore modal Cancel now calls ajax.restoreCancel with the session id
  before leaving (session id tracked in restoreSessionId).
- SteppedSession::cleanupOldSessions() also reaps orphaned
  mokosuitebackup-restore-* staging dirs >24h (backstop for browser-close).

Found by an audit of the restore path against recent changes; the schema
(retired sftp_*/VARCHAR include_mokorestore) and PHP 8.3 changes were
confirmed to NOT affect restore.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 11:46:31 -05:00
jmiller 388db8c7d0 Merge pull request 'feat(ui): re-brand standalone MokoRestore wizard to the black theme' (#286) from feat/mokorestore-black-theme into dev 2026-07-16 16:46:07 +00:00
jmiller f8e121d925 feat(ui): re-brand the standalone MokoRestore wizard to the black theme
The generated restore.php wizard used a light "Joomla-styled" blue theme.
Restyled its stylesheet to the full-black MokoSuite look that matches the
runbackup / backup-progress screens: black background + big header, dark
panels/cards, dark form inputs with readable contrast, MokoSuite blue/green
accents, dark step-bar/checks/alerts/progress/log, and all inline help-box
styles converted from light to the dark palette. No logic changes.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 11:12:49 -05:00
jmiller e88040f60d Merge pull request 'feat(ui): auto-continue + action buttons on the backup-progress modal' (#285) from feat/progress-modal-controls into dev 2026-07-16 15:54:55 +00:00
jmiller 4ab24b20a6 feat(ui): mirror progress-modal controls onto the restore modal
Restore-progress modal now matches the backup modal: auto-continue
checkbox, terminal buttons (Retry restore / Back to backups), and a
double-confirm Cancel. Restore's cancel warns that stopping mid-flight
may leave the site partially restored (no server rollback), and there is
no "view record" button (restore has no new record). startSteppedRestore
split into a re-runnable runSteppedRestore() so Retry works. Title via
safe DOM (no innerHTML).

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 10:52:02 -05:00
jmiller d0c12914a8 feat(ui): add auto-continue + action buttons to the backup-progress modal
Brings the full-screen runbackup screen's controls onto the black
backup-progress modal in the backups view:
- "Automatically return to the list when finished" checkbox (default on);
  unchecked leaves the completion screen up with buttons.
- Cancel button while running (double confirm) — stops the step loop and
  cancels the record via ajax.cancelBackup.
- Terminal buttons: View backup record + Back to backups on success;
  Retry + Back to backups on failure.
Title icon/text updated via safe DOM (no innerHTML). Restore modal
unchanged in this pass.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 10:46:53 -05:00
jmiller c77e921582 Merge pull request 'fix(lang): drop redundant backup word in admin-lock message' (#284) from fix/lock-message-wording into dev 2026-07-16 15:38:50 +00:00
jmiller cac691ec92 fix(lang): drop redundant "backup" in admin-lock message
"A MokoSuiteBackup backup is currently running" -> "A MokoSuiteBackup
is currently running". en-GB + en-US.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 10:38:39 -05:00
jmiller e0b5d72c40 Merge pull request 'chore(ci): converge dev with main full gitea->git rebrand' (#283) from chore/converge-full-rebrand into dev 2026-07-16 14:38:14 +00:00
jmiller 0b9cf6f4d8 chore(ci): converge dev with main's full gitea->git rebrand
Back-fills dev with the fuller rebrand that shipped on main in the
dev->main release (#282): MokoGitea->MokoGIT, GITEA_ORG->GIT_ORG,
mokogit-actions[bot], and the corrected .mokogit/CLAUDE.md path. dev's
earlier partial rename (#279) is superseded so dev and main no longer
diverge on CI config.

Claude-Session: https://claude.ai/code/session_01WbGBN9VyRK61zczYWcCQ2i
2026-07-16 09:38:06 -05:00