feat: add GET /api/dashboard endpoint (PROJ-430) (#130)
fix: resolve planner bugs (PROJ-432) (#131)
refactor: extract CreateOrderAction from OrdersController::store() (#80)
test: expand OrdersController test coverage (#59)
docs: document legacy Blade vs React SPA architecture (#119)
ci: add workflow_dispatch trigger for manual CI runs
chore: remove legacy frontend dependencies and dead code (#103)
feat: add GET /api/dashboard endpoint (PROJ-430) (#130)
fix: resolve planner bugs (PROJ-432) (#131)
refactor: extract CreateOrderAction from OrdersController::store() (#80)
test: expand OrdersController test coverage (#59)
docs: document legacy Blade vs React SPA architecture (#119)
ci: add workflow_dispatch trigger for manual CI runs
chore: remove legacy frontend dependencies and dead code (#103)
feat: add GET /api/dashboard endpoint (PROJ-430) (#130)
fix: resolve planner bugs (PROJ-432) (#131)
refactor: extract CreateOrderAction from OrdersController::store() (#80)
test: expand OrdersController test coverage (#59)
docs: document legacy Blade vs React SPA architecture (#119)
ci: add workflow_dispatch trigger for manual CI runs
chore: remove legacy frontend dependencies and dead code (#103)
Build → Code Quality → Tests → Deploy (make lint) (make test + make test-js)
Build → Code Quality → Tests → Deploy (make lint) (make test + make test-js)
Build → Code Quality → Tests → Deploy (make lint) (make test + make test-js)
cd staging.example.com
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
npm ci && npm run build
php artisan queue:restart
php artisan config:cache
php artisan route:cache
php artisan view:cache
cd staging.example.com
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
npm ci && npm run build
php artisan queue:restart
php artisan config:cache
php artisan route:cache
php artisan view:cache
cd staging.example.com
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
npm ci && npm run build
php artisan queue:restart
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:work redis --queue=default,crm --sleep=3 --tries=3
php artisan queue:work redis --queue=default,crm --sleep=3 --tries=3
php artisan queue:work redis --queue=default,crm --sleep=3 --tries=3
redis: image: redis:7-alpine profiles: [queue] queue-worker: build: . command: php artisan queue:work redis --queue=default,crm profiles: [queue] depends_on: [redis, mysql]
redis: image: redis:7-alpine profiles: [queue] queue-worker: build: . command: php artisan queue:work redis --queue=default,crm profiles: [queue] depends_on: [redis, mysql]
redis: image: redis:7-alpine profiles: [queue] queue-worker: build: . command: php artisan queue:work redis --queue=default,crm profiles: [queue] depends_on: [redis, mysql]
make migrate-e2e # Run migrations on E2E database
make seed-e2e # Seed test users with proper roles, permissions, relationships
make migrate-e2e # Run migrations on E2E database
make seed-e2e # Seed test users with proper roles, permissions, relationships
make migrate-e2e # Run migrations on E2E database
make seed-e2e # Seed test users with proper roles, permissions, relationships - Branch — create a branch from main: feat/PROJ-431-dashboard-migration
- Build — write tests, implement the feature, run make lint && make test
- PR — open a PR. Small diff. Clear description. Conventional commit title.
- CI — GitHub Actions runs the full pipeline (lint, test, test-js)
- Merge — once CI is green, merge to main
- Deploy — CI triggers a Forge deployment webhook. Staging updates automatically. - Easier to review — you can actually read the diff
- Easier to revert — if something breaks, git revert one PR, not a 2,000-line changeset
- Faster CI — smaller changes mean fewer test failures to debug
- Less merge conflict risk — you're never far from main - Generate changelogs automatically
- See at a glance whether a commit is a feature, fix, or refactoring
- Train an agent to follow the same convention (it will, if every existing commit uses it) - Some features are gated behind environment checks or feature flags
- Some changes need manual verification on staging first
- Production deploys happen when we decide, not when the CI pipeline finishes - The tests tell me if it works (seconds to minutes)
- The linter tells me if it's clean (seconds)
- CI confirms both in an environment I trust (minutes)
- If it passes, I merge. If it doesn't, Claude fixes it.
- The conventional commit tells me what changed without reading the diff. - Branches live for hours. If your branch is older than a day, something's wrong.
- Small PRs, merged often. 145 PRs in 3 months. Each one small enough to review in minutes.
- Conventional commits are a communication protocol. Both for humans reading the log and agents writing commits.
- CI is the source of truth. If it passes CI, it's good. If it doesn't, fix it before merging.
- Continuous delivery means always releasable. Deploy when you want, not when you have to.
- Infrastructure is code. Docker, queue workers, Redis, deploy scripts: all versioned, all reproducible.