composer-packages
When to use
Use this skill when creating, maintaining, or publishing Composer library packages — including Laravel packages with service providers, Artisan commands, and config publishing.
Procedure: Work with Composer packages
- Read the package's
composer.jsonfor structure and dependencies. - Check if it's a Laravel package (look for
extra.laravel.providers). - Read the package's
README.mdandCHANGELOG.md. - Check the
agents/directory in the package for package-specific docs.
Known packages
Check the project's composer.json for organization-specific packages.
Check agents/overrides/skills/composer-packages.md for the package registry and known packages list.
Package structure
my-package/
├── src/ # Source code
│ ├── App/
│ │ └── Providers/ # Laravel service providers
│ └── ...
├── config/ # Publishable config files
├── tests/ # Package tests
├── composer.json # Package manifest
├── README.md # Documentation
├── CHANGELOG.md # Version history
└── agents/ # Package-specific agent docs
composer.json essentials
Required fields
{
"name": "vendor/my-package",
"type": "library",
"description": "Clear, concise description",
"require": {
"php": "^8.2"
},
"autoload": {
"psr-4": {
"Vendor\\MyPackage\\": "src/"
}
}
}
Laravel package auto-discovery
{
"extra": {
"laravel": {
"providers": [
"Vendor\\MyPackage\\App\\Providers\\PackageServiceProvider"
]
}
}
}
Composer scripts / plugins
Packages can hook into Composer lifecycle events:
{
"scripts": {
"post-install-cmd": [
"MyNamespace\\ComposerScripts::onInstall"
]
}
}
Version constraints
Use wide version ranges for library packages to maximize compatibility:
{
"require": {
"php": "^8.1 || ^8.2 || ^8.3 || ^8.4",
"illuminate/support": "^10.0 || ^11.0 || ^12.0"
}
}
Libraries should use || ranges. Applications should use ^ (caret).
Local development
Path repositories
In the consuming project's composer.json:
{
"repositories": [
{ "type": "path", "url": "../packages/my-package" }
]
}
Then: composer require vendor/my-package:@dev
Development project
If the organization has a dedicated development sandbox for testing packages, use it for local testing.
Publishing
Private registry (GitHub Packages / Satis)
Packages are published to a private Composer registry. Check the organization's Satis or GitHub Packages setup.
Pre-publish checklist
composer validate— verifycomposer.jsonis valid.composer dump-autoload— verify autoloading works.- Run tests:
vendor/bin/phpunitorvendor/bin/pest. - Run quality tools: PHPStan, ECS, Rector.
- Update
CHANGELOG.mdwith the new version. - Tag the release:
git tag v1.2.3.
Conventions
- Follow the organization's namespace convention (check existing packages).
- Use
declare(strict_types=1)in all PHP files. - Use typed properties, parameters, and return types.
- Follow the same coding standards as the main projects (see
php-coderskill). - Include
agents/directory for package-specific documentation.
Output format
- Package files following standard Composer structure
- Updated composer.json with correct autoloading and dependencies
- Service provider and config publishing (if Laravel package)
Auto-trigger keywords
- Composer package
- library development
- package versioning
Gotcha
- Don't add
composer.lockto library packages — it should be in.gitignorefor libraries (not apps). - Minimum stability must be explicit — don't assume
stable. - The model tends to set overly restrictive version constraints — use
^(caret) not=(exact).
Do NOT
- Do NOT use
*version constraints in library packages. - Do NOT require specific patch versions — use
^or||ranges. - Do NOT include dev dependencies in
require— userequire-dev. - Do NOT forget to run
composer validatebefore publishing. - Do NOT publish without updating the changelog and tagging.