···980980```bash
981981# Generate OAuth private key
982982php artisan atp-client:generate-key
983983+984984+# Create a domain client extension
985985+php artisan make:atp-client AnalyticsClient
986986+987987+# Create a request client extension for an existing domain
988988+php artisan make:atp-request MetricsClient --domain=bsky
983989```
984990985991## Requirements
+27
docs/extensions.md
···2323| Domain Client | `$client->myDomain` | Group related functionality under a namespace |
2424| Request Client | `$client->bsky->myFeature` | Add methods to an existing domain |
25252626+### Generator Commands
2727+2828+Quickly scaffold extension classes using artisan commands:
2929+3030+```bash
3131+# Create a domain client extension
3232+php artisan make:atp-client AnalyticsClient
3333+3434+# Create a public domain client extension
3535+php artisan make:atp-client DiscoverClient --public
3636+3737+# Create a request client extension for an existing domain
3838+php artisan make:atp-request MetricsClient --domain=bsky
3939+4040+# Create a public request client extension
4141+php artisan make:atp-request TrendingClient --domain=bsky --public
4242+```
4343+4444+The generated files are placed in `app/Services/Clients/` (domain clients) and `app/Services/Clients/Requests/` (request clients). You can customize these paths in `config/client.php`:
4545+4646+```php
4747+'generators' => [
4848+ 'client_path' => 'app/Services/Clients',
4949+ 'request_path' => 'app/Services/Clients/Requests',
5050+],
5151+```
5252+2653## Understanding Extensions
27542855Extensions follow a lazy-loading pattern. When you register an extension, the callback is stored but not executed. The extension is only instantiated when first accessed: