PHPackages                             artisan-build/kibble - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. artisan-build/kibble

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

artisan-build/kibble
====================

PHP package creation and management tools

v1.2.0(3w ago)02.0k↓77.8%MITPHPCI failing

Since Oct 14Pushed 3w ago2 watchersCompare

[ Source](https://github.com/artisan-build/kibble)[ Packagist](https://packagist.org/packages/artisan-build/kibble)[ RSS](/packages/artisan-build-kibble/feed)WikiDiscussions main Synced 3d ago

READMEChangelog (3)Dependencies (33)Versions (5)Used By (0)

Kibble
======

[](#kibble)

This is the package that makes our package manager work.

Warning

This package is currently under active development, and we have not yet released a major version. Once a 0.\* version has been tagged, we strongly recommend locking your application to a specific working version because we might make breaking changes even in patch releases until we've tagged 1.0.

Installation
------------

[](#installation)

`composer require artisan-build/kibble`

Configuration
-------------

[](#configuration)

Usage
-----

[](#usage)

### Splitting packages

[](#splitting-packages)

`php artisan kibble:split` mirrors each `packages/*` directory to its own read-only repository on GitHub. The monorepo is always the source of truth — split repositories are force-synced from it.

```
# Split every package (force-syncs each split repo's main branch)
php artisan kibble:split

# Split a single package
php artisan kibble:split adverbs
```

### Distribution cleaning (default)

[](#distribution-cleaning-default)

A split repository exists to be published, so by default `kibble:split` does **not** copy each package's `composer.json` verbatim. It produces a *distribution* `composer.json` for the split that strips dev-only wiring which is load-bearing inside the monorepo but wrong in the published package:

1. The top-level `version` field is removed so Packagist derives the version from the git tag rather than a hardcoded value (a stale `version` field breaks tag-derived/lockstep versioning).
2. `repositories` entries whose `type` is `path` are removed — their `../sibling` urls do not exist for consumers and otherwise print `The url supplied for the path (../) repository does not exist` on every `composer require`. Non-`path` repositories are preserved, and the `repositories` key is dropped entirely when nothing remains.

Anything else in `composer.json` is left untouched. The strip is applied to the **split artifact only** — the monorepo's own `packages//composer.json` on disk is never modified. Mechanically, the cleaned content is committed in a detached worktree *after* `git subtree split` and *before* the pushes, so both `main` and any `--tag` ref point at the cleaned commit.

Pass `--no-clean` to opt out and publish each `composer.json` verbatim (raw passthrough):

```
# Publish composer.json exactly as it appears in the monorepo
php artisan kibble:split adverbs --no-clean
```

### Lockstep release tagging

[](#lockstep-release-tagging)

Pass `--tag` to also tag every split repository with a release version, following the Laravel `illuminate/*` lockstep model — every split repo is tagged with the same version on every release, even packages with no changes:

```
# Force-sync main AND create the tag on every split repo
php artisan kibble:split --tag=v1.2.0

# Tag a single package
php artisan kibble:split adverbs --tag=v1.2.0
```

Notes:

- **Idempotent re-runs.** The tag is pushed with `--force`. `git subtree split` synthesizes new commit SHAs on each run, so a re-run of a failed or partial release simply re-points the tag at the new split commit rather than erroring that the tag already exists. (Re-publishing an already-released version is still discouraged, but the mirror model permits it.)
- **No local tag is created.** The tag is pushed via a ref-spec (`split-branch:refs/tags/`), so no tag is written into the monorepo checkout. This avoids colliding with the monorepo's own release tag that triggered the split in CI.
- **Partial failures.** The command stops on the first failed sub-command, which can leave a release partially tagged. Because tag pushes are force-idempotent, simply re-run the same command to finish the release.
- **CI requirements.** `git subtree split` needs full history, so check out with `fetch-depth: 0`. Split repositories must already exist. Outside the local environment, pushes authenticate with the `GH_USERNAME` / `GH_TOKEN` credentials (see Configuration).

Example release workflow step (run on a monorepo tag push):

```
- uses: actions/checkout@v4
  with:
    fetch-depth: 0
- run: composer install --no-interaction --prefer-dist
- run: php artisan kibble:split --tag=${{ github.ref_name }}
```

Memberware
----------

[](#memberware)

This package is part of our internal toolkit and is optimized for our own purposes. We do not accept issues or PRs in this repository.

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance95

Actively maintained with recent releases

Popularity21

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity39

Early-stage or recently created project

 Bus Factor1

Top contributor holds 92.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~79 days

Total

4

Last Release

24d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1053395?v=4)[Ed Grosvenor](/maintainers/edgrosvenor)[@edgrosvenor](https://github.com/edgrosvenor)

---

Top Contributors

[![edgrosvenor](https://avatars.githubusercontent.com/u/1053395?v=4)](https://github.com/edgrosvenor "edgrosvenor (59 commits)")[![ProjektGopher](https://avatars.githubusercontent.com/u/1688608?v=4)](https://github.com/ProjektGopher "ProjektGopher (5 commits)")

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/artisan-build-kibble/health.svg)

```
[![Health](https://phpackages.com/badges/artisan-build-kibble/health.svg)](https://phpackages.com/packages/artisan-build-kibble)
```

###  Alternatives

[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M201](/packages/laravel-ai)[illuminate/session

The Illuminate Session package.

9939.3M850](/packages/illuminate-session)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M131](/packages/roots-acorn)[livewire/flux

The official UI component library for Livewire.

9527.8M128](/packages/livewire-flux)[moonshine/moonshine

Laravel administration panel

1.3k253.1k81](/packages/moonshine-moonshine)[nativephp/mobile

NativePHP for Mobile

1.1k75.1k96](/packages/nativephp-mobile)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
