Примеры Кода

Практические примеры кода и шаблоны, которые помогут вам максимально использовать Gemini CLI. От базового использования до продвинутых паттернов автоматизации и интеграции.

Базовое Использование

Простые примеры для начала работы с Gemini CLI

Простой Чат

Начать базовую беседу с Gemini

bashКод
# Запустить интерактивный чат
gemini chat

# Задать вопрос
gemini ask "Что такое машинное обучение?"

# Спросить с конкретной моделью
gemini ask "Объяснить квантовые вычисления" --model gemini-pro

Анализ Файлов

Анализировать файлы кода с помощью ИИ

bashКод
# Анализировать один файл
gemini analyze src/main.js

# Анализировать несколько файлов
gemini analyze src/*.js --type code-review

# Получить предложения по коду
gemini analyze package.json --suggest-improvements

Управление Конфигурацией

Базовое управление конфигурацией

bashКод
# Посмотреть текущую конфигурацию
gemini config list

# Установить модель по умолчанию
gemini config set model gemini-pro

# Установить температуру
gemini config set temperature 0.7

# Сбросить к значениям по умолчанию
gemini config reset

Скрипты Автоматизации

Скрипты для автоматизации задач разработки

Скрипт Ревью Кода

Автоматизированное ревью кода для pull request'ов

bashКод
#!/bin/bash
# code-review.sh - Скрипт автоматизированного ревью кода

# Получить измененные файлы
CHANGED_FILES=\$(git diff --name-only HEAD~1)

echo "🔍 Запуск автоматизированного ревью кода..."

for file in $CHANGED_FILES; do
  if [[ $file == *.js || $file == *.ts || $file == *.py ]]; then
    echo "📝 Проверка: $file"

    # Анализировать файл
    gemini analyze "$file" \
      --type code-review \
      --prompt "Проверить этот код на ошибки, проблемы производительности и лучшие практики" \
      --output review-$file.md
  fi
done

echo "✅ Ревью кода завершено! Проверьте файлы review-*.md"

Генератор Документации

Генерация документации из кода

bashКод
#!/bin/bash
# generate-docs.sh - Автоматическая генерация документации

echo "📚 Генерация документации..."

# Генерировать API документацию
gemini analyze src/api/*.js \
  --prompt "Сгенерировать полную API документацию с примерами" \
  --output docs/api.md

# Генерировать README
gemini ask "Создать README.md для этого проекта на основе кодовой базы" \
  --context src/ \
  --output README.md

# Генерировать changelog
git log --oneline --since="1 month ago" | \
  gemini ask "Преобразовать эти git коммиты в changelog" \
  --output CHANGELOG.md

echo "✅ Генерация документации завершена!"

Генератор Тестов

Автоматическая генерация модульных тестов

bashКод
#!/bin/bash
# generate-tests.sh - Автоматическая генерация модульных тестов

SOURCE_DIR="src"
TEST_DIR="tests"

echo "🧪 Генерация модульных тестов..."

find $SOURCE_DIR -name "*.js" -o -name "*.ts" | while read file; do
  # Получить относительный путь
  rel_path=\$\{file#\$SOURCE_DIR/\}
  test_file="\$TEST_DIR/\$\{rel_path%.*\}.test.\$\{file##*.\}"

  echo "📝 Генерация тестов для: $file"

  gemini analyze "$file" \
    --prompt "Сгенерировать полные модульные тесты с граничными случаями" \
    --template jest \
    --output "$test_file"
done

echo "✅ Генерация тестов завершена!"

Примеры Интеграции

Интеграция Gemini CLI с другими инструментами и рабочими процессами

Рабочий Процесс GitHub Actions

CI/CD интеграция с GitHub Actions

yamlКод
name: ИИ Ревью Кода
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Настроить Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Установить Gemini CLI
        run: npm install -g @google/generative-ai-cli

      - name: Настроить Gemini CLI
        run: |
          gemini config set api-key \$\{\{ secrets.GEMINI_API_KEY \}\}
          gemini config set model gemini-pro

      - name: Получить измененные файлы
        id: changed-files
        run: |
          echo "files=\$(git diff --name-only HEAD~1 | tr '\n' ' ')" >> $GITHUB_OUTPUT

      - name: ИИ Ревью Кода
        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: Комментировать PR
        uses: actions/github-script@v6
        with:
          script: |
            const fs = require('fs');
            const reviews = fs.readdirSync('.').filter(f => f.startsWith('review-'));

            let comment = '## 🤖 ИИ Ревью Кода\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
            });

Расширение VS Code

Интеграция пользовательского расширения VS Code

javascriptКод
// extension.js - Расширение VS Code для Gemini CLI
const vscode = require('vscode');
const { exec } = require('child_process');

function activate(context) {
  // Команда: Объяснить Код
  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('Пожалуйста, выберите код для объяснения');
        return;
      }

      // Показать прогресс
      vscode.window.withProgress({
        location: vscode.ProgressLocation.Notification,
        title: "Объяснение кода с помощью Gemini...",
        cancellable: false
      }, async () => {
        return new Promise((resolve, reject) => {
          exec(`echo "${text}" | gemini ask "Объясни этот код"`,
            (error, stdout, stderr) => {
              if (error) {
                vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
                reject(error);
                return;
              }

              // Показать объяснение в новом документе
              vscode.workspace.openTextDocument({
                content: stdout,
                language: 'markdown'
              }).then(doc => {
                vscode.window.showTextDocument(doc);
                resolve();
              });
            });
        });
      });
    }
  );

  // Команда: Генерировать Тесты
  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 "Сгенерировать модульные тесты" --output "${testPath}"`,
        (error, stdout, stderr) => {
          if (error) {
            vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
            return;
          }

          vscode.window.showInformationMessage(`Тесты сгенерированы: ${testPath}`);
          vscode.workspace.openTextDocument(testPath).then(doc => {
            vscode.window.showTextDocument(doc);
          });
        });
    }
  );

  context.subscriptions.push(explainCommand, testCommand);
}

function deactivate() {}

module.exports = { activate, deactivate };

Интеграция Docker

Использование Gemini CLI в контейнерах

dockerfileКод
# Dockerfile - Контейнер Gemini CLI
FROM node:18-alpine

# Установить Gemini CLI
RUN npm install -g @google/generative-ai-cli

# Установить рабочую директорию
WORKDIR /app

# Скопировать файлы проекта
COPY . .

# Установить переменные окружения
ENV GEMINI_API_KEY=""

# Создать скрипт анализа
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

# Команда по умолчанию
CMD ["analyze-project"]

Продвинутое Использование

Сложные сценарии и продвинутые функции

Разработка Пользовательских Инструментов

Создание пользовательских инструментов для конкретных задач

javascriptКод
// custom-tools.js - Определения пользовательских инструментов
const tools = {
  // Инструмент запросов к базе данных
  database_query: {
    name: 'database_query',
    description: 'Выполнение SQL запросов к базе данных',
    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.message}`;
      }
    }
  },

  // Инструмент тестирования API
  api_test: {
    name: 'api_test',
    description: 'Тестировать 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 `Статус: ${response.status}\nОтвет: ${data}`;
      } catch (error) {
        return `Ошибка: ${error.message}`;
      }
    }
  },

  // Инструмент форматирования кода
  format_code: {
    name: 'format_code',
    description: 'Форматировать код с помощью 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.message}`;
      }
    }
  }
};

// Зарегистрировать инструменты в Gemini CLI
Object.values(tools).forEach(tool => {
  process.env.GEMINI_TOOLS = JSON.stringify([
    ...(JSON.parse(process.env.GEMINI_TOOLS || '[]')),
    tool
  ]);
});

module.exports = tools;

Пакетная Обработка

Обработка нескольких файлов или задач пакетами

bashКод
#!/bin/bash
# batch-process.sh - Пакетная обработка с Gemini CLI

BATCH_SIZE=5
CONCURRENT_JOBS=3

# Функция для обработки одного файла
process_file() {
  local file=$1
  local task=$2

  echo "🔄 Обработка: $file"

  case $task in
    "translate")
      gemini ask "Перевести эти комментарии кода на английский" \
        --file "$file" \
        --output "${file%.js}.en.js"
      ;;
    "optimize")
      gemini analyze "$file" \
        --prompt "Оптимизировать этот код для производительности" \
        --output "${file%.js}.optimized.js"
      ;;
    "document")
      gemini analyze "$file" \
        --prompt "Добавить полные JSDoc комментарии" \
        --output "${file%.js}.documented.js"
      ;;
  esac

  echo "✅ Завершено: $file"
}

# Основная функция пакетной обработки
batch_process() {
  local task=$1
  shift
  local files=("$@")

  echo "🚀 Начало пакетной обработки: $task"
  echo "📁 Файлов для обработки: ${#files[@]}"

  # Обработка файлов пакетами
  for ((i=0; i<${#files[@]}; i+=BATCH_SIZE)); do
    batch=("${files[@]:i:BATCH_SIZE}")

    echo "📦 Обработка пакета $((i/BATCH_SIZE + 1))"

    # Обработка пакета с ограниченной параллельностью
    for file in "${batch[@]}"; do
      (($(jobs -r | wc -l) >= CONCURRENT_JOBS)) && wait
      process_file "$file" "$task" &
    done

    wait # Ожидание завершения текущего пакета
  done

  echo "🎉 Пакетная обработка завершена!"
}

# Примеры использования
case $1 in
  "translate")
    batch_process "translate" src/**/*.js
    ;;
  "optimize")
    batch_process "optimize" src/**/*.js
    ;;
  "document")
    batch_process "document" src/**/*.js
    ;;
  *)
    echo "Использование: $0 {translate|optimize|document}"
    exit 1
    ;;
esac

Система Плагинов

Создание расширяемой архитектуры плагинов

javascriptКод
// plugin-system.js - Пример системы плагинов
const { GeminiCLI } = require('@google/generative-ai-cli');

class PluginManager {
  constructor() {
    this.cli = new GeminiCLI();
    this.plugins = new Map();
  }

  // Регистрация плагина
  registerPlugin(plugin) {
    if (!plugin.name || !plugin.version) {
      throw new Error('Плагин должен иметь имя и версию');
    }

    this.plugins.set(plugin.name, plugin);

    // Регистрация команд плагина
    if (plugin.commands) {
      Object.entries(plugin.commands).forEach(([cmd, handler]) => {
        this.cli.registerCommand(`${plugin.name}:${cmd}`, handler);
      });
    }

    // Регистрация инструментов плагина
    if (plugin.tools) {
      plugin.tools.forEach(tool => {
        this.cli.registerTool(tool);
      });
    }

    console.log(`✅ Плагин ${plugin.name} v${plugin.version} зарегистрирован`);
  }

  // Получение информации о плагине
  getPlugin(name) {
    return this.plugins.get(name);
  }

  // Список всех плагинов
  listPlugins() {
    return Array.from(this.plugins.values());
  }
}

// Пример плагина: Проверка качества кода
const codeQualityPlugin = {
  name: 'code-quality',
  version: '1.0.0',
  description: 'Плагин проверки качества кода',

  commands: {
    'check': async (args) => {
      const files = args.files || ['src/'];
      console.log(`🔍 Проверка качества кода: ${files.join(', ')}`);

      // Реализация логики проверки качества кода
      return 'Проверка качества кода завершена';
    },

    'metrics': async (args) => {
      console.log('📊 Генерация метрик кода...');

      // Реализация логики генерации метрик
      return {
        complexity: 'low',
        maintainability: 'high',
        coverage: '85%'
      };
    }
  },

  tools: [
    {
      name: 'complexity_analyzer',
      description: 'Анализ сложности кода',
      parameters: {
        file: { type: 'string', required: true }
      },
      execute: async ({ file }) => {
        // Реализация анализа сложности
        return `Сложность файла ${file}: средняя`;
      }
    }
  ]
};

// Пример использования
async function main() {
  const manager = new PluginManager();

  // Регистрация плагина
  manager.registerPlugin(codeQualityPlugin);

  // Использование команды плагина
  const result = await manager.cli.executeCommand('code-quality:check', {
    files: ['src/main.js', 'src/utils.js']
  });

  console.log('Результат проверки:', result);

  // Список всех плагинов
  console.log('Установленные плагины:', manager.listPlugins());
}

main().catch(console.error);

Нужна дополнительная помощь?

Изучите больше ресурсов и документации