-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathCargo.toml
More file actions
155 lines (151 loc) · 6.95 KB
/
Copy pathCargo.toml
File metadata and controls
155 lines (151 loc) · 6.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
[workspace]
resolver = "3"
members = ["crates/*", "xtask"]
[workspace.package]
version = "26.2.0"
edition = "2024"
rust-version = "1.96"
license = "GPL-3.0-or-later" # intentional deviation from upstream mtui (GPL-2.0-only); see LICENSE
repository = "https://github.com/openSUSE/mtui"
[workspace.dependencies]
# runtime
tokio = { version = "1", features = ["full"] }
futures = "0.3"
# cli
clap = { version = "4", features = ["derive", "env"] }
clap_complete = "4"
# Man-page generation for both binaries. Used only by the `xtask` dev
# tool, not by any shipped binary, so it never enters a release build.
clap_mangen = { version = "0.3", features = ["env"] }
reedline = "0.49"
# raw-mode terminal + async input/resize stream for the interactive `shell`
# TTY bridge (mtui-rs-jww). Pinned to reedline 0.49's `crossterm` major so
# the two share one copy; `event-stream` enables the async `EventStream` the
# bridge selects over (keystrokes + `Event::Resize` → SIGWINCH forwarding).
crossterm = { version = "0.29", features = ["event-stream"] }
# terminal styling for the REPL input highlighter; pinned to reedline 0.49's
# `nu-ansi-term` major so `StyledText.buffer: Vec<(Style, String)>` types match.
nu-ansi-term = "0.50"
# POSIX shell-splitting of a REPL input line into argv (engine line-dispatch),
# mirroring upstream's `shlex.split` in `Command.parse_args`.
shlex = "2"
# ser/de + config
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# serde_yaml is archived (0.9.34+deprecated, no in-crate upgrade path);
# serde-saphyr is the maintained, serde-native replacement. It streams and
# builds no DOM, so rows go through serde_json::Value instead.
serde-saphyr = "1"
toml = "1"
# INI parsing for the native oscrc credential reader (obs backend, G1b).
# osc writes genuine INI (`[https://api.suse.de]` headers, bare `key = value`),
# not TOML, so this is a configparser-parity reader distinct from the app's TOML
# config. Parse errors are mapped to a fixed message (never interpolating the
# parser's Display) so a malformed oscrc's source line — possibly a password —
# is not leaked.
ini = { package = "rust-ini", version = "0.21" }
# XML parsing for /etc/products.d/*.prod product files (host system parser).
quick-xml = "0.41"
directories = "6"
# rpm version comparison — pure-Rust replacement for upstream's libc
# `rpm.labelCompare`, preserving the single-static-binary / no-runtime-deps
# contract. Verified against every upstream `test_rpm_version` golden vector.
sandogasa-rpmvercmp = "0.18"
# http
reqwest = { version = "0.13", features = ["json", "rustls"], default-features = false }
# openQA API auth: HMAC-SHA1 request signing (X-API-Hash), matching the
# third-party python `openqa_client` auth design (openQA/lib/OpenQA/client.pm).
hmac = "0.13"
sha1 = "0.11"
hex = "0.4"
# percent-encoding of the request path before HMAC signing (openQA quirks:
# %20 -> +, ~ -> %7E)
urlencoding = "2"
# regex — SMELT testplatform grammar parsing (refhost Attributes::from_testplatform)
regex = "1"
# HTML parsing — extract `.log` hrefs from the qam.suse.de build_checks directory
# index (oqa_search build-check overview), replacing upstream's minimal
# html.parser LogFileLinkParser.
scraper = "0.27"
# datetime — parse/sort Gitea comment `updated_at` timestamps (RFC3339 with
# offset), matching upstream `datetime.fromisoformat`. std only, no clock/oldtime
# baggage; keeps the single-static-binary contract clean.
chrono = { version = "0.4", default-features = false, features = ["std"] }
# ssh
russh = "0.62"
russh-sftp = "2"
async-trait = "0.1"
# mcp. `server` for the ServerHandler surface + model types;
# `transport-io` for the stdio runner; `transport-async-rw` for the
# in-memory duplex round-trip test. No `macros` — tools are synthesised from the
# runtime command registry, so we hand-build schemas/handlers, not `#[tool]`.
rmcp = { version = "2", default-features = false, features = [
"server",
"client",
"transport-io",
"transport-async-rw",
# `--transport http`: the runtime-keyed streamable-HTTP server whose
# per-session `service_factory` is our per-client `McpSession` isolation hook.
"transport-streamable-http-server",
] }
# HTTP host for the mtui-mcp `--transport http` server: mounts rmcp's
# `StreamableHttpService` (a `tower::Service`) via `Router::fallback_service`
# and binds it with `axum::serve`. Feature-gated behind `mcp`, so the default
# `mtui` build never pulls in a web framework.
axum = { version = "0.8", default-features = false, features = ["tokio", "http1"] }
# CancellationToken for the mtui-mcp http idle-sweeper's cooperative shutdown
# (bead mtui-rs-odq8). Feature-gated behind `mcp`; also rmcp's own transport dep.
tokio-util = { version = "0.7", default-features = false }
# observability + errors
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "registry"] }
thiserror = "2"
anyhow = "1"
# terminal color (CommandPromptDisplay) — supports_color-gated ANSI wrapping
owo-colors = "4"
# optional desktop notifications (feature `notify`). Pure-Rust
# freedesktop/DBus (Linux) + NSUserNotification (macOS) toast backend, keeping
# the single-static-binary / no-Python-runtime contract. Best-effort + headless
# no-op, so a build without the feature never pulls it.
notify-rust = "4"
# stable insertion-ordered map (TemplateRegistry entries) + per-registry id
indexmap = "2"
uuid = { version = "1", features = ["v4"] }
# random shuffle of per-slot pool candidates so load spreads across
# interchangeable refhosts (upstream `random.shuffle`); test-seamed for
# determinism.
rand = "0.10"
# dev / test
insta = "1"
wiremock = "0.6"
# serialises tests that mutate process-global env vars ($OSC_CONFIG, $HOME,
# $XDG_CONFIG_HOME) for the osc-parity oscrc discovery reader — cargo runs tests
# in parallel threads, so env mutation must not race.
serial_test = "4"
# perf baselines (mtui-rs-0mop.1): criterion for in-process latency/throughput
# benches, dhat for allocation + peak-heap profiles. Dev-only; benches use
# `harness = false` so they compile only under `cargo bench`, never in the
# default `cargo test` gate. Startup timing is measured externally with
# `hyperfine` (documented in plans/perf-baseline-0mop1.md), not a crate dep.
criterion = { version = "0.8", features = ["async_tokio"] }
dhat = "0.3"
tempfile = "3"
# internal crates (path deps)
mtui-types = { path = "crates/mtui-types" }
mtui-config = { path = "crates/mtui-config" }
mtui-hosts = { path = "crates/mtui-hosts" }
mtui-datasources = { path = "crates/mtui-datasources" }
mtui-testreport = { path = "crates/mtui-testreport" }
mtui-core = { path = "crates/mtui-core" }
mtui-mcp = { path = "crates/mtui-mcp" }
[workspace.lints.rust]
unsafe_code = "warn"
[profile.release]
lto = "thin"
strip = true
# One codegen unit trades slower release builds for a smaller/faster binary.
codegen-units = 1
# Abort on panic: no unwinding tables, smaller binary. Release-only — the `test`
# profile keeps unwinding (Cargo forbids `panic = "abort"` there and the suite
# relies on it).
panic = "abort"