$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()); } }