From 75f4297455c39fda93f099c154f8fcfbb8155040 Mon Sep 17 00:00:00 2001 From: Youri Wijnands Date: Tue, 18 Nov 2025 20:47:59 +0100 Subject: [PATCH 1/3] Add Gemini CodeEnvironment --- src/BoostManager.php | 2 + src/Install/CodeEnvironment/Gemini.php | 57 +++++++++++++++++++ tests/Unit/BoostManagerTest.php | 4 ++ .../Install/CodeEnvironmentsDetectorTest.php | 9 ++- 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/Install/CodeEnvironment/Gemini.php 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..6708e90a --- /dev/null +++ b/src/Install/CodeEnvironment/Gemini.php @@ -0,0 +1,57 @@ + [ + 'command' => 'command -v gemini', + ], + Platform::Windows => [ + 'command' => 'where gemini 2>nul', + ], + }; + } + + public function projectDetectionConfig(): array + { + return [ + 'paths' => ['.gemini'], + 'files' => ['GEMINI.md'], + ]; + } + + public function mcpInstallationStrategy(): McpInstallationStrategy + { + return McpInstallationStrategy::FILE; + } + + 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 6a6071ca..9c45dfb6 100644 --- a/tests/Unit/BoostManagerTest.php +++ b/tests/Unit/BoostManagerTest.php @@ -7,6 +7,8 @@ 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; use Tests\Unit\Install\ExampleCodeEnvironment; @@ -22,6 +24,8 @@ 'claudecode' => ClaudeCode::class, '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); From 96e7e8b907c77ba117d91bad48f5f7723b375266 Mon Sep 17 00:00:00 2001 From: Youri Wijnands Date: Wed, 19 Nov 2025 09:51:29 +0100 Subject: [PATCH 2/3] Implement missing McpClient interface --- src/Install/CodeEnvironment/Gemini.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Install/CodeEnvironment/Gemini.php b/src/Install/CodeEnvironment/Gemini.php index 6708e90a..2a431274 100644 --- a/src/Install/CodeEnvironment/Gemini.php +++ b/src/Install/CodeEnvironment/Gemini.php @@ -5,10 +5,11 @@ namespace Laravel\Boost\Install\CodeEnvironment; use Laravel\Boost\Contracts\Agent; +use Laravel\Boost\Contracts\McpClient; use Laravel\Boost\Install\Enums\McpInstallationStrategy; use Laravel\Boost\Install\Enums\Platform; -class Gemini extends CodeEnvironment implements Agent +class Gemini extends CodeEnvironment implements Agent, McpClient { public function name(): string { From 2bbc2b48b48097c0965468d1952206a0ebfe17d5 Mon Sep 17 00:00:00 2001 From: Pushpak Chhajed Date: Thu, 20 Nov 2025 21:51:29 +0530 Subject: [PATCH 3/3] Remove the redundant mcpInstallationStrategy method Signed-off-by: Pushpak Chhajed --- src/Install/CodeEnvironment/Gemini.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Install/CodeEnvironment/Gemini.php b/src/Install/CodeEnvironment/Gemini.php index 2a431274..5a6e1397 100644 --- a/src/Install/CodeEnvironment/Gemini.php +++ b/src/Install/CodeEnvironment/Gemini.php @@ -41,11 +41,6 @@ public function projectDetectionConfig(): array ]; } - public function mcpInstallationStrategy(): McpInstallationStrategy - { - return McpInstallationStrategy::FILE; - } - public function mcpConfigPath(): string { return '.gemini/settings.json';