Ejemplos de Código
Ejemplos de código prácticos y plantillas para ayudarte a aprovechar al máximo Gemini CLI. Desde uso básico hasta patrones avanzados de automatización e integración.
Categorías de Ejemplos
Elige una categoría para explorar ejemplos relacionados
Uso Básico
Ejemplos simples para comenzar con Gemini CLI
Chat Simple
Iniciar conversación básica con Gemini
# Iniciar chat interactivo
gemini chat
# Hacer una pregunta
gemini ask "¿Qué es el aprendizaje automático?"
# Preguntar con modelo específico
gemini ask "Explicar computación cuántica" --model gemini-pro
Análisis de Archivos
Analizar archivos de código con asistencia IA
# Analizar un solo archivo
gemini analyze src/main.js
# Analizar múltiples archivos
gemini analyze src/*.js --type code-review
# Obtener sugerencias de código
gemini analyze package.json --suggest-improvements
Gestión de Configuración
Gestión básica de configuración
# Ver configuración actual
gemini config list
# Establecer modelo por defecto
gemini config set model gemini-pro
# Establecer temperatura
gemini config set temperature 0.7
# Restablecer a valores por defecto
gemini config reset
Scripts de Automatización
Scripts para automatizar tareas de desarrollo
Script de Revisión de Código
Revisión de código automatizada para pull requests
#!/bin/bash
# code-review.sh - Script de revisión de código automatizada
# Obtener archivos modificados
CHANGED_FILES=\$(git diff --name-only HEAD~1)
echo "🔍 Iniciando revisión de código automatizada..."
for file in $CHANGED_FILES; do
if [[ $file == *.js || $file == *.ts || $file == *.py ]]; then
echo "📝 Revisando: $file"
# Analizar archivo
gemini analyze "$file" \
--type code-review \
--prompt "Revisar este código en busca de errores, problemas de rendimiento y mejores prácticas" \
--output review-$file.md
fi
done
echo "✅ Revisión de código completada! Revisa los archivos review-*.md"
Generador de Documentación
Generar documentación desde código
#!/bin/bash
# generate-docs.sh - Generación automática de documentación
echo "📚 Generando documentación..."
# Generar documentación API
gemini analyze src/api/*.js \
--prompt "Generar documentación API completa con ejemplos" \
--output docs/api.md
# Generar README
gemini ask "Crear README.md para este proyecto basado en la base de código" \
--context src/ \
--output README.md
# Generar changelog
git log --oneline --since="1 month ago" | \
gemini ask "Convertir estos commits de git en changelog" \
--output CHANGELOG.md
echo "✅ Generación de documentación completada!"
Generador de Pruebas
Generar automáticamente pruebas unitarias
#!/bin/bash
# generate-tests.sh - Generación automática de pruebas unitarias
SOURCE_DIR="src"
TEST_DIR="tests"
echo "🧪 Generando pruebas unitarias..."
find $SOURCE_DIR -name "*.js" -o -name "*.ts" | while read file; do
# Obtener ruta relativa
rel_path=\$\{file#\$SOURCE_DIR/\}
test_file="\$TEST_DIR/\$\{rel_path%.*\}.test.\$\{file##*.\}"
echo "📝 Generando pruebas para: $file"
gemini analyze "$file" \
--prompt "Generar pruebas unitarias completas con casos límite" \
--template jest \
--output "$test_file"
done
echo "✅ Generación de pruebas completada!"
Ejemplos de Integración
Integrar Gemini CLI con otras herramientas y flujos de trabajo
Flujo de Trabajo GitHub Actions
Integración CI/CD con GitHub Actions
name: Revisión de Código IA
on:
pull_request:
types: [opened, synchronize]
jobs:
ai-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Configurar Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Instalar Gemini CLI
run: npm install -g @google/generative-ai-cli
- name: Configurar Gemini CLI
run: |
gemini config set api-key \$\{\{ secrets.GEMINI_API_KEY \}\}
gemini config set model gemini-pro
- name: Obtener archivos modificados
id: changed-files
run: |
echo "files=\$(git diff --name-only HEAD~1 | tr '\n' ' ')" >> $GITHUB_OUTPUT
- name: Revisión de Código IA
run: |
for file in \$\{\{ steps.changed-files.outputs.files \}\}; do
if [[ $file == *.js || $file == *.ts || $file == *.py ]]; then
gemini analyze "$file" \
--type code-review \
--output "review-$file.md"
fi
done
- name: Comentar PR
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const reviews = fs.readdirSync('.').filter(f => f.startsWith('review-'));
let comment = '## 🤖 Revisión de Código IA\n\n';
reviews.forEach(file => {
const content = fs.readFileSync(file, 'utf8');
comment += `### ${file}\n${content}\n\n`;
});
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
Extensión VS Code
Integración de extensión VS Code personalizada
// extension.js - Extensión VS Code para Gemini CLI
const vscode = require('vscode');
const { exec } = require('child_process');
function activate(context) {
// Comando: Explicar Código
let explainCommand = vscode.commands.registerCommand(
'gemini.explainCode',
async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const selection = editor.selection;
const text = editor.document.getText(selection);
if (!text) {
vscode.window.showErrorMessage('Por favor selecciona código para explicar');
return;
}
// Mostrar progreso
vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: "Explicando código con Gemini...",
cancellable: false
}, async () => {
return new Promise((resolve, reject) => {
exec(`echo "${text}" | gemini ask "Explica este código"`,
(error, stdout, stderr) => {
if (error) {
vscode.window.showErrorMessage(`Error: ${error.message}`);
reject(error);
return;
}
// Mostrar explicación en nuevo documento
vscode.workspace.openTextDocument({
content: stdout,
language: 'markdown'
}).then(doc => {
vscode.window.showTextDocument(doc);
resolve();
});
});
});
});
}
);
// Comando: Generar Pruebas
let testCommand = vscode.commands.registerCommand(
'gemini.generateTests',
async () => {
const editor = vscode.window.activeTextEditor;
if (!editor) return;
const filePath = editor.document.fileName;
const testPath = filePath.replace(/\.(js|ts)$/, '.test.$1');
exec(`gemini analyze "${filePath}" --prompt "Generar pruebas unitarias" --output "${testPath}"`,
(error, stdout, stderr) => {
if (error) {
vscode.window.showErrorMessage(`Error: ${error.message}`);
return;
}
vscode.window.showInformationMessage(`Pruebas generadas: ${testPath}`);
vscode.workspace.openTextDocument(testPath).then(doc => {
vscode.window.showTextDocument(doc);
});
});
}
);
context.subscriptions.push(explainCommand, testCommand);
}
function deactivate() {}
module.exports = { activate, deactivate };
Integración Docker
Usar Gemini CLI en contenedores
# Dockerfile - Contenedor Gemini CLI
FROM node:18-alpine
# Instalar Gemini CLI
RUN npm install -g @google/generative-ai-cli
# Establecer directorio de trabajo
WORKDIR /app
# Copiar archivos del proyecto
COPY . .
# Establecer variables de entorno
ENV GEMINI_API_KEY=""
# Crear script de análisis
RUN echo '#!/bin/sh' > /usr/local/bin/analyze-project && \
echo 'gemini analyze src/ --output analysis.md' >> /usr/local/bin/analyze-project && \
chmod +x /usr/local/bin/analyze-project
# Comando por defecto
CMD ["analyze-project"]
Uso Avanzado
Escenarios complejos y características avanzadas
Desarrollo de Herramientas Personalizadas
Crear herramientas personalizadas para tareas específicas
// custom-tools.js - Definiciones de herramientas personalizadas
const tools = {
// Herramienta de consulta de base de datos
database_query: {
name: 'database_query',
description: 'Ejecutar consultas SQL en la base de datos',
parameters: {
query: { type: 'string', required: true },
database: { type: 'string', default: 'main' }
},
execute: async ({ query, database }) => {
const db = require('./db-connection');
try {
const result = await db.query(query, database);
return JSON.stringify(result, null, 2);
} catch (error) {
return `Error: ${error.message}`;
}
}
},
// Herramienta de prueba de API
api_test: {
name: 'api_test',
description: 'Probar endpoints de API',
parameters: {
url: { type: 'string', required: true },
method: { type: 'string', default: 'GET' },
headers: { type: 'object', default: {} },
body: { type: 'object', default: null }
},
execute: async ({ url, method, headers, body }) => {
const fetch = require('node-fetch');
try {
const response = await fetch(url, {
method,
headers,
body: body ? JSON.stringify(body) : undefined
});
const data = await response.text();
return `Estado: ${response.status}\nRespuesta: ${data}`;
} catch (error) {
return `Error: ${error.message}`;
}
}
},
// Herramienta de formateo de código
format_code: {
name: 'format_code',
description: 'Formatear código usando prettier',
parameters: {
code: { type: 'string', required: true },
language: { type: 'string', default: 'javascript' }
},
execute: async ({ code, language }) => {
const prettier = require('prettier');
try {
const formatted = prettier.format(code, {
parser: language === 'typescript' ? 'typescript' : 'babel',
semi: true,
singleQuote: true,
tabWidth: 2
});
return formatted;
} catch (error) {
return `Error: ${error.message}`;
}
}
}
};
// Registrar herramientas con Gemini CLI
Object.values(tools).forEach(tool => {
process.env.GEMINI_TOOLS = JSON.stringify([
...(JSON.parse(process.env.GEMINI_TOOLS || '[]')),
tool
]);
});
module.exports = tools;
Procesamiento por Lotes
Procesar múltiples archivos o tareas por lotes
#!/bin/bash
# batch-process.sh - Procesamiento por lotes con Gemini CLI
BATCH_SIZE=5
CONCURRENT_JOBS=3
# Función para procesar un solo archivo
process_file() {
local file=$1
local task=$2
echo "🔄 Procesando: $file"
case $task in
"translate")
gemini ask "Traducir estos comentarios de código al inglés" \
--file "$file" \
--output "${file%.js}.en.js"
;;
"optimize")
gemini analyze "$file" \
--prompt "Optimizar este código para rendimiento" \
--output "${file%.js}.optimized.js"
;;
"document")
gemini analyze "$file" \
--prompt "Agregar comentarios JSDoc completos" \
--output "${file%.js}.documented.js"
;;
esac
echo "✅ Completado: $file"
}
# Función principal de procesamiento por lotes
batch_process() {
local task=$1
shift
local files=("$@")
echo "🚀 Iniciando procesamiento por lotes: $task"
echo "📁 Archivos a procesar: ${#files[@]}"
# Procesar archivos por lotes
for ((i=0; i<${#files[@]}; i+=BATCH_SIZE)); do
batch=("${files[@]:i:BATCH_SIZE}")
echo "📦 Procesando lote $((i/BATCH_SIZE + 1))"
# Procesar lote con concurrencia limitada
for file in "${batch[@]}"; do
(($(jobs -r | wc -l) >= CONCURRENT_JOBS)) && wait
process_file "$file" "$task" &
done
wait # Esperar a que termine el lote actual
done
echo "🎉 Procesamiento por lotes completado!"
}
# Ejemplos de uso
case $1 in
"translate")
batch_process "translate" src/**/*.js
;;
"optimize")
batch_process "optimize" src/**/*.js
;;
"document")
batch_process "document" src/**/*.js
;;
*)
echo "Uso: $0 {translate|optimize|document}"
exit 1
;;
esac
Sistema de Plugins
Crear arquitectura de plugins extensible
// plugin-system.js - Ejemplo de sistema de plugins
const { GeminiCLI } = require('@google/generative-ai-cli');
class PluginManager {
constructor() {
this.cli = new GeminiCLI();
this.plugins = new Map();
}
// Registrar plugin
registerPlugin(plugin) {
if (!plugin.name || !plugin.version) {
throw new Error('El plugin debe tener nombre y versión');
}
this.plugins.set(plugin.name, plugin);
// Registrar comandos del plugin
if (plugin.commands) {
Object.entries(plugin.commands).forEach(([cmd, handler]) => {
this.cli.registerCommand(`${plugin.name}:${cmd}`, handler);
});
}
// Registrar herramientas del plugin
if (plugin.tools) {
plugin.tools.forEach(tool => {
this.cli.registerTool(tool);
});
}
console.log(`✅ Plugin ${plugin.name} v${plugin.version} registrado`);
}
// Obtener información del plugin
getPlugin(name) {
return this.plugins.get(name);
}
// Listar todos los plugins
listPlugins() {
return Array.from(this.plugins.values());
}
}
// Plugin de ejemplo: Verificador de calidad de código
const codeQualityPlugin = {
name: 'code-quality',
version: '1.0.0',
description: 'Plugin de verificación de calidad de código',
commands: {
'check': async (args) => {
const files = args.files || ['src/'];
console.log(`🔍 Verificando calidad de código: ${files.join(', ')}`);
// Implementar lógica de verificación de calidad
return 'Verificación de calidad de código completada';
},
'metrics': async (args) => {
console.log('📊 Generando métricas de código...');
// Implementar lógica de generación de métricas
return {
complexity: 'low',
maintainability: 'high',
coverage: '85%'
};
}
},
tools: [
{
name: 'complexity_analyzer',
description: 'Analizar complejidad del código',
parameters: {
file: { type: 'string', required: true }
},
execute: async ({ file }) => {
// Implementar análisis de complejidad
return `Complejidad del archivo ${file}: media`;
}
}
]
};
// Ejemplo de uso
async function main() {
const manager = new PluginManager();
// Registrar plugin
manager.registerPlugin(codeQualityPlugin);
// Usar comando del plugin
const result = await manager.cli.executeCommand('code-quality:check', {
files: ['src/main.js', 'src/utils.js']
});
console.log('Resultado de verificación:', result);
// Listar todos los plugins
console.log('Plugins instalados:', manager.listPlugins());
}
main().catch(console.error);
¿Necesitas más ayuda?
Explora más recursos y documentación