apavliukov / laravel-devtools
Shared Laravel dev tooling: the laravel-finalize Boost skill, a translation completeness checker, and a Claude Code Stop-hook backstop.
Requires
- php: ^8.4
- symfony/finder: ^7.3 || ^8.0
Requires (Dev)
- laravel/pint: ^1.13
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5 || ^12.0
README
Shared development tooling for Laravel projects, distributed as a require-dev
composer package so every project and every developer gets the same tools without
per-project copies that rot.
Ships:
laravel-finalizeBoost skill — the finalization checklist (IDE helpers → translations → Pint → tests) that Claude runs before marking work complete. Laravel Boost auto-installs it into.claude/skills/laravel-finalize/onphp artisan boost:update.check-translations— a composer-bin script that scansapp/,resources/androutes/for__()/@lang/trans()/trans_choice()strings and fails if any is missing from any of the app'slang/*.jsonlocales.- Claude Code Stop hook — a backstop that blocks ending a turn with untranslated strings.
Requirements
- PHP 8.4+
- Locale files as
lang/*.json(the locale list is derived from them — no config)
Installation
composer require --dev apavliukov/laravel-devtools php artisan boost:update
boost:update installs the skill into .claude/skills/laravel-finalize/. Keep that
directory git-ignored — it is a vendor artifact, reinstalled on every boost:update.
Translation checker
# Ratchet mode (default): only strings in files changed vs main vendor/bin/sail php vendor/bin/check-translations # Full audit: every string under app/resources/routes vendor/bin/sail php vendor/bin/check-translations --all
Exit code 1 and an Untranslated strings found marker on STDERR mean gaps; the
output lists missing keys per locale. Dotted keys (auth.failed) resolve from PHP
array lang files and are ignored.
Stop hook
Wire the hook in the project's .claude/settings.json so Claude cannot end a turn
that touched PHP/lang files while translations are missing:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "vendor/apavliukov/laravel-devtools/hooks/check-translations.sh"
}
]
}
]
}
}
The hook is a detector only — silent when nothing relevant changed; fixing translations is the skill's job. It runs the checker with host PHP (no framework boot), so it works even when Docker/Sail is down.
Migrating a project off local copies
composer require --dev apavliukov/laravel-devtools && php artisan boost:update- Delete the local
.claude/skills/laravel-finalize/copy (and any localtranslations:checkartisan command). - Repoint
.claude/settings.jsonhooks to the vendor path above; delete the local.claude/hooks/check-translations.sh. - Drop the gitignore exception for
!/.claude/skills/laravel-finalize/.
Releases
Versioned with commit-and-tag-version (conventional commits, enforced by
commitlint + lefthook). Use yarn release:patch|minor|major — see CHANGELOG.md.
License
MIT