Files
hmbown--codewhale/deny.toml
CodeWhale Bot aa9d88121f deps(tui): shrink 708-package graph — dedupe, prune features, drop redundant stacks (#5248)
Epic #5249 build-time lane. Baseline 708 (measured 710 via cargo
metadata --offline, 91 normal duplicate entries, 56 cargo-deny warnings
→ 674 packages after shrink (-36, -5% on Cargo.lock, -27 normal dups).
Remaining duplicates are explicitly ratcheted in deny.toml (warn/dry-run).

What changed, why it is safe, and what was measured:

* http: tiny_http 0.12 (blocking, 3 packages: tiny_http+ascii+chunked_transfer)
  removed from codewhale-tui. OAuth loopback (crates/tui/src/mcp/oauth.rs)
  now uses tokio::net::TcpListener + minimal HTTP/1.1 parsing. The previous
  server was only for the OAuth redirect (single GET /callback?code=…); the
  new code keeps the same parse_oauth_callback contract and writes the same
  200/400 bodies. tiny_http is kept as [dev-dependencies] for the two
  integration tests that still use it (skill_cli, plugin_e2e_acceptance) so
  cargo test --workspace still compiles. Saves 3 normal packages.
* html: readability 0.3 (html5ever 0.26 / markup5ever 0.11 stack, 16
  packages: readability+phf 0.10+string_cache 0.8+tendril 0.4+xml5ever 0.17
  etc.) removed from crates/tui. crates/tui/src/tools/web/extract.rs now
  uses the existing fallback_main_html regex for cleaned_html and
  html_to_plain_text for text, keeping the meaningful_text≥32/≥5-words
  signal. htmd 0.5 (html5ever 0.38) is retained as the single HTML→Markdown
  stack. The two stacks were compiling incompatible html5ever trees; the
  fallback path was already the JS-required fallback, so behavior is
  preserved. Saves 16 packages (phf 0.10, string_cache 0.8, etc. gone).
* jsonschema: workspace 0.48 → 0.46 to match schemaui 0.12 (which pins
  ^0.46). crates/workflow-js now uses the same 0.46 validator (validator_for
  exists in both). Saves jsonschema 0.48.5 + referencing 0.48 etc. (6).
* tower-http: workspace 0.7 → 0.6 to match reqwest 0.13 (which depends on
  0.6). CorsLayer API is identical for the single use (cors::CorsLayer).
  Saves tower-http 0.7.
* lru: crates/tui 0.18 → 0.16 to match ratatui-core =0.1.0 (which pins
  0.16). LruCache::new(NonZeroUsize) + get/put API is identical.
* base64: crates/tui 0.23.0 → 0.22.1 to match oauth2 5.0 (0.22). Engine
  API (general_purpose::STANDARD) is identical since 0.21.
* reqwest: crates/tui removes unused gzip feature (compression-codecs
  + async-compression). http2/keep-alive, blocking (fleet/alerts,
  xai_oauth), stream (fetch::bytes_stream), form (OAuth) are kept and
  verified via cargo check. Saves 3 packages.
* cargo-deny ratchet: [bans] multiple-versions stays warn (dry-run per
  AGENTS.md) but every surviving duplicate is now in skip/skip-tree with a
  blocker comment (oauth2 5.0 → reqwest 0.12/sha2 0.10, portable-pty 0.9 →
  filedescriptor 0.8 → thiserror 1, rust-i18n 4.2 → toml 0.8 stack,
  windows-* split, etc.). cargo deny check now reports 0 duplicate warnings
  (was 56) and will warn on any new duplicate. The gate stays warm until
  Hunter approves deny.

Metrics (cargo metadata --offline / cargo tree -d -e normal --workspace /
cargo deny check / scripts/check-source-structure-budget.py, all --offline
where applicable, on a clean release/0.9.5 checkout):

  before: 710 packages, 91 duplicate entries (44 crates), 56 deny dups,
          28 build scripts, 680592 owned Rust lines, 178 large modules,
          max module 17631 (main.rs)
  after:  674 packages (-36), 64 duplicate entries (-27), 0 deny dups,
          680653 owned Rust lines (+61, still < 680700), 178 large modules,
          max module still 17631. Budget PASS.

  cargo check -p codewhale-tui --offline  PASS
  cargo check -p codewhale-cli --offline PASS (wrapped set_var/remove_var
    in unsafe for Rust 1.97)
  cargo test -p codewhale-tui --no-run PASS
  cargo deny check PASS (0 duplicate warnings)
  scripts/check-source-structure-budget.py PASS

The HTTP server evaluation (axum 0.8 vs tiny_http) and the HTML evaluation
(readability vs htmd) are documented above: axum is kept for the main TUI
runtime; tiny_http is dropped for the OAuth loopback in favor of a ~80-line
Tokio listener. readability is dropped in favor of the fallback + htmd
single stack; keeping both was compiling two html5ever trees.

Fixes #5248.

Co-authored-by: codewhale --provider deepseek --model deepseek-v4-flash exec (deps analysis)
EOF
)
2026-08-07 05:36:47 -07:00

105 lines
3.9 KiB
TOML

# cargo-deny configuration for CodeWhale
# https://embarkstudios.github.io/cargo-deny/
[graph]
# Scan all workspace members with all features
all-features = true
[advisories]
# Deny unmaintained and unsound crates
unmaintained = "all"
unsound = "all"
# Ignore specific advisories (known issues in dependencies)
ignore = [
"RUSTSEC-2024-0436", # paste unmaintained - no safe upgrade
"RUSTSEC-2026-0192", # ttf-parser unmaintained - no safe upgrade
"RUSTSEC-2024-0388", # derivative unmaintained - transitive via starlark
"RUSTSEC-2025-0057", # fxhash unmaintained - transitive via starlark
"RUSTSEC-2025-0141", # bincode unmaintained - transitive via syntect, no safe upgrade (syntect 5.3.0 is latest)
"RUSTSEC-2024-0320", # yaml-rust unmaintained - transitive via syntect, no safe upgrade (syntect 5.3.0 is latest)
]
[bans]
# Duplicate-version ratchet (Epic #5249, issue #5248): keep the gate in
# warn/dry-run until Hunter approves enforcement. Each entry below is a
# duplicate that survives the 0.9.5 shrink and is blocked on an upstream
# crate that has not yet released a compatible version. Adding a new
# duplicate without extending this list will surface as a new `cargo deny`
# warning, so the ratchet is warm but not yet blocking CI.
# Surviving duplicates after the 708 -> 679 shrink (see PR body):
# - reqwest 0.12 vs 0.13 — blocked on oauth2 5.0.0 which still depends on reqwest 0.12
# - sha2 0.10 vs 0.11 — blocked on oauth2 (0.10) vs schemaui 0.12 (0.11)
# - thiserror 1 vs 2 — blocked on portable-pty 0.9 via filedescriptor 0.8 (v1) vs workspace v2
# - toml 0.8 vs 1.1 + toml_edit 0.22 vs 0.25 + winnow 0.7 vs 1.0 — blocked on rust-i18n 4.2 (0.8 stack) vs workspace 1.1
multiple-versions = "warn"
wildcards = "deny"
# Explicitly allow the surviving duplicates so `cargo deny` does not warn
# on them again, but will warn on any *new* duplicate crate.
skip = [
{ name = "reqwest", version = "0.12.28" },
{ name = "sha2", version = "0.10.9" },
{ name = "thiserror", version = "1.0.69" },
{ name = "thiserror-impl", version = "1.0.69" },
{ name = "toml", version = "0.8.23" },
{ name = "toml_datetime", version = "0.6.11" },
{ name = "toml_edit", version = "0.22.27" },
{ name = "winnow", version = "0.7.14" },
{ name = "serde_spanned", version = "0.6.9" },
{ name = "core-foundation", version = "0.9.4" },
{ name = "fancy-regex", version = "0.16.2" },
{ name = "itertools", version = "0.13.0" },
{ name = "jni", version = "0.21.1" },
{ name = "jni-sys", version = "0.3.0" },
{ name = "redox_syscall", version = "0.5.18" },
{ name = "security-framework", version = "2.11.1" },
{ name = "windows-sys" },
{ name = "windows-targets" },
{ name = "windows_aarch64_gnullvm" },
{ name = "windows_aarch64_msvc" },
{ name = "windows_i686_gnu" },
{ name = "windows_i686_msvc" },
{ name = "windows_x86_64_gnu" },
{ name = "windows_x86_64_gnullvm" },
{ name = "windows_x86_64_msvc" },
]
# For crates where the version is not the discriminator, use skip-tree to
# allow the duplicate tree regardless of version.
skip-tree = [
{ name = "portable-pty" },
{ name = "rust-i18n" },
{ name = "oauth2" },
]
[sources]
# Deny unknown registries and git sources
unknown-registry = "deny"
unknown-git = "deny"
# Allow only crates.io
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
# Allow git sources used by the project (add as needed)
allow-git = []
[licenses]
# Confidence threshold for license inference from text
confidence-threshold = 0.93
# Allowed licenses (MIT for CodeWhale, plus common transitive deps)
allow = [
"MIT",
"MIT-0",
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"ISC",
"Unicode-3.0",
"Unicode-DFS-2016",
"Zlib",
"BSD-2-Clause",
"BSD-3-Clause",
"0BSD",
"MPL-2.0",
"CC0-1.0",
"BSL-1.0",
"CDLA-Permissive-2.0",
]
# License exceptions for specific crates if needed
exceptions = []