Branching
master is the main branch and the usual PR target. Branch names in the history follow a
type prefix:
master through pull requests.
Before you push
Run the same checks CI does, in this order:npm run format:check is the non-writing variant if you only want to know whether
something is off.
CI
Two workflows live in.github/workflows, both triggered on pushes and pull requests
targeting master or develop:
There is no frontend linting step. ESLint is not a dependency of this project — the old
eslint.config.js was Vue configuration inherited from the laravel/vue-starter-kit
skeleton and was removed once the app moved to React. Type safety comes from
npm run typecheck instead.
develop is kept in the trigger list but does not currently exist as a remote branch.
master is the live target.Code conventions
- PHP — Laravel Pint with the project’s default preset. Formatting is not negotiable; let Pint decide.
- TypeScript — strict compilation via
npm run typecheck. Prettier handles layout, withprettier-plugin-organize-importssorting imports andprettier-plugin-tailwindcssordering class names. - Routes — add to the file in
routes/that matches the concern rather than growingweb.php. Always name routes; Ziggy exposes them to the frontend. - Provider calls — never in the request cycle. Dispatch a job and let the UI poll.
- New provider costs — add the model to
config/ai.phpwithcost_per_1k_tokens, orTokenUsageTrackerwill record spend as zero.
Tests
Pest, split intotests/Unit and tests/Feature. Feature tests cover the Inertia pages and
settings flows — see PromptsPageTest, VisibilityPromptAnalyticsTest and
OnboardingCompleteTest for the established patterns.
The sync queue driver means dispatched jobs run inline, so assert against the resulting
records rather than against the queue.