Skip to content

v1.52.0 — Mizar

Choose a tag to compare

@MichaelSowah MichaelSowah released this 07 Jun 15:51
· 68 commits to main since this release
bb009d2

[1.52.0] - 2026-06-07 — Mizar

Theme: Lean core — four subsystems extracted to optional extensions. A coordinated breaking release that moves Archive, CDN / edge-cache, queue operations (supervision / autoscaling / worker-metrics), and rich media (image processing / thumbnails / metadata) out of framework core into standalone glueful/* extensions, each behind a narrow core seam core consumes only if bound. A plain core install boots, serves uploads, runs a lean single-worker queue:work, and caches responses with zero of these subsystems' heavy dependencies present (no intervention/image, james-heinrich/getid3, and no GD/Imagick required). Every subsystem is restored with a single composer require. Staying in 1.x per the pre-public breaking-changes policy — see Upgrade Notes and UPGRADE.md for full per-subsystem migration guidance.

Breaking Changes

  • CDN / edge-cache subsystem extracted to the glueful/cdn extension. Edge purging and edge cache-control headers now require composer require glueful/cdn (auto-discovered via extra.glueful). The duplicated edge/CDN code was removed from core: Glueful\Cache\EdgeCacheService (→ Glueful\Extensions\Cdn\EdgeCachePurger, which now implements the retained core contract Glueful\Cache\Contracts\EdgeCacheInterface); Glueful\Cache\CDN\CDNAdapterInterface and Glueful\Cache\CDN\AbstractCDNAdapter (→ Glueful\Extensions\Cdn\Adapters\*); the cache:purge console command (Glueful\Console\Commands\Cache\PurgeCommand); and the dead Glueful\Helpers\CDNAdapterManager trait. The EdgeCacheService container binding was removed — core still binds EdgeCacheInterface to the no-op Glueful\Cache\NullEdgeCache, so response caching keeps working (it still emits surrogate keys) and resolving the interface always succeeds. The cache.edge config block was removed; its settings move to the extension's cdn config key (the EDGE_CACHE_* env vars are now read only by the extension). Without the extension, php glueful cache:purge is absent and edge purges/headers are silent no-ops. See UPGRADE.md.
  • Archive subsystem extracted to the glueful/archive extension. All archive code and schema were removed from core: src/Services/Archive (service, ArchiveServiceInterface, ArchiveHealthChecker, DTOs, and ServiceProvider/ArchiveProvider), the archive:manage console command (src/Console/Commands/Archive), migrations/archive, config/archive.php, and the archive capability (the capabilities.archive / ARCHIVE_DATABASE_SCHEMA gate). The ArchiveProvider is no longer registered in the container. Apps that use archiving must now composer require glueful/archive (auto-discovered via extra.glueful) and migrate imports Glueful\Services\Archive\*Glueful\Extensions\Archive\*. See UPGRADE.md. Intentional fix carried into the extension: a configured archive.storage.path now actually takes effect — under core, the dead archive.config / storage_path config keys plus a missing ApplicationContext meant the configured storage path was silently never applied.
  • Queue ops (supervised fleets / autoscaling / worker metrics) command surface extracted to the glueful/queue-ops extension (part 1 of a staged breaking series — config relocates in a follow-up commit). Plain php glueful queue:work is now a single lean worker: the old queue:work sub-actions (work (multi/manager mode), spawn, scale, status, stop, restart, health) and the queue:autoscale command are removed/absent — invoking them is a generic command-not-found / unknown-argument error, with no stub printing an actionable message. The deleted core classes moved to the extension: Glueful\Queue\Monitoring\WorkerMonitorGlueful\Extensions\QueueOps\Monitoring\WorkerMonitor; Glueful\Queue\Process\* (ProcessManager, ProcessFactory, WorkerProcess, AutoScaler, ScheduledScaler, ResourceMonitor, StreamingMonitor) → Glueful\Extensions\QueueOps\Process\*; Glueful\Console\Commands\Queue\AutoScaleCommand → the extension. Core retains the lean worker plus the Glueful\Queue\Contracts\WorkerMonitorInterface seam bound by default to the no-op Glueful\Queue\Monitoring\NullWorkerMonitor, so queue:work and QueueMaintenance keep working on a plain checkout. Supervised fleets, autoscaling, and worker/job metrics now require composer require glueful/queue-ops (auto-discovered via extra.glueful), which restores queue:supervise (supervisor + leaf workers) and queue:autoscale. Additive (already shipped this cycle, no action needed): new queue:work --once / --connection= flags, and WorkerOptions max-jobs / max-runtime now treat 0 as unlimited; ServeCommand still shells queue:work --sleep=3 (now one lean worker). Note: this is part 1 of a staged breaking series — the ops config keys (queue.workers.{process,auto_scaling,resource_limits,resource_thresholds,supervisor} and per-queue workers / max_workers / auto_scale) relocate to the extension's queue_ops.* in a follow-up commit. See UPGRADE.md.
  • Queue ops config relocated from core config/queue.php to the glueful/queue-ops extension (queue_ops.*) (part 2, final, of the staged breaking series — commands removed in part 1). The worker-management blocks queue.workers.{process,auto_scaling,resource_limits,resource_thresholds,supervisor} and the per-queue ops keys queue.workers.queues.<name>.{workers,max_workers,auto_scale} were removed from core and now live under queue_ops.* in the extension (provided via the extension's config/queue_ops.php + mergeConfig). Read remappings: config('queue.workers.process.*')config('queue_ops.process.*'), …auto_scalingqueue_ops.auto_scaling, …resource_limitsqueue_ops.resource_limits, …resource_thresholdsqueue_ops.resource_thresholds, …supervisorqueue_ops.supervisor, and config('queue.workers.queues.<name>.workers|max_workers|auto_scale')config('queue_ops.queues.<name>.*'). Stays in core: per-queue priority / memory_limit / timeout / max_jobs, queue.workers.performance.* (read by the lean QueueWorker), and queue.monitoring.*. The feeding env vars are unchanged (e.g. QUEUE_PROCESS_ENABLED, QUEUE_AUTO_SCALING, CRITICAL_QUEUE_WORKERS, QUEUE_MEMORY_WARNING) — they are simply read by glueful/queue-ops now, so no .env changes are required. See UPGRADE.md.
  • Rich media (image processing, thumbnail generation, media metadata) extracted to the glueful/media extension. The two heavy deps intervention/image and james-heinrich/getid3 were removed from core and now ship with the extension. The moved classes (namespace map): Glueful\Services\ImageProcessorGlueful\Extensions\Media\ImageProcessor; Glueful\Services\ImageProcessorInterfaceGlueful\Extensions\Media\Contracts\ImageProcessorInterface; Glueful\Uploader\ThumbnailGeneratorGlueful\Extensions\Media\ThumbnailGenerator; Glueful\Uploader\MediaMetadataExtractorGlueful\Extensions\Media\MediaMetadataExtractor. Glueful\Uploader\MediaMetadata is unchanged and stays in core. The global image() helper is now extension-provided — on a plain core install it is undefined (function-not-found, not a stub). FileUploader::getThumbnailGenerator() / getMetadataExtractor() were removed. IMAGE_* env vars and config/image.php are now extension-owned; the UPLOADS_THUMBNAILS / UPLOADS_IMAGE_PROCESSING / THUMBNAIL_* config keys stay in core (config/uploads.php / config/filesystem.php) but are inert (media-gated no-ops) until glueful/media is installed. Without the extension: uploadMedia() returns thumb_url: null plus a type-only MediaMetadata, and the blob-resize endpoint serves the original image (returning 415 only when an explicit format conversion is requested). Restore full rich-media support with composer require glueful/media (auto-discovered via extra.glueful). See UPGRADE.md.

Upgrade Notes

  • Restore any extracted subsystem with one composer require (each auto-discovers via extra.glueful); enable it in the app's config/extensions.php if your app gates extensions there:
    • composer require glueful/archive — archiving + the archive:manage command + the ARCHIVE_DATABASE_SCHEMA gate (run php glueful migrate:run).
    • composer require glueful/cdn — edge purging + cache-control headers + cache:purge; move any cache.edge overrides to the extension's cdn config.
    • composer require glueful/queue-opsqueue:supervise (supervisor + leaf workers) + queue:autoscale + worker/job metrics; the queue.workers.* ops blocks move to queue_ops.* (same env vars, no .env changes).
    • composer require glueful/media — image processing / thumbnails / metadata + the image() helper; republishes config/image.php.
  • Refresh the production command manifest on deploy. This release removes the core archive:manage, cache:purge, and queue:autoscale commands; a storage/cache/glueful_commands_manifest.php generated before the upgrade still references them and breaks CLI boot. Run php glueful commands:cache --clear as part of the deploy — php glueful cache:clear does not clear the command manifest. (See UPGRADE.mdCommand cache.)
  • No-extension behavior is graceful, not fatal (the seams are bound to no-op/defaults): response caching still emits surrogate keys (NullEdgeCache); queue:work runs as one lean worker; uploadMedia() returns thumb_url: null + type-only MediaMetadata and the blob-resize endpoint serves the original (415 only on explicit format conversion); archiving is simply unavailable. The removed image() helper and queue:autoscale/queue:work sub-actions are absent (function/command-not-found), not error-printing stubs.
  • Queue ops is a two-stage breaking move (within this release): the commands/classes and the queue.workers.* ops config both relocate to glueful/queue-ops. Core keeps per-queue priority/memory_limit/timeout/max_jobs, queue.workers.performance.*, and queue.monitoring.*. The additive queue:work --once / --connection= flags and WorkerOptions 0 = unlimited ship in core regardless.
  • No new framework env vars; no core migrations. The four extensions own their own schema/config. Full namespace maps and per-subsystem steps are in UPGRADE.md.