Skip to content

Implement Cline/Gemini-CLI integration with Bun runtime in Kestra workflows #31

@coderabbitai

Description

@coderabbitai

Implement Cline/Gemini-CLI integration with Bun runtime in Kestra workflows

Description

Integrate Cline CLI (with gemini-cli as fallback) using Bun runtime in Kestra workflow orchestration for agent execution.

Requirements

Primary: Cline CLI with Bun

  • Install and configure Cline CLI in Kestra worker environment
  • Use Bun as the JavaScript runtime (faster than Node.js)
  • Configure Cline to use Gemini API for agent operations
  • Execute adversary and defender agents via Cline in Kestra tasks

Fallback: gemini-cli with Bun

  • If Cline CLI fails or is unavailable, fall back to gemini-cli
  • Implement retry logic with graceful degradation
  • Use gemini-cli for direct Gemini API interactions
  • Maintain same input/output interface for both tools

Kestra Workflow Structure

id: redloop-security-scan
namespace: redloop

tasks:
  - id: setup-environment
    type: io.kestra.plugin.scripts.bun.Script
    containerImage: oven/bun
    beforeCommands:
      - bun install -g cline-cli gemini-cli
    script: |
      const { $ } = require('bun');
      
      // Verify installations
      try {
        await $`cline --version`;
        console.log('✓ Cline CLI available');
      } catch {
        console.log('⚠ Cline unavailable, will use gemini-cli fallback');
      }

  - id: adversary-scan
    type: io.kestra.plugin.scripts.bun.Script
    containerImage: oven/bun
    env:
      GEMINI_API_KEY: "{{ secret('GEMINI_API_KEY') }}"
      CLINE_TIMEOUT_SECONDS: "300"
      TARGET_REPO: "{{ inputs.repo_path }}"
    beforeCommands:
      - bun install -g cline-cli gemini-cli
    script: |
      const { $ } = require('bun');
      
      let analysisResult;
      
      // Try Cline CLI first
      try {
        console.log('Attempting Cline CLI analysis...');
        const result = await $`cline analyze --target ${process.env.TARGET_REPO}`.quiet();
        analysisResult = result.stdout.toString();
        console.log('✓ Cline analysis completed');
      } catch (error) {
        // Fallback to gemini-cli
        console.log('⚠ Cline failed, using gemini-cli fallback');
        try {
          const fallback = await $`gemini-cli prompt "Analyze for security vulnerabilities: ${process.env.TARGET_REPO}"`.quiet();
          analysisResult = fallback.stdout.toString();
          console.log('✓ Gemini-CLI analysis completed');
        } catch (fallbackError) {
          console.error('✗ Both Cline and gemini-cli failed');
          throw fallbackError;
        }
      }
      
      console.log('Analysis Result:', analysisResult);
      await Bun.write('analysis-result.json', JSON.stringify({ result: analysisResult }));
    outputFiles:
      - analysis-result.json

  - id: defender-fix
    type: io.kestra.plugin.scripts.bun.Script
    containerImage: oven/bun
    env:
      GEMINI_API_KEY: "{{ secret('GEMINI_API_KEY') }}"
      VULNERABILITIES: "{{ outputs['adversary-scan'].outputFiles['analysis-result.json'] }}"
    beforeCommands:
      - bun install -g cline-cli gemini-cli
    script: |
      const { $ } = require('bun');
      
      const vulns = await Bun.file(process.env.VULNERABILITIES).json();
      
      // Try Cline CLI for fixes
      try {
        console.log('Attempting Cline CLI fix generation...');
        await $`cline fix --input ${process.env.VULNERABILITIES}`;
        console.log('✓ Cline fix generation completed');
      } catch (error) {
        console.log('⚠ Cline failed, using gemini-cli fallback');
        await $`gemini-cli prompt "Generate fixes for: ${JSON.stringify(vulns)}"`;
        console.log('✓ Gemini-CLI fix generation completed');
      }

Technical Details

Bun Plugin Benefits

  • Native Bun Support: Uses dedicated io.kestra.plugin.scripts.bun.Script plugin
  • Official Container: oven/bun container image with full Bun runtime
  • Built-in Bun APIs: Direct access to Bun.write(), Bun.file(), and $ shell execution
  • 3x faster startup than Node.js
  • Built-in TypeScript support
  • Lower memory footprint
  • No Node.js compatibility layer needed

Error Handling & Retry Logic

  • Detect Cline CLI failures (exit codes, timeouts)
  • Automatic fallback to gemini-cli
  • Log which tool was used for each execution
  • Metrics tracking (success rates for each tool)

Environment Variables

# Kestra environment variables
GEMINI_API_KEY=${GEMINI_API_KEY}
CLINE_CONFIG_PATH=/etc/kestra/cline.json
FALLBACK_TO_GEMINI_CLI=true
CLINE_TIMEOUT_SECONDS=300

Acceptance Criteria

  • Bun runtime installed in Kestra worker using io.kestra.plugin.scripts.bun.Script
  • Cline CLI successfully executes in Kestra task
  • gemini-cli fallback triggers on Cline failure
  • Both adversary and defender agents work with both tools
  • Workflow logs indicate which tool was used
  • Error handling tested (simulate Cline unavailability)
  • Documentation for Kestra workflow setup
  • CI/CD pipeline for Kestra flow validation

Dependencies

Links & Resources

Context

Requested by @haroon0x in issue #1

This enables RedLoop agents to run in orchestrated workflows with fast Bun runtime and resilient fallback strategy.

Metadata

Metadata

Assignees

Labels

devopsDevOps and deploymentfuture-enhancementFuture enhancement beyond current roadmapinfrastructureInfrastructure and DevOpskestraKestra workflow orchestration related

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions