···1313## Tooling
14141515- **Package manager: bun only.** Never use npm, yarn, or pnpm for dependency changes. All install/run/build commands must use `bun`. PHP deps via Composer.
1616-- **Never read or search inside `node_modules/` or `vendor/`.** Treat as off-limits.
1716- **Never use inline eval** (`node -e`, `bun -e`, or equivalent). Don't create temporary files to work around this. To investigate JS package APIs, use [npmx.dev](https://npmx.dev) instead.
1817- **Wayfinder over hardcoded URLs.** Import route helpers from `@/routes/*` and action helpers from `@/actions/*`. Re-run `php artisan wayfinder:generate` after route or controller changes.
1918- **Inertia + React pages live at `resources/js/pages/`.** Kebab-case filenames, default export a component.
···2322- Use **Red/Green TDD** as the standard development paradigm.
2423- **Pest** for backend tests (`tests/Feature`, `tests/Unit`). Run with `php artisan test --compact` — add `--filter=<name>` to scope.
2524- Prefer feature tests over unit tests unless the logic is genuinely pure.
2525+- **Extract shared setup into traits** (or Pest `beforeEach`/helpers) instead of repeating arrange code across individual test cases. Reach for a trait the second time you'd copy-paste setup.
2626+- **Test like an experienced senior dev**: focus on meaningful behavior and likely failure modes, not exhaustive edge-case enumeration. Each test should earn its place.
2627- No frontend test runner is installed yet; add Vitest when the first interaction-worthy UI lands.
27282829## Verification
···4849- [ATProto OAuth](https://atproto.com/specs/oauth), [ATProto permissions](https://atproto.com/specs/permission)
4950- [revolution/laravel-bluesky docs](https://github.com/invokable/laravel-bluesky/blob/main/docs/socialite.md)
5051- Skyreader lexicons — `lexicons/app/skyreader/`
5151-5252-## Laravel Boost note
5353-5454-`laravel/boost` is installed and its `boost:update` hook runs on every `composer install/require/update`. That hook rewrites parts of this file. If it clobbers important content, recover from git. Long-term options: uninstall Boost, or merge Boost's guideline block into this file intentionally.