diff --git a/src/BoostManager.php b/src/BoostManager.php index 1250f501..5d0c389c 100644 --- a/src/BoostManager.php +++ b/src/BoostManager.php @@ -10,6 +10,7 @@ use Laravel\Boost\Install\CodeEnvironment\Codex; use Laravel\Boost\Install\CodeEnvironment\Copilot; use Laravel\Boost\Install\CodeEnvironment\Cursor; +use Laravel\Boost\Install\CodeEnvironment\Gemini; use Laravel\Boost\Install\CodeEnvironment\OpenCode; use Laravel\Boost\Install\CodeEnvironment\PhpStorm; use Laravel\Boost\Install\CodeEnvironment\VSCode; @@ -25,6 +26,7 @@ class BoostManager 'codex' => Codex::class, 'copilot' => Copilot::class, 'opencode' => OpenCode::class, + 'gemini' => Gemini::class, ]; /** diff --git a/src/Install/CodeEnvironment/Gemini.php b/src/Install/CodeEnvironment/Gemini.php new file mode 100644 index 00000000..5a6e1397 --- /dev/null +++ b/src/Install/CodeEnvironment/Gemini.php @@ -0,0 +1,53 @@ + [ + 'command' => 'command -v gemini', + ], + Platform::Windows => [ + 'command' => 'where gemini 2>nul', + ], + }; + } + + public function projectDetectionConfig(): array + { + return [ + 'paths' => ['.gemini'], + 'files' => ['GEMINI.md'], + ]; + } + + public function mcpConfigPath(): string + { + return '.gemini/settings.json'; + } + + public function guidelinesPath(): string + { + return 'GEMINI.md'; + } +} diff --git a/tests/Unit/BoostManagerTest.php b/tests/Unit/BoostManagerTest.php index 97496f37..9c45dfb6 100644 --- a/tests/Unit/BoostManagerTest.php +++ b/tests/Unit/BoostManagerTest.php @@ -7,6 +7,7 @@ use Laravel\Boost\Install\CodeEnvironment\Codex; use Laravel\Boost\Install\CodeEnvironment\Copilot; use Laravel\Boost\Install\CodeEnvironment\Cursor; +use Laravel\Boost\Install\CodeEnvironment\Gemini; use Laravel\Boost\Install\CodeEnvironment\OpenCode; use Laravel\Boost\Install\CodeEnvironment\PhpStorm; use Laravel\Boost\Install\CodeEnvironment\VSCode; @@ -24,6 +25,7 @@ 'codex' => Codex::class, 'copilot' => Copilot::class, 'opencode' => OpenCode::class, + 'gemini' => Gemini::class, ]); }); diff --git a/tests/Unit/Install/CodeEnvironmentsDetectorTest.php b/tests/Unit/Install/CodeEnvironmentsDetectorTest.php index e189cb36..31985f68 100644 --- a/tests/Unit/Install/CodeEnvironmentsDetectorTest.php +++ b/tests/Unit/Install/CodeEnvironmentsDetectorTest.php @@ -10,6 +10,7 @@ use Laravel\Boost\Install\CodeEnvironment\Codex; use Laravel\Boost\Install\CodeEnvironment\Copilot; use Laravel\Boost\Install\CodeEnvironment\Cursor; +use Laravel\Boost\Install\CodeEnvironment\Gemini; use Laravel\Boost\Install\CodeEnvironment\OpenCode; use Laravel\Boost\Install\CodeEnvironment\PhpStorm; use Laravel\Boost\Install\CodeEnvironment\VSCode; @@ -30,9 +31,9 @@ $codeEnvironments = $this->detector->getCodeEnvironments(); expect($codeEnvironments)->toBeInstanceOf(Collection::class) - ->and($codeEnvironments->count())->toBe(7) + ->and($codeEnvironments->count())->toBe(8) ->and($codeEnvironments->keys()->toArray())->toBe([ - 'phpstorm', 'vscode', 'cursor', 'claudecode', 'codex', 'copilot', 'opencode', + 'phpstorm', 'vscode', 'cursor', 'claudecode', 'codex', 'copilot', 'opencode', 'gemini', ]); $codeEnvironments->each(function ($environment): void { @@ -64,6 +65,7 @@ $this->container->bind(Codex::class, fn () => $mockOther); $this->container->bind(Copilot::class, fn () => $mockOther); $this->container->bind(OpenCode::class, fn () => $mockOther); + $this->container->bind(Gemini::class, fn () => $mockOther); $detector = new CodeEnvironmentsDetector($this->container, $this->boostManager); $detected = $detector->discoverSystemInstalledCodeEnvironments(); @@ -83,6 +85,7 @@ $this->container->bind(Codex::class, fn () => $mockEnvironment); $this->container->bind(Copilot::class, fn () => $mockEnvironment); $this->container->bind(OpenCode::class, fn () => $mockEnvironment); + $this->container->bind(Gemini::class, fn () => $mockEnvironment); $detector = new CodeEnvironmentsDetector($this->container, $this->boostManager); $detected = $detector->discoverSystemInstalledCodeEnvironments(); @@ -116,6 +119,7 @@ $this->container->bind(Codex::class, fn () => $mockOther); $this->container->bind(Copilot::class, fn () => $mockOther); $this->container->bind(OpenCode::class, fn () => $mockOther); + $this->container->bind(Gemini::class, fn () => $mockOther); $detector = new CodeEnvironmentsDetector($this->container, $this->boostManager); $detected = $detector->discoverProjectInstalledCodeEnvironments($basePath); @@ -137,6 +141,7 @@ $this->container->bind(Codex::class, fn () => $mockEnvironment); $this->container->bind(Copilot::class, fn () => $mockEnvironment); $this->container->bind(OpenCode::class, fn () => $mockEnvironment); + $this->container->bind(Gemini::class, fn () => $mockEnvironment); $detector = new CodeEnvironmentsDetector($this->container, $this->boostManager); $detected = $detector->discoverProjectInstalledCodeEnvironments($basePath);