$args Positional arguments (after the command name) * @param array $options Parsed --key=value and --flag options * @return int Exit code (0 = success) */ abstract public function execute(array $args, array $options): int; // ─── Bootstrap helpers ────────────────────────────────────────── protected function projectRoot(): string { return dirname(__DIR__, 2); } /** * Bootstrap the app for non-module CLI commands. * Uses the centralized CLI bootstrap runtime. */ protected function bootstrapApp(string $channel = 'cli', ?string $path = null): void { CliAppBootstrap::bootstrap($channel, $path ?? 'bin/console ' . $this->name()); } /** * Bootstrap the app for module CLI commands. * Loads the module CLI infrastructure (error policy, locking, app container). */ protected function bootstrapModuleApp(): void { ModuleCliRuntime::bootstrap(); } }