From 9d4c04d9eb229840de7c648c7e711ea241d2d781 Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:33:42 -0700 Subject: [PATCH 1/6] feat: Add CI workflow for Claude Code SDK integration testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GitHub Actions workflow that runs on PR open/synchronize - Install Claude Code CLI via official install script - Run quickstart example and dedicated e2e tests - Test across Python 3.10-3.13 - Add basic integration tests and file operation tests šŸ¤– Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/workflows/claude-code-integration.yml | 57 +++++++++++ e2e-tests/test_basic_integration.py | 73 ++++++++++++++ e2e-tests/test_file_operations.py | 96 +++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 .github/workflows/claude-code-integration.yml create mode 100644 e2e-tests/test_basic_integration.py create mode 100644 e2e-tests/test_file_operations.py diff --git a/.github/workflows/claude-code-integration.yml b/.github/workflows/claude-code-integration.yml new file mode 100644 index 00000000..a15f407c --- /dev/null +++ b/.github/workflows/claude-code-integration.yml @@ -0,0 +1,57 @@ +name: Claude Code Integration Test + +on: + pull_request: + types: [opened, synchronize] + +jobs: + integration-test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13"] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Claude Code + run: | + curl -fsSL https://claude.ai/install.sh | bash + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Verify Claude Code installation + run: | + export PATH="$HOME/.local/bin:$PATH" + claude -v + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install -e . + + - name: Run quickstart example + run: | + export PATH="$HOME/.local/bin:$PATH" + cd examples + python quick_start.py + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + + - name: Run basic integration tests + run: | + export PATH="$HOME/.local/bin:$PATH" + python e2e-tests/test_basic_integration.py + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + + - name: Run file operation tests + run: | + export PATH="$HOME/.local/bin:$PATH" + python e2e-tests/test_file_operations.py + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} diff --git a/e2e-tests/test_basic_integration.py b/e2e-tests/test_basic_integration.py new file mode 100644 index 00000000..b77d889e --- /dev/null +++ b/e2e-tests/test_basic_integration.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Basic integration test for Claude Code SDK.""" + +import anyio + +from claude_code_sdk import AssistantMessage, TextBlock, query + + +async def test_basic_query(): + """Test basic query functionality.""" + print("Testing basic query...") + found_response = False + + async for message in query(prompt="What is 2 + 2?"): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f"Response: {block.text}") + found_response = True + + if not found_response: + raise Exception("No response received from Claude") + + print("āœ… Basic query test passed") + + +async def test_with_system_prompt(): + """Test query with custom system prompt.""" + print("\nTesting with system prompt...") + found_response = False + + from claude_code_sdk import ClaudeCodeOptions + + options = ClaudeCodeOptions( + system_prompt="You are a helpful assistant that answers concisely.", + max_turns=1, + ) + + async for message in query( + prompt="What is Python in one sentence?", options=options + ): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f"Response: {block.text}") + found_response = True + + if not found_response: + raise Exception("No response received from Claude") + + print("āœ… System prompt test passed") + + +async def main(): + """Run all integration tests.""" + print("=" * 50) + print("Running Claude Code SDK Integration Tests") + print("=" * 50) + + try: + await test_basic_query() + await test_with_system_prompt() + + print("\n" + "=" * 50) + print("āœ… All integration tests passed!") + print("=" * 50) + except Exception as e: + print(f"\nāŒ Integration test failed: {e}") + raise + + +if __name__ == "__main__": + anyio.run(main()) \ No newline at end of file diff --git a/e2e-tests/test_file_operations.py b/e2e-tests/test_file_operations.py new file mode 100644 index 00000000..cd5e80c1 --- /dev/null +++ b/e2e-tests/test_file_operations.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""Test file operations with Claude Code SDK.""" + +import os +import tempfile +import anyio +from pathlib import Path + +from claude_code_sdk import AssistantMessage, ClaudeCodeOptions, TextBlock, query + + +async def test_file_creation(): + """Test file creation through SDK.""" + print("Testing file creation...") + + with tempfile.TemporaryDirectory() as tmpdir: + test_file = Path(tmpdir) / "test_output.txt" + + options = ClaudeCodeOptions( + allowed_tools=["Write"], + system_prompt="You are a helpful file assistant. Be concise.", + max_turns=1, + ) + + prompt = f"Create a file at {test_file} with content 'Hello from Claude Code SDK!'" + + async for message in query(prompt=prompt, options=options): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f"Claude: {block.text[:100]}...") # Print first 100 chars + + # Verify file was created + if not test_file.exists(): + raise Exception(f"File {test_file} was not created") + + content = test_file.read_text() + if "Hello from Claude Code SDK!" not in content: + raise Exception(f"File content incorrect: {content}") + + print(f"āœ… File created successfully with correct content") + + +async def test_file_reading(): + """Test file reading through SDK.""" + print("\nTesting file reading...") + + with tempfile.TemporaryDirectory() as tmpdir: + test_file = Path(tmpdir) / "input.txt" + test_content = "This is a test file for Claude Code SDK e2e testing." + test_file.write_text(test_content) + + options = ClaudeCodeOptions( + allowed_tools=["Read"], + system_prompt="You are a helpful file assistant. Be concise.", + max_turns=1, + ) + + prompt = f"Read the file at {test_file} and tell me the first word in the file" + + found_response = False + async for message in query(prompt=prompt, options=options): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f"Claude: {block.text[:100]}...") + # Check if Claude identified "This" as the first word + if "This" in block.text or "this" in block.text.lower(): + found_response = True + + if not found_response: + raise Exception("Claude did not identify the first word correctly") + + print("āœ… File reading test passed") + + +async def main(): + """Run file operation tests.""" + print("=" * 50) + print("Running File Operation Tests") + print("=" * 50) + + try: + await test_file_creation() + await test_file_reading() + + print("\n" + "=" * 50) + print("āœ… All file operation tests passed!") + print("=" * 50) + except Exception as e: + print(f"\nāŒ File operation test failed: {e}") + raise + + +if __name__ == "__main__": + anyio.run(main()) \ No newline at end of file From 75f97f25f27c72e04253f014c7718631844fd5bd Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:36:58 -0700 Subject: [PATCH 2/6] fix: Correct anyio.run() syntax in e2e tests Remove parentheses from main function in anyio.run() call --- e2e-tests/test_basic_integration.py | 2 +- e2e-tests/test_file_operations.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e-tests/test_basic_integration.py b/e2e-tests/test_basic_integration.py index b77d889e..b577a00a 100644 --- a/e2e-tests/test_basic_integration.py +++ b/e2e-tests/test_basic_integration.py @@ -70,4 +70,4 @@ async def main(): if __name__ == "__main__": - anyio.run(main()) \ No newline at end of file + anyio.run(main) \ No newline at end of file diff --git a/e2e-tests/test_file_operations.py b/e2e-tests/test_file_operations.py index cd5e80c1..2eb0b923 100644 --- a/e2e-tests/test_file_operations.py +++ b/e2e-tests/test_file_operations.py @@ -93,4 +93,4 @@ async def main(): if __name__ == "__main__": - anyio.run(main()) \ No newline at end of file + anyio.run(main) \ No newline at end of file From a277571b342b5938553032e99a8514d9cb10f9ab Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:40:02 -0700 Subject: [PATCH 3/6] fix: Make file reading test more robust - Change test to check for file content rather than specific word extraction - Add system prompt for consistency - Check for key phrases in response to validate file was read --- e2e-tests/test_file_operations.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/e2e-tests/test_file_operations.py b/e2e-tests/test_file_operations.py index 2eb0b923..ff3221b0 100644 --- a/e2e-tests/test_file_operations.py +++ b/e2e-tests/test_file_operations.py @@ -47,7 +47,7 @@ async def test_file_reading(): with tempfile.TemporaryDirectory() as tmpdir: test_file = Path(tmpdir) / "input.txt" - test_content = "This is a test file for Claude Code SDK e2e testing." + test_content = "Hello world from Claude Code SDK e2e testing." test_file.write_text(test_content) options = ClaudeCodeOptions( @@ -56,7 +56,7 @@ async def test_file_reading(): max_turns=1, ) - prompt = f"Read the file at {test_file} and tell me the first word in the file" + prompt = f"Read the file at {test_file} and tell me what it says" found_response = False async for message in query(prompt=prompt, options=options): @@ -64,12 +64,12 @@ async def test_file_reading(): for block in message.content: if isinstance(block, TextBlock): print(f"Claude: {block.text[:100]}...") - # Check if Claude identified "This" as the first word - if "This" in block.text or "this" in block.text.lower(): + # Check if Claude read the file content + if "hello" in block.text.lower() or "claude code sdk" in block.text.lower(): found_response = True if not found_response: - raise Exception("Claude did not identify the first word correctly") + raise Exception("Claude did not read the file content correctly") print("āœ… File reading test passed") From 09da2aad138966c6c2a2db58d74a289ef54c863a Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:51:04 -0700 Subject: [PATCH 4/6] simplify: Run example files directly in CI tests - Remove custom e2e test files - Run examples/quick_start.py directly - Run examples/streaming_mode.py with 120s timeout - Remove || true to properly fail on errors --- .github/workflows/claude-code-integration.yml | 14 +-- e2e-tests/test_basic_integration.py | 73 ------------ e2e-tests/test_file_operations.py | 96 ---------------- e2e-tests/test_quickstart.py | 107 ++++++++++++++++++ hello.txt | 1 + 5 files changed, 111 insertions(+), 180 deletions(-) delete mode 100644 e2e-tests/test_basic_integration.py delete mode 100644 e2e-tests/test_file_operations.py create mode 100644 e2e-tests/test_quickstart.py create mode 100644 hello.txt diff --git a/.github/workflows/claude-code-integration.yml b/.github/workflows/claude-code-integration.yml index a15f407c..71b4546e 100644 --- a/.github/workflows/claude-code-integration.yml +++ b/.github/workflows/claude-code-integration.yml @@ -37,21 +37,13 @@ jobs: - name: Run quickstart example run: | export PATH="$HOME/.local/bin:$PATH" - cd examples - python quick_start.py + python examples/quick_start.py env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - - name: Run basic integration tests + - name: Run streaming mode examples run: | export PATH="$HOME/.local/bin:$PATH" - python e2e-tests/test_basic_integration.py - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - - - name: Run file operation tests - run: | - export PATH="$HOME/.local/bin:$PATH" - python e2e-tests/test_file_operations.py + timeout 120 python examples/streaming_mode.py all env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} diff --git a/e2e-tests/test_basic_integration.py b/e2e-tests/test_basic_integration.py deleted file mode 100644 index b577a00a..00000000 --- a/e2e-tests/test_basic_integration.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 -"""Basic integration test for Claude Code SDK.""" - -import anyio - -from claude_code_sdk import AssistantMessage, TextBlock, query - - -async def test_basic_query(): - """Test basic query functionality.""" - print("Testing basic query...") - found_response = False - - async for message in query(prompt="What is 2 + 2?"): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f"Response: {block.text}") - found_response = True - - if not found_response: - raise Exception("No response received from Claude") - - print("āœ… Basic query test passed") - - -async def test_with_system_prompt(): - """Test query with custom system prompt.""" - print("\nTesting with system prompt...") - found_response = False - - from claude_code_sdk import ClaudeCodeOptions - - options = ClaudeCodeOptions( - system_prompt="You are a helpful assistant that answers concisely.", - max_turns=1, - ) - - async for message in query( - prompt="What is Python in one sentence?", options=options - ): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f"Response: {block.text}") - found_response = True - - if not found_response: - raise Exception("No response received from Claude") - - print("āœ… System prompt test passed") - - -async def main(): - """Run all integration tests.""" - print("=" * 50) - print("Running Claude Code SDK Integration Tests") - print("=" * 50) - - try: - await test_basic_query() - await test_with_system_prompt() - - print("\n" + "=" * 50) - print("āœ… All integration tests passed!") - print("=" * 50) - except Exception as e: - print(f"\nāŒ Integration test failed: {e}") - raise - - -if __name__ == "__main__": - anyio.run(main) \ No newline at end of file diff --git a/e2e-tests/test_file_operations.py b/e2e-tests/test_file_operations.py deleted file mode 100644 index ff3221b0..00000000 --- a/e2e-tests/test_file_operations.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 -"""Test file operations with Claude Code SDK.""" - -import os -import tempfile -import anyio -from pathlib import Path - -from claude_code_sdk import AssistantMessage, ClaudeCodeOptions, TextBlock, query - - -async def test_file_creation(): - """Test file creation through SDK.""" - print("Testing file creation...") - - with tempfile.TemporaryDirectory() as tmpdir: - test_file = Path(tmpdir) / "test_output.txt" - - options = ClaudeCodeOptions( - allowed_tools=["Write"], - system_prompt="You are a helpful file assistant. Be concise.", - max_turns=1, - ) - - prompt = f"Create a file at {test_file} with content 'Hello from Claude Code SDK!'" - - async for message in query(prompt=prompt, options=options): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f"Claude: {block.text[:100]}...") # Print first 100 chars - - # Verify file was created - if not test_file.exists(): - raise Exception(f"File {test_file} was not created") - - content = test_file.read_text() - if "Hello from Claude Code SDK!" not in content: - raise Exception(f"File content incorrect: {content}") - - print(f"āœ… File created successfully with correct content") - - -async def test_file_reading(): - """Test file reading through SDK.""" - print("\nTesting file reading...") - - with tempfile.TemporaryDirectory() as tmpdir: - test_file = Path(tmpdir) / "input.txt" - test_content = "Hello world from Claude Code SDK e2e testing." - test_file.write_text(test_content) - - options = ClaudeCodeOptions( - allowed_tools=["Read"], - system_prompt="You are a helpful file assistant. Be concise.", - max_turns=1, - ) - - prompt = f"Read the file at {test_file} and tell me what it says" - - found_response = False - async for message in query(prompt=prompt, options=options): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f"Claude: {block.text[:100]}...") - # Check if Claude read the file content - if "hello" in block.text.lower() or "claude code sdk" in block.text.lower(): - found_response = True - - if not found_response: - raise Exception("Claude did not read the file content correctly") - - print("āœ… File reading test passed") - - -async def main(): - """Run file operation tests.""" - print("=" * 50) - print("Running File Operation Tests") - print("=" * 50) - - try: - await test_file_creation() - await test_file_reading() - - print("\n" + "=" * 50) - print("āœ… All file operation tests passed!") - print("=" * 50) - except Exception as e: - print(f"\nāŒ File operation test failed: {e}") - raise - - -if __name__ == "__main__": - anyio.run(main) \ No newline at end of file diff --git a/e2e-tests/test_quickstart.py b/e2e-tests/test_quickstart.py new file mode 100644 index 00000000..675c4d79 --- /dev/null +++ b/e2e-tests/test_quickstart.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +"""E2E test based on quickstart examples.""" + +import anyio + +from claude_code_sdk import ( + AssistantMessage, + ClaudeCodeOptions, + ResultMessage, + TextBlock, + query, +) + + +async def test_basic_example(): + """Test basic example - simple question.""" + print("Testing basic example...") + + found_response = False + async for message in query(prompt="What is 2 + 2?"): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f" Response: {block.text}") + found_response = True + + if not found_response: + raise Exception("No response received for basic example") + print("āœ… Basic example test passed") + + +async def test_with_options_example(): + """Test example with custom options.""" + print("\nTesting with options example...") + + options = ClaudeCodeOptions( + system_prompt="You are a helpful assistant that explains things simply.", + max_turns=1, + ) + + found_response = False + async for message in query( + prompt="Explain what Python is in one sentence.", options=options + ): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f" Response: {block.text}") + found_response = True + + if not found_response: + raise Exception("No response received for options example") + print("āœ… Options example test passed") + + +async def test_with_tools_example(): + """Test example using tools.""" + print("\nTesting with tools example...") + + options = ClaudeCodeOptions( + allowed_tools=["Read", "Write"], + system_prompt="You are a helpful file assistant.", + ) + + found_response = False + found_cost = False + async for message in query( + prompt="Create a file called hello.txt with 'Hello, World!' in it", + options=options, + ): + if isinstance(message, AssistantMessage): + for block in message.content: + if isinstance(block, TextBlock): + print(f" Response: {block.text[:100]}...") + found_response = True + elif isinstance(message, ResultMessage) and message.total_cost_usd > 0: + print(f" Cost: ${message.total_cost_usd:.4f}") + found_cost = True + + if not found_response: + raise Exception("No response received for tools example") + if not found_cost: + print(" Note: Cost information not available (might be expected)") + print("āœ… Tools example test passed") + + +async def main(): + """Run all quickstart tests.""" + print("=" * 50) + print("Running Quickstart E2E Tests") + print("=" * 50) + + try: + await test_basic_example() + await test_with_options_example() + await test_with_tools_example() + + print("\n" + "=" * 50) + print("āœ… All quickstart tests passed!") + print("=" * 50) + except Exception as e: + print(f"\nāŒ Test failed: {e}") + raise + + +if __name__ == "__main__": + anyio.run(main) \ No newline at end of file diff --git a/hello.txt b/hello.txt new file mode 100644 index 00000000..b45ef6fe --- /dev/null +++ b/hello.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file From 2974d976dbd71b32969b499dc92165cfeb9436cb Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:54:12 -0700 Subject: [PATCH 5/6] rename --- ...aude-code-integration.yml => test-e2e.yml} | 0 e2e-tests/test_quickstart.py | 107 ------------------ 2 files changed, 107 deletions(-) rename .github/workflows/{claude-code-integration.yml => test-e2e.yml} (100%) delete mode 100644 e2e-tests/test_quickstart.py diff --git a/.github/workflows/claude-code-integration.yml b/.github/workflows/test-e2e.yml similarity index 100% rename from .github/workflows/claude-code-integration.yml rename to .github/workflows/test-e2e.yml diff --git a/e2e-tests/test_quickstart.py b/e2e-tests/test_quickstart.py deleted file mode 100644 index 675c4d79..00000000 --- a/e2e-tests/test_quickstart.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python3 -"""E2E test based on quickstart examples.""" - -import anyio - -from claude_code_sdk import ( - AssistantMessage, - ClaudeCodeOptions, - ResultMessage, - TextBlock, - query, -) - - -async def test_basic_example(): - """Test basic example - simple question.""" - print("Testing basic example...") - - found_response = False - async for message in query(prompt="What is 2 + 2?"): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f" Response: {block.text}") - found_response = True - - if not found_response: - raise Exception("No response received for basic example") - print("āœ… Basic example test passed") - - -async def test_with_options_example(): - """Test example with custom options.""" - print("\nTesting with options example...") - - options = ClaudeCodeOptions( - system_prompt="You are a helpful assistant that explains things simply.", - max_turns=1, - ) - - found_response = False - async for message in query( - prompt="Explain what Python is in one sentence.", options=options - ): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f" Response: {block.text}") - found_response = True - - if not found_response: - raise Exception("No response received for options example") - print("āœ… Options example test passed") - - -async def test_with_tools_example(): - """Test example using tools.""" - print("\nTesting with tools example...") - - options = ClaudeCodeOptions( - allowed_tools=["Read", "Write"], - system_prompt="You are a helpful file assistant.", - ) - - found_response = False - found_cost = False - async for message in query( - prompt="Create a file called hello.txt with 'Hello, World!' in it", - options=options, - ): - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock): - print(f" Response: {block.text[:100]}...") - found_response = True - elif isinstance(message, ResultMessage) and message.total_cost_usd > 0: - print(f" Cost: ${message.total_cost_usd:.4f}") - found_cost = True - - if not found_response: - raise Exception("No response received for tools example") - if not found_cost: - print(" Note: Cost information not available (might be expected)") - print("āœ… Tools example test passed") - - -async def main(): - """Run all quickstart tests.""" - print("=" * 50) - print("Running Quickstart E2E Tests") - print("=" * 50) - - try: - await test_basic_example() - await test_with_options_example() - await test_with_tools_example() - - print("\n" + "=" * 50) - print("āœ… All quickstart tests passed!") - print("=" * 50) - except Exception as e: - print(f"\nāŒ Test failed: {e}") - raise - - -if __name__ == "__main__": - anyio.run(main) \ No newline at end of file From 8f89f070e995b87fb89d020fa4e7562a3f50110c Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Sat, 6 Sep 2025 21:56:28 -0700 Subject: [PATCH 6/6] fix: Remove redundant PATH exports in CI workflow The PATH is already updated via GITHUB_PATH in the install step, so we don't need to export it in every subsequent step. --- .github/workflows/test-e2e.yml | 14 ++++---------- hello.txt | 1 - 2 files changed, 4 insertions(+), 11 deletions(-) delete mode 100644 hello.txt diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 71b4546e..b9ffdb1d 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -1,4 +1,4 @@ -name: Claude Code Integration Test +name: Claude Code E2E Test on: pull_request: @@ -25,9 +25,7 @@ jobs: echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Verify Claude Code installation - run: | - export PATH="$HOME/.local/bin:$PATH" - claude -v + run: claude -v - name: Install Python dependencies run: | @@ -35,15 +33,11 @@ jobs: pip install -e . - name: Run quickstart example - run: | - export PATH="$HOME/.local/bin:$PATH" - python examples/quick_start.py + run: python examples/quick_start.py env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - name: Run streaming mode examples - run: | - export PATH="$HOME/.local/bin:$PATH" - timeout 120 python examples/streaming_mode.py all + run: timeout 120 python examples/streaming_mode.py all env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} diff --git a/hello.txt b/hello.txt deleted file mode 100644 index b45ef6fe..00000000 --- a/hello.txt +++ /dev/null @@ -1 +0,0 @@ -Hello, World! \ No newline at end of file