Repository navigation
ShipKit 1.0.0
The first release that lets agents implement features unattended: the rules that protect the application's invariants are enforced by code, tests, and CI instead of by review, and they ship in a versioned package that updates with composer update.
There is no upgrade path from 0.x. ShipKit had no users before 1.0.0, so nothing in this release carries compatibility code. Create new projects from 1.0.0.
Enforcement moves into shipwithian/shipkit-core
- The guard traits, domain exception base class, architecture checks, guarded-table and cascade checks,
make:context, and the system roles and permissions live in the package, not in your project.composer updatebrings improved checks to a project that already exists. config/shipkit.phpmaps the project'sRole,Permission, andUsermodels. The application refuses to boot when a mapped model does not useGuardsInvariants.php artisan shipkit:verifyruns incomposer ci:checkand fails when core's testsuite is not registered inphpunit.xml, so deleting one line cannot silently turn the checks off.- The shared
.airules, skills, and guidelines come from the package through Boost (php artisan boost:update) instead of being copied into each project.
Guarded writes fail closed
- Every query-builder write on a guarded model throws, even for one row, and so do the inherited ones (
increment,decrement,touch,forceDelete,updateOrInsert, and the rest). Every Eloquent builder method is classified as guarded, rejected, or safe, and a test fails when a Laravel release adds one that is unclassified. is_protectedcannot change after a record is created, in either direction. One Access Control bootstrap Action, called by the seeder, is the only code that creates protected records, and a source check fails on any other file that writes the flag.- The last-super-admin guard is proven under real contention on MySQL and Postgres, in addition to the SQLite suite.
The frontend contract is generated from PHP
- Every Inertia page and the shared props are typed PHP classes.
composer types:generatewrites the TypeScript types toresources/js/types/generated.ts, andcomposer ci:checkfails when the committed file differs. This adds thespatie/laravel-typescript-transformerdependency. - Pages receive abilities computed with the Gate from the policy abilities their controllers authorize (
can.create, acanon each row,auth.canfor navigation). The UI no longer reads permission names,auth.permissionsis no longer shared, and a core check fails onpermissions.includes(...)inresources/js.
Agent workflow
.github/CODEOWNERSassigns the maintainer to the checks and to the places their exceptions are recorded. Theimplementandreview-diffskills state the evidence an agent needs to merge project-owned code: a regression test shown failing without the change, a greencomposer ci:check, and an independent review.docs/branch-protection.mdrecords the repository rules that enforce the split.- A CI job creates a project from the installer archive with the package from the same commit and runs
composer ci:checkin it, including the two cases that must fail.
Also since 0.1.0
- Code is organized into DDD-lite bounded contexts (
AccessControl,Settings,Authentication) withmake:contextto add more, enforced by architecture tests. - API token management endpoints for Sanctum.
- Agent skills are generated when a project is created, and the
verify-appskill drives an isolated copy of the app. league/commonmarkis updated for two security advisories.