Current section

46 Versions

Jump to

Compare versions

31 files changed
+1419 additions
-1127 deletions
  @@ -5,7 +5,33 @@ All notable changes to this project will be documented in this file.
5 5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 7
8 - ## [Unreleased]
8 + ## [0.8.0] - 2026-01-06
9 +
10 + ### Changed
11 + - **BREAKING: Renamed message type modules** - Added "Message" suffix for clarity
12 + - `ClaudeCode.Message.Assistant``ClaudeCode.Message.AssistantMessage`
13 + - `ClaudeCode.Message.User``ClaudeCode.Message.UserMessage`
14 + - `ClaudeCode.Message.Result``ClaudeCode.Message.ResultMessage`
15 + - `ClaudeCode.Message.StreamEvent``ClaudeCode.Message.StreamEventMessage`
16 + - New `ClaudeCode.Message.SystemMessage` and `ClaudeCode.Message.CompactBoundaryMessage` message types
17 + - **BREAKING: Renamed content block modules** - Added "Block" suffix for consistency
18 + - `ClaudeCode.Content.Text``ClaudeCode.Content.TextBlock`
19 + - `ClaudeCode.Content.ToolUse``ClaudeCode.Content.ToolUseBlock`
20 + - `ClaudeCode.Content.ToolResult``ClaudeCode.Content.ToolResultBlock`
21 + - `ClaudeCode.Content.Thinking``ClaudeCode.Content.ThinkingBlock`
22 +
23 + ### Added
24 + - **New system message fields** - Support for additional Claude Code features
25 + - `:output_style` - Claude's configured output style
26 + - `:slash_commands` - Available slash commands
27 + - `:uuid` - Session UUID
28 + - **Extended message type fields** - Better access to API response metadata
29 + - `AssistantMessage`: `:priority`, `:sequence_id`, `:finalize_stack`
30 + - `ResultMessage`: `:session_id`, `:duration_ms`, `:usage`, `:parent_message_id`, `:sequence_id`
31 + - `UserMessage`: `:priority`, `:sequence_id`, `:finalize_stack`
32 +
33 + ### Fixed
34 + - **`:mcp_servers` option validation** - Fixed handling of MCP server configurations ([0c7e849])
9 35
10 36 ## [0.7.0] - 2026-01-02
  @@ -38,7 +38,7 @@ IO.puts(answer) # => "Your favorite language is Elixir!"
38 38 **Step 1:** Add to your `mix.exs`
39 39 ```elixir
40 40 def deps do
41 - [{:claude_code, "~> 0.7.0"}]
41 + [{:claude_code, "~> 0.8.0"}]
42 42 end
43 43 ```
  @@ -3,7 +3,7 @@
3 3 <<"https://github.com/guess/claude_code/blob/main/CHANGELOG.md">>},
4 4 {<<"GitHub">>,<<"https://github.com/guess/claude_code">>}]}.
5 5 {<<"name">>,<<"claude_code">>}.
6 - {<<"version">>,<<"0.7.0">>}.
6 + {<<"version">>,<<"0.8.0">>}.
7 7 {<<"description">>,<<"An idiomatic Elixir SDK for Claude Code AI assistant">>}.
8 8 {<<"elixir">>,<<"~> 1.18">>}.
9 9 {<<"app">>,<<"claude_code">>}.
  @@ -12,17 +12,19 @@
12 12 <<"lib/claude_code/message.ex">>,<<"lib/claude_code/session.ex">>,
13 13 <<"lib/claude_code/stream.ex">>,<<"lib/claude_code/types.ex">>,
14 14 <<"lib/claude_code/options.ex">>,<<"lib/claude_code/tool_callback.ex">>,
15 - <<"lib/claude_code/content">>,<<"lib/claude_code/content/tool_use.ex">>,
16 - <<"lib/claude_code/content/tool_result.ex">>,
17 - <<"lib/claude_code/content/thinking.ex">>,
18 - <<"lib/claude_code/content/text.ex">>,<<"lib/claude_code/message">>,
19 - <<"lib/claude_code/message/assistant.ex">>,
20 - <<"lib/claude_code/message/system.ex">>,
21 - <<"lib/claude_code/message/user.ex">>,
22 - <<"lib/claude_code/message/stream_event.ex">>,
23 - <<"lib/claude_code/message/result.ex">>,<<"lib/claude_code/mcp">>,
24 - <<"lib/claude_code/mcp/server.ex">>,<<"lib/claude_code/mcp/config.ex">>,
25 - <<"lib/claude_code/hooks">>,<<"lib/claude_code/cli.ex">>,
15 + <<"lib/claude_code/content">>,<<"lib/claude_code/content/text_block.ex">>,
16 + <<"lib/claude_code/content/tool_use_block.ex">>,
17 + <<"lib/claude_code/content/tool_result_block.ex">>,
18 + <<"lib/claude_code/content/thinking_block.ex">>,
19 + <<"lib/claude_code/message">>,
20 + <<"lib/claude_code/message/system_message.ex">>,
21 + <<"lib/claude_code/message/compact_boundary_message.ex">>,
22 + <<"lib/claude_code/message/stream_event_message.ex">>,
23 + <<"lib/claude_code/message/user_message.ex">>,
24 + <<"lib/claude_code/message/result_message.ex">>,
25 + <<"lib/claude_code/message/assistant_message.ex">>,
26 + <<"lib/claude_code/mcp">>,<<"lib/claude_code/mcp/server.ex">>,
27 + <<"lib/claude_code/mcp/config.ex">>,<<"lib/claude_code/cli.ex">>,
26 28 <<"lib/claude_code/mcp.ex">>,<<"lib/claude_code/content.ex">>,
27 29 <<"lib/claude_code/input.ex">>,<<"lib/claude_code.ex">>,
28 30 <<".formatter.exs">>,<<"mix.exs">>,<<"README.md">>,<<"LICENSE">>,
  @@ -82,12 +82,12 @@ defmodule ClaudeCode do
82 82 See `ClaudeCode.Supervisor` for advanced supervision patterns.
83 83 """
84 84
85 - alias ClaudeCode.Message.Result
85 + alias ClaudeCode.Message.ResultMessage
86 86 alias ClaudeCode.Session
87 87
88 88 @type session :: pid() | atom() | {:via, module(), any()}
89 89 @type query_response ::
90 - {:ok, Result.t()} | {:error, Result.t() | term()}
90 + {:ok, ResultMessage.t()} | {:error, ResultMessage.t() | term()}
91 91 @type message_stream :: Enumerable.t(ClaudeCode.Message.t())
92 92
93 93 @doc """
  @@ -165,7 +165,7 @@ defmodule ClaudeCode do
165 165 # Handle errors
166 166 case ClaudeCode.query(session, "Do something risky") do
167 167 {:ok, result} -> IO.puts(result.result)
168 - {:error, %ClaudeCode.Message.Result{is_error: true} = result} ->
168 + {:error, %ClaudeCode.Message.ResultMessage{is_error: true} = result} ->
169 169 IO.puts("Claude error: \#{result.result}")
170 170 {:error, :timeout} -> IO.puts("Request timed out")
171 171 {:error, reason} -> IO.puts("Error: \#{inspect(reason)}")
  @@ -6,12 +6,12 @@ defmodule ClaudeCode.Content do
6 6 This module provides functions to parse and work with any content type.
7 7 """
8 8
9 - alias ClaudeCode.Content.Text
10 - alias ClaudeCode.Content.Thinking
11 - alias ClaudeCode.Content.ToolResult
12 - alias ClaudeCode.Content.ToolUse
9 + alias ClaudeCode.Content.TextBlock
10 + alias ClaudeCode.Content.ThinkingBlock
11 + alias ClaudeCode.Content.ToolResultBlock
12 + alias ClaudeCode.Content.ToolUseBlock
13 13
14 - @type t :: Text.t() | Thinking.t() | ToolUse.t() | ToolResult.t()
14 + @type t :: TextBlock.t() | ThinkingBlock.t() | ToolUseBlock.t() | ToolResultBlock.t()
15 15
16 16 @doc """
17 17 Parses a content block from JSON data based on its type.
  @@ -19,7 +19,7 @@ defmodule ClaudeCode.Content do
19 19 ## Examples
20 20
21 21 iex> Content.parse(%{"type" => "text", "text" => "Hello"})
22 - {:ok, %Text{type: :text, text: "Hello"}}
22 + {:ok, %TextBlock{type: :text, text: "Hello"}}
23 23
24 24 iex> Content.parse(%{"type" => "unknown"})
25 25 {:error, {:unknown_content_type, "unknown"}}
  @@ -27,10 +27,10 @@ defmodule ClaudeCode.Content do
27 27 @spec parse(map()) :: {:ok, t()} | {:error, term()}
28 28 def parse(%{"type" => type} = data) do
29 29 case type do
30 - "text" -> Text.new(data)
31 - "thinking" -> Thinking.new(data)
32 - "tool_use" -> ToolUse.new(data)
33 - "tool_result" -> ToolResult.new(data)
30 + "text" -> TextBlock.new(data)
31 + "thinking" -> ThinkingBlock.new(data)
32 + "tool_use" -> ToolUseBlock.new(data)
33 + "tool_result" -> ToolResultBlock.new(data)
34 34 other -> {:error, {:unknown_content_type, other}}
35 35 end
36 36 end
  @@ -63,18 +63,18 @@ defmodule ClaudeCode.Content do
63 63 Checks if a value is any type of content block.
64 64 """
65 65 @spec content?(any()) :: boolean()
66 - def content?(%Text{}), do: true
67 - def content?(%Thinking{}), do: true
68 - def content?(%ToolUse{}), do: true
69 - def content?(%ToolResult{}), do: true
66 + def content?(%TextBlock{}), do: true
67 + def content?(%ThinkingBlock{}), do: true
68 + def content?(%ToolUseBlock{}), do: true
69 + def content?(%ToolResultBlock{}), do: true
70 70 def content?(_), do: false
71 71
72 72 @doc """
73 73 Returns the type of a content block.
74 74 """
75 75 @spec content_type(t()) :: :text | :thinking | :tool_use | :tool_result
76 - def content_type(%Text{type: type}), do: type
77 - def content_type(%Thinking{type: type}), do: type
78 - def content_type(%ToolUse{type: type}), do: type
79 - def content_type(%ToolResult{type: type}), do: type
76 + def content_type(%TextBlock{type: type}), do: type
77 + def content_type(%ThinkingBlock{type: type}), do: type
78 + def content_type(%ToolUseBlock{type: type}), do: type
79 + def content_type(%ToolResultBlock{type: type}), do: type
80 80 end
Loading more files…