Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
5ddcf08
fix(cli): strip Windows \\?\ verbatim prefix in uninstall path resolu…
githubrobbi Jun 30, 2026
7e9d50a
fix(cli): uninstall deep sweep decodes every search payload (was find…
githubrobbi Jun 30, 2026
84f5cab
fix(cli): uninstall drive-coverage prompt warns that indexing builds …
githubrobbi Jun 30, 2026
4373f6f
fix(cli): uninstall drive-coverage polls status_drives for readiness,…
githubrobbi Jun 30, 2026
81a1b90
feat(cli): stamp the git commit into `uffs --version` to verify the r…
githubrobbi Jun 30, 2026
e393be1
fix(cli): uninstall deep sweep keeps only real family files, not subs…
githubrobbi Jun 30, 2026
6d52931
fix(client): exe-resolution fallbacks carry .exe on Windows (no bare …
githubrobbi Jun 30, 2026
ed01d38
fix(cli): uninstall drops the legacy C++ uffs.exe GUI binary (PE subs…
githubrobbi Jun 30, 2026
5e6ac84
feat(cli): uninstall prints the running build's version + commit at t…
githubrobbi Jun 30, 2026
8f7a01c
fix(cli): uninstall drive-coverage waits long enough + shows index pr…
githubrobbi Jun 30, 2026
92ff706
fix(cli): uninstall indexes drives with live progress + clearer prompt
githubrobbi Jun 30, 2026
ea0e511
fix(cli): uninstall broker is optional when non-elevated + display po…
githubrobbi Jun 30, 2026
6481087
fix(cli): uninstall always indexes drives for the deep sweep (no prompt)
githubrobbi Jun 30, 2026
ad94b1d
feat(cli): uninstall removes the full workspace binary set, not just …
githubrobbi Jun 30, 2026
7d22fb0
fix(cli): uninstall gathers decisions up front, runs once, defers the…
githubrobbi Jun 30, 2026
1a4e666
fix(cli): uninstall does not taskkill the broker (it is a service; sc…
githubrobbi Jun 30, 2026
11b91a0
fix(cli): uninstall decides the broker/elevation up front, before the…
githubrobbi Jun 30, 2026
318b2cb
perf(uninstall): parallelize + timeout the deep-sweep version probes;…
githubrobbi Jun 30, 2026
76b1de8
feat(uninstall): redesign the discovered-binary table (one row/binary…
githubrobbi Jul 1, 2026
a735a06
fix(uninstall): make deep-sweep drive coverage robust (kill+start, no…
githubrobbi Jul 1, 2026
238adf9
fix(uninstall): never start the daemon in-process for coverage; degra…
githubrobbi Jul 1, 2026
889b0cd
fix(uninstall): reload daemon for coverage via the real CLI handlers …
githubrobbi Jul 1, 2026
a80496a
build(windows): embed icon + version-info + manifest into the 4 bare …
githubrobbi Jul 1, 2026
6276765
build(windows): embed UFFS icon + metadata into the 14 dev/CI binaries
githubrobbi Jul 1, 2026
f894430
fix(mft): bound the overlapped $UpCase/FRS read with a dedicated even…
githubrobbi Jul 1, 2026
4fc9a60
feat(uninstall): quieter UX — elevation asked first, one final summar…
githubrobbi Jul 1, 2026
9bd28a0
feat(uninstall): one-click elevate — 3-way gate + UAC helper at remov…
githubrobbi Jul 2, 2026
4c31b78
feat(uninstall): background gather + spinner, CORE/EXTRA tables, 3-wa…
githubrobbi Jul 2, 2026
b60fbc7
fix(uninstall): presentation order + EXTRA in the plan summary; quiet…
githubrobbi Jul 2, 2026
99d95af
style(uninstall): breathing room before the gate list and both Choice…
githubrobbi Jul 2, 2026
b6c17d0
fix(uninstall): teardown-last execution order + 5 live-run bugs from …
githubrobbi Jul 2, 2026
dde0305
chore(deps): bump rmcp 2.1.0, aes-gcm 0.11.0, indicatif 0.18.6, rand …
githubrobbi Jul 2, 2026
91e278c
refactor(deps): migrate uffs-security to aes-gcm 0.11 and uffs-mcp to…
githubrobbi Jul 3, 2026
d7d63ae
Merge remote-tracking branch 'origin/main' into deps/rmcp2-bumps-vetted
githubrobbi Jul 3, 2026
b603dd6
fix(bytes): clear the 13 anti-pattern-gate lossy-decode sites (first …
githubrobbi Jul 3, 2026
a5d5adc
refactor(mcp): confine the SEP-2577 Roots deprecation to one boundary…
githubrobbi Jul 3, 2026
2caabaa
chore(vet): burn down 13 exemptions with real audits (11 full + 2 delta)
githubrobbi Jul 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 67 additions & 61 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ thiserror = "2.0.18"
anyhow = "1.0.103"

# ───── MCP (Model Context Protocol) ─────
rmcp = { version = "1.8.0", features = ["server", "transport-io", "macros"] }
rmcp = { version = "2.1.0", features = ["server", "transport-io", "macros"] }
schemars = "1.2.1"

# ───── HTTP / Tower (for MCP Streamable HTTP gateway) ─────
Expand All @@ -258,7 +258,7 @@ clap = { version = "4.6.1", features = [
"unicode",
"wrap_help",
] }
indicatif = "0.18.4"
indicatif = "0.18.6"
devicons = "0.6.12"
# ANSI terminal colouring. Used by the `uffs-ci-pipeline` tool; kept at
# workspace scope so a future UI surface that wants colored output inherits
Expand Down Expand Up @@ -328,8 +328,8 @@ num_cpus = "1.17.0"
uuid = { version = "1.23.4", features = ["v4"] }

# ───── Security / Crypto ─────
aes-gcm = "0.10"
rand = "0.10.1"
aes-gcm = "0.11.0"
rand = "0.10.2"
rand_chacha = "0.10.0"
security-framework = "3.7.0"

Expand Down
3 changes: 3 additions & 0 deletions crates/uffs-broker/src/broker/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,10 @@ fn wide(text: &str) -> Vec<u16> {
/// stderr-only message comes out empty (as seen on a failed `sc create`).
#[cfg(windows)]
fn sc_output(output: &std::process::Output) -> String {
// AUDIT-OK(bytes): operator-facing diagnostic text only — the combined
// output is formatted into an error message, never parsed or matched.
let stdout = String::from_utf8_lossy(&output.stdout);
// AUDIT-OK(bytes): same display-only argument as stdout above.
let stderr = String::from_utf8_lossy(&output.stderr);
format!("{} {}", stdout.trim(), stderr.trim())
.trim()
Expand Down
9 changes: 8 additions & 1 deletion crates/uffs-cli/src/commands/uninstall/sweep.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,13 @@ fn probe_version_bounded(path: &Path) -> ProbeOutcome {
let Ok(output) = child.wait_with_output() else {
return ProbeOutcome::None;
};
// AUDIT-OK(bytes): ASCII version-token extraction from a probed binary's
// output. A lossy decode cannot fabricate a `MAJOR.MINOR.PATCH` token
// (U+FFFD is not a digit), only fail to yield one -> "legacy" label.
let mut text = String::from_utf8_lossy(&output.stdout).into_owned();
if text.trim().is_empty() {
// Some tools print `--version` to stderr; fall back to it.
// AUDIT-OK(bytes): same ASCII-token argument as stdout above.
text = String::from_utf8_lossy(&output.stderr).into_owned();
}
crate::commands::update::binaries::parse_version(&text)
Expand Down Expand Up @@ -397,7 +401,10 @@ fn payload_paths(payload: uffs_client::protocol::response::SearchPayload) -> Vec
Payload::ShmemBlob(path) => {
let mut buf: Vec<u8> = Vec::new();
if uffs_client::shmem::stream_paths_blob_into(Path::new(&path), &mut buf).is_ok() {
blob_lines_to_paths(&String::from_utf8_lossy(&buf))
// Strict parse: these paths feed the EXTRA delete list, so a
// corrupt blob is rejected outright rather than risking a
// lossy-mangled path. The daemon always emits valid UTF-8.
core::str::from_utf8(&buf).map_or_else(|_| Vec::new(), blob_lines_to_paths)
} else {
Vec::new()
}
Expand Down
5 changes: 4 additions & 1 deletion crates/uffs-cli/src/commands/update/acquire.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ pub(super) fn latest_version() -> Option<String> {
if !output.status.success() {
return None;
}
String::from_utf8_lossy(&output.stdout)
// Strict parse: the helper is our own binary emitting ASCII `latest=`
// lines; non-UTF-8 output means something is wrong -> treat as no answer.
core::str::from_utf8(&output.stdout)
.ok()?
.lines()
.find_map(|line| line.strip_prefix("latest="))
.map(|tag| tag.trim().to_owned())
Expand Down
Loading
Loading