claude_code 0.0.15 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.claude/settings.local.json +14 -0
- data/.rspec_status +98 -84
- data/USAGE_EXAMPLES.md +35 -35
- data/claude_code-0.0.16.gem +0 -0
- data/docs/README.md +27 -27
- data/docs/mcp_integration.md +64 -64
- data/docs/streaming.md +53 -53
- data/examples/irb_helpers.rb +21 -28
- data/lib/claude_code/client.rb +112 -82
- data/lib/claude_code/version.rb +1 -1
- data/lib/claude_code.rb +47 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88e44e3ea2b1c155610136e623727c86d60f5630a3909849610b4c38d44b7c91
|
4
|
+
data.tar.gz: b129d583355c94715ef4bd445278b21ac3857ecec645bbf48abe819561cb6413
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da82cb9302e5d524fccf3941adb47373845e208095ad405cf71f055e8f8a760670324d158df7480c9d2275a4796beed2b2cbc2949e232fb25e73824a2cd65f7c
|
7
|
+
data.tar.gz: 3bdfb4b91363e84d0e377e9f789487f4785882eda2e680cfd66c14b09f8f7b44647941fb23834aafea35df7766e11cf2d9dbaa1ef560d97a959140b7a74a57a1
|
data/.rspec_status
CHANGED
@@ -1,114 +1,128 @@
|
|
1
1
|
example_id | status | run_time |
|
2
2
|
-------------------------------------------------- | ------ | --------------- |
|
3
|
-
./spec/claude_code/
|
4
|
-
./spec/claude_code/
|
5
|
-
./spec/claude_code/
|
6
|
-
./spec/claude_code/
|
7
|
-
./spec/claude_code/
|
8
|
-
./spec/claude_code/
|
9
|
-
./spec/claude_code/
|
10
|
-
./spec/claude_code/
|
11
|
-
./spec/claude_code/
|
12
|
-
./spec/claude_code/
|
3
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:1:1] | passed | 0.0008 seconds |
|
4
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:1:2] | passed | 0.00004 seconds |
|
5
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:1:3] | passed | 0.00004 seconds |
|
6
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:1:4] | passed | 0.00003 seconds |
|
7
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:2:1] | passed | 0.00003 seconds |
|
8
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:2:2] | passed | 0.00003 seconds |
|
9
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:2:3] | passed | 0.00003 seconds |
|
10
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:2:4] | passed | 0.00004 seconds |
|
11
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:2:5] | passed | 0.00004 seconds |
|
12
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:3:1] | passed | 0.00012 seconds |
|
13
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:3:2] | passed | 0.00003 seconds |
|
14
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:3:3] | passed | 0.00003 seconds |
|
15
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:4:1] | passed | 0.00007 seconds |
|
16
|
+
./spec/claude_code/add_mcp_server_spec.rb[1:1:5:1] | passed | 0.00004 seconds |
|
17
|
+
./spec/claude_code/client_spec.rb[1:1:1:1] | passed | 0.00039 seconds |
|
18
|
+
./spec/claude_code/client_spec.rb[1:1:1:2] | passed | 0.00043 seconds |
|
19
|
+
./spec/claude_code/client_spec.rb[1:1:1:3] | passed | 0.0005 seconds |
|
20
|
+
./spec/claude_code/client_spec.rb[1:1:1:4] | passed | 0.00044 seconds |
|
21
|
+
./spec/claude_code/client_spec.rb[1:1:2:1] | passed | 0.00019 seconds |
|
22
|
+
./spec/claude_code/client_spec.rb[1:1:3:1] | passed | 0.00012 seconds |
|
23
|
+
./spec/claude_code/client_spec.rb[1:1:4:1] | passed | 0.00035 seconds |
|
24
|
+
./spec/claude_code/client_spec.rb[1:1:5:1] | passed | 0.00032 seconds |
|
25
|
+
./spec/claude_code/client_spec.rb[1:1:5:2] | passed | 0.00036 seconds |
|
26
|
+
./spec/claude_code/client_spec.rb[1:1:5:3] | passed | 0.00033 seconds |
|
13
27
|
./spec/claude_code/client_spec.rb[1:2:1] | passed | 0.00007 seconds |
|
14
|
-
./spec/claude_code/client_spec.rb[1:2:2] | passed | 0.
|
28
|
+
./spec/claude_code/client_spec.rb[1:2:2] | passed | 0.00018 seconds |
|
15
29
|
./spec/claude_code/client_spec.rb[1:2:3] | passed | 0.00018 seconds |
|
16
|
-
./spec/claude_code/client_spec.rb[1:2:4] | passed | 0.
|
17
|
-
./spec/claude_code/client_spec.rb[1:3:1:1] | passed | 0.
|
30
|
+
./spec/claude_code/client_spec.rb[1:2:4] | passed | 0.00023 seconds |
|
31
|
+
./spec/claude_code/client_spec.rb[1:3:1:1] | passed | 0.00003 seconds |
|
18
32
|
./spec/claude_code/client_spec.rb[1:3:1:2] | passed | 0.00004 seconds |
|
19
|
-
./spec/claude_code/client_spec.rb[1:3:2:1] | passed | 0.
|
33
|
+
./spec/claude_code/client_spec.rb[1:3:2:1] | passed | 0.00003 seconds |
|
20
34
|
./spec/claude_code/client_spec.rb[1:3:3:1] | passed | 0.00004 seconds |
|
21
|
-
./spec/claude_code/client_spec.rb[1:3:4:1] | passed | 0.
|
35
|
+
./spec/claude_code/client_spec.rb[1:3:4:1] | passed | 0.00004 seconds |
|
22
36
|
./spec/claude_code/client_spec.rb[1:3:5:1] | passed | 0.00003 seconds |
|
23
|
-
./spec/claude_code/client_spec.rb[1:3:5:2] | passed | 0.
|
37
|
+
./spec/claude_code/client_spec.rb[1:3:5:2] | passed | 0.00004 seconds |
|
24
38
|
./spec/claude_code/client_spec.rb[1:3:6:1] | passed | 0.00004 seconds |
|
25
|
-
./spec/claude_code/client_spec.rb[1:3:6:2] | passed | 0.
|
26
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:1:1:1] | passed | 0.
|
27
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:1:1:2] | passed | 0.
|
28
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:1:2:1] | passed | 0.
|
29
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:1:3:1] | passed | 0.
|
39
|
+
./spec/claude_code/client_spec.rb[1:3:6:2] | passed | 0.00004 seconds |
|
40
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:1:1:1] | passed | 0.0004 seconds |
|
41
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:1:1:2] | passed | 0.00045 seconds |
|
42
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:1:2:1] | passed | 0.00016 seconds |
|
43
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:1:3:1] | passed | 0.00034 seconds |
|
30
44
|
./spec/claude_code/subprocess_cli_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
31
45
|
./spec/claude_code/subprocess_cli_spec.rb[1:2:2] | passed | 0.00006 seconds |
|
32
46
|
./spec/claude_code/subprocess_cli_spec.rb[1:2:3] | passed | 0.00004 seconds |
|
33
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:2:4] | passed | 0.
|
34
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:3:1] | passed | 0.
|
35
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:3:2] | passed | 0.
|
36
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:3:3] | passed | 0.
|
47
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:2:4] | passed | 0.00008 seconds |
|
48
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:3:1] | passed | 0.00112 seconds |
|
49
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:3:2] | passed | 0.00018 seconds |
|
50
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:3:3] | passed | 0.00031 seconds |
|
37
51
|
./spec/claude_code/subprocess_cli_spec.rb[1:4:1] | passed | 0.00004 seconds |
|
38
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:4:2] | passed | 0.
|
39
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:4:3] | passed | 0.
|
40
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:5:1] | passed | 0.
|
41
|
-
./spec/claude_code/subprocess_cli_spec.rb[1:5:2] | passed | 0.
|
42
|
-
./spec/claude_code_spec.rb[1:1] | passed | 0.
|
43
|
-
./spec/claude_code_spec.rb[1:2:1] | passed | 0.
|
44
|
-
./spec/claude_code_spec.rb[1:2:2] | passed | 0.
|
45
|
-
./spec/claude_code_spec.rb[1:2:3] | passed | 0.
|
46
|
-
./spec/claude_code_spec.rb[1:2:4] | passed | 0.
|
47
|
-
./spec/claude_code_spec.rb[1:2:5] | passed | 0.
|
48
|
-
./spec/claude_code_spec.rb[1:2:6] | passed | 0.
|
49
|
-
./spec/claude_code_spec.rb[1:3:1] | passed | 0.
|
50
|
-
./spec/claude_code_spec.rb[1:3:2] | passed | 0.
|
51
|
-
./spec/claude_code_spec.rb[1:3:3] | passed | 0.
|
52
|
-
./spec/claude_code_spec.rb[1:3:4] | passed | 0.
|
53
|
-
./spec/claude_code_spec.rb[1:4:1] | passed | 0.
|
54
|
-
./spec/claude_code_spec.rb[1:4:2] | passed | 0.
|
55
|
-
./spec/claude_code_spec.rb[1:4:3] | passed | 0.
|
52
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:4:2] | passed | 0.00012 seconds |
|
53
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:4:3] | passed | 0.00251 seconds |
|
54
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:5:1] | passed | 0.00022 seconds |
|
55
|
+
./spec/claude_code/subprocess_cli_spec.rb[1:5:2] | passed | 0.00026 seconds |
|
56
|
+
./spec/claude_code_spec.rb[1:1] | passed | 0.00281 seconds |
|
57
|
+
./spec/claude_code_spec.rb[1:2:1] | passed | 0.00026 seconds |
|
58
|
+
./spec/claude_code_spec.rb[1:2:2] | passed | 0.0014 seconds |
|
59
|
+
./spec/claude_code_spec.rb[1:2:3] | passed | 0.00016 seconds |
|
60
|
+
./spec/claude_code_spec.rb[1:2:4] | passed | 0.00016 seconds |
|
61
|
+
./spec/claude_code_spec.rb[1:2:5] | passed | 0.00018 seconds |
|
62
|
+
./spec/claude_code_spec.rb[1:2:6] | passed | 0.00019 seconds |
|
63
|
+
./spec/claude_code_spec.rb[1:3:1] | passed | 0.0002 seconds |
|
64
|
+
./spec/claude_code_spec.rb[1:3:2] | passed | 0.00031 seconds |
|
65
|
+
./spec/claude_code_spec.rb[1:3:3] | passed | 0.00041 seconds |
|
66
|
+
./spec/claude_code_spec.rb[1:3:4] | passed | 0.00027 seconds |
|
67
|
+
./spec/claude_code_spec.rb[1:4:1] | passed | 0.0002 seconds |
|
68
|
+
./spec/claude_code_spec.rb[1:4:2] | passed | 0.00016 seconds |
|
69
|
+
./spec/claude_code_spec.rb[1:4:3] | passed | 0.00052 seconds |
|
56
70
|
./spec/claude_code_spec.rb[1:5:1] | passed | 0.00014 seconds |
|
57
|
-
./spec/claude_code_spec.rb[1:5:2] | passed | 0.
|
58
|
-
./spec/claude_code_spec.rb[1:6:1] | passed | 0.
|
59
|
-
./spec/claude_code_spec.rb[1:6:2] | passed | 0.
|
60
|
-
./spec/claude_code_spec.rb[1:6:3] | passed | 0.
|
61
|
-
./spec/claude_code_spec.rb[1:7:1] | passed | 0.
|
71
|
+
./spec/claude_code_spec.rb[1:5:2] | passed | 0.00026 seconds |
|
72
|
+
./spec/claude_code_spec.rb[1:6:1] | passed | 0.00047 seconds |
|
73
|
+
./spec/claude_code_spec.rb[1:6:2] | passed | 0.00022 seconds |
|
74
|
+
./spec/claude_code_spec.rb[1:6:3] | passed | 0.00048 seconds |
|
75
|
+
./spec/claude_code_spec.rb[1:7:1] | passed | 0.0001 seconds |
|
62
76
|
./spec/claude_code_spec.rb[1:7:2] | passed | 0.00011 seconds |
|
63
|
-
./spec/claude_code_spec.rb[1:8:1] | passed | 0.
|
64
|
-
./spec/claude_code_spec.rb[1:8:2] | passed | 0.
|
65
|
-
./spec/claude_code_spec.rb[1:9:1:1] | passed | 0.
|
66
|
-
./spec/claude_code_spec.rb[1:9:1:2] | passed | 0.
|
67
|
-
./spec/claude_code_spec.rb[1:9:1:3] | passed | 0.
|
68
|
-
./spec/errors_spec.rb[1:1:1:1] | passed | 0.
|
77
|
+
./spec/claude_code_spec.rb[1:8:1] | passed | 0.00048 seconds |
|
78
|
+
./spec/claude_code_spec.rb[1:8:2] | passed | 0.00096 seconds |
|
79
|
+
./spec/claude_code_spec.rb[1:9:1:1] | passed | 0.00054 seconds |
|
80
|
+
./spec/claude_code_spec.rb[1:9:1:2] | passed | 0.00015 seconds |
|
81
|
+
./spec/claude_code_spec.rb[1:9:1:3] | passed | 0.00011 seconds |
|
82
|
+
./spec/errors_spec.rb[1:1:1:1] | passed | 0.00003 seconds |
|
69
83
|
./spec/errors_spec.rb[1:1:1:2] | passed | 0.00003 seconds |
|
70
|
-
./spec/errors_spec.rb[1:1:2:1] | passed | 0.
|
84
|
+
./spec/errors_spec.rb[1:1:2:1] | passed | 0.00003 seconds |
|
71
85
|
./spec/errors_spec.rb[1:1:2:2] | passed | 0.00003 seconds |
|
72
86
|
./spec/errors_spec.rb[1:1:2:3] | passed | 0.00003 seconds |
|
73
87
|
./spec/errors_spec.rb[1:1:2:4] | passed | 0.00003 seconds |
|
74
|
-
./spec/errors_spec.rb[1:1:3:1] | passed | 0.
|
75
|
-
./spec/errors_spec.rb[1:1:3:2] | passed | 0.
|
88
|
+
./spec/errors_spec.rb[1:1:3:1] | passed | 0.00003 seconds |
|
89
|
+
./spec/errors_spec.rb[1:1:3:2] | passed | 0.00003 seconds |
|
76
90
|
./spec/errors_spec.rb[1:1:4:1] | passed | 0.00003 seconds |
|
77
|
-
./spec/errors_spec.rb[1:1:4:2] | passed | 0.
|
91
|
+
./spec/errors_spec.rb[1:1:4:2] | passed | 0.00003 seconds |
|
78
92
|
./spec/errors_spec.rb[1:1:4:3] | passed | 0.00003 seconds |
|
79
93
|
./spec/errors_spec.rb[1:1:4:4] | passed | 0.00004 seconds |
|
80
|
-
./spec/errors_spec.rb[1:1:4:5] | passed | 0.
|
81
|
-
./spec/errors_spec.rb[1:1:5:1] | passed | 0.
|
82
|
-
./spec/errors_spec.rb[1:1:5:2] | passed | 0.
|
83
|
-
./spec/errors_spec.rb[1:1:5:3] | passed | 0.
|
84
|
-
./spec/errors_spec.rb[1:1:5:4] | passed | 0.
|
85
|
-
./spec/errors_spec.rb[1:2:1] | passed | 0.
|
86
|
-
./spec/errors_spec.rb[1:2:2] | passed | 0.
|
87
|
-
./spec/errors_spec.rb[1:2:3] | passed | 0.
|
88
|
-
./spec/errors_spec.rb[1:2:4] | passed | 0.
|
89
|
-
./spec/errors_spec.rb[1:2:5] | passed | 0.
|
90
|
-
./spec/integration/claude_code_spec.rb[1:1:1:1] | passed | 0.
|
91
|
-
./spec/integration/claude_code_spec.rb[1:1:2:1] | passed | 0.
|
92
|
-
./spec/integration/claude_code_spec.rb[1:1:3:1] | passed | 0.
|
93
|
-
./spec/integration/claude_code_spec.rb[1:1:4:1] | passed | 0.
|
94
|
-
./spec/integration/claude_code_spec.rb[1:1:5:1] | passed | 0.
|
94
|
+
./spec/errors_spec.rb[1:1:4:5] | passed | 0.00003 seconds |
|
95
|
+
./spec/errors_spec.rb[1:1:5:1] | passed | 0.00003 seconds |
|
96
|
+
./spec/errors_spec.rb[1:1:5:2] | passed | 0.00004 seconds |
|
97
|
+
./spec/errors_spec.rb[1:1:5:3] | passed | 0.00037 seconds |
|
98
|
+
./spec/errors_spec.rb[1:1:5:4] | passed | 0.00004 seconds |
|
99
|
+
./spec/errors_spec.rb[1:2:1] | passed | 0.00031 seconds |
|
100
|
+
./spec/errors_spec.rb[1:2:2] | passed | 0.00016 seconds |
|
101
|
+
./spec/errors_spec.rb[1:2:3] | passed | 0.00014 seconds |
|
102
|
+
./spec/errors_spec.rb[1:2:4] | passed | 0.00018 seconds |
|
103
|
+
./spec/errors_spec.rb[1:2:5] | passed | 0.00014 seconds |
|
104
|
+
./spec/integration/claude_code_spec.rb[1:1:1:1] | passed | 0.00074 seconds |
|
105
|
+
./spec/integration/claude_code_spec.rb[1:1:2:1] | passed | 0.00395 seconds |
|
106
|
+
./spec/integration/claude_code_spec.rb[1:1:3:1] | passed | 0.00289 seconds |
|
107
|
+
./spec/integration/claude_code_spec.rb[1:1:4:1] | passed | 0.0004 seconds |
|
108
|
+
./spec/integration/claude_code_spec.rb[1:1:5:1] | passed | 0.00039 seconds |
|
95
109
|
./spec/jsonl_helpers_spec.rb[1:1:1] | passed | 0.00003 seconds |
|
96
|
-
./spec/jsonl_helpers_spec.rb[1:1:2] | passed | 0.
|
97
|
-
./spec/jsonl_helpers_spec.rb[1:1:3] | passed | 0.
|
98
|
-
./spec/jsonl_helpers_spec.rb[1:1:4] | passed | 0.
|
99
|
-
./spec/jsonl_helpers_spec.rb[1:2:1] | passed | 0.
|
110
|
+
./spec/jsonl_helpers_spec.rb[1:1:2] | passed | 0.00002 seconds |
|
111
|
+
./spec/jsonl_helpers_spec.rb[1:1:3] | passed | 0.00003 seconds |
|
112
|
+
./spec/jsonl_helpers_spec.rb[1:1:4] | passed | 0.00003 seconds |
|
113
|
+
./spec/jsonl_helpers_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
100
114
|
./spec/jsonl_helpers_spec.rb[1:2:2] | passed | 0.00003 seconds |
|
101
115
|
./spec/jsonl_helpers_spec.rb[1:2:3] | passed | 0.00003 seconds |
|
102
116
|
./spec/jsonl_helpers_spec.rb[1:2:4] | passed | 0.00003 seconds |
|
103
|
-
./spec/jsonl_helpers_spec.rb[1:3:1] | passed | 0.
|
104
|
-
./spec/jsonl_helpers_spec.rb[1:3:2] | passed | 0.
|
105
|
-
./spec/jsonl_helpers_spec.rb[1:3:3] | passed | 0.
|
106
|
-
./spec/jsonl_helpers_spec.rb[1:3:4] | passed | 0.
|
107
|
-
./spec/jsonl_helpers_spec.rb[1:4:1] | passed | 0.
|
117
|
+
./spec/jsonl_helpers_spec.rb[1:3:1] | passed | 0.00005 seconds |
|
118
|
+
./spec/jsonl_helpers_spec.rb[1:3:2] | passed | 0.00003 seconds |
|
119
|
+
./spec/jsonl_helpers_spec.rb[1:3:3] | passed | 0.00003 seconds |
|
120
|
+
./spec/jsonl_helpers_spec.rb[1:3:4] | passed | 0.00004 seconds |
|
121
|
+
./spec/jsonl_helpers_spec.rb[1:4:1] | passed | 0.00064 seconds |
|
108
122
|
./spec/types_spec.rb[1:1:1:1] | passed | 0.00003 seconds |
|
109
123
|
./spec/types_spec.rb[1:1:2:1] | passed | 0.00003 seconds |
|
110
124
|
./spec/types_spec.rb[1:1:3:1] | passed | 0.00003 seconds |
|
111
|
-
./spec/types_spec.rb[1:1:4:1] | passed | 0.
|
112
|
-
./spec/types_spec.rb[1:2:1] | passed | 0.
|
125
|
+
./spec/types_spec.rb[1:1:4:1] | passed | 0.00003 seconds |
|
126
|
+
./spec/types_spec.rb[1:2:1] | passed | 0.00004 seconds |
|
113
127
|
./spec/types_spec.rb[1:2:2] | passed | 0.00003 seconds |
|
114
128
|
./spec/types_spec.rb[1:2:3:1] | passed | 0.00003 seconds |
|
data/USAGE_EXAMPLES.md
CHANGED
@@ -59,7 +59,7 @@ resume_last("Continue with last session")
|
|
59
59
|
require_relative 'path/to/ruby/lib/claude_code_sdk'
|
60
60
|
|
61
61
|
# Use normally
|
62
|
-
|
62
|
+
ClaudeCode.query(prompt: "Hello").each { |msg| puts msg }
|
63
63
|
```
|
64
64
|
|
65
65
|
## Rails + Sidekiq Streaming Example
|
@@ -83,29 +83,29 @@ gem 'redis'
|
|
83
83
|
# app/jobs/claude_streaming_job.rb
|
84
84
|
class ClaudeStreamingJob
|
85
85
|
include Sidekiq::Job
|
86
|
-
|
86
|
+
|
87
87
|
def perform(user_id, query_id, prompt, options = {})
|
88
88
|
require_relative '../vendor/claude-code-sdk-ruby/lib/claude_code_sdk'
|
89
|
-
|
89
|
+
|
90
90
|
channel = "claude_stream_#{user_id}_#{query_id}"
|
91
|
-
|
91
|
+
|
92
92
|
# Parse options
|
93
|
-
claude_options =
|
93
|
+
claude_options = ClaudeCode::ClaudeCodeOptions.new(
|
94
94
|
model: options['model'],
|
95
95
|
max_turns: options['max_turns'] || 1,
|
96
96
|
system_prompt: options['system_prompt'],
|
97
97
|
allowed_tools: options['allowed_tools'] || []
|
98
98
|
)
|
99
|
-
|
99
|
+
|
100
100
|
# Stream Claude responses
|
101
101
|
message_count = 0
|
102
|
-
|
102
|
+
ClaudeCode.query(
|
103
103
|
prompt: prompt,
|
104
104
|
options: claude_options,
|
105
105
|
cli_path: ENV['CLAUDE_CLI_PATH'] || '/usr/local/bin/claude'
|
106
106
|
).each do |message|
|
107
107
|
message_count += 1
|
108
|
-
|
108
|
+
|
109
109
|
# Broadcast each message via ActionCable
|
110
110
|
ActionCable.server.broadcast(channel, {
|
111
111
|
type: 'claude_message',
|
@@ -114,11 +114,11 @@ class ClaudeStreamingJob
|
|
114
114
|
timestamp: Time.current.iso8601,
|
115
115
|
data: serialize_claude_message(message)
|
116
116
|
})
|
117
|
-
|
117
|
+
|
118
118
|
# Optional: Save to database
|
119
119
|
save_message_to_db(user_id, query_id, message_count, message)
|
120
120
|
end
|
121
|
-
|
121
|
+
|
122
122
|
# Broadcast completion
|
123
123
|
ActionCable.server.broadcast(channel, {
|
124
124
|
type: 'complete',
|
@@ -127,23 +127,23 @@ class ClaudeStreamingJob
|
|
127
127
|
timestamp: Time.current.iso8601
|
128
128
|
})
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
private
|
132
|
-
|
132
|
+
|
133
133
|
def serialize_claude_message(message)
|
134
134
|
case message
|
135
|
-
when
|
135
|
+
when ClaudeCode::SystemMessage
|
136
136
|
{
|
137
137
|
message_type: 'system',
|
138
138
|
subtype: message.subtype,
|
139
139
|
data: message.data
|
140
140
|
}
|
141
|
-
when
|
141
|
+
when ClaudeCode::AssistantMessage
|
142
142
|
{
|
143
143
|
message_type: 'assistant',
|
144
144
|
content: message.content.map { |block| serialize_content_block(block) }
|
145
145
|
}
|
146
|
-
when
|
146
|
+
when ClaudeCode::ResultMessage
|
147
147
|
{
|
148
148
|
message_type: 'result',
|
149
149
|
subtype: message.subtype,
|
@@ -153,18 +153,18 @@ class ClaudeStreamingJob
|
|
153
153
|
}
|
154
154
|
end
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
def serialize_content_block(block)
|
158
158
|
case block
|
159
|
-
when
|
159
|
+
when ClaudeCode::TextBlock
|
160
160
|
{ type: 'text', text: block.text }
|
161
|
-
when
|
161
|
+
when ClaudeCode::ToolUseBlock
|
162
162
|
{ type: 'tool_use', id: block.id, name: block.name, input: block.input }
|
163
|
-
when
|
163
|
+
when ClaudeCode::ToolResultBlock
|
164
164
|
{ type: 'tool_result', tool_use_id: block.tool_use_id, content: block.content, is_error: block.is_error }
|
165
165
|
end
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
def save_message_to_db(user_id, query_id, message_index, message)
|
169
169
|
# Example database save
|
170
170
|
# ClaudeMessage.create!(
|
@@ -191,7 +191,7 @@ class ClaudeStreamChannel < ApplicationCable::Channel
|
|
191
191
|
reject
|
192
192
|
end
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
def unsubscribed
|
196
196
|
# Cleanup when channel is unsubscribed
|
197
197
|
end
|
@@ -204,10 +204,10 @@ end
|
|
204
204
|
# app/controllers/claude_controller.rb
|
205
205
|
class ClaudeController < ApplicationController
|
206
206
|
before_action :authenticate_user!
|
207
|
-
|
207
|
+
|
208
208
|
def create_stream_query
|
209
209
|
query_id = SecureRandom.uuid
|
210
|
-
|
210
|
+
|
211
211
|
# Validate input
|
212
212
|
prompt = params.require(:prompt)
|
213
213
|
options = {
|
@@ -216,7 +216,7 @@ class ClaudeController < ApplicationController
|
|
216
216
|
'system_prompt' => params[:system_prompt],
|
217
217
|
'allowed_tools' => params[:allowed_tools] || []
|
218
218
|
}
|
219
|
-
|
219
|
+
|
220
220
|
# Start background job
|
221
221
|
ClaudeStreamingJob.perform_async(
|
222
222
|
current_user.id,
|
@@ -224,7 +224,7 @@ class ClaudeController < ApplicationController
|
|
224
224
|
prompt,
|
225
225
|
options
|
226
226
|
)
|
227
|
-
|
227
|
+
|
228
228
|
render json: {
|
229
229
|
query_id: query_id,
|
230
230
|
channel: "claude_stream_#{current_user.id}_#{query_id}",
|
@@ -243,7 +243,7 @@ class ClaudeStreaming {
|
|
243
243
|
this.userId = userId;
|
244
244
|
this.activeSubscriptions = new Map();
|
245
245
|
}
|
246
|
-
|
246
|
+
|
247
247
|
startQuery(prompt, options = {}) {
|
248
248
|
return fetch('/claude/stream_query', {
|
249
249
|
method: 'POST',
|
@@ -265,7 +265,7 @@ class ClaudeStreaming {
|
|
265
265
|
return data;
|
266
266
|
});
|
267
267
|
}
|
268
|
-
|
268
|
+
|
269
269
|
subscribeToQuery(queryId, onMessage, onComplete) {
|
270
270
|
const subscription = App.cable.subscriptions.create(
|
271
271
|
{
|
@@ -287,13 +287,13 @@ class ClaudeStreaming {
|
|
287
287
|
}
|
288
288
|
}
|
289
289
|
);
|
290
|
-
|
290
|
+
|
291
291
|
this.activeSubscriptions.set(queryId, subscription);
|
292
292
|
}
|
293
|
-
|
293
|
+
|
294
294
|
handleClaudeMessage(data, onMessage) {
|
295
295
|
const message = data.data;
|
296
|
-
|
296
|
+
|
297
297
|
if (message.message_type === 'assistant') {
|
298
298
|
message.content.forEach(block => {
|
299
299
|
if (block.type === 'text') {
|
@@ -320,7 +320,7 @@ class ClaudeStreaming {
|
|
320
320
|
});
|
321
321
|
}
|
322
322
|
}
|
323
|
-
|
323
|
+
|
324
324
|
handleComplete(data, onComplete) {
|
325
325
|
if (onComplete) {
|
326
326
|
onComplete({
|
@@ -330,7 +330,7 @@ class ClaudeStreaming {
|
|
330
330
|
});
|
331
331
|
}
|
332
332
|
}
|
333
|
-
|
333
|
+
|
334
334
|
unsubscribeFromQuery(queryId) {
|
335
335
|
const subscription = this.activeSubscriptions.get(queryId);
|
336
336
|
if (subscription) {
|
@@ -376,7 +376,7 @@ REDIS_URL=redis://localhost:6379/0
|
|
376
376
|
# config/routes.rb
|
377
377
|
Rails.application.routes.draw do
|
378
378
|
mount ActionCable.server => '/cable'
|
379
|
-
|
379
|
+
|
380
380
|
resources :claude, only: [] do
|
381
381
|
collection do
|
382
382
|
post 'stream_query'
|
@@ -418,11 +418,11 @@ ClaudeStreamingJob.perform_async(
|
|
418
418
|
This setup provides:
|
419
419
|
- ✅ Real-time streaming via WebSockets
|
420
420
|
- ✅ Background processing with Sidekiq
|
421
|
-
- ✅ Error handling and retry logic
|
421
|
+
- ✅ Error handling and retry logic
|
422
422
|
- ✅ Message persistence (optional)
|
423
423
|
- ✅ User authentication and authorization
|
424
424
|
- ✅ Frontend integration with ActionCable
|
425
425
|
- ✅ MCP server support
|
426
426
|
- ✅ Cost tracking and monitoring
|
427
427
|
|
428
|
-
The streaming happens in real-time, so users see Claude's responses as they're generated, providing an excellent user experience for AI-powered Rails applications.
|
428
|
+
The streaming happens in real-time, so users see Claude's responses as they're generated, providing an excellent user experience for AI-powered Rails applications.
|
Binary file
|
data/docs/README.md
CHANGED
@@ -24,7 +24,7 @@ gem install claude_code_sdk
|
|
24
24
|
|
25
25
|
**Prerequisites:**
|
26
26
|
- Ruby 3.0+
|
27
|
-
- Node.js
|
27
|
+
- Node.js
|
28
28
|
- Claude Code: `npm install -g @anthropic-ai/claude-code`
|
29
29
|
|
30
30
|
## Quick Start
|
@@ -33,10 +33,10 @@ gem install claude_code_sdk
|
|
33
33
|
require 'claude_code_sdk'
|
34
34
|
|
35
35
|
# Simple query with streaming
|
36
|
-
|
37
|
-
if message.is_a?(
|
36
|
+
ClaudeCode.query(prompt: "What is 2 + 2?").each do |message|
|
37
|
+
if message.is_a?(ClaudeCode::AssistantMessage)
|
38
38
|
message.content.each do |block|
|
39
|
-
if block.is_a?(
|
39
|
+
if block.is_a?(ClaudeCode::TextBlock)
|
40
40
|
puts block.text
|
41
41
|
end
|
42
42
|
end
|
@@ -51,7 +51,7 @@ end
|
|
51
51
|
- Low memory footprint - process one message at a time
|
52
52
|
- Perfect for interactive applications and long-running operations
|
53
53
|
|
54
|
-
### 🔧 **Ergonomic MCP Integration**
|
54
|
+
### 🔧 **Ergonomic MCP Integration**
|
55
55
|
- Simple one-line MCP server configuration
|
56
56
|
- Support for HTTP, SSE, and stdio MCP servers
|
57
57
|
- Built-in helpers for common use cases
|
@@ -75,13 +75,13 @@ end
|
|
75
75
|
require 'claude_code_sdk'
|
76
76
|
|
77
77
|
# With options
|
78
|
-
options =
|
78
|
+
options = ClaudeCode::ClaudeCodeOptions.new(
|
79
79
|
model: "sonnet",
|
80
80
|
system_prompt: "You are a helpful assistant",
|
81
81
|
max_turns: 1
|
82
82
|
)
|
83
83
|
|
84
|
-
|
84
|
+
ClaudeCode.query(
|
85
85
|
prompt: "Explain Ruby blocks",
|
86
86
|
options: options,
|
87
87
|
cli_path: "/path/to/claude"
|
@@ -94,7 +94,7 @@ end
|
|
94
94
|
|
95
95
|
```ruby
|
96
96
|
# Ultra-convenient MCP usage
|
97
|
-
|
97
|
+
ClaudeCode.quick_mcp_query(
|
98
98
|
"Use the about tool to describe yourself",
|
99
99
|
server_name: "ninja",
|
100
100
|
server_url: "https://mcp-creator-ninja-v1-4-0.mcp.soy/",
|
@@ -104,13 +104,13 @@ ClaudeCodeSDK.quick_mcp_query(
|
|
104
104
|
end
|
105
105
|
|
106
106
|
# Advanced MCP configuration
|
107
|
-
mcp_servers =
|
107
|
+
mcp_servers = ClaudeCode.add_mcp_server("my_server", {
|
108
108
|
command: "node",
|
109
109
|
args: ["my-mcp-server.js"],
|
110
110
|
env: { "API_KEY" => "secret" }
|
111
111
|
})
|
112
112
|
|
113
|
-
options =
|
113
|
+
options = ClaudeCode::ClaudeCodeOptions.new(
|
114
114
|
allowed_tools: ["mcp__my_server__my_tool"],
|
115
115
|
mcp_servers: mcp_servers
|
116
116
|
)
|
@@ -120,16 +120,16 @@ options = ClaudeCodeSDK::ClaudeCodeOptions.new(
|
|
120
120
|
|
121
121
|
```ruby
|
122
122
|
# Auto-formatted streaming
|
123
|
-
|
123
|
+
ClaudeCode.stream_query(
|
124
124
|
prompt: "Count from 1 to 5",
|
125
|
-
options:
|
125
|
+
options: ClaudeCode::ClaudeCodeOptions.new(max_turns: 1)
|
126
126
|
)
|
127
127
|
|
128
128
|
# Custom streaming with timestamps
|
129
129
|
start_time = Time.now
|
130
|
-
|
130
|
+
ClaudeCode.stream_query(
|
131
131
|
prompt: "Explain inheritance",
|
132
|
-
options:
|
132
|
+
options: ClaudeCode::ClaudeCodeOptions.new(max_turns: 1)
|
133
133
|
) do |message, index|
|
134
134
|
timestamp = Time.now - start_time
|
135
135
|
puts "[#{format('%.2f', timestamp)}s] #{message}"
|
@@ -142,11 +142,11 @@ end
|
|
142
142
|
# Background job with real-time streaming
|
143
143
|
class ClaudeStreamingJob
|
144
144
|
include Sidekiq::Job
|
145
|
-
|
145
|
+
|
146
146
|
def perform(user_id, query_id, prompt, options = {})
|
147
147
|
channel = "claude_stream_#{user_id}_#{query_id}"
|
148
|
-
|
149
|
-
|
148
|
+
|
149
|
+
ClaudeCode.query(prompt: prompt, options: options).each do |message|
|
150
150
|
# Broadcast to ActionCable
|
151
151
|
ActionCable.server.broadcast(channel, {
|
152
152
|
type: 'message',
|
@@ -162,16 +162,16 @@ end
|
|
162
162
|
|
163
163
|
### Core Methods
|
164
164
|
|
165
|
-
#### `
|
165
|
+
#### `ClaudeCode.query(prompt:, options: nil, cli_path: nil, mcp_servers: {})`
|
166
166
|
Main method for querying Claude with streaming support.
|
167
167
|
|
168
|
-
#### `
|
168
|
+
#### `ClaudeCode.quick_mcp_query(prompt, server_name:, server_url:, tools:, **options)`
|
169
169
|
Convenient method for quick MCP server usage.
|
170
170
|
|
171
|
-
#### `
|
171
|
+
#### `ClaudeCode.stream_query(prompt:, options: nil, cli_path: nil, mcp_servers: {}, &block)`
|
172
172
|
Streaming helper with auto-formatting or custom block handling.
|
173
173
|
|
174
|
-
#### `
|
174
|
+
#### `ClaudeCode.add_mcp_server(name, config)`
|
175
175
|
Helper to create MCP server configurations.
|
176
176
|
|
177
177
|
### Configuration Classes
|
@@ -188,7 +188,7 @@ Main configuration class with all CLI options:
|
|
188
188
|
|
189
189
|
#### MCP Server Configurations
|
190
190
|
- `McpHttpServerConfig` - HTTP/HTTPS MCP servers
|
191
|
-
- `McpSSEServerConfig` - Server-Sent Events MCP servers
|
191
|
+
- `McpSSEServerConfig` - Server-Sent Events MCP servers
|
192
192
|
- `McpStdioServerConfig` - Stdio MCP servers
|
193
193
|
|
194
194
|
### Message Types
|
@@ -215,14 +215,14 @@ Main configuration class with all CLI options:
|
|
215
215
|
|
216
216
|
```ruby
|
217
217
|
begin
|
218
|
-
|
218
|
+
ClaudeCode.query(prompt: "Hello").each do |message|
|
219
219
|
# Process message
|
220
220
|
end
|
221
|
-
rescue
|
221
|
+
rescue ClaudeCode::CLINotFoundError
|
222
222
|
puts "Please install Claude Code"
|
223
|
-
rescue
|
223
|
+
rescue ClaudeCode::ProcessError => e
|
224
224
|
puts "Process failed: #{e.exit_code}"
|
225
|
-
rescue
|
225
|
+
rescue ClaudeCode::CLIJSONDecodeError => e
|
226
226
|
puts "JSON parsing failed: #{e.message}"
|
227
227
|
end
|
228
228
|
```
|
@@ -251,4 +251,4 @@ auto_stream("Count to 5")
|
|
251
251
|
|
252
252
|
## License
|
253
253
|
|
254
|
-
MIT
|
254
|
+
MIT
|