From 36199a772f8a9c7c8e4590123590543c79a0dfa0 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 21 Jul 2025 23:14:11 +0530 Subject: [PATCH 01/29] feat: gemini module --- .icons/gemini.svg | 1 + registry/anomaly/modules/gemini/main.test.ts | 254 ++++++++++++++++++ registry/anomaly/modules/gemini/main.tf | 162 +++++++++++ .../anomaly/modules/gemini/scripts/install.sh | 74 +++++ .../anomaly/modules/gemini/scripts/start.sh | 38 +++ 5 files changed, 529 insertions(+) create mode 100644 .icons/gemini.svg create mode 100644 registry/anomaly/modules/gemini/main.test.ts create mode 100644 registry/anomaly/modules/gemini/main.tf create mode 100644 registry/anomaly/modules/gemini/scripts/install.sh create mode 100644 registry/anomaly/modules/gemini/scripts/start.sh diff --git a/.icons/gemini.svg b/.icons/gemini.svg new file mode 100644 index 00000000..f1cf3575 --- /dev/null +++ b/.icons/gemini.svg @@ -0,0 +1 @@ +Gemini \ No newline at end of file diff --git a/registry/anomaly/modules/gemini/main.test.ts b/registry/anomaly/modules/gemini/main.test.ts new file mode 100644 index 00000000..bbf8b262 --- /dev/null +++ b/registry/anomaly/modules/gemini/main.test.ts @@ -0,0 +1,254 @@ +import { + test, + afterEach, + describe, + setDefaultTimeout, + beforeAll, + expect, +} from "bun:test"; +import { execContainer, readFileContainer, runTerraformInit } from "~test"; +import { + loadTestFile, + writeExecutable, + setup as setupUtil, + execModuleScript, + expectAgentAPIStarted, +} from "../agentapi/test-util"; +import dedent from "dedent"; + +let cleanupFunctions: (() => Promise)[] = []; + +const registerCleanup = (cleanup: () => Promise) => { + cleanupFunctions.push(cleanup); +}; + +// Cleanup logic depends on the fact that bun's built-in test runner +// runs tests sequentially. +// https://bun.sh/docs/test/discovery#execution-order +// Weird things would happen if tried to run tests in parallel. +// One test could clean up resources that another test was still using. +afterEach(async () => { + // reverse the cleanup functions so that they are run in the correct order + const cleanupFnsCopy = cleanupFunctions.slice().reverse(); + cleanupFunctions = []; + for (const cleanup of cleanupFnsCopy) { + try { + await cleanup(); + } catch (error) { + console.error("Error during cleanup:", error); + } + } +}); + +interface SetupProps { + skipAgentAPIMock?: boolean; + skipGooseMock?: boolean; + moduleVariables?: Record; + agentapiMockScript?: string; +} + +const setup = async (props?: SetupProps): Promise<{ id: string }> => { + const projectDir = "/home/coder/project"; + const { id } = await setupUtil({ + moduleDir: import.meta.dir, + moduleVariables: { + install_goose: props?.skipGooseMock ? "true" : "false", + install_agentapi: props?.skipAgentAPIMock ? "true" : "false", + goose_provider: "test-provider", + goose_model: "test-model", + ...props?.moduleVariables, + }, + registerCleanup, + projectDir, + skipAgentAPIMock: props?.skipAgentAPIMock, + agentapiMockScript: props?.agentapiMockScript, + }); + if (!props?.skipGooseMock) { + await writeExecutable({ + containerId: id, + filePath: "/usr/bin/goose", + content: await loadTestFile(import.meta.dir, "goose-mock.sh"), + }); + } + return { id }; +}; + +// increase the default timeout to 60 seconds +setDefaultTimeout(60 * 1000); + +describe("goose", async () => { + beforeAll(async () => { + await runTerraformInit(import.meta.dir); + }); + + test("happy-path", async () => { + const { id } = await setup(); + + await execModuleScript(id); + + await expectAgentAPIStarted(id); + }); + + test("install-version", async () => { + const { id } = await setup({ + skipGooseMock: true, + moduleVariables: { + install_goose: "true", + goose_version: "v1.0.24", + }, + }); + + await execModuleScript(id); + + const resp = await execContainer(id, [ + "bash", + "-c", + `"$HOME/.local/bin/goose" --version`, + ]); + if (resp.exitCode !== 0) { + console.log(resp.stdout); + console.log(resp.stderr); + } + expect(resp.exitCode).toBe(0); + expect(resp.stdout).toContain("1.0.24"); + }); + + test("install-stable", async () => { + const { id } = await setup({ + skipGooseMock: true, + moduleVariables: { + install_goose: "true", + goose_version: "stable", + }, + }); + + await execModuleScript(id); + + const resp = await execContainer(id, [ + "bash", + "-c", + `"$HOME/.local/bin/goose" --version`, + ]); + if (resp.exitCode !== 0) { + console.log(resp.stdout); + console.log(resp.stderr); + } + expect(resp.exitCode).toBe(0); + }); + + test("config", async () => { + const expected = + dedent` + GOOSE_PROVIDER: anthropic + GOOSE_MODEL: claude-3-5-sonnet-latest + extensions: + coder: + args: + - exp + - mcp + - server + cmd: coder + description: Report ALL tasks and statuses (in progress, done, failed) you are working on. + enabled: true + envs: + CODER_MCP_APP_STATUS_SLUG: goose + CODER_MCP_AI_AGENTAPI_URL: http://localhost:3284 + name: Coder + timeout: 3000 + type: stdio + developer: + display_name: Developer + enabled: true + name: developer + timeout: 300 + type: builtin + custom-stuff: + enabled: true + name: custom-stuff + timeout: 300 + type: builtin + `.trim() + "\n"; + + const { id } = await setup({ + moduleVariables: { + goose_provider: "anthropic", + goose_model: "claude-3-5-sonnet-latest", + additional_extensions: dedent` + custom-stuff: + enabled: true + name: custom-stuff + timeout: 300 + type: builtin + `.trim(), + }, + }); + await execModuleScript(id); + const resp = await readFileContainer( + id, + "/home/coder/.config/goose/config.yaml", + ); + expect(resp).toEqual(expected); + }); + + test("pre-post-install-scripts", async () => { + const { id } = await setup({ + moduleVariables: { + pre_install_script: "#!/bin/bash\necho 'pre-install-script'", + post_install_script: "#!/bin/bash\necho 'post-install-script'", + }, + }); + + await execModuleScript(id); + + const preInstallLog = await readFileContainer( + id, + "/home/coder/.goose-module/pre_install.log", + ); + expect(preInstallLog).toContain("pre-install-script"); + + const postInstallLog = await readFileContainer( + id, + "/home/coder/.goose-module/post_install.log", + ); + expect(postInstallLog).toContain("post-install-script"); + }); + + const promptFile = "/home/coder/.goose-module/prompt.txt"; + const agentapiStartLog = "/home/coder/.goose-module/agentapi-start.log"; + + test("start-with-prompt", async () => { + const { id } = await setup({ + agentapiMockScript: await loadTestFile( + import.meta.dir, + "agentapi-mock-print-args.js", + ), + }); + await execModuleScript(id, { + GOOSE_TASK_PROMPT: "custom-test-prompt", + }); + const prompt = await readFileContainer(id, promptFile); + expect(prompt).toContain("custom-test-prompt"); + + const agentapiMockOutput = await readFileContainer(id, agentapiStartLog); + expect(agentapiMockOutput).toContain( + "'goose run --interactive --instructions /home/coder/.goose-module/prompt.txt '", + ); + }); + + test("start-without-prompt", async () => { + const { id } = await setup({ + agentapiMockScript: await loadTestFile( + import.meta.dir, + "agentapi-mock-print-args.js", + ), + }); + await execModuleScript(id); + + const agentapiMockOutput = await readFileContainer(id, agentapiStartLog); + expect(agentapiMockOutput).toContain("'goose '"); + + const prompt = await execContainer(id, ["ls", "-l", promptFile]); + expect(prompt.exitCode).not.toBe(0); + expect(prompt.stderr).toContain("No such file or directory"); + }); +}); diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf new file mode 100644 index 00000000..5b07e31d --- /dev/null +++ b/registry/anomaly/modules/gemini/main.tf @@ -0,0 +1,162 @@ +terraform { + required_version = ">= 1.0" + + required_providers { + coder = { + source = "coder/coder" + version = ">= 2.7" + } + } +} + +variable "agent_id" { + type = string + description = "The ID of a Coder agent." +} + +data "coder_workspace" "me" {} + +data "coder_workspace_owner" "me" {} + +variable "order" { + type = number + description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)." + default = null +} + +variable "group" { + type = string + description = "The name of a group that this app belongs to." + default = null +} + +variable "icon" { + type = string + description = "The icon to use for the app." + default = "/icon/gemini.svg" +} + +variable "folder" { + type = string + description = "The folder to run Gemini in." + default = "/home/coder" +} + +variable "install_gemini" { + type = bool + description = "Whether to install Gemini." + default = true +} + +variable "gemini_version" { + type = string + description = "The version of Gemini to install." + default = "" +} + +variable "gemini_settings_json" { + type = string + description = "json to use in ~/.gemini/settings.json." + default = "" +} + +variable gemini_api_key { + type = string + description = "Gemini API Key" + default = "" +} + +variable google_genai_use_vertexai { + type = bool + description = "Whether to use vertex ai" + default = false +} + +variable "install_agentapi" { + type = bool + description = "Whether to install AgentAPI." + default = true +} + +variable "agentapi_version" { + type = string + description = "The version of AgentAPI to install." + default = "v0.2.3" +} + +variable "gemini_model" { + type = string + description = "The model to use for Gemini (e.g., claude-3-5-sonnet-latest)." + default = "" +} + +variable "gemini_start_directory" { + type = string + description = "Directory to start the Gemini CLI in." + default = "/home/coder/gemini" +} + +variable "pre_install_script" { + type = string + description = "Custom script to run before installing Goose." + default = null +} + +variable "post_install_script" { + type = string + description = "Custom script to run after installing Gemini." + default = null +} + + +locals { + app_slug = "gemini" + install_script = file("${path.module}/scripts/install.sh") + start_script = file("${path.module}/scripts/start.sh") + module_dir_name = ".gemini-module" +} + +module "agentapi" { + source = "registry.coder.com/coder/agentapi/coder" + version = "1.0.0" + + agent_id = var.agent_id + web_app_slug = local.app_slug + web_app_order = var.order + web_app_group = var.group + web_app_icon = var.icon + web_app_display_name = "Gemini" + cli_app_slug = "${local.app_slug}-cli" + cli_app_display_name = "Gemini CLI" + module_dir_name = local.module_dir_name + install_agentapi = var.install_agentapi + agentapi_version = var.agentapi_version + pre_install_script = var.pre_install_script + post_install_script = var.post_install_script + start_script = <<-EOT + #!/bin/bash + set -o errexit + set -o pipefail + + echo -n '${base64encode(local.start_script)}' | base64 -d > /tmp/start.sh + chmod +x /tmp/start.sh + GOOGLE_API_KEY='${var.gemini_api_key}' \ + GOOGLE_GENAI_USE_VERTEXAI='${var.google_genai_use_vertexai}' \ + GEMINI_MODEL='${var.gemini_model}' \ + GEMINI_START_DIRECTORY='${var.gemini_start_directory}' \ + /tmp/start.sh + EOT + + install_script = <<-EOT + #!/bin/bash + set -o errexit + set -o pipefail + + echo -n '${base64encode(local.install_script)}' | base64 -d > /tmp/install.sh + chmod +x /tmp/install.sh + ARG_INSTALL='${var.install_gemini}' \ + ARG_GEMINI_VERSION='${var.gemini_version}' \ + ARG_GEMINI_CONFIG='${var.gemini_settings_json}' \ + /tmp/install.sh + EOT +} diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/anomaly/modules/gemini/scripts/install.sh new file mode 100644 index 00000000..3fe59360 --- /dev/null +++ b/registry/anomaly/modules/gemini/scripts/install.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +BOLD='\033[0;1m' + +# Function to check if a command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +set -o nounset + +echo "--------------------------------" +printf "gemini_config: %s\n" "$ARG_GEMINI_CONFIG\n" +printf "install: %s\n" "$ARG_INSTALL\n" +printf "gemini_version: %s\n" "$ARG_GEMINI_VERSION\n" +echo "--------------------------------" + +set +o nounset + +function install_node() { + # borrowed from claude-code module + if ! command_exists npm; then + printf "npm not found, checking for Node.js installation...\n" + if ! command_exists node; then + printf "Node.js not found, installing Node.js via NVM...\n" + export NVM_DIR="$HOME/.nvm" + if [ ! -d "$NVM_DIR" ]; then + mkdir -p "$NVM_DIR" + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + else + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + fi + + nvm install --lts + nvm use --lts + nvm alias default node + + printf "Node.js installed: %s\n" "$(node --version)\n" + printf "npm installed: %s\n" "$(npm --version)\n" + else + printf "Node.js is installed but npm is not available. Please install npm manually.\n" + exit 1 + fi + fi +} + +function install_gemini() { + if [ "${ARG_INSTALL}" = "true" ]; then + # we need node to install and run gemini-cli + install_node + + printf "%s Installing Gemini CLI\n" "$BOLD" + if [ -n "$ARG_GEMINI_VERSION" ]; then + npm install -g "@google/gemini-cli@$ARG_GEMINI_VERSION" + else + npm install -g "@google/gemini-cli" + fi + printf "%s Successfully installed Gemini CLI. Version: %s" "$BOLD" "$(gemini --version)\n" + fi +} + +function populate_settings_json() { + if [ "${ARG_GEMINI_CONFIG}" != "" ]; then + echo "${ARG_GEMINI_CONFIG}" > "/home/coder/.gemini/settings.json" + fi +} + + + +# Install Gemini +install_gemini +populate_settings_json + diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/anomaly/modules/gemini/scripts/start.sh new file mode 100644 index 00000000..7479b19c --- /dev/null +++ b/registry/anomaly/modules/gemini/scripts/start.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Load shell environment +source ~/.bashrc +source ~/.nvm/nvm.sh + +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +printf "Version: %s\n" "$(gemini --version)\n" + +if command_exists gemini; then + printf "Gemini is installed\n" +else + printf "Error: Gemini is not installed. Please enable install_gemini or install it manually :)\n" + exit 1 +fi + +if [ -d "${GEMINI_START_DIRECTORY}" ]; then + printf "Directory '%s' exists. Changing to it.\\n" "${GEMINI_START_DIRECTORY}" + cd "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not change to directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } +else + printf "Directory '%s' does not exist. Creating and changing to it.\\n" "${GEMINI_START_DIRECTORY}" + mkdir -p "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not create directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } + cd "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not change to directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } +fi + +agentapi server --term-width 67 --term-height 1190 -- gemini \ No newline at end of file From feb7051c7b8ad105e8e8a170b6ff5160f760a4db Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 21 Jul 2025 23:25:06 +0530 Subject: [PATCH 02/29] feat: add README.md --- registry/anomaly/modules/gemini/README.md | 83 +++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 registry/anomaly/modules/gemini/README.md diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md new file mode 100644 index 00000000..af442d21 --- /dev/null +++ b/registry/anomaly/modules/gemini/README.md @@ -0,0 +1,83 @@ +--- +display_name: Gemini +icon: ../../../../.icons/gemini.svg +description: Run Gemini CLI in your workspace with AgentAPI integration +verified: false +tags: [agent, gemini, ai, tasks] +--- + +# Gemini + +Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to access Google's Gemini AI models, with support for background operation, task reporting, and custom pre/post install scripts. This module integrates with [AgentAPI](https://github.com/coder/agentapi) for Coder Tasks compatibility. + +```tf +module "gemini" { + source = "registry.coder.com/anomaly/gemini/anomaly" + version = "1.0.0" + agent_id = coder_agent.example.id + gemini_api_key = var.gemini_api_key + gemini_model = "gemini-1.5-pro-latest" + install_gemini = true + gemini_version = "latest" + agentapi_version = "latest" +} +``` + +## Prerequisites + +- You must add the [Coder Login](https://registry.coder.com/modules/coder-login/coder) module to your template +- Node.js and npm will be installed automatically if not present + +## Features + +- **Gemini CLI**: Installs and runs Gemini CLI in your workspace +- **AgentAPI Integration**: Enables Coder Tasks and background operation +- **Customizable**: Choose Gemini model, version, and settings +- **Pre/Post Install Hooks**: Run custom scripts before/after install +- **Vertex AI Support**: Optionally use Google Vertex AI endpoints + + +## Usage Example + +```tf +variable "gemini_api_key" { + type = string + description = "Gemini API key" + sensitive = true +} + +module "gemini" { + count = data.coder_workspace.me.start_count + source = "registry.coder.com/anomaly/gemini/anomaly" + version = "1.0.0" + agent_id = coder_agent.example.id + gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) + gemini_model = "gemini-1.5-pro-latest" + install_gemini = true + gemini_version = "latest" +} +``` + +## How it Works + +- **Install**: The module installs Gemini CLI using npm (installs Node.js if needed) +- **Configure**: Optionally writes your settings JSON to `~/.gemini/settings.json` +- **Start**: Launches Gemini CLI in the specified directory, wrapped by AgentAPI for Coder Tasks compatibility +- **Environment**: Sets `GOOGLE_API_KEY`, `GOOGLE_GENAI_USE_VERTEXAI`, `GEMINI_MODEL`, and `GEMINI_START_DIRECTORY` for the CLI + +## Customization + +- **Custom Pre/Post Install Scripts**: Use `pre_install_script` and `post_install_script` to run custom shell commands before or after install +- **Gemini Settings**: Pass a JSON string to `gemini_settings_json` to configure Gemini CLI (written to `~/.gemini/settings.json`) + +## Troubleshooting + +- If Gemini CLI is not found, ensure `install_gemini = true` and your API key is valid +- Node.js and npm are installed automatically if missing +- Check logs in `/home/coder/.gemini-module/` for install/start output + +## References + +- [Gemini CLI Documentation](https://ai.google.dev/gemini-api/docs/cli) +- [AgentAPI Documentation](https://github.com/coder/agentapi) +- [Coder AI Agents Guide](https://coder.com/docs/tutorials/ai-agents) From 1968f9cdb19449a5feaa64aaab2754d079c51dd6 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 21 Jul 2025 23:25:31 +0530 Subject: [PATCH 03/29] feat: bun fmt --- registry/anomaly/modules/gemini/README.md | 33 +++++++++++------------ registry/anomaly/modules/gemini/main.tf | 8 +++--- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index af442d21..add44383 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -12,14 +12,14 @@ Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to ```tf module "gemini" { - source = "registry.coder.com/anomaly/gemini/anomaly" - version = "1.0.0" - agent_id = coder_agent.example.id - gemini_api_key = var.gemini_api_key - gemini_model = "gemini-1.5-pro-latest" - install_gemini = true - gemini_version = "latest" - agentapi_version = "latest" + source = "registry.coder.com/anomaly/gemini/anomaly" + version = "1.0.0" + agent_id = coder_agent.example.id + gemini_api_key = var.gemini_api_key + gemini_model = "gemini-1.5-pro-latest" + install_gemini = true + gemini_version = "latest" + agentapi_version = "latest" } ``` @@ -36,7 +36,6 @@ module "gemini" { - **Pre/Post Install Hooks**: Run custom scripts before/after install - **Vertex AI Support**: Optionally use Google Vertex AI endpoints - ## Usage Example ```tf @@ -47,14 +46,14 @@ variable "gemini_api_key" { } module "gemini" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/anomaly/gemini/anomaly" - version = "1.0.0" - agent_id = coder_agent.example.id - gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) - gemini_model = "gemini-1.5-pro-latest" - install_gemini = true - gemini_version = "latest" + count = data.coder_workspace.me.start_count + source = "registry.coder.com/anomaly/gemini/anomaly" + version = "1.0.0" + agent_id = coder_agent.example.id + gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) + gemini_model = "gemini-1.5-pro-latest" + install_gemini = true + gemini_version = "latest" } ``` diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 5b07e31d..88fa6f02 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -60,13 +60,13 @@ variable "gemini_settings_json" { default = "" } -variable gemini_api_key { +variable "gemini_api_key" { type = string description = "Gemini API Key" default = "" } -variable google_genai_use_vertexai { +variable "google_genai_use_vertexai" { type = bool description = "Whether to use vertex ai" default = false @@ -111,8 +111,8 @@ variable "post_install_script" { locals { app_slug = "gemini" - install_script = file("${path.module}/scripts/install.sh") - start_script = file("${path.module}/scripts/start.sh") + install_script = file("${path.module}/scripts/install.sh") + start_script = file("${path.module}/scripts/start.sh") module_dir_name = ".gemini-module" } From a76729941059c4796b6eb540af6ba28ccac8d4dd Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 21 Jul 2025 23:53:09 +0530 Subject: [PATCH 04/29] feat: update tests --- registry/anomaly/modules/gemini/main.test.ts | 271 ++---------------- registry/anomaly/modules/gemini/main.tf | 12 +- .../anomaly/modules/gemini/scripts/install.sh | 4 +- 3 files changed, 31 insertions(+), 256 deletions(-) diff --git a/registry/anomaly/modules/gemini/main.test.ts b/registry/anomaly/modules/gemini/main.test.ts index bbf8b262..341aca39 100644 --- a/registry/anomaly/modules/gemini/main.test.ts +++ b/registry/anomaly/modules/gemini/main.test.ts @@ -1,254 +1,35 @@ +import { describe, it, expect } from "bun:test"; import { - test, - afterEach, - describe, - setDefaultTimeout, - beforeAll, - expect, -} from "bun:test"; -import { execContainer, readFileContainer, runTerraformInit } from "~test"; -import { - loadTestFile, - writeExecutable, - setup as setupUtil, - execModuleScript, - expectAgentAPIStarted, -} from "../agentapi/test-util"; -import dedent from "dedent"; - -let cleanupFunctions: (() => Promise)[] = []; - -const registerCleanup = (cleanup: () => Promise) => { - cleanupFunctions.push(cleanup); -}; + runTerraformApply, + runTerraformInit, + testRequiredVariables, + findResourceInstance, +} from "~test"; +import path from "path"; -// Cleanup logic depends on the fact that bun's built-in test runner -// runs tests sequentially. -// https://bun.sh/docs/test/discovery#execution-order -// Weird things would happen if tried to run tests in parallel. -// One test could clean up resources that another test was still using. -afterEach(async () => { - // reverse the cleanup functions so that they are run in the correct order - const cleanupFnsCopy = cleanupFunctions.slice().reverse(); - cleanupFunctions = []; - for (const cleanup of cleanupFnsCopy) { - try { - await cleanup(); - } catch (error) { - console.error("Error during cleanup:", error); - } - } -}); +const moduleDir = path.resolve(__dirname); -interface SetupProps { - skipAgentAPIMock?: boolean; - skipGooseMock?: boolean; - moduleVariables?: Record; - agentapiMockScript?: string; -} - -const setup = async (props?: SetupProps): Promise<{ id: string }> => { - const projectDir = "/home/coder/project"; - const { id } = await setupUtil({ - moduleDir: import.meta.dir, - moduleVariables: { - install_goose: props?.skipGooseMock ? "true" : "false", - install_agentapi: props?.skipAgentAPIMock ? "true" : "false", - goose_provider: "test-provider", - goose_model: "test-model", - ...props?.moduleVariables, - }, - registerCleanup, - projectDir, - skipAgentAPIMock: props?.skipAgentAPIMock, - agentapiMockScript: props?.agentapiMockScript, - }); - if (!props?.skipGooseMock) { - await writeExecutable({ - containerId: id, - filePath: "/usr/bin/goose", - content: await loadTestFile(import.meta.dir, "goose-mock.sh"), - }); - } - return { id }; +const requiredVars = { + agent_id: "dummy-agent-id", }; -// increase the default timeout to 60 seconds -setDefaultTimeout(60 * 1000); - -describe("goose", async () => { - beforeAll(async () => { - await runTerraformInit(import.meta.dir); - }); - - test("happy-path", async () => { - const { id } = await setup(); - - await execModuleScript(id); - - await expectAgentAPIStarted(id); - }); - - test("install-version", async () => { - const { id } = await setup({ - skipGooseMock: true, - moduleVariables: { - install_goose: "true", - goose_version: "v1.0.24", - }, - }); - - await execModuleScript(id); - - const resp = await execContainer(id, [ - "bash", - "-c", - `"$HOME/.local/bin/goose" --version`, - ]); - if (resp.exitCode !== 0) { - console.log(resp.stdout); - console.log(resp.stderr); - } - expect(resp.exitCode).toBe(0); - expect(resp.stdout).toContain("1.0.24"); - }); - - test("install-stable", async () => { - const { id } = await setup({ - skipGooseMock: true, - moduleVariables: { - install_goose: "true", - goose_version: "stable", - }, - }); - - await execModuleScript(id); - - const resp = await execContainer(id, [ - "bash", - "-c", - `"$HOME/.local/bin/goose" --version`, - ]); - if (resp.exitCode !== 0) { - console.log(resp.stdout); - console.log(resp.stderr); - } - expect(resp.exitCode).toBe(0); - }); - - test("config", async () => { - const expected = - dedent` - GOOSE_PROVIDER: anthropic - GOOSE_MODEL: claude-3-5-sonnet-latest - extensions: - coder: - args: - - exp - - mcp - - server - cmd: coder - description: Report ALL tasks and statuses (in progress, done, failed) you are working on. - enabled: true - envs: - CODER_MCP_APP_STATUS_SLUG: goose - CODER_MCP_AI_AGENTAPI_URL: http://localhost:3284 - name: Coder - timeout: 3000 - type: stdio - developer: - display_name: Developer - enabled: true - name: developer - timeout: 300 - type: builtin - custom-stuff: - enabled: true - name: custom-stuff - timeout: 300 - type: builtin - `.trim() + "\n"; - - const { id } = await setup({ - moduleVariables: { - goose_provider: "anthropic", - goose_model: "claude-3-5-sonnet-latest", - additional_extensions: dedent` - custom-stuff: - enabled: true - name: custom-stuff - timeout: 300 - type: builtin - `.trim(), - }, - }); - await execModuleScript(id); - const resp = await readFileContainer( - id, - "/home/coder/.config/goose/config.yaml", - ); - expect(resp).toEqual(expected); - }); - - test("pre-post-install-scripts", async () => { - const { id } = await setup({ - moduleVariables: { - pre_install_script: "#!/bin/bash\necho 'pre-install-script'", - post_install_script: "#!/bin/bash\necho 'post-install-script'", - }, - }); - - await execModuleScript(id); - - const preInstallLog = await readFileContainer( - id, - "/home/coder/.goose-module/pre_install.log", - ); - expect(preInstallLog).toContain("pre-install-script"); - - const postInstallLog = await readFileContainer( - id, - "/home/coder/.goose-module/post_install.log", - ); - expect(postInstallLog).toContain("post-install-script"); - }); - - const promptFile = "/home/coder/.goose-module/prompt.txt"; - const agentapiStartLog = "/home/coder/.goose-module/agentapi-start.log"; - - test("start-with-prompt", async () => { - const { id } = await setup({ - agentapiMockScript: await loadTestFile( - import.meta.dir, - "agentapi-mock-print-args.js", - ), - }); - await execModuleScript(id, { - GOOSE_TASK_PROMPT: "custom-test-prompt", - }); - const prompt = await readFileContainer(id, promptFile); - expect(prompt).toContain("custom-test-prompt"); - - const agentapiMockOutput = await readFileContainer(id, agentapiStartLog); - expect(agentapiMockOutput).toContain( - "'goose run --interactive --instructions /home/coder/.goose-module/prompt.txt '", - ); - }); +describe("gemini module", async () => { + await runTerraformInit(moduleDir); - test("start-without-prompt", async () => { - const { id } = await setup({ - agentapiMockScript: await loadTestFile( - import.meta.dir, - "agentapi-mock-print-args.js", - ), - }); - await execModuleScript(id); + // 1. Required variables + testRequiredVariables(moduleDir, requiredVars); - const agentapiMockOutput = await readFileContainer(id, agentapiStartLog); - expect(agentapiMockOutput).toContain("'goose '"); + // 2. coder_script resource is created + it("creates coder_script resource", async () => { + const state = await runTerraformApply(moduleDir, requiredVars); + const scriptResource = findResourceInstance(state, "coder_script"); + expect(scriptResource).toBeDefined(); + expect(scriptResource.agent_id).toBe(requiredVars.agent_id); - const prompt = await execContainer(id, ["ls", "-l", promptFile]); - expect(prompt.exitCode).not.toBe(0); - expect(prompt.stderr).toContain("No such file or directory"); + // check that the script contains expected components based on actual content + expect(scriptResource.script).toContain("ARG_MODULE_DIR_NAME='.gemini-module'"); + expect(scriptResource.script).toContain("ARG_INSTALL_AGENTAPI='true'"); + expect(scriptResource.script).toContain("ARG_AGENTAPI_VERSION='v0.2.3'"); + expect(scriptResource.script).toContain("/tmp/main.sh"); }); -}); +}); \ No newline at end of file diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 88fa6f02..ae9cc199 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -39,7 +39,7 @@ variable "icon" { variable "folder" { type = string description = "The folder to run Gemini in." - default = "/home/coder" + default = "/home/coder/gemini" } variable "install_gemini" { @@ -90,15 +90,9 @@ variable "gemini_model" { default = "" } -variable "gemini_start_directory" { - type = string - description = "Directory to start the Gemini CLI in." - default = "/home/coder/gemini" -} - variable "pre_install_script" { type = string - description = "Custom script to run before installing Goose." + description = "Custom script to run before installing Gemini." default = null } @@ -143,7 +137,7 @@ module "agentapi" { GOOGLE_API_KEY='${var.gemini_api_key}' \ GOOGLE_GENAI_USE_VERTEXAI='${var.google_genai_use_vertexai}' \ GEMINI_MODEL='${var.gemini_model}' \ - GEMINI_START_DIRECTORY='${var.gemini_start_directory}' \ + GEMINI_START_DIRECTORY='${var.folder}' \ /tmp/start.sh EOT diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/anomaly/modules/gemini/scripts/install.sh index 3fe59360..7ea97585 100644 --- a/registry/anomaly/modules/gemini/scripts/install.sh +++ b/registry/anomaly/modules/gemini/scripts/install.sh @@ -50,13 +50,13 @@ function install_gemini() { # we need node to install and run gemini-cli install_node - printf "%s Installing Gemini CLI\n" "$BOLD" + printf "%s Installing Gemini CLI\n" "$${BOLD}" if [ -n "$ARG_GEMINI_VERSION" ]; then npm install -g "@google/gemini-cli@$ARG_GEMINI_VERSION" else npm install -g "@google/gemini-cli" fi - printf "%s Successfully installed Gemini CLI. Version: %s" "$BOLD" "$(gemini --version)\n" + printf "%s Successfully installed Gemini CLI. Version: %s" "$${BOLD}" "$(gemini --version)\n" fi } From e81c651b9b72001464305f6ec62aebb8c2e951c7 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Tue, 22 Jul 2025 00:18:28 +0530 Subject: [PATCH 05/29] feat: gemini api key --- registry/anomaly/modules/gemini/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index ae9cc199..370a6418 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -134,7 +134,7 @@ module "agentapi" { echo -n '${base64encode(local.start_script)}' | base64 -d > /tmp/start.sh chmod +x /tmp/start.sh - GOOGLE_API_KEY='${var.gemini_api_key}' \ + GEMINI_API_KEY='${var.gemini_api_key}' \ GOOGLE_GENAI_USE_VERTEXAI='${var.google_genai_use_vertexai}' \ GEMINI_MODEL='${var.gemini_model}' \ GEMINI_START_DIRECTORY='${var.folder}' \ From 21f06a41f6ab9bb18ae98229d99c967df929170c Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Tue, 22 Jul 2025 00:59:41 +0530 Subject: [PATCH 06/29] feat: update README.md --- registry/anomaly/modules/gemini/README.md | 25 ++++++----------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index add44383..808e2de4 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -1,14 +1,14 @@ --- -display_name: Gemini +display_name: Gemini CLI icon: ../../../../.icons/gemini.svg description: Run Gemini CLI in your workspace with AgentAPI integration verified: false -tags: [agent, gemini, ai, tasks] +tags: [agent, gemini, ai] --- -# Gemini +# Gemini CLI -Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to access Google's Gemini AI models, with support for background operation, task reporting, and custom pre/post install scripts. This module integrates with [AgentAPI](https://github.com/coder/agentapi) for Coder Tasks compatibility. +Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to access Google's Gemini AI models, and custom pre/post install scripts. This module integrates with [AgentAPI](https://github.com/coder/agentapi) for Coder Tasks compatibility. ```tf module "gemini" { @@ -28,14 +28,6 @@ module "gemini" { - You must add the [Coder Login](https://registry.coder.com/modules/coder-login/coder) module to your template - Node.js and npm will be installed automatically if not present -## Features - -- **Gemini CLI**: Installs and runs Gemini CLI in your workspace -- **AgentAPI Integration**: Enables Coder Tasks and background operation -- **Customizable**: Choose Gemini model, version, and settings -- **Pre/Post Install Hooks**: Run custom scripts before/after install -- **Vertex AI Support**: Optionally use Google Vertex AI endpoints - ## Usage Example ```tf @@ -61,13 +53,8 @@ module "gemini" { - **Install**: The module installs Gemini CLI using npm (installs Node.js if needed) - **Configure**: Optionally writes your settings JSON to `~/.gemini/settings.json` -- **Start**: Launches Gemini CLI in the specified directory, wrapped by AgentAPI for Coder Tasks compatibility -- **Environment**: Sets `GOOGLE_API_KEY`, `GOOGLE_GENAI_USE_VERTEXAI`, `GEMINI_MODEL`, and `GEMINI_START_DIRECTORY` for the CLI - -## Customization - -- **Custom Pre/Post Install Scripts**: Use `pre_install_script` and `post_install_script` to run custom shell commands before or after install -- **Gemini Settings**: Pass a JSON string to `gemini_settings_json` to configure Gemini CLI (written to `~/.gemini/settings.json`) +- **Start**: Launches Gemini CLI in the specified directory, wrapped by AgentAPI +- **Environment**: Sets `GEMINI_API_KEY`, `GOOGLE_GENAI_USE_VERTEXAI`, `GEMINI_MODEL` for the CLI (if variables provided) ## Troubleshooting From 6d000e458ff8a9959f55ff6745d5340a07604eba Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 00:19:33 +0530 Subject: [PATCH 07/29] feat: add support for reporting tasks --- registry/anomaly/modules/gemini/main.tf | 61 +++++++++++++++- .../anomaly/modules/gemini/scripts/install.sh | 70 +++++++++++++++++++ .../anomaly/modules/gemini/scripts/start.sh | 11 ++- 3 files changed, 140 insertions(+), 2 deletions(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 370a6418..0e04eb9f 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -102,8 +102,62 @@ variable "post_install_script" { default = null } +data "coder_parameter" "ai_prompt" { + type = "string" + name = "AI Prompt" + default = "" + description = "Write a prompt for Gemini CLI" + mutable = true +} + +variable "additional_extensions" { + type = string + description = "Additional extensions configuration in json format to append to the config." + default = null +} + +variable "gemini_instruction_prompt" { + type = string + description = "Gemini instruction prompt. will be added to GEMINI.md in specified folder" + default = "" +} + +resource "coder_env" "gemini_api_key" { + agent_id = var.agent_id + name = "GEMINI_API_KEY" + value = var.gemini_api_key +} + +resource "coder_env" "gemini_use_vertex_ai" { + agent_id = var.agent_id + name = "GOOGLE_GENAI_USE_VERTEXAI" + value = var.google_genai_use_vertexai +} locals { + base_extensions = <<-EOT +{ + "coder": { + "args": [ + "exp", + "mcp", + "server" + ], + "command": "coder", + "description": "Report ALL tasks and statuses (in progress, done, failed) you are working on.", + "enabled": true, + "env": { + "CODER_MCP_APP_STATUS_SLUG": "${local.app_slug}", + "CODER_MCP_AI_AGENTAPI_URL": "http://localhost:3284" + }, + "name": "Coder", + "timeout": 3000, + "type": "stdio", + "trust": true + } +} +EOT + app_slug = "gemini" install_script = file("${path.module}/scripts/install.sh") start_script = file("${path.module}/scripts/start.sh") @@ -138,6 +192,7 @@ module "agentapi" { GOOGLE_GENAI_USE_VERTEXAI='${var.google_genai_use_vertexai}' \ GEMINI_MODEL='${var.gemini_model}' \ GEMINI_START_DIRECTORY='${var.folder}' \ + GEMINI_TASK_PROMPT='${data.coder_parameter.ai_prompt.value}' \ /tmp/start.sh EOT @@ -151,6 +206,10 @@ module "agentapi" { ARG_INSTALL='${var.install_gemini}' \ ARG_GEMINI_VERSION='${var.gemini_version}' \ ARG_GEMINI_CONFIG='${var.gemini_settings_json}' \ + BASE_EXTENSIONS='${replace(local.base_extensions, "'", "'\\''")}' \ + ADDITIONAL_EXTENSIONS='${replace(var.additional_extensions != null ? var.additional_extensions : "", "'", "'\\''")}' \ + GEMINI_START_DIRECTORY='${var.folder}' \ + GEMINI_INSTRUCTION_PROMPT='${var.gemini_instruction_prompt}' \ /tmp/install.sh EOT -} +} \ No newline at end of file diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/anomaly/modules/gemini/scripts/install.sh index 7ea97585..f073bb7e 100644 --- a/registry/anomaly/modules/gemini/scripts/install.sh +++ b/registry/anomaly/modules/gemini/scripts/install.sh @@ -66,9 +66,79 @@ function populate_settings_json() { fi } +function append_extensions_to_settings_json() { + SETTINGS_PATH="/home/coder/.gemini/settings.json" + mkdir -p "$(dirname "$SETTINGS_PATH")" + printf "[append_extensions_to_settings_json] Starting extension merge process...\n" + if [ -z "${BASE_EXTENSIONS:-}" ]; then + printf "[append_extensions_to_settings_json] BASE_EXTENSIONS is empty, skipping merge.\n" + return + fi + if [ ! -f "$SETTINGS_PATH" ]; then + printf "[append_extensions_to_settings_json] $SETTINGS_PATH does not exist. Creating with merged mcpServers structure.\n" + # If ADDITIONAL_EXTENSIONS is not set or empty, use '{}' + ADD_EXT_JSON='{}' + if [ -n "${ADDITIONAL_EXTENSIONS:-}" ]; then + ADD_EXT_JSON="$ADDITIONAL_EXTENSIONS" + fi + printf '{"mcpServers":%s}\n' "$(jq -s 'add' <(echo "$BASE_EXTENSIONS") <(echo "$ADD_EXT_JSON"))" > "$SETTINGS_PATH" + fi + + # Prepare temp files + TMP_SETTINGS=$(mktemp) + + # If ADDITIONAL_EXTENSIONS is not set or empty, use '{}' + ADD_EXT_JSON='{}' + if [ -n "${ADDITIONAL_EXTENSIONS:-}" ]; then + printf "[append_extensions_to_settings_json] ADDITIONAL_EXTENSIONS is set.\n" + ADD_EXT_JSON="$ADDITIONAL_EXTENSIONS" + else + printf "[append_extensions_to_settings_json] ADDITIONAL_EXTENSIONS is empty or not set.\n" + fi + + printf "[append_extensions_to_settings_json] Merging BASE_EXTENSIONS and ADDITIONAL_EXTENSIONS into mcpServers...\n" + jq --argjson base "$BASE_EXTENSIONS" --argjson add "$ADD_EXT_JSON" \ + '.mcpServers = (.mcpServers // {} + $base + $add)' \ + "$SETTINGS_PATH" > "$TMP_SETTINGS" && mv "$TMP_SETTINGS" "$SETTINGS_PATH" + + # Add theme and selectedAuthType fields + jq '.theme = "Default" | .selectedAuthType = "gemini-api-key"' "$SETTINGS_PATH" > "$TMP_SETTINGS" && mv "$TMP_SETTINGS" "$SETTINGS_PATH" + + printf "[append_extensions_to_settings_json] Merge complete.\n" +} + +function add_instruction_prompt_if_exists() { + if [ -n "${GEMINI_INSTRUCTION_PROMPT:-}" ]; then + if [ -d "${GEMINI_START_DIRECTORY}" ]; then + printf "Directory '%s' exists. Changing to it.\\n" "${GEMINI_START_DIRECTORY}" + cd "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not change to directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } + else + printf "Directory '%s' does not exist. Creating and changing to it.\\n" "${GEMINI_START_DIRECTORY}" + mkdir -p "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not create directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } + cd "${GEMINI_START_DIRECTORY}" || { + printf "Error: Could not change to directory '%s'.\\n" "${GEMINI_START_DIRECTORY}" + exit 1 + } + fi + touch GEMINI.md + printf "Setting GEMINI.md\n" + echo "${GEMINI_INSTRUCTION_PROMPT}" > GEMINI.md + else + printf "GEMINI.md is not set.\n" + fi +} # Install Gemini install_gemini populate_settings_json +gemini --version +append_extensions_to_settings_json +add_instruction_prompt_if_exists diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/anomaly/modules/gemini/scripts/start.sh index 7479b19c..2b688f5b 100644 --- a/registry/anomaly/modules/gemini/scripts/start.sh +++ b/registry/anomaly/modules/gemini/scripts/start.sh @@ -35,4 +35,13 @@ else } fi -agentapi server --term-width 67 --term-height 1190 -- gemini \ No newline at end of file +if [ -n "$GEMINI_TASK_PROMPT" ]; then + printf "Running the task prompt\n" + PROMPT="Review your Gemini.md. Every step of the way, report tasks to Coder with proper descriptions and statuses. Your task at hand: $GEMINI_TASK_PROMPT" + GEMINI_ARGS=(--prompt-interactive "$PROMPT") +else + printf "No task prompt given.\n" + GEMINI_ARGS=() +fi + +agentapi server --term-width 67 --term-height 1190 -- gemini "${GEMINI_ARGS[@]}" \ No newline at end of file From 2be7739a28aeafd5fdc4f5467e191b3f994d4439 Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Thu, 24 Jul 2025 00:20:23 +0530 Subject: [PATCH 08/29] Update registry/anomaly/modules/gemini/README.md Co-authored-by: Atif Ali --- registry/anomaly/modules/gemini/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index 808e2de4..45debf03 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -3,7 +3,7 @@ display_name: Gemini CLI icon: ../../../../.icons/gemini.svg description: Run Gemini CLI in your workspace with AgentAPI integration verified: false -tags: [agent, gemini, ai] +tags: [agent, gemini, ai, google] --- # Gemini CLI From 528907e1b5567bbc31e53fda549f6ed93d74fcc8 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 01:03:41 +0530 Subject: [PATCH 09/29] feat: enhance README and start script for improved task reporting --- registry/anomaly/modules/gemini/README.md | 14 +++++++++++--- registry/anomaly/modules/gemini/scripts/start.sh | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index 45debf03..1fca4897 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -30,6 +30,7 @@ module "gemini" { ## Usage Example +- Example 1: ```tf variable "gemini_api_key" { type = string @@ -46,21 +47,28 @@ module "gemini" { gemini_model = "gemini-1.5-pro-latest" install_gemini = true gemini_version = "latest" + gemini_instruction_prompt = "Start every response with `Gemini says:`" } ``` ## How it Works -- **Install**: The module installs Gemini CLI using npm (installs Node.js if needed) -- **Configure**: Optionally writes your settings JSON to `~/.gemini/settings.json` +- **Install**: The module installs Gemini CLI using npm (installs Node.js via NVM if needed) +- **Instruction Prompt**: If `GEMINI_INSTRUCTION_PROMPT` and `GEMINI_START_DIRECTORY` are set, creates the directory (if needed) and writes the prompt to `GEMINI.md` - **Start**: Launches Gemini CLI in the specified directory, wrapped by AgentAPI - **Environment**: Sets `GEMINI_API_KEY`, `GOOGLE_GENAI_USE_VERTEXAI`, `GEMINI_MODEL` for the CLI (if variables provided) ## Troubleshooting - If Gemini CLI is not found, ensure `install_gemini = true` and your API key is valid -- Node.js and npm are installed automatically if missing +- Node.js and npm are installed automatically if missing (using NVM) - Check logs in `/home/coder/.gemini-module/` for install/start output +- We highly recommend using the `gemini_api_key` variable, this also ensures smooth tasks running without needing to sign in to Google. + +> [!NOTE] +> To use tasks with Gemini CLI, ensure you have the `gemini_api_key` variable set, and **you pass the `AI Prompt` Parameter**. +> By default we inject the "theme": "Default" and "selectedAuthType": "gemini-api-key" to your ~/.gemini/settings.json along with the coder mcp server. +> In `gemini_instruction_prompt` and `AI Prompt` text we recommend using (\`\`) backticks instead of quotes to avoid escaping issues. Eg: gemini_instruction_prompt = "Start every response with \`Gemini says:\` " ## References diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/anomaly/modules/gemini/scripts/start.sh index 2b688f5b..449d68dc 100644 --- a/registry/anomaly/modules/gemini/scripts/start.sh +++ b/registry/anomaly/modules/gemini/scripts/start.sh @@ -37,7 +37,7 @@ fi if [ -n "$GEMINI_TASK_PROMPT" ]; then printf "Running the task prompt\n" - PROMPT="Review your Gemini.md. Every step of the way, report tasks to Coder with proper descriptions and statuses. Your task at hand: $GEMINI_TASK_PROMPT" + PROMPT="Every step of the way, report tasks to Coder with proper descriptions and statuses. Your task at hand: $GEMINI_TASK_PROMPT" GEMINI_ARGS=(--prompt-interactive "$PROMPT") else printf "No task prompt given.\n" From 88696adf3b9c59adb414a92df800f08218ffb093 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 01:04:42 +0530 Subject: [PATCH 10/29] fmt: bun fmt --- registry/anomaly/modules/gemini/README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index 1fca4897..aa3925f1 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -31,6 +31,7 @@ module "gemini" { ## Usage Example - Example 1: + ```tf variable "gemini_api_key" { type = string @@ -39,14 +40,14 @@ variable "gemini_api_key" { } module "gemini" { - count = data.coder_workspace.me.start_count - source = "registry.coder.com/anomaly/gemini/anomaly" - version = "1.0.0" - agent_id = coder_agent.example.id - gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) - gemini_model = "gemini-1.5-pro-latest" - install_gemini = true - gemini_version = "latest" + count = data.coder_workspace.me.start_count + source = "registry.coder.com/anomaly/gemini/anomaly" + version = "1.0.0" + agent_id = coder_agent.example.id + gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) + gemini_model = "gemini-1.5-pro-latest" + install_gemini = true + gemini_version = "latest" gemini_instruction_prompt = "Start every response with `Gemini says:`" } ``` From 164083a2f1731a42dbee4fa85b30e6d2c9464a4b Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 07:48:19 +0530 Subject: [PATCH 11/29] fea: update readme to IMPORTANT --- registry/anomaly/modules/gemini/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index aa3925f1..64bf3cbe 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -66,7 +66,7 @@ module "gemini" { - Check logs in `/home/coder/.gemini-module/` for install/start output - We highly recommend using the `gemini_api_key` variable, this also ensures smooth tasks running without needing to sign in to Google. -> [!NOTE] +> [!IMPORTANT] > To use tasks with Gemini CLI, ensure you have the `gemini_api_key` variable set, and **you pass the `AI Prompt` Parameter**. > By default we inject the "theme": "Default" and "selectedAuthType": "gemini-api-key" to your ~/.gemini/settings.json along with the coder mcp server. > In `gemini_instruction_prompt` and `AI Prompt` text we recommend using (\`\`) backticks instead of quotes to avoid escaping issues. Eg: gemini_instruction_prompt = "Start every response with \`Gemini says:\` " From 90485f86a195e8c6a95174b63956c6a9d5589493 Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Thu, 24 Jul 2025 16:09:15 +0530 Subject: [PATCH 12/29] Update registry/anomaly/modules/gemini/scripts/start.sh Co-authored-by: Hugo Dutka --- registry/anomaly/modules/gemini/scripts/start.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/anomaly/modules/gemini/scripts/start.sh index 449d68dc..9367d1fd 100644 --- a/registry/anomaly/modules/gemini/scripts/start.sh +++ b/registry/anomaly/modules/gemini/scripts/start.sh @@ -43,5 +43,6 @@ else printf "No task prompt given.\n" GEMINI_ARGS=() fi - +# use low width to fit in the tasks UI sidebar. height is adjusted so that width x height ~= 80x1000 characters +# are visible in the terminal screen by default. agentapi server --term-width 67 --term-height 1190 -- gemini "${GEMINI_ARGS[@]}" \ No newline at end of file From 4409901f709bd5af481e5f8b0a01ab76ed9ffec2 Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Thu, 24 Jul 2025 16:12:34 +0530 Subject: [PATCH 13/29] Update registry/anomaly/modules/gemini/main.tf Co-authored-by: Hugo Dutka --- registry/anomaly/modules/gemini/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 0e04eb9f..560ee0c5 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -106,7 +106,7 @@ data "coder_parameter" "ai_prompt" { type = "string" name = "AI Prompt" default = "" - description = "Write a prompt for Gemini CLI" + description = "Initial prompt for the Gemini CLI" mutable = true } From b95a68e147df9425ce09a54a4db95c6d9b482f9a Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Thu, 24 Jul 2025 16:13:00 +0530 Subject: [PATCH 14/29] Update registry/anomaly/modules/gemini/main.tf Co-authored-by: Hugo Dutka --- registry/anomaly/modules/gemini/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 560ee0c5..d717cd5b 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -81,7 +81,7 @@ variable "install_agentapi" { variable "agentapi_version" { type = string description = "The version of AgentAPI to install." - default = "v0.2.3" + default = "v0.3.0" } variable "gemini_model" { From c8d0a37db39a59de35f1e78ac3cfcd36636e01b2 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 16:15:33 +0530 Subject: [PATCH 15/29] refactor: rename variables for clarity in main.tf --- registry/anomaly/modules/gemini/main.tf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index d717cd5b..9088efc8 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -66,7 +66,7 @@ variable "gemini_api_key" { default = "" } -variable "google_genai_use_vertexai" { +variable "use_vertexai" { type = bool description = "Whether to use vertex ai" default = false @@ -86,7 +86,7 @@ variable "agentapi_version" { variable "gemini_model" { type = string - description = "The model to use for Gemini (e.g., claude-3-5-sonnet-latest)." + description = "The model to use for Gemini (e.g., gemini-2.5-pro)." default = "" } @@ -116,9 +116,9 @@ variable "additional_extensions" { default = null } -variable "gemini_instruction_prompt" { +variable "gemini_system_prompt" { type = string - description = "Gemini instruction prompt. will be added to GEMINI.md in specified folder" + description = "System prompt for Gemini. It will be added to GEMINI.md in the specified folder." default = "" } @@ -131,7 +131,7 @@ resource "coder_env" "gemini_api_key" { resource "coder_env" "gemini_use_vertex_ai" { agent_id = var.agent_id name = "GOOGLE_GENAI_USE_VERTEXAI" - value = var.google_genai_use_vertexai + value = var.use_vertexai } locals { @@ -189,7 +189,7 @@ module "agentapi" { echo -n '${base64encode(local.start_script)}' | base64 -d > /tmp/start.sh chmod +x /tmp/start.sh GEMINI_API_KEY='${var.gemini_api_key}' \ - GOOGLE_GENAI_USE_VERTEXAI='${var.google_genai_use_vertexai}' \ + GOOGLE_GENAI_USE_VERTEXAI='${var.use_vertexai}' \ GEMINI_MODEL='${var.gemini_model}' \ GEMINI_START_DIRECTORY='${var.folder}' \ GEMINI_TASK_PROMPT='${data.coder_parameter.ai_prompt.value}' \ @@ -209,7 +209,7 @@ module "agentapi" { BASE_EXTENSIONS='${replace(local.base_extensions, "'", "'\\''")}' \ ADDITIONAL_EXTENSIONS='${replace(var.additional_extensions != null ? var.additional_extensions : "", "'", "'\\''")}' \ GEMINI_START_DIRECTORY='${var.folder}' \ - GEMINI_INSTRUCTION_PROMPT='${var.gemini_instruction_prompt}' \ + GEMINI_INSTRUCTION_PROMPT='${var.gemini_system_prompt}' \ /tmp/install.sh EOT } \ No newline at end of file From 9f06c1c3013c4770d7c0b5cdbc276511fe746114 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 18:59:58 +0530 Subject: [PATCH 16/29] fix: update default folder path for Gemini configuration --- registry/anomaly/modules/gemini/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/anomaly/modules/gemini/main.tf index 9088efc8..ba32381f 100644 --- a/registry/anomaly/modules/gemini/main.tf +++ b/registry/anomaly/modules/gemini/main.tf @@ -39,7 +39,7 @@ variable "icon" { variable "folder" { type = string description = "The folder to run Gemini in." - default = "/home/coder/gemini" + default = "/home/coder" } variable "install_gemini" { From c9fbada3c18887cab21db2fcd085a91e5833b5d9 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 19:14:33 +0530 Subject: [PATCH 17/29] fix: use HOME variable for user-specific settings path in install.sh --- registry/anomaly/modules/gemini/scripts/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/anomaly/modules/gemini/scripts/install.sh index f073bb7e..f32cf1a9 100644 --- a/registry/anomaly/modules/gemini/scripts/install.sh +++ b/registry/anomaly/modules/gemini/scripts/install.sh @@ -62,12 +62,12 @@ function install_gemini() { function populate_settings_json() { if [ "${ARG_GEMINI_CONFIG}" != "" ]; then - echo "${ARG_GEMINI_CONFIG}" > "/home/coder/.gemini/settings.json" + echo "${ARG_GEMINI_CONFIG}" > "$HOME/.gemini/settings.json" fi } function append_extensions_to_settings_json() { - SETTINGS_PATH="/home/coder/.gemini/settings.json" + SETTINGS_PATH="$HOME/.gemini/settings.json" mkdir -p "$(dirname "$SETTINGS_PATH")" printf "[append_extensions_to_settings_json] Starting extension merge process...\n" if [ -z "${BASE_EXTENSIONS:-}" ]; then From 6e64e432dc82fc1a38dd41090c109fa95ceeade6 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Thu, 24 Jul 2025 21:59:36 +0530 Subject: [PATCH 18/29] fix: fix README.md --- registry/anomaly/modules/gemini/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index 64bf3cbe..fa9f92e7 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -12,7 +12,7 @@ Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to ```tf module "gemini" { - source = "registry.coder.com/anomaly/gemini/anomaly" + source = "registry.coder.com/anomaly/gemini/coder" version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key @@ -41,7 +41,7 @@ variable "gemini_api_key" { module "gemini" { count = data.coder_workspace.me.start_count - source = "registry.coder.com/anomaly/gemini/anomaly" + source = "registry.coder.com/anomaly/gemini/coder" version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) From b444aaf518367cd36061da7513fe15fa3668d29f Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Fri, 25 Jul 2025 00:47:36 +0530 Subject: [PATCH 19/29] feat: update tests --- registry/anomaly/modules/gemini/README.md | 4 +- registry/anomaly/modules/gemini/main.test.ts | 230 ++++++++++++++++-- .../anomaly/modules/gemini/scripts/install.sh | 46 +++- .../anomaly/modules/gemini/scripts/start.sh | 16 +- .../modules/gemini/testdata/gemini-mock.sh | 14 ++ 5 files changed, 270 insertions(+), 40 deletions(-) create mode 100644 registry/anomaly/modules/gemini/testdata/gemini-mock.sh diff --git a/registry/anomaly/modules/gemini/README.md b/registry/anomaly/modules/gemini/README.md index fa9f92e7..9a24f870 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/anomaly/modules/gemini/README.md @@ -16,7 +16,7 @@ module "gemini" { version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key - gemini_model = "gemini-1.5-pro-latest" + gemini_model = "gemini-2.5-pro" install_gemini = true gemini_version = "latest" agentapi_version = "latest" @@ -45,7 +45,7 @@ module "gemini" { version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) - gemini_model = "gemini-1.5-pro-latest" + gemini_model = "gemini-2.5-flash" install_gemini = true gemini_version = "latest" gemini_instruction_prompt = "Start every response with `Gemini says:`" diff --git a/registry/anomaly/modules/gemini/main.test.ts b/registry/anomaly/modules/gemini/main.test.ts index 341aca39..6f3b2a7f 100644 --- a/registry/anomaly/modules/gemini/main.test.ts +++ b/registry/anomaly/modules/gemini/main.test.ts @@ -1,35 +1,213 @@ -import { describe, it, expect } from "bun:test"; import { - runTerraformApply, - runTerraformInit, - testRequiredVariables, - findResourceInstance, -} from "~test"; -import path from "path"; + test, + afterEach, + describe, + setDefaultTimeout, + beforeAll, + expect, +} from "bun:test"; +import { execContainer, findResourceInstance, readFileContainer, runTerraformInit } from "~test"; +import { + loadTestFile, + writeExecutable, + setup as setupUtil, + execModuleScript, + expectAgentAPIStarted, +} from "../../../coder/modules/agentapi/test-util"; +import dedent from "dedent"; + +let cleanupFunctions: (() => Promise)[] = []; +const registerCleanup = (cleanup: () => Promise) => { + cleanupFunctions.push(cleanup); +}; +afterEach(async () => { + const cleanupFnsCopy = cleanupFunctions.slice().reverse(); + cleanupFunctions = []; + for (const cleanup of cleanupFnsCopy) { + try { + await cleanup(); + } catch (error) { + console.error("Error during cleanup:", error); + } + } +}); -const moduleDir = path.resolve(__dirname); +interface SetupProps { + skipAgentAPIMock?: boolean; + skipGeminiMock?: boolean; + moduleVariables?: Record; + agentapiMockScript?: string; +} -const requiredVars = { - agent_id: "dummy-agent-id", +const setup = async (props?: SetupProps): Promise<{ id: string }> => { + const projectDir = "/home/coder/project"; + const { id } = await setupUtil({ + moduleDir: import.meta.dir, + moduleVariables: { + install_gemini: props?.skipGeminiMock ? "true" : "false", + install_agentapi: props?.skipAgentAPIMock ? "true" : "false", + gemini_model: "test-model", + ...props?.moduleVariables, + }, + registerCleanup, + projectDir, + skipAgentAPIMock: props?.skipAgentAPIMock, + agentapiMockScript: props?.agentapiMockScript, + }); + if (!props?.skipGeminiMock) { + await writeExecutable({ + containerId: id, + filePath: "/usr/bin/gemini", + content: await loadTestFile(import.meta.dir, "gemini-mock.sh"), + }); + } + return { id }; }; -describe("gemini module", async () => { - await runTerraformInit(moduleDir); +setDefaultTimeout(60 * 1000); + +describe("gemini", async () => { + beforeAll(async () => { + await runTerraformInit(import.meta.dir); + }); + + test("happy-path", async () => { + const { id } = await setup(); + await execModuleScript(id); + await expectAgentAPIStarted(id); + // const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); + // console.error("\n\n\nINSTALL_LOG => ", resp, "\n\n\n") + // + // const resp2 = await readFileContainer(id, "/home/coder/.gemini-module/agentapi-start.log"); + // console.error("\n\n\nSTART_LOG => ", resp2, "\n\n\n") + }); + + test("install-gemini-version", async () => { + const { id } = await setup({ + moduleVariables: { + install_gemini: "true", + gemini_version: "v2.5.0", + }, + }); + await execModuleScript(id); + // Check for version in install log or binary (customize as needed) + const resp = await execContainer(id, [ + "bash", + "-c", + `cat /home/coder/.gemini-module/install.log || true`, + ]); + expect(resp.stdout).toContain("v2.5.0"); + }); + // + test("gemini-settings-json", async () => { + const settings = '{"foo": "bar"}'; + const { id } = await setup({ + moduleVariables: { + gemini_settings_json: settings, + }, + }); + await execModuleScript(id); + const resp = await readFileContainer(id, "/home/coder/.gemini/settings.json"); + expect(resp).toContain("foo"); + expect(resp).toContain("bar"); + }); + + test("gemini-api-key", async () => { + const apiKey = "test-api-key-123"; + const { id } = await setup({ + moduleVariables: { + gemini_api_key: apiKey, + }, + }); + await execModuleScript(id); - // 1. Required variables - testRequiredVariables(moduleDir, requiredVars); + const resp = await readFileContainer(id, "/home/coder/.gemini-module/agentapi-start.log"); + expect(resp).toContain("gemini_api_key provided !"); + }); + + test("use-vertexai", async () => { + const { id } = await setup({ + skipGeminiMock: false, + moduleVariables: { + use_vertexai: "true", + }, + }); + await execModuleScript(id); + const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); + expect(resp).toContain('GOOGLE_GENAI_USE_VERTEXAI=\'true\''); + }); + + test("gemini-model", async () => { + const model = "gemini-2.5-pro"; + const { id } = await setup({ + skipGeminiMock: false, + moduleVariables: { + gemini_model: model, + }, + }); + await execModuleScript(id); + const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); + expect(resp).toContain(model); + }); + + test("pre-post-install-scripts", async () => { + const { id } = await setup({ + moduleVariables: { + pre_install_script: "#!/bin/bash\necho 'pre-install-script'", + post_install_script: "#!/bin/bash\necho 'post-install-script'", + }, + }); + await execModuleScript(id); + const preInstallLog = await readFileContainer(id, "/home/coder/.gemini-module/pre_install.log"); + expect(preInstallLog).toContain("pre-install-script"); + const postInstallLog = await readFileContainer(id, "/home/coder/.gemini-module/post_install.log"); + expect(postInstallLog).toContain("post-install-script"); + }); + + test("folder-variable", async () => { + const folder = "/tmp/gemini-test-folder"; + const { id } = await setup({ + skipGeminiMock: false, + moduleVariables: { + folder, + }, + }); + await execModuleScript(id); + // Check that the folder is used (e.g., by checking a file or env) + const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); + expect(resp).toContain(folder); + }); - // 2. coder_script resource is created - it("creates coder_script resource", async () => { - const state = await runTerraformApply(moduleDir, requiredVars); - const scriptResource = findResourceInstance(state, "coder_script"); - expect(scriptResource).toBeDefined(); - expect(scriptResource.agent_id).toBe(requiredVars.agent_id); + test("additional-extensions", async () => { + const additional = '{"custom": {"enabled": true}}'; + const { id } = await setup({ + moduleVariables: { + additional_extensions: additional, + }, + }); + await execModuleScript(id); + const resp = await readFileContainer(id, "/home/coder/.gemini/settings.json"); + expect(resp).toContain("custom"); + expect(resp).toContain("enabled"); + }); + + test("gemini-system-prompt", async () => { + const prompt = "This is a system prompt for Gemini."; + const { id } = await setup({ + moduleVariables: { + gemini_system_prompt: prompt, + }, + }); + await execModuleScript(id); + const resp = await readFileContainer(id, "/home/coder/GEMINI.md"); + expect(resp).toContain(prompt); + }); - // check that the script contains expected components based on actual content - expect(scriptResource.script).toContain("ARG_MODULE_DIR_NAME='.gemini-module'"); - expect(scriptResource.script).toContain("ARG_INSTALL_AGENTAPI='true'"); - expect(scriptResource.script).toContain("ARG_AGENTAPI_VERSION='v0.2.3'"); - expect(scriptResource.script).toContain("/tmp/main.sh"); + test("start-without-prompt", async () => { + const { id } = await setup(); + await execModuleScript(id); + const prompt = await execContainer(id, ["ls", "-l", "/home/coder/GEMINI.md"]); + expect(prompt.exitCode).not.toBe(0); + expect(prompt.stderr).toContain("No such file or directory"); }); -}); \ No newline at end of file +}); diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/anomaly/modules/gemini/scripts/install.sh index f32cf1a9..91d9b62f 100644 --- a/registry/anomaly/modules/gemini/scripts/install.sh +++ b/registry/anomaly/modules/gemini/scripts/install.sh @@ -10,9 +10,9 @@ command_exists() { set -o nounset echo "--------------------------------" -printf "gemini_config: %s\n" "$ARG_GEMINI_CONFIG\n" -printf "install: %s\n" "$ARG_INSTALL\n" -printf "gemini_version: %s\n" "$ARG_GEMINI_VERSION\n" +printf "gemini_config: %s\n" "$ARG_GEMINI_CONFIG" +printf "install: %s\n" "$ARG_INSTALL" +printf "gemini_version: %s\n" "$ARG_GEMINI_VERSION" echo "--------------------------------" set +o nounset @@ -36,8 +36,8 @@ function install_node() { nvm use --lts nvm alias default node - printf "Node.js installed: %s\n" "$(node --version)\n" - printf "npm installed: %s\n" "$(npm --version)\n" + printf "Node.js installed: %s\n" "$(node --version)" + printf "npm installed: %s\n" "$(npm --version)" else printf "Node.js is installed but npm is not available. Please install npm manually.\n" exit 1 @@ -50,19 +50,46 @@ function install_gemini() { # we need node to install and run gemini-cli install_node - printf "%s Installing Gemini CLI\n" "$${BOLD}" + # If nvm does not exist, we will create a global npm directory (this os to prevent the possibility of EACCESS issues on npm -g) + if ! command_exists nvm; then + printf "which node: %s\n" "$(which node)" + printf "which npm: %s\n" "$(which npm)" + + # Create a directory for global packages + mkdir -p "$HOME"/.npm-global + + # Configure npm to use it + npm config set prefix "$HOME/.npm-global" + + # Add to PATH for current session + export PATH="$HOME/.npm-global/bin:$PATH" + + # Add to shell profile for future sessions + if ! grep -q "export PATH=$HOME/.npm-global/bin:\$PATH" ~/.bashrc; then + echo "export PATH=$HOME/.npm-global/bin:\$PATH" >> ~/.bashrc + fi + fi + + printf "%s Installing Gemini CLI\n" "${BOLD}" + if [ -n "$ARG_GEMINI_VERSION" ]; then npm install -g "@google/gemini-cli@$ARG_GEMINI_VERSION" else npm install -g "@google/gemini-cli" fi - printf "%s Successfully installed Gemini CLI. Version: %s" "$${BOLD}" "$(gemini --version)\n" + printf "%s Successfully installed Gemini CLI. Version: %s\n" "${BOLD}" "$(gemini --version)" fi } function populate_settings_json() { if [ "${ARG_GEMINI_CONFIG}" != "" ]; then + SETTINGS_PATH="$HOME/.gemini/settings.json" + mkdir -p "$(dirname "$SETTINGS_PATH")" + printf "Custom gemini_config is provided !\n" echo "${ARG_GEMINI_CONFIG}" > "$HOME/.gemini/settings.json" + else + printf "No custom gemini_config provided, using default settings.json.\n" + append_extensions_to_settings_json fi } @@ -75,7 +102,7 @@ function append_extensions_to_settings_json() { return fi if [ ! -f "$SETTINGS_PATH" ]; then - printf "[append_extensions_to_settings_json] $SETTINGS_PATH does not exist. Creating with merged mcpServers structure.\n" + printf "%s does not exist. Creating with merged mcpServers structure.\n" "$SETTINGS_PATH" # If ADDITIONAL_EXTENSIONS is not set or empty, use '{}' ADD_EXT_JSON='{}' if [ -n "${ADDITIONAL_EXTENSIONS:-}" ]; then @@ -137,8 +164,7 @@ function add_instruction_prompt_if_exists() { # Install Gemini install_gemini -populate_settings_json gemini --version -append_extensions_to_settings_json +populate_settings_json add_instruction_prompt_if_exists diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/anomaly/modules/gemini/scripts/start.sh index 9367d1fd..ef0a5cf1 100644 --- a/registry/anomaly/modules/gemini/scripts/start.sh +++ b/registry/anomaly/modules/gemini/scripts/start.sh @@ -1,13 +1,18 @@ #!/bin/bash # Load shell environment -source ~/.bashrc -source ~/.nvm/nvm.sh +source "$HOME"/.bashrc command_exists() { command -v "$1" >/dev/null 2>&1 } +if [ -f "$HOME/.nvm/nvm.sh" ]; then + source "$HOME"/.nvm/nvm.sh +else + export PATH="$HOME/.npm-global/bin:$PATH" +fi + printf "Version: %s\n" "$(gemini --version)\n" if command_exists gemini; then @@ -43,6 +48,13 @@ else printf "No task prompt given.\n" GEMINI_ARGS=() fi + +if [ -n "$GEMINI_API_KEY" ]; then + printf "gemini_api_key provided !\n" +else + printf "gemini_api_key not provided\n" +fi + # use low width to fit in the tasks UI sidebar. height is adjusted so that width x height ~= 80x1000 characters # are visible in the terminal screen by default. agentapi server --term-width 67 --term-height 1190 -- gemini "${GEMINI_ARGS[@]}" \ No newline at end of file diff --git a/registry/anomaly/modules/gemini/testdata/gemini-mock.sh b/registry/anomaly/modules/gemini/testdata/gemini-mock.sh new file mode 100644 index 00000000..53c9c41d --- /dev/null +++ b/registry/anomaly/modules/gemini/testdata/gemini-mock.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +if [[ "$1" == "--version" ]]; then + echo "HELLO: $(bash -c env)" + echo "gemini version v2.5.0" + exit 0 +fi + +set -e + +while true; do + echo "$(date) - gemini-mock" + sleep 15 +done \ No newline at end of file From 02504eff34be13cec79c5faec5692a86e1949eef Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Fri, 25 Jul 2025 22:23:20 +0530 Subject: [PATCH 20/29] feat: fix image format --- registry/anomaly/.images/avatar.jpeg | Bin 9064 -> 0 bytes registry/anomaly/README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 registry/anomaly/.images/avatar.jpeg diff --git a/registry/anomaly/.images/avatar.jpeg b/registry/anomaly/.images/avatar.jpeg deleted file mode 100644 index ca1072d8dce0807e1688f16be0e3bddfa5d29ef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9064 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 Date: Fri, 25 Jul 2025 22:23:35 +0530 Subject: [PATCH 21/29] feat: fix image format --- registry/anomaly/.images/avatar.png | Bin 0 -> 86136 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 registry/anomaly/.images/avatar.png diff --git a/registry/anomaly/.images/avatar.png b/registry/anomaly/.images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..956fea7b91bcb43180cf017acdb4d90b56acfc0d GIT binary patch literal 86136 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%0A^5PN!AwCje@S*$m=U&F2qG@YwyXKeREE_W#< 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 literal 0 HcmV?d00001 From 880137c9380d331e98cb2184ad4a11d04188f447 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Fri, 25 Jul 2025 22:38:31 +0530 Subject: [PATCH 22/29] fix: correct formatting in tmux README.md --- registry/anomaly/modules/tmux/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/registry/anomaly/modules/tmux/README.md b/registry/anomaly/modules/tmux/README.md index e0bdd5f2..ed145ad6 100644 --- a/registry/anomaly/modules/tmux/README.md +++ b/registry/anomaly/modules/tmux/README.md @@ -92,8 +92,7 @@ module "tmux" { > [!IMPORTANT] > -> - If you provide a custom `tmux_config`, it will completely replace the default configuration. Ensure you include plugin -> and TPM initialization lines if you want plugin support and session persistence. +> - If you provide a custom `tmux_config`, it will completely replace the default configuration. Ensure you include plugin and TPM initialization lines if you want plugin support and session persistence. > - The script will attempt to install dependencies using `sudo` where required. > - If `git` is not installed, TPM installation will fail. > - If you are using custom config, you'll be responsible for setting up persistence and plugins. From db20aa5353ffea57d02fa4a5641ff8223e3f68b3 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Sat, 26 Jul 2025 00:14:24 +0530 Subject: [PATCH 23/29] feat: move gemini module to coder-labs --- registry/{anomaly => coder-labs}/modules/gemini/README.md | 6 +++--- .../{anomaly => coder-labs}/modules/gemini/main.test.ts | 1 - registry/{anomaly => coder-labs}/modules/gemini/main.tf | 0 .../modules/gemini/scripts/install.sh | 0 .../{anomaly => coder-labs}/modules/gemini/scripts/start.sh | 0 .../modules/gemini/testdata/gemini-mock.sh | 0 6 files changed, 3 insertions(+), 4 deletions(-) rename registry/{anomaly => coder-labs}/modules/gemini/README.md (95%) rename registry/{anomaly => coder-labs}/modules/gemini/main.test.ts (99%) rename registry/{anomaly => coder-labs}/modules/gemini/main.tf (100%) rename registry/{anomaly => coder-labs}/modules/gemini/scripts/install.sh (100%) rename registry/{anomaly => coder-labs}/modules/gemini/scripts/start.sh (100%) rename registry/{anomaly => coder-labs}/modules/gemini/testdata/gemini-mock.sh (100%) diff --git a/registry/anomaly/modules/gemini/README.md b/registry/coder-labs/modules/gemini/README.md similarity index 95% rename from registry/anomaly/modules/gemini/README.md rename to registry/coder-labs/modules/gemini/README.md index 9a24f870..630b2eef 100644 --- a/registry/anomaly/modules/gemini/README.md +++ b/registry/coder-labs/modules/gemini/README.md @@ -2,7 +2,7 @@ display_name: Gemini CLI icon: ../../../../.icons/gemini.svg description: Run Gemini CLI in your workspace with AgentAPI integration -verified: false +verified: true tags: [agent, gemini, ai, google] --- @@ -12,7 +12,7 @@ Run [Gemini CLI](https://ai.google.dev/gemini-api/docs/cli) in your workspace to ```tf module "gemini" { - source = "registry.coder.com/anomaly/gemini/coder" + source = "registry.coder.com/coder-labs/gemini/coder" version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key @@ -41,7 +41,7 @@ variable "gemini_api_key" { module "gemini" { count = data.coder_workspace.me.start_count - source = "registry.coder.com/anomaly/gemini/coder" + source = "registry.coder.com/coder-labs/gemini/coder" version = "1.0.0" agent_id = coder_agent.example.id gemini_api_key = var.gemini_api_key # we recommend providing this parameter inorder to have a smoother experience (i.e. no google sign-in) diff --git a/registry/anomaly/modules/gemini/main.test.ts b/registry/coder-labs/modules/gemini/main.test.ts similarity index 99% rename from registry/anomaly/modules/gemini/main.test.ts rename to registry/coder-labs/modules/gemini/main.test.ts index 6f3b2a7f..86150f01 100644 --- a/registry/anomaly/modules/gemini/main.test.ts +++ b/registry/coder-labs/modules/gemini/main.test.ts @@ -14,7 +14,6 @@ import { execModuleScript, expectAgentAPIStarted, } from "../../../coder/modules/agentapi/test-util"; -import dedent from "dedent"; let cleanupFunctions: (() => Promise)[] = []; const registerCleanup = (cleanup: () => Promise) => { diff --git a/registry/anomaly/modules/gemini/main.tf b/registry/coder-labs/modules/gemini/main.tf similarity index 100% rename from registry/anomaly/modules/gemini/main.tf rename to registry/coder-labs/modules/gemini/main.tf diff --git a/registry/anomaly/modules/gemini/scripts/install.sh b/registry/coder-labs/modules/gemini/scripts/install.sh similarity index 100% rename from registry/anomaly/modules/gemini/scripts/install.sh rename to registry/coder-labs/modules/gemini/scripts/install.sh diff --git a/registry/anomaly/modules/gemini/scripts/start.sh b/registry/coder-labs/modules/gemini/scripts/start.sh similarity index 100% rename from registry/anomaly/modules/gemini/scripts/start.sh rename to registry/coder-labs/modules/gemini/scripts/start.sh diff --git a/registry/anomaly/modules/gemini/testdata/gemini-mock.sh b/registry/coder-labs/modules/gemini/testdata/gemini-mock.sh similarity index 100% rename from registry/anomaly/modules/gemini/testdata/gemini-mock.sh rename to registry/coder-labs/modules/gemini/testdata/gemini-mock.sh From 0ac54404757f0ad0e48a00ea03f4fe04e8677856 Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:03:09 +0530 Subject: [PATCH 24/29] Update README.md --- registry/coder-labs/modules/gemini/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/registry/coder-labs/modules/gemini/README.md b/registry/coder-labs/modules/gemini/README.md index 630b2eef..65b9d9bc 100644 --- a/registry/coder-labs/modules/gemini/README.md +++ b/registry/coder-labs/modules/gemini/README.md @@ -3,7 +3,7 @@ display_name: Gemini CLI icon: ../../../../.icons/gemini.svg description: Run Gemini CLI in your workspace with AgentAPI integration verified: true -tags: [agent, gemini, ai, google] +tags: [agent, gemini, ai, google, tasks] --- # Gemini CLI From 289b84e222975a112518e169c6be36f15a5fd1cc Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 28 Jul 2025 17:45:33 +0530 Subject: [PATCH 25/29] Revert "fix: correct formatting in tmux README.md" This reverts commit 880137c9380d331e98cb2184ad4a11d04188f447. --- registry/anomaly/modules/tmux/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/registry/anomaly/modules/tmux/README.md b/registry/anomaly/modules/tmux/README.md index ed145ad6..e0bdd5f2 100644 --- a/registry/anomaly/modules/tmux/README.md +++ b/registry/anomaly/modules/tmux/README.md @@ -92,7 +92,8 @@ module "tmux" { > [!IMPORTANT] > -> - If you provide a custom `tmux_config`, it will completely replace the default configuration. Ensure you include plugin and TPM initialization lines if you want plugin support and session persistence. +> - If you provide a custom `tmux_config`, it will completely replace the default configuration. Ensure you include plugin +> and TPM initialization lines if you want plugin support and session persistence. > - The script will attempt to install dependencies using `sudo` where required. > - If `git` is not installed, TPM installation will fail. > - If you are using custom config, you'll be responsible for setting up persistence and plugins. From 9e14d55647722f743c34305a275998eb9e381ec6 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 28 Jul 2025 18:11:05 +0530 Subject: [PATCH 26/29] Revert "feat: fix image format" This reverts commit 353c4b96bc6f3882fd981efc2646e6fde0dbad4f. --- registry/anomaly/.images/avatar.png | Bin 86136 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 registry/anomaly/.images/avatar.png diff --git a/registry/anomaly/.images/avatar.png b/registry/anomaly/.images/avatar.png deleted file mode 100644 index 956fea7b91bcb43180cf017acdb4d90b56acfc0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86136 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%0A^5PN!AwCje@S*$m=U&F2qG@YwyXKeREE_W#< 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 From f4fe7c44262c696e2d73aa7b02fdc0c3744d784e Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Mon, 28 Jul 2025 18:11:27 +0530 Subject: [PATCH 27/29] Revert "feat: fix image format" This reverts commit 02504eff34be13cec79c5faec5692a86e1949eef. --- registry/anomaly/.images/avatar.jpeg | Bin 0 -> 9064 bytes registry/anomaly/README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 registry/anomaly/.images/avatar.jpeg diff --git a/registry/anomaly/.images/avatar.jpeg b/registry/anomaly/.images/avatar.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ca1072d8dce0807e1688f16be0e3bddfa5d29ef7 GIT binary patch literal 9064 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 Date: Tue, 29 Jul 2025 00:34:10 +0530 Subject: [PATCH 28/29] feat: b64encode inputs to script --- registry/coder-labs/modules/gemini/main.test.ts | 14 +++++--------- registry/coder-labs/modules/gemini/main.tf | 10 +++++----- .../coder-labs/modules/gemini/scripts/install.sh | 5 +++++ .../coder-labs/modules/gemini/scripts/start.sh | 6 ++++-- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/registry/coder-labs/modules/gemini/main.test.ts b/registry/coder-labs/modules/gemini/main.test.ts index 86150f01..2caa3599 100644 --- a/registry/coder-labs/modules/gemini/main.test.ts +++ b/registry/coder-labs/modules/gemini/main.test.ts @@ -74,30 +74,26 @@ describe("gemini", async () => { const { id } = await setup(); await execModuleScript(id); await expectAgentAPIStarted(id); - // const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); - // console.error("\n\n\nINSTALL_LOG => ", resp, "\n\n\n") - // - // const resp2 = await readFileContainer(id, "/home/coder/.gemini-module/agentapi-start.log"); - // console.error("\n\n\nSTART_LOG => ", resp2, "\n\n\n") }); test("install-gemini-version", async () => { + const version_to_install = "0.1.13"; const { id } = await setup({ + skipGeminiMock: true, moduleVariables: { install_gemini: "true", - gemini_version: "v2.5.0", + gemini_version: version_to_install, }, }); await execModuleScript(id); - // Check for version in install log or binary (customize as needed) const resp = await execContainer(id, [ "bash", "-c", `cat /home/coder/.gemini-module/install.log || true`, ]); - expect(resp.stdout).toContain("v2.5.0"); + expect(resp.stdout).toContain(version_to_install); }); - // + test("gemini-settings-json", async () => { const settings = '{"foo": "bar"}'; const { id } = await setup({ diff --git a/registry/coder-labs/modules/gemini/main.tf b/registry/coder-labs/modules/gemini/main.tf index ba32381f..ab4fa945 100644 --- a/registry/coder-labs/modules/gemini/main.tf +++ b/registry/coder-labs/modules/gemini/main.tf @@ -192,7 +192,7 @@ module "agentapi" { GOOGLE_GENAI_USE_VERTEXAI='${var.use_vertexai}' \ GEMINI_MODEL='${var.gemini_model}' \ GEMINI_START_DIRECTORY='${var.folder}' \ - GEMINI_TASK_PROMPT='${data.coder_parameter.ai_prompt.value}' \ + GEMINI_TASK_PROMPT='${base64encode(data.coder_parameter.ai_prompt.value)}' \ /tmp/start.sh EOT @@ -205,11 +205,11 @@ module "agentapi" { chmod +x /tmp/install.sh ARG_INSTALL='${var.install_gemini}' \ ARG_GEMINI_VERSION='${var.gemini_version}' \ - ARG_GEMINI_CONFIG='${var.gemini_settings_json}' \ - BASE_EXTENSIONS='${replace(local.base_extensions, "'", "'\\''")}' \ - ADDITIONAL_EXTENSIONS='${replace(var.additional_extensions != null ? var.additional_extensions : "", "'", "'\\''")}' \ + ARG_GEMINI_CONFIG='${base64encode(var.gemini_settings_json)}' \ + BASE_EXTENSIONS='${base64encode(replace(local.base_extensions, "'", "'\\''"))}' \ + ADDITIONAL_EXTENSIONS='${base64encode(replace(var.additional_extensions != null ? var.additional_extensions : "", "'", "'\\''"))}' \ GEMINI_START_DIRECTORY='${var.folder}' \ - GEMINI_INSTRUCTION_PROMPT='${var.gemini_system_prompt}' \ + GEMINI_INSTRUCTION_PROMPT='${base64encode(var.gemini_system_prompt)}' \ /tmp/install.sh EOT } \ No newline at end of file diff --git a/registry/coder-labs/modules/gemini/scripts/install.sh b/registry/coder-labs/modules/gemini/scripts/install.sh index 91d9b62f..a800dbd2 100644 --- a/registry/coder-labs/modules/gemini/scripts/install.sh +++ b/registry/coder-labs/modules/gemini/scripts/install.sh @@ -9,6 +9,11 @@ command_exists() { set -o nounset +ARG_GEMINI_CONFIG=$(echo -n "$ARG_GEMINI_CONFIG" | base64 -d) +BASE_EXTENSIONS=$(echo -n "$BASE_EXTENSIONS" | base64 -d) +ADDITIONAL_EXTENSIONS=$(echo -n "$ADDITIONAL_EXTENSIONS" | base64 -d) +GEMINI_INSTRUCTION_PROMPT=$(echo -n "$GEMINI_INSTRUCTION_PROMPT" | base64 -d) + echo "--------------------------------" printf "gemini_config: %s\n" "$ARG_GEMINI_CONFIG" printf "install: %s\n" "$ARG_INSTALL" diff --git a/registry/coder-labs/modules/gemini/scripts/start.sh b/registry/coder-labs/modules/gemini/scripts/start.sh index ef0a5cf1..00e0b5ed 100644 --- a/registry/coder-labs/modules/gemini/scripts/start.sh +++ b/registry/coder-labs/modules/gemini/scripts/start.sh @@ -13,7 +13,9 @@ else export PATH="$HOME/.npm-global/bin:$PATH" fi -printf "Version: %s\n" "$(gemini --version)\n" +printf "Version: %s\n" "$(gemini --version)" + +GEMINI_TASK_PROMPT=$(echo -n "$GEMINI_TASK_PROMPT" | base64 -d) if command_exists gemini; then printf "Gemini is installed\n" @@ -41,7 +43,7 @@ else fi if [ -n "$GEMINI_TASK_PROMPT" ]; then - printf "Running the task prompt\n" + printf "Running the task prompt %s\n" "$GEMINI_TASK_PROMPT" PROMPT="Every step of the way, report tasks to Coder with proper descriptions and statuses. Your task at hand: $GEMINI_TASK_PROMPT" GEMINI_ARGS=(--prompt-interactive "$PROMPT") else From 919eb38120e90509b6e45c2c10246bbc638734a6 Mon Sep 17 00:00:00 2001 From: 35C4n0r Date: Tue, 29 Jul 2025 01:00:25 +0530 Subject: [PATCH 29/29] feat: remove comment --- registry/coder-labs/modules/gemini/main.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/registry/coder-labs/modules/gemini/main.test.ts b/registry/coder-labs/modules/gemini/main.test.ts index 2caa3599..181b6114 100644 --- a/registry/coder-labs/modules/gemini/main.test.ts +++ b/registry/coder-labs/modules/gemini/main.test.ts @@ -6,7 +6,7 @@ import { beforeAll, expect, } from "bun:test"; -import { execContainer, findResourceInstance, readFileContainer, runTerraformInit } from "~test"; +import { execContainer, readFileContainer, runTerraformInit } from "~test"; import { loadTestFile, writeExecutable, @@ -168,7 +168,6 @@ describe("gemini", async () => { }, }); await execModuleScript(id); - // Check that the folder is used (e.g., by checking a file or env) const resp = await readFileContainer(id, "/home/coder/.gemini-module/install.log"); expect(resp).toContain(folder); });