Skip to content

Commit 23e85ee

Browse files
committed
fix: smallfix workflow
1 parent 130cd2a commit 23e85ee

File tree

6 files changed

+82
-69
lines changed

6 files changed

+82
-69
lines changed

apps/core/.cargo/audit.toml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,8 @@ ignore = [
1919
# tokio-tar PAX header parsing - no fix available, used by datafusion/arrow
2020
# https://rustsec.org/advisories/RUSTSEC-2025-0111
2121
"RUSTSEC-2025-0111",
22-
]
2322

24-
[warnings]
25-
# Warnings to ignore
26-
ignore = [
27-
# rustls-pemfile unmaintained - used by testcontainers, not critical
23+
# rustls-pemfile unmaintained - used by testcontainers, not critical (warning)
2824
# https://rustsec.org/advisories/RUSTSEC-2025-0134
2925
"RUSTSEC-2025-0134",
3026
]

apps/mcp-server-elixir/lib/mcp_server_elixir/protocol/json_rpc.ex

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ defmodule McpServerElixir.Protocol.JsonRpc do
2424

2525
defp validate_request(%{"jsonrpc" => "2.0"} = request) do
2626
# Validate required fields
27-
cond do
28-
not Map.has_key?(request, "method") ->
29-
{:error, "Missing 'method' field"}
30-
27+
if Map.has_key?(request, "method") do
3128
# Request (has id) or notification (no id)
32-
true ->
33-
{:ok, normalize_request(request)}
29+
{:ok, normalize_request(request)}
30+
else
31+
{:error, "Missing 'method' field"}
3432
end
3533
end
3634

apps/mcp-server-elixir/lib/mcp_server_elixir/protocol/mcp_tools.ex

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ defmodule McpServerElixir.Protocol.McpTools do
88

99
require Logger
1010

11-
alias McpServerElixir.Infrastructure.{CoreClient, ControlPlaneClient}
11+
alias McpServerElixir.Infrastructure.{ControlPlaneClient, CoreClient}
1212
alias McpServerElixir.Protocol.ToonEncoder
1313

1414
@doc """
@@ -30,6 +30,23 @@ defmodule McpServerElixir.Protocol.McpTools do
3030
]
3131
end
3232

33+
@tool_handlers %{
34+
"query_events" => :handle_query_events,
35+
"reconstruct_state" => :handle_reconstruct_state,
36+
"get_snapshot" => :handle_get_snapshot,
37+
"analyze_changes" => :handle_analyze_changes,
38+
"find_patterns" => :handle_find_patterns,
39+
"compare_entities" => :handle_compare_entities,
40+
"event_timeline" => :handle_event_timeline,
41+
"explain_entity" => :handle_explain_entity,
42+
"ingest_event" => :handle_ingest_event
43+
}
44+
45+
@stateless_tool_handlers %{
46+
"get_stats" => :handle_get_stats,
47+
"get_cluster_status" => :handle_get_cluster_status
48+
}
49+
3350
@doc """
3451
Call a tool by name with arguments.
3552
@@ -42,19 +59,19 @@ defmodule McpServerElixir.Protocol.McpTools do
4259
format = Map.get(args, "format", nil)
4360
args_without_format = Map.delete(args, "format")
4461

45-
case tool_name do
46-
"query_events" -> handle_query_events(args_without_format, state, format)
47-
"reconstruct_state" -> handle_reconstruct_state(args_without_format, state, format)
48-
"get_snapshot" -> handle_get_snapshot(args_without_format, state, format)
49-
"analyze_changes" -> handle_analyze_changes(args_without_format, state, format)
50-
"find_patterns" -> handle_find_patterns(args_without_format, state, format)
51-
"compare_entities" -> handle_compare_entities(args_without_format, state, format)
52-
"event_timeline" -> handle_event_timeline(args_without_format, state, format)
53-
"explain_entity" -> handle_explain_entity(args_without_format, state, format)
54-
"ingest_event" -> handle_ingest_event(args_without_format, state, format)
55-
"get_stats" -> handle_get_stats(state, format)
56-
"get_cluster_status" -> handle_get_cluster_status(state, format)
57-
_ -> {:error, "Unknown tool: #{tool_name}"}
62+
dispatch_tool(tool_name, args_without_format, state, format)
63+
end
64+
65+
defp dispatch_tool(tool_name, args, state, format) do
66+
cond do
67+
handler = Map.get(@tool_handlers, tool_name) ->
68+
apply(__MODULE__, handler, [args, state, format])
69+
70+
handler = Map.get(@stateless_tool_handlers, tool_name) ->
71+
apply(__MODULE__, handler, [state, format])
72+
73+
true ->
74+
{:error, "Unknown tool: #{tool_name}"}
5875
end
5976
end
6077

@@ -273,7 +290,8 @@ defmodule McpServerElixir.Protocol.McpTools do
273290
# Tool Handlers
274291
# ============================================================================
275292

276-
defp handle_query_events(args, state, format) do
293+
@doc false
294+
def handle_query_events(args, state, format) do
277295
params = Map.take(args, ["entity_id", "event_type", "as_of", "since", "until", "limit"])
278296

279297
case CoreClient.query_events(state.core_client, params) do
@@ -298,7 +316,8 @@ defmodule McpServerElixir.Protocol.McpTools do
298316
end
299317
end
300318

301-
defp handle_reconstruct_state(args, state, format) do
319+
@doc false
320+
def handle_reconstruct_state(args, state, format) do
302321
entity_id = Map.fetch!(args, "entity_id")
303322
as_of = Map.get(args, "as_of")
304323

@@ -334,7 +353,8 @@ defmodule McpServerElixir.Protocol.McpTools do
334353
end
335354
end
336355

337-
defp handle_get_snapshot(args, state, format) do
356+
@doc false
357+
def handle_get_snapshot(args, state, format) do
338358
entity_id = Map.fetch!(args, "entity_id")
339359

340360
case CoreClient.get_snapshot(state.core_client, entity_id) do
@@ -358,7 +378,8 @@ defmodule McpServerElixir.Protocol.McpTools do
358378
end
359379
end
360380

361-
defp handle_analyze_changes(args, state, format) do
381+
@doc false
382+
def handle_analyze_changes(args, state, format) do
362383
entity_id = Map.fetch!(args, "entity_id")
363384
from_time = Map.fetch!(args, "from_time")
364385
to_time = Map.get(args, "to_time")
@@ -406,7 +427,8 @@ defmodule McpServerElixir.Protocol.McpTools do
406427
end
407428
end
408429

409-
defp handle_find_patterns(args, state, format) do
430+
@doc false
431+
def handle_find_patterns(args, state, format) do
410432
params = Map.take(args, ["entity_id", "event_type", "since"])
411433

412434
case CoreClient.query_events(state.core_client, params) do
@@ -441,7 +463,8 @@ defmodule McpServerElixir.Protocol.McpTools do
441463
end
442464
end
443465

444-
defp handle_compare_entities(args, state, format) do
466+
@doc false
467+
def handle_compare_entities(args, state, format) do
445468
entity_ids = Map.fetch!(args, "entity_ids")
446469
timeframe = Map.get(args, "timeframe")
447470

@@ -491,7 +514,8 @@ defmodule McpServerElixir.Protocol.McpTools do
491514
}}
492515
end
493516

494-
defp handle_event_timeline(args, state, format) do
517+
@doc false
518+
def handle_event_timeline(args, state, format) do
495519
entity_id = Map.fetch!(args, "entity_id")
496520
params = Map.take(args, ["since", "until"])
497521
params = Map.put(params, "entity_id", entity_id)
@@ -543,7 +567,8 @@ defmodule McpServerElixir.Protocol.McpTools do
543567
end
544568
end
545569

546-
defp handle_explain_entity(args, state, format) do
570+
@doc false
571+
def handle_explain_entity(args, state, format) do
547572
entity_id = Map.fetch!(args, "entity_id")
548573

549574
# Get current state
@@ -603,7 +628,8 @@ defmodule McpServerElixir.Protocol.McpTools do
603628
end
604629
end
605630

606-
defp handle_ingest_event(args, state, format) do
631+
@doc false
632+
def handle_ingest_event(args, state, format) do
607633
event_data = %{
608634
"event_type" => Map.fetch!(args, "event_type"),
609635
"entity_id" => Map.fetch!(args, "entity_id"),
@@ -641,7 +667,8 @@ defmodule McpServerElixir.Protocol.McpTools do
641667
end
642668
end
643669

644-
defp handle_get_stats(state, format) do
670+
@doc false
671+
def handle_get_stats(state, format) do
645672
case CoreClient.get_stats(state.core_client) do
646673
{:ok, stats} ->
647674
summary = "📊 AllSource Statistics\n\n"
@@ -663,7 +690,8 @@ defmodule McpServerElixir.Protocol.McpTools do
663690
end
664691
end
665692

666-
defp handle_get_cluster_status(state, format) do
693+
@doc false
694+
def handle_get_cluster_status(state, format) do
667695
case ControlPlaneClient.get_cluster_status(state.control_client) do
668696
{:ok, status} ->
669697
summary = "🎯 Cluster Status\n\n"

apps/mcp-server-elixir/lib/mcp_server_elixir/protocol/toon_encoder.ex

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
5555
# Find the list of items to encode
5656
items = find_tabular_items(data)
5757

58-
if items != nil and length(items) > 0 do
58+
if is_list(items) and items != [] do
5959
encode_items_as_toon(items)
6060
else
6161
{:error, :not_tabular}
@@ -74,7 +74,7 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
7474
defp find_tabular_items(data) when is_map(data) do
7575
# Find the first list value that looks tabular
7676
Enum.find_value(data, fn
77-
{_key, value} when is_list(value) and length(value) > 0 ->
77+
{_key, [_ | _] = value} ->
7878
if uniform_list?(value), do: value, else: nil
7979

8080
_ ->
@@ -84,22 +84,13 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
8484

8585
defp find_tabular_items(_), do: nil
8686

87-
defp encode_items_as_toon(items) when is_list(items) and length(items) > 0 do
88-
first_item = List.first(items)
89-
87+
defp encode_items_as_toon([first_item | _] = items) do
9088
case first_item do
9189
item when is_map(item) ->
9290
keys = Map.keys(item) |> Enum.sort()
9391
header = "[" <> Enum.join(keys, "|") <> "]"
9492

95-
rows =
96-
Enum.map(items, fn item ->
97-
Enum.map(keys, fn key ->
98-
value = Map.get(item, key, "")
99-
encode_value(value)
100-
end)
101-
|> Enum.join("|")
102-
end)
93+
rows = Enum.map(items, fn item -> encode_row(item, keys) end)
10394

10495
{:ok, Enum.join([header | rows], "\n")}
10596

@@ -108,8 +99,16 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
10899
end
109100
end
110101

102+
defp encode_items_as_toon([]), do: {:error, :empty_list}
111103
defp encode_items_as_toon(_), do: {:error, :empty_list}
112104

105+
defp encode_row(item, keys) do
106+
Enum.map_join(keys, "|", fn key ->
107+
value = Map.get(item, key, "")
108+
encode_value(value)
109+
end)
110+
end
111+
113112
defp encode_value(nil), do: ""
114113
defp encode_value(value) when is_binary(value), do: escape_toon_value(value)
115114
defp encode_value(value) when is_number(value), do: to_string(value)
@@ -147,22 +146,22 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
147146
def detect_tabular_structure(_), do: {:mixed, nil}
148147

149148
# Check for "events" array with uniform structure
150-
defp has_uniform_events?(%{"events" => events}) when is_list(events) and length(events) > 0 do
149+
defp has_uniform_events?(%{"events" => [_ | _] = events}) do
151150
uniform_event_list?(events)
152151
end
153152

154-
defp has_uniform_events?(%{events: events}) when is_list(events) and length(events) > 0 do
153+
defp has_uniform_events?(%{events: [_ | _] = events}) do
155154
uniform_event_list?(events)
156155
end
157156

158157
defp has_uniform_events?(_), do: false
159158

160159
# Check for "items" array with uniform structure
161-
defp has_uniform_items?(%{"items" => items}) when is_list(items) and length(items) > 0 do
160+
defp has_uniform_items?(%{"items" => [_ | _] = items}) do
162161
uniform_list?(items)
163162
end
164163

165-
defp has_uniform_items?(%{items: items}) when is_list(items) and length(items) > 0 do
164+
defp has_uniform_items?(%{items: [_ | _] = items}) do
166165
uniform_list?(items)
167166
end
168167

@@ -171,7 +170,7 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
171170
# Check for comparison arrays (entity comparisons, etc.)
172171
defp has_uniform_comparisons?(data) when is_map(data) do
173172
Enum.any?(data, fn
174-
{_key, value} when is_list(value) and length(value) > 0 ->
173+
{_key, [_ | _] = value} ->
175174
uniform_list?(value)
176175

177176
_ ->
@@ -182,8 +181,7 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
182181
defp has_uniform_comparisons?(_), do: false
183182

184183
# Check if event list has uniform structure
185-
defp uniform_event_list?(events) when length(events) > 0 do
186-
first_event = List.first(events)
184+
defp uniform_event_list?([first_event | _] = events) do
187185
first_keys = extract_keys(first_event) |> Enum.sort()
188186

189187
Enum.all?(events, fn event ->
@@ -195,9 +193,7 @@ defmodule McpServerElixir.Protocol.ToonEncoder do
195193
defp uniform_event_list?(_), do: false
196194

197195
# Check if list has uniform structure
198-
defp uniform_list?(items) when length(items) > 0 do
199-
first_item = List.first(items)
200-
196+
defp uniform_list?([first_item | _] = items) do
201197
case first_item do
202198
item when is_map(item) ->
203199
first_keys = extract_keys(item) |> Enum.sort()

apps/mcp-server-elixir/lib/mcp_server_elixir/server.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ defmodule McpServerElixir.Server do
99
use GenServer
1010
require Logger
1111

12+
alias McpServerElixir.Infrastructure.{ControlPlaneClient, CoreClient}
1213
alias McpServerElixir.Protocol.{JsonRpc, McpTools}
13-
alias McpServerElixir.Infrastructure.{CoreClient, ControlPlaneClient}
1414

1515
@server_info %{
1616
name: "allsource-mcp-elixir",
@@ -89,7 +89,7 @@ defmodule McpServerElixir.Server do
8989

9090
{:error, reason} ->
9191
Logger.warning("Failed to parse JSON-RPC request: #{inspect(reason)}")
92-
send_error(nil, -32700, "Parse error", nil)
92+
send_error(nil, -32_700, "Parse error", nil)
9393
end
9494
end
9595
end
@@ -141,7 +141,7 @@ defmodule McpServerElixir.Server do
141141
send_response(response)
142142

143143
{:error, reason} ->
144-
send_error(id, -32603, "Internal error", reason)
144+
send_error(id, -32_603, "Internal error", reason)
145145
end
146146

147147
{:noreply, state}
@@ -154,13 +154,13 @@ defmodule McpServerElixir.Server do
154154

155155
defp process_request(%{method: method, id: id}, state) do
156156
Logger.warning("Unknown method: #{method}")
157-
send_error(id, -32601, "Method not found", nil)
157+
send_error(id, -32_601, "Method not found", nil)
158158
{:noreply, state}
159159
end
160160

161161
defp process_request(request, state) do
162162
Logger.warning("Invalid request format: #{inspect(request)}")
163-
send_error(nil, -32600, "Invalid Request", nil)
163+
send_error(nil, -32_600, "Invalid Request", nil)
164164
{:noreply, state}
165165
end
166166

apps/query-service/mix.lock

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
"bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"},
55
"certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"},
66
"cors_plug": {:hex, :cors_plug, "3.0.3", "7c3ac52b39624bc616db2e937c282f3f623f25f8d550068b6710e58d04a0e330", [:mix], [{:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3f2d759e8c272ed3835fab2ef11b46bddab8c1ab9528167bd463b6452edf830d"},
7-
"cowboy": {:hex, :cowboy, "2.14.2", "4008be1df6ade45e4f2a4e9e2d22b36d0b5aba4e20b0a0d7049e28d124e34847", [:make, :rebar3], [{:cowlib, ">= 2.16.0 and < 3.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, ">= 1.8.0 and < 3.0.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "569081da046e7b41b5df36aa359be71a0c8874e5b9cff6f747073fc57baf1ab9"},
8-
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
9-
"cowlib": {:hex, :cowlib, "2.16.0", "54592074ebbbb92ee4746c8a8846e5605052f29309d3a873468d76cdf932076f", [:make, :rebar3], [], "hexpm", "7f478d80d66b747344f0ea7708c187645cfcc08b11aa424632f78e25bf05db51"},
107
"credo": {:hex, :credo, "1.7.13", "126a0697df6b7b71cd18c81bc92335297839a806b6f62b61d417500d1070ff4e", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "47641e6d2bbff1e241e87695b29f617f1a8f912adea34296fb10ecc3d7e9e84f"},
118
"db_connection": {:hex, :db_connection, "2.8.1", "9abdc1e68c34c6163f6fb96a96532272d13ad7ca45262156ae8b7ec6d9dc4bec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61a3d489b239d76f326e03b98794fb8e45168396c925ef25feb405ed09da8fd"},
129
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
@@ -44,10 +41,8 @@
4441
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.2.0", "ff3a5616e1bed6804de7773b92cbccfc0b0f473faf1f63d7daf1206c7aeaaa6f", [:mix], [], "hexpm", "adc313a5bf7136039f63cfd9668fde73bba0765e0614cba80c06ac9460ff3e96"},
4542
"phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"},
4643
"plug": {:hex, :plug, "1.18.1", "5067f26f7745b7e31bc3368bc1a2b818b9779faa959b49c934c17730efc911cf", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "57a57db70df2b422b564437d2d33cf8d33cd16339c1edb190cd11b1a3a546cc2"},
47-
"plug_cowboy": {:hex, :plug_cowboy, "2.7.4", "729c752d17cf364e2b8da5bdb34fb5804f56251e88bb602aff48ae0bd8673d11", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "9b85632bd7012615bae0a5d70084deb1b25d2bcbb32cab82d1e9a1e023168aa3"},
4844
"plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"},
4945
"postgrex": {:hex, :postgrex, "0.21.1", "2c5cc830ec11e7a0067dd4d623c049b3ef807e9507a424985b8dcf921224cd88", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "27d8d21c103c3cc68851b533ff99eef353e6a0ff98dc444ea751de43eb48bdac"},
50-
"ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"},
5146
"redix": {:hex, :redix, "1.5.2", "ab854435a663f01ce7b7847f42f5da067eea7a3a10c0a9d560fa52038fd7ab48", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:nimble_options, "~> 0.5.0 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "78538d184231a5d6912f20567d76a49d1be7d3fca0e1aaaa20f4df8e1142dcb8"},
5247
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
5348
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},

0 commit comments

Comments
 (0)