nucel-agent-claude-code 0.1.4

Claude Code provider for Nucel agent-sdk — subprocess wrapper for claude CLI
Documentation

nucel-agent-claude-code

crates.io docs.rs License

Claude Code provider for the Nucel Agent SDK — a subprocess wrapper for Anthropic's claude CLI.

Features

  • Streaming JSONL protocol — parses system/init, assistant, result, and rate-limit events line-by-line
  • Session resume — uses the official --resume <session_id> CLI flag
  • Multi-turn — keeps the subprocess alive and writes prompts to stdin (start_interactive mode)
  • Token tracking — input / output tokens reported by the CLI
  • Budget enforcement — passes --max-budget-usd to the CLI and guards client-side before/after every query
  • Timeout protection — configurable timeout per query (default: 10 minutes)
  • Permission modesPrompt, AcceptEdits, BypassPermissions, RejectAll → mapped to the official --permission-mode values
  • max_turns control — passes --max-turns <n> (defaults to 1 for the initial spawn)
  • Graceful shutdown — SIGTERM then SIGKILL fallback

How it works

Spawns the claude CLI in print mode with streaming JSON output:

claude \
  --model <model> \
  --permission-mode <mode> \
  --max-budget-usd <amount> \
  --system-prompt <prompt> \
  -p "<user prompt>" \
  --output-format stream-json \
  --verbose \
  --max-turns <n>

Then parses the JSONL stream and extracts:

  • Text content from assistant messages
  • Cost from result.total_cost_usd
  • Token usage from result.usage
  • Session ID from system/init (for resume)

For session resume, --resume <session_id> is added.

CLI flag mapping

SpawnConfig field CLI flag
model --model
permission_mode --permission-mode {default|acceptEdits|bypassPermissions|plan}
budget_usd --max-budget-usd
system_prompt --system-prompt
max_turns --max-turns
env passed as subprocess environment
PermissionMode --permission-mode value
Prompt default
AcceptEdits acceptEdits
BypassPermissions bypassPermissions
RejectAll plan

Reference: Claude Code CLI docs.

Usage

[dependencies]
nucel-agent-sdk = "0.1"
tokio = { version = "1", features = ["full"] }
use nucel_agent_sdk::{ClaudeCodeExecutor, AgentExecutor, PermissionMode, SpawnConfig};
use std::path::Path;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let executor = ClaudeCodeExecutor::new();
    // Or supply an API key explicitly:
    // let executor = ClaudeCodeExecutor::with_api_key(std::env::var("ANTHROPIC_API_KEY")?);

    // Check availability
    let avail = executor.availability();
    if !avail.available {
        eprintln!("{}", avail.reason.unwrap_or_default());
        // → "`claude` CLI not found. Install: npm install -g @anthropic-ai/claude-code"
        return Ok(());
    }

    let session = executor.spawn(
        Path::new("/my/repo"),
        "Fix the failing tests in src/lib.rs",
        &SpawnConfig {
            model: Some("claude-opus-4-6".into()),
            budget_usd: Some(5.0),
            permission_mode: Some(PermissionMode::AcceptEdits),
            max_turns: Some(10),
            ..Default::default()
        },
    ).await?;

    let resp = session.query("Did the tests pass?").await?;
    println!("{}", resp.content);

    let cost = session.total_cost().await?;
    println!("Total cost: ${:.4}", cost.total_usd);

    session.close().await?;
    Ok(())
}

Capabilities

session_resume:     true   (via --resume <id>)
token_usage:        true
mcp_support:        true
autonomous_mode:    true
structured_output:  false

Requirements

  • claude CLI on PATH: npm install -g @anthropic-ai/claude-code
  • A valid ANTHROPIC_API_KEY env var or a logged-in Claude Max / Pro subscription (via claude login)

Source

License

Apache-2.0