CLI app for developers prototyping atproto functionality
1[package]
2name = "atproto-devtool"
3version = "0.1.1"
4authors = ["Jack Grigg <thestr4d@gmail.com>"]
5edition = "2024"
6rust-version = "1.85"
7description = "A multitool for the atproto developer ecosystem"
8repository = "https://tangled.org/str4d.xyz/atproto-devtool"
9license = "MIT OR Apache-2.0"
10keywords = ["atmosphere", "bluesky"]
11categories = [
12 "command-line-utilities",
13 "development-tools::testing",
14 "web-programming",
15]
16
17[dependencies]
18async-trait = "0.1"
19atrium-api = "0.25"
20# Used to decode the atproto JSON `{"$bytes": "<base64>"}` wrapper that appears
21# in label `sig` fields, since atrium-api's generated types assume CBOR byte
22# strings.
23base64 = "0.22"
24atrium-xrpc-client = { version = "0.5", default-features = false, features = ["reqwest"] }
25axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio"] }
26bytes = "1.10"
27ciborium = "0.2"
28clap = { version = "4.6", features = ["derive"] }
29futures-util = { version = "0.3", default-features = false, features = ["std"] }
30# Direct CSPRNG access for JWT `jti` nonces and the sentinel run-id.
31# Transitively present (k256 → elliptic-curve → rand_core with the
32# `getrandom` feature disabled), so we can't reach OsRng through the
33# existing dep graph. Promoting `getrandom` to a direct dep is the
34# smallest viable fix.
35getrandom = "0.2"
36hickory-resolver = "0.25"
37humantime = "2.1"
38# JWS/JWK parsing and signing. Use rust_crypto backend (no ring).
39jsonwebtoken = { version = "10.3", default-features = false, features = ["rust_crypto"] }
40k256 = { version = "0.13", features = ["ecdsa"] }
41miette = { version = "7.6", features = ["fancy", "derive"] }
42multibase = "0.9"
43# PKCS8 export needed for jsonwebtoken's rust_crypto backend to read keys via from_pkcs8_der.
44p256 = { version = "0.13", features = ["ecdsa", "pkcs8"] }
45percent-encoding = "2.3"
46rand_chacha = "0.3"
47rand_core = "0.6"
48reqwest = { version = "0.13", default-features = false, features = ["rustls", "json", "gzip"] }
49serde = { version = "1.0", features = ["derive"] }
50serde_json = "1.0"
51serde_urlencoded = "0.7"
52sha2 = "0.11"
53thiserror = "2.0"
54tokio = { version = "1.51", features = ["rt", "macros", "time", "net", "signal"] }
55tokio-tungstenite = { version = "0.29", default-features = false, features = ["connect", "rustls-tls-native-roots"] }
56tracing = "0.1"
57tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
58url = "2.5"
59
60[dev-dependencies]
61assert_cmd = "2.0"
62insta = "1.47"
63# Property-based tests pin roundtrip / idempotence properties for the
64# cryptographic primitives (multikey encode/decode, JWT encode/verify,
65# JWS sign/verify, signature byte-length invariants). 64 cases per
66# property is enough to exercise every byte-pattern edge case without
67# making the test suite slow.
68proptest = "1.5"
69rand = "0.8"
70rand_chacha = "0.3"
71tokio = { version = "1.51", features = ["rt", "macros", "test-util", "time"] }
72
73[lints.clippy]
74uninlined_format_args = "deny"