ClaudeCodeSDK.OptionBuilder (claude_code_sdk v0.0.1)

View Source

Smart option builder for Claude Code SDK configurations.

This module provides pre-configured option sets and builder patterns for common use cases. Instead of manually constructing ClaudeCodeSDK.Options structs, you can use these convenience functions to get sensible defaults for different environments and scenarios.

Design Philosophy

  • Environment-aware: Automatically adapt to dev, test, and production
  • Security-first: Production configs are restrictive by default
  • Composable: Mix and match presets with custom overrides
  • Practical: Based on real-world usage patterns

Quick Start

# Get options for current environment
options = ClaudeCodeSDK.OptionBuilder.for_environment()

# Use a specific preset
options = ClaudeCodeSDK.OptionBuilder.build_development_options()

# Customize a preset
options = ClaudeCodeSDK.OptionBuilder.merge(:development, %{max_turns: 15})

Environment Presets

EnvironmentSecurityToolsTurn LimitUse Case
DevelopmentPermissiveAll tools10Local development
StagingModerateRead-only5Testing/CI
ProductionRestrictiveRead-only3Production analysis

Use Case Presets

PresetToolsPurposePermissions
AnalysisRead, Grep, FindCode reviewRead-only
DocumentationRead, WriteDoc generationFile creation
ChatNoneSimple Q&ANo tools
SandboxedCustomSafe executionIsolated

Summary

Functions

Lists all available preset names.

Builds options optimized for code analysis tasks.

Builds options for simple chat and Q&A interactions.

Builds options suitable for development environment.

Builds options for documentation generation tasks.

Builds options suitable for production environment.

Builds options suitable for staging/testing environment.

Builds options for test generation and testing tasks.

Builds options for a specific environment based on Mix.env().

Merges custom options with a base configuration.

Creates options for quick, one-off queries.

Creates a sandboxed configuration for safe execution.

Validates that an options struct has sensible configuration.

Adds additional allowed tools to any options.

Adds a custom system prompt to any options.

Sets a custom turn limit for any options.

Adds a custom working directory to any options.

Functions

available_presets()

@spec available_presets() :: [atom()]

Lists all available preset names.

Useful for dynamic configuration or validation.

Examples

presets = ClaudeCodeSDK.OptionBuilder.available_presets()
# => [:development, :staging, :production, :analysis, :chat, :documentation, :testing]

build_analysis_options()

@spec build_analysis_options() :: ClaudeCodeSDK.Options.t()

Builds options optimized for code analysis tasks.

Use for: Code reviews, security audits, quality analysis

Features:

  • Read and search tools for thorough analysis
  • Higher turn limit (7) for comprehensive review
  • No modification permissions for safety
  • Specialized system prompt for analysis focus

Examples

options = ClaudeCodeSDK.OptionBuilder.build_analysis_options()
ClaudeCodeSDK.query("Review this module for potential issues", options)

build_chat_options()

@spec build_chat_options() :: ClaudeCodeSDK.Options.t()

Builds options for simple chat and Q&A interactions.

Use for: Help desk, documentation queries, general assistance

Features:

  • Single turn for quick responses
  • Text output for simple display
  • No tool access to prevent unintended actions
  • Minimal permissions

Examples

options = ClaudeCodeSDK.OptionBuilder.build_chat_options()
ClaudeCodeSDK.query("What is the difference between async and sync?", options)

build_development_options()

@spec build_development_options() :: ClaudeCodeSDK.Options.t()

Builds options suitable for development environment.

Use for: Local development, debugging, experimentation

Features:

  • Higher turn limit (10) for complex tasks
  • Verbose output for debugging
  • All tools allowed for full functionality
  • Edit permissions accepted for rapid iteration
  • Stream JSON output for real-time feedback

Examples

# Basic development setup
options = ClaudeCodeSDK.OptionBuilder.build_development_options()
ClaudeCodeSDK.query("Help me debug this function", options)

# Development with custom system prompt
options = 
  ClaudeCodeSDK.OptionBuilder.build_development_options()
  |> ClaudeCodeSDK.OptionBuilder.with_system_prompt("You are a debugging expert")

build_documentation_options()

@spec build_documentation_options() :: ClaudeCodeSDK.Options.t()

Builds options for documentation generation tasks.

Use for: API docs, README generation, code documentation

Features:

  • Read access to understand existing code
  • Write access for creating documentation files
  • Higher turn limit (8) for comprehensive docs
  • Accept edits mode for file creation
  • Specialized prompt for documentation focus

Examples

options = ClaudeCodeSDK.OptionBuilder.build_documentation_options()
ClaudeCodeSDK.query("Generate API documentation for this module", options)

build_production_options()

@spec build_production_options() :: ClaudeCodeSDK.Options.t()

Builds options suitable for production environment.

Use for: Production monitoring, read-only analysis, customer-facing features

Features:

  • Low turn limit (3) for efficiency
  • Read-only access only
  • Plan mode for safety
  • Minimal tool access
  • Structured JSON output

Examples

# Production-safe code analysis
options = ClaudeCodeSDK.OptionBuilder.build_production_options()
ClaudeCodeSDK.query("Explain what this function does", options)

build_staging_options()

@spec build_staging_options() :: ClaudeCodeSDK.Options.t()

Builds options suitable for staging/testing environment.

Use for: CI/CD pipelines, automated testing, code review

Features:

  • Moderate turn limit (5) for focused tasks
  • Read-only tools for safety
  • Plan mode prevents automatic changes
  • Bash disabled to prevent system modifications
  • JSON output for structured results

Examples

# Use in CI for code analysis
options = ClaudeCodeSDK.OptionBuilder.build_staging_options()
ClaudeCodeSDK.query("Analyze this code for security issues", options)

build_testing_options()

@spec build_testing_options() :: ClaudeCodeSDK.Options.t()

Builds options for test generation and testing tasks.

Use for: Unit test creation, test analysis, quality assurance

Features:

  • Read access to understand code under test
  • Write access for creating test files
  • Moderate turn limit for thorough test coverage
  • Testing-focused system prompt

Examples

options = ClaudeCodeSDK.OptionBuilder.build_testing_options()
ClaudeCodeSDK.query("Generate comprehensive unit tests for this module", options)

for_environment()

@spec for_environment() :: ClaudeCodeSDK.Options.t()

Builds options for a specific environment based on Mix.env().

Automatically selects appropriate options based on current environment:

  • :dev -> development options (permissive, verbose)
  • :test -> staging options (moderate restrictions)
  • :prod -> production options (restrictive, safe)

This is the recommended way to get environment-appropriate defaults.

Examples

# Get options for current environment
options = ClaudeCodeSDK.OptionBuilder.for_environment()

# In development, this gives you full access
# In production, this gives you read-only access

merge(base, custom)

Merges custom options with a base configuration.

Allows you to start with a preset and customize specific fields. This is the recommended pattern for customizing presets.

Parameters

  • base - Base preset (atom) or Options struct
  • custom - Map of custom options to override

Examples

# Start with development preset, customize turn limit
options = ClaudeCodeSDK.OptionBuilder.merge(:development, %{max_turns: 15})

# Start with analysis preset, add custom prompt
options = ClaudeCodeSDK.OptionBuilder.merge(:analysis, %{
  system_prompt: "Focus on security vulnerabilities",
  max_turns: 10
})

# Merge with existing options
base_options = ClaudeCodeSDK.OptionBuilder.build_chat_options()
options = ClaudeCodeSDK.OptionBuilder.merge(base_options, %{max_turns: 3})

quick()

@spec quick() :: ClaudeCodeSDK.Options.t()

Creates options for quick, one-off queries.

Use for: Simple questions, quick checks, lightweight operations

Features:

  • Single turn limit
  • Text output for simplicity
  • No tools for safety
  • Fast response

Examples

options = ClaudeCodeSDK.OptionBuilder.quick()
ClaudeCodeSDK.query("What does this error mean?", options)

sandboxed(sandbox_path, allowed_tools \\ ["Read", "Write"])

@spec sandboxed(String.t(), [String.t()]) :: ClaudeCodeSDK.Options.t()

Creates a sandboxed configuration for safe execution.

Use for: Untrusted code execution, isolated environments, testing

Features:

  • Isolated to specific directory
  • Bypass permissions (safe within sandbox)
  • Customizable tool access
  • No bash access by default

Parameters

  • sandbox_path - Path to sandbox directory
  • allowed_tools - List of tools to allow (default: ["Read", "Write"])

Examples

# Basic sandbox
options = ClaudeCodeSDK.OptionBuilder.sandboxed("/tmp/sandbox")

# Sandbox with custom tools
options = ClaudeCodeSDK.OptionBuilder.sandboxed("/tmp/safe", ["Read", "Write", "Grep"])

validate(options)

@spec validate(ClaudeCodeSDK.Options.t()) ::
  {:ok, ClaudeCodeSDK.Options.t()}
  | {:warning, ClaudeCodeSDK.Options.t(), [String.t()]}
  | {:error, String.t()}

Validates that an options struct has sensible configuration.

Checks for common misconfigurations and provides warnings.

Parameters

  • options - Options struct to validate

Returns

  • {:ok, options} if valid
  • {:warning, options, warnings} if valid but has warnings
  • {:error, reason} if invalid

Examples

options = ClaudeCodeSDK.OptionBuilder.build_development_options()
{:ok, _} = ClaudeCodeSDK.OptionBuilder.validate(options)

with_additional_tools(options, additional_tools)

@spec with_additional_tools(ClaudeCodeSDK.Options.t(), [String.t()]) ::
  ClaudeCodeSDK.Options.t()

Adds additional allowed tools to any options.

Parameters

  • options - Options struct to modify
  • tools - List of additional tools to allow

Examples

options = 
  ClaudeCodeSDK.OptionBuilder.build_production_options()
  |> ClaudeCodeSDK.OptionBuilder.with_additional_tools(["Grep"])

with_system_prompt(prompt)

@spec with_system_prompt(String.t()) :: ClaudeCodeSDK.Options.t()

Adds a custom system prompt to any options.

Parameters

  • prompt - System prompt to use
  • options - Options struct to modify (optional, creates new if not provided)

Examples

options = ClaudeCodeSDK.OptionBuilder.with_system_prompt("You are a security expert")

options = 
  ClaudeCodeSDK.OptionBuilder.build_analysis_options()
  |> ClaudeCodeSDK.OptionBuilder.with_system_prompt("You are a security expert")

with_system_prompt(options, prompt)

@spec with_system_prompt(ClaudeCodeSDK.Options.t(), String.t()) ::
  ClaudeCodeSDK.Options.t()

with_turn_limit(options, turns)

Sets a custom turn limit for any options.

Parameters

  • options - Options struct to modify
  • turns - Maximum number of turns

Examples

options = 
  ClaudeCodeSDK.OptionBuilder.build_chat_options()
  |> ClaudeCodeSDK.OptionBuilder.with_turn_limit(5)

with_working_directory(cwd)

@spec with_working_directory(String.t()) :: ClaudeCodeSDK.Options.t()

Adds a custom working directory to any options.

Parameters

  • cwd - Working directory path
  • options - Options struct to modify (optional, creates new if not provided)

Examples

options = ClaudeCodeSDK.OptionBuilder.with_working_directory("/project")

options = 
  ClaudeCodeSDK.OptionBuilder.build_development_options()
  |> ClaudeCodeSDK.OptionBuilder.with_working_directory("/project")

with_working_directory(options, cwd)

@spec with_working_directory(ClaudeCodeSDK.Options.t(), String.t()) ::
  ClaudeCodeSDK.Options.t()