injectable-dilisted
Install: claude install-skill ghozimahdi/gm-aiagent-plugins
Resolve `UFIL_ROOT` to the plugin root containing this skill. Claude Code may
provide `CLAUDE_PLUGIN_ROOT`; Codex can resolve it from the installed skill
path.
## Injectable / GetIt DI Patterns (GM Standard)
### Non-Modular — Single Injector
```dart
// lib/injector.dart
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'injector.config.dart';
final getIt = GetIt.instance;
@InjectableInit()
Future<void> configureDependencies() async {
getIt.registerLazySingleton<AppRouter>(() => AppRouter());
getIt.init();
}
```
All registrations go to single `injector.config.dart` (auto-generated).
### Modular — Per-Package DI + Config Class
**Each package has its own `di.dart`:**
```dart
// packages/domain/domain_auth/lib/src/di/di.dart
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'di.config.dart';
final getIt = GetIt.instance;
@injectableInit
void configureInjection({required String env}) {
getIt.init(environment: env);
}
```
**Each package has a Config class (singleton + AsyncMemoizer):**
```dart
// packages/domain/domain_auth/lib/src/config/domain_auth_config.dart
import 'package:library_common/library_common.dart';
class DomainAuthConfig extends AppConfig {
DomainAuthConfig._();
static final DomainAuthConfig _instance = DomainAuthConfig._();
static DomainAuthConfig getInstance() {
return _instance;
}
@override
Future<bool> config({required String env}) async {
configu