Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
import { ToolListUnion, FunctionDeclaration } from '@google/genai';
|
2025-04-17 17:25:01 -04:00
|
|
|
import { Tool } from './tools.js';
|
Initial commit of Gemini Code CLI
This commit introduces the initial codebase for the Gemini Code CLI, a command-line interface designed to facilitate interaction with the Gemini API for software engineering tasks.
The code was migrated from a previous git repository as a single squashed commit.
Core Features & Components:
* **Gemini Integration:** Leverages the `@google/genai` SDK to interact with the Gemini models, supporting chat history, streaming responses, and function calling (tools).
* **Terminal UI:** Built with Ink (React for CLIs) providing an interactive chat interface within the terminal, including input prompts, message display, loading indicators, and tool interaction elements.
* **Tooling Framework:** Implements a robust tool system allowing Gemini to interact with the local environment. Includes tools for:
* File system listing (`ls`)
* File reading (`read-file`)
* Content searching (`grep`)
* File globbing (`glob`)
* File editing (`edit`)
* File writing (`write-file`)
* Executing bash commands (`terminal`)
* **State Management:** Handles the streaming state of Gemini responses and manages the conversation history.
* **Configuration:** Parses command-line arguments (`yargs`) and loads environment variables (`dotenv`) for setup.
* **Project Structure:** Organized into `core`, `ui`, `tools`, `config`, and `utils` directories using TypeScript. Includes basic build (`tsc`) and start scripts.
This initial version establishes the foundation for a powerful CLI tool enabling developers to use Gemini for coding assistance directly in their terminal environment.
---
Created by yours truly: __Gemini Code__
2025-04-15 21:41:08 -07:00
|
|
|
|
|
|
|
|
class ToolRegistry {
|
|
|
|
|
private tools: Map<string, Tool> = new Map();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Registers a tool definition.
|
|
|
|
|
* @param tool - The tool object containing schema and execution logic.
|
|
|
|
|
*/
|
|
|
|
|
registerTool(tool: Tool): void {
|
|
|
|
|
if (this.tools.has(tool.name)) {
|
|
|
|
|
// Decide on behavior: throw error, log warning, or allow overwrite
|
|
|
|
|
console.warn(`Tool with name "${tool.name}" is already registered. Overwriting.`);
|
|
|
|
|
}
|
|
|
|
|
this.tools.set(tool.name, tool);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retrieves the list of tool schemas in the format required by Gemini.
|
|
|
|
|
* @returns A ToolListUnion containing the function declarations.
|
|
|
|
|
*/
|
|
|
|
|
getToolSchemas(): ToolListUnion {
|
|
|
|
|
const declarations: FunctionDeclaration[] = [];
|
|
|
|
|
this.tools.forEach(tool => {
|
|
|
|
|
declarations.push(tool.schema);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Return Gemini's expected format. Handle the case of no tools.
|
|
|
|
|
if (declarations.length === 0) {
|
|
|
|
|
// Depending on the SDK version, you might need `undefined`, `[]`, or `[{ functionDeclarations: [] }]`
|
|
|
|
|
// Check the documentation for your @google/genai version.
|
|
|
|
|
// Let's assume an empty array works or signifies no tools.
|
|
|
|
|
return [];
|
|
|
|
|
// Or if it requires the structure:
|
|
|
|
|
// return [{ functionDeclarations: [] }];
|
|
|
|
|
}
|
|
|
|
|
return [{ functionDeclarations: declarations }];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Optional: Get a list of registered tool names.
|
|
|
|
|
*/
|
|
|
|
|
listAvailableTools(): string[] {
|
|
|
|
|
return Array.from(this.tools.keys());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the definition of a specific tool.
|
|
|
|
|
*/
|
|
|
|
|
getTool(name: string): Tool | undefined {
|
|
|
|
|
return this.tools.get(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Export a singleton instance of the registry
|
|
|
|
|
export const toolRegistry = new ToolRegistry();
|