artisanpack-ui/core
ArtisanPack UI Core unifies configuration from all ArtisanPack UI packages into a single config/artisanpack.php file. A scaffold command auto-detects and merges installed package settings while preserving your existing customizations.
Architecture fit
artisanpack-ui/core is a foundation layer, not a feature package. Its stated job is to unify configuration from every sibling ArtisanPack UI package into a single config/artisanpack.php, and since 1.2.0 it also ships shared plumbing: an abstract ArtisanPackServiceProvider, a ConfigurationManager, logging/audit infrastructure, a Blade directive registrar, a base facade, an exception hierarchy, enums/constants, and a testing base case. That makes it an ecosystem contract — the value proposition is only realized if we adopt at least a few ArtisanPack UI packages (CMS framework, visual editor, UI components, accessibility). In a standalone Laravel app it is a small convenience layer plus a set of artisan commands.
Architecturally the package is idiomatic Laravel: package discovery, a registerable service provider, a publish tag (artisanpack-config), singletons resolved through the container, and facades. Nothing exotic, no PHP extensions beyond the standard set, no queue or event-loop coupling. It will sit cleanly alongside an existing app's config and service providers. The one design choice to scrutinize is that configuration centralization is implemented as a file-mutating artisan command rather than a runtime merge — this is simpler to reason about but means config state lives in version-controlled PHP that a command rewrites.
Integration feasibility
Low technical effort: composer require artisanpack-ui/core, auto-registration, one publish command, one scaffold command. The prerequisites are PHP ^8.2 and Laravel 11–13, all of which a current Laravel codebase should satisfy. The real feasibility question is not "can we install it" but "do we intend to adopt the ecosystem it fronts." For a TPM, this is a scoping decision: if the answer is no, the package's remaining value is limited to the operational commands (artisanpack:diagnose, artisanpack:check-compatibility, artisanpack:check-updates, artisanpack:make-package) and the testing base classes — useful, but not a compelling reason on their own.
Technical risk
| Risk | Severity | Notes |
|---|---|---|
| Adoption signal | High | 1 star, 0 dependents. This is effectively unproven in the wild. No evidence of third-party production usage. |
| Bus factor / governance | High | Small single-vendor OSS effort. No stated support model, SLA, or security policy in the supplied material. |
| SemVer discipline | Medium | 1.1.0 is labeled "Breaking Changes" (dropped Laravel 10, removed a11y* helpers) yet shipped as a minor. Consumers treating ^1.0 as safe will be broken by a routine composer update. |
| Surface-area velocity | Medium | 1.2.0 adds roughly a dozen new services, commands, and base classes in one release. Fast-moving foundations tend to churn; "opt-in migration" language suggests the maintainers expect consumers to lag. |
| Config file mutation | Medium | Scaffolding rewrites config/artisanpack.php; --force overwrites existing keys. Corruption or unintended overwrite is the most likely operational incident. |
| Outbound network calls | Medium | artisanpack:check-updates reads composer.lock and queries Packagist, with caching. Needs to be understood before it runs in CI or any restricted network. |
| Lock-in to a fragmented ecosystem | Medium | Config conventions and base classes are ecosystem-specific. Ripping this out later is a refactor, not an uninstall. |
Key questions
core intended as a hard dependency for all sibling packages?artisanpack:check-updates transmit anything beyond package names, and is it safe to run in air-gapped or restricted CI?ConfigurationManager be used without adopting the full provider base class, and is that a supported configuration?Stack fit
Good fit for Laravel 11/12/13 applications on PHP 8.2+, particularly ones already standardized on Laravel's config/ conventions and comfortable with artisan-driven developer tooling. It is a poor fit for non-Laravel PHP services, for polyglot monorepos where a PHP-specific config convention adds a second source of truth, or for teams with strict third-party dependency review processes — an unproven 1-star foundation package will likely fail that gate without an exception.
Migration path
There is nothing to migrate from unless we already use ArtisanPack UI packages. Two entry scenarios:
core first, publish the base config, then add sibling packages and re-run artisanpack:scaffold-config. This is the intended path and is clean.config/artisanpack.php; it does not touch existing config. Actual migration cost appears only if we later move package settings out of per-package config files into the unified file. Treat that consolidation as a separate, optional initiative — do not bundle it into the initial install.Compatibility
^1.0 is not a safe constraint given the 1.1.0 breaking change. Pin to an explicit minor (^1.2) and review the changelog on every bump.config/artisanpack.php or an existing artisanpack service-container alias.Sequencing
core, publish config, run artisanpack:scaffold-config and artisanpack:diagnose. Confirm commands behave and inspect what the scaffold writes.artisanpack:check-compatibility and artisanpack:diagnose --json against a representative real application in a branch. Diff the config file before/after.core as "not adopted" and, if the diagnostic/testing utilities alone are wanted, vendor the specific ideas rather than the dependency.Maintenance
Runtime maintenance is negligible — this is config helpers and a service provider, with no background processes, migrations, or storage. The ongoing cost is upgrade cost: the project is moving fast and has already shipped breaking changes in a minor release. Budget for a changelog review on every composer update, and pin versions in composer.json with a lockfile committed. The config file becomes a maintained artifact owned by whoever runs the scaffold command; treat it like code, not generated output.
Support
MIT-licensed, community-supported, no vendor SLA. Internal support burden falls on the adopting team. Mitigations: read the source (it is small), keep the exception hierarchy in mind (ArtisanPackException and subclasses give a single catch point), and don't route critical paths through the facade without a fallback. Escalation path is GitHub issues only — factor that into risk acceptance for anything customer-facing.
Scaling
Effectively zero runtime cost: config merging happens at install/scaffold time and access is Laravel's native config() lookup. The scaling concern is organizational, not technical — as more sibling packages are added, the single artisanpack.php grows and becomes a merge-conflict hotspot across teams. Consider ownership rules (who may edit which section) before the file exceeds a few hundred lines.
Failure modes
--force is destructive. Never run it in a pipeline; require a clean working tree.check-updates depends on Packagist and a cache backend; expect failures in restricted networks or behind proxies, and don't put it on a critical CI path.check-compatibility --strict is the right gate but only if the ecosystem is actually installed.Ramp-up
Roughly half a day for an experienced Laravel engineer to install, publish, scaffold, and understand the config model; 1–2 days to become productive with the wider 1.2.0 services (ConfigurationManager, logging/audit, testing base case). The testing utilities (ArtisanPackTestCase plus assertions and mocking concerns) meaningfully reduce ramp-up for sibling-package work and are the most defensible part of the package for a team that is not fully committing to the ecosystem. Documentation is present — README, docs, changelog, upgrade guide — which is above average for a package at this adoption level, but the material is maintainer-authored and has no independent validation. Plan a short internal knowledge-transfer note so the team isn't dependent on one person's reading of the source.
How can I help you explore Laravel packages today?