Immutable
release. Only release title and notes can be modified.
Added
ArtisanPackServiceProviderbase class: Abstract base service provider that removes the boilerplate every sibling ArtisanPack UI package previously hand-rolled (config merging, command registration, view loading, route loading, container singletons). Child providers configure their behaviour declaratively through$configFile,$configKey,$configPublishTag,$commands,$singletons,$viewsPath,$viewsNamespace, and$routesPathproperties and only need to implement theregisterPackageBindings()hook for unique bindings. An optionalbootPackage()hook covers any boot-time logic that doesn't map to the standard hooks. Reduces a typical sibling provider to a handful of properties.- Unified configuration manager: Added
ArtisanPackUI\Core\Config\ConfigurationManagerfor reading, writing, merging, and validating the configuration of every installed ArtisanPack UI package. Hides the sharedartisanpack.<package>.<key>namespacing behind package-aware helpers (get,set,has,merge,validate,all,package,registerSchema,schema). Shipped alongsideConfigurationSchema(lightweighttype/required/inrule validation),ValidationResult(immutable outcome object), theArtisanPackConfigfacade, and theartisanpack_config()helper for one-off reads. Resolved as a singleton throughCoreServiceProvider. - Shared logging infrastructure: Added
ArtisanPackLogger,Logger, andLoggerFactoryunderArtisanPackUI\Core\Logging, plus theAuditLogCreatedevent and theArtisanPackLogfacade. Every ArtisanPack UI package can now route logs through a single channel with consistent[package]prefixes, structured context, and anaudit()method that records compliance-relevant actions and dispatches an event applications can listen for. Configurable viaartisanpack.core.logging.channel(falls back to Laravel's default channel) andartisanpack.core.logging.audit.enabled. - Blade directive registrar: Added
ArtisanPackUI\Core\View\BladeDirectiveRegistrarand the matchingartisanpack_blade()helper. Packages can now declare common directive patterns through intent-revealing methods (echo,escaped,conditional,wrap,livewireAction,facade) instead of hand-rolling PHP-string templates withBlade::directive(). Directive names are validated at registration so typos surface immediately rather than at template render. Resolved as a singleton throughCoreServiceProvider. ArtisanPackFacadebase class: Shared base for every ArtisanPack UI facade, providing consistent error messages when the underlying service is missing alongside helper methods for safely probing whether the service is available before resolving it. Subclasses overridegetFacadeAccessor()and may overridegetPackageName()so the missing-service exception names the package the consumer needs to install.- Constants + enums repository: Added
ArtisanPackUI\Core\Constants(package identifiers, configuration keys, default values, version baselines) and four enums underArtisanPackUI\Core\Enums—LogLevel,Package(withconfigKey()andshortName()helpers),Priority, andStatus. Single source of truth for primitives used across the ecosystem. - Base exception hierarchy: Added
ArtisanPackUI\Core\Exceptions\ArtisanPackExceptionplus five specialised subclasses —ConfigurationException,DependencyException,InstallationException,ServiceException,ValidationException. Catch the base class for any ArtisanPack UI error, or the specific subclass for a specific failure mode. - Testing utilities base classes: Added
ArtisanPackUI\Core\Testing\ArtisanPackTestCase(Orchestra Testbench base that registersCoreServiceProviderautomatically) plus three concerns —ArtisanPackAssertions(assertPackageInstalled,assertConfigEquals,assertCommandExists,assertFacadeWorks,assertHelperExists),InteractsWithConfiguration(withConfig,withPackageConfig), andMocksArtisanPackServices(swapArtisanPackService,mockArtisanPackService, plus dedicated shortcuts for the configuration manager, logger factory, and Blade directive registrar). Sibling packages can extend the base case and immediately reach for ecosystem-aware assertions and helpers. artisanpack:diagnosecommand: Runs the newDiagnosticRunneragainst five default checks —EnvironmentCheck(PHP / Laravel / Livewire versions + required PHP extensions),InstalledPackagesCheck,ConfigurationCheck(with auto-fix that invokesartisanpack:scaffold-config),ServiceBindingsCheck(verifiescoreanda11yaliases resolve to expected concretes), andArtisanCommandsCheck. Supports--json,--fix, and--package=<id>flags. Exits non-zero when any check reports an error.artisanpack:check-compatibilitycommand: Walks every installed ArtisanPack UI package's Composer requirements and reports inter-package, PHP version, Laravel version, and PHP extension constraint satisfaction via the newCompatibilityChecker. Supports--json,--strict(treat warnings as errors), and--package=<name>flags. Test overrides on the checker allow stubbing PHP version, Laravel version, loaded extensions, and the package list without touching the host environment.artisanpack:check-updatescommand: Readscomposer.lock, asks Packagist for the latest stable release of every installed ArtisanPack UI package, and produces a structured update report via the newUpdateCheckerandPackagistClient. Classifies each update as major / minor / patch, flags security-related releases by keyword scanning (security, vulnerability, cve-, xss, csrf, sql injection, remote code execution), and supports--json,--minor-only,--security-only, and--changelogflags. Packagist responses are cached forartisanpack.core.updates.cache_ttlseconds (default 3600), with cache entries refreshed on read so frequently-queried packages stay warm. Adopts Laravel 13'sCache::touch()behind amethod_exists()feature gate so custom cache repositories on Laravel 11/12 benefit too.artisanpack:make-packagecommand: Scaffolds a new ArtisanPack UI package from the standard blueprint —composer.jsonwired to the ecosystem's standard dev dependencies, a service provider that extendsArtisanPackServiceProvider, a facade, a config stub, Pest tests via Orchestra Testbench, and the conventional directory layout. Optional--with-livewire,--with-views,--with-routes,--with-migrations, and--with-commandsflags add additional structure. Validatesvendor/packagenaming format up front and protects existing non-empty directories ( opt-in via--force).- Laravel 13 support: Widened the
illuminate/supportconstraint from^11.0|^12.0to^11.0|^12.0|^13.0. Laravel 11 and 12 remain fully supported. The CI matrix now runs against Laravel 11, 12, and 13.
Changed
- Hardened CI: CI now runs on
release/**branches so v1.2 PRs are validated, workflow permissions tightened, and the release workflow now fails on Packagist errors rather than swallowing them silently.
Notes
- PHP 8.2+ remains the minimum requirement. Laravel 13 requires PHP 8.3+, so PHP 8.2 users continue to receive Laravel 11/12, while Laravel 13 is only selectable on PHP 8.3+ (enforced by Laravel's own PHP constraint).
- No public API was removed. Every Core 1.1 application continues to work after upgrading to 1.2 with no other changes required. Migration to the new services (
ArtisanPackServiceProvider,ConfigurationManager,ArtisanPackLog,ArtisanPackTestCase) is opt-in. SeeUPGRADE.mdfor the full migration guide.