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
use clap::{Args, Parser, Subcommand};
/// Cargo subcommand wrapper — invoked as `cargo bless`.
#[derive(Parser, Debug)]
#[command(name = "cargo", bin_name = "cargo")]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
/// Bless your dependencies — modernize, optimize, and stay current.
Bless(BlessCommand),
/// Run only the bullshit detector code audit.
Bs(CodeAuditOpts),
}
#[derive(Args, Debug)]
pub struct BlessCommand {
#[command(flatten)]
pub opts: BlessOpts,
#[command(subcommand)]
pub command: Option<BlessSubcommand>,
}
#[derive(Subcommand, Debug)]
pub enum BlessSubcommand {
/// Run only the bullshit detector code audit.
Bs(CodeAuditOpts),
}
#[derive(Args, Debug)]
pub struct BlessOpts {
/// Apply suggested changes to Cargo.toml (creates .bak backup first).
#[arg(long)]
pub fix: bool,
/// Preview changes without writing anything (requires --fix).
#[arg(long)]
pub dry_run: bool,
/// Fetch the latest rules from blessed.rs and update the local cache.
#[arg(long)]
pub update_rules: bool,
/// Reserved for future machine-assisted suggestions.
#[arg(long, hide = true)]
pub llm: bool,
/// Path to the Cargo.toml to analyze (defaults to current directory).
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<std::path::PathBuf>,
/// Run the bullshit detector code audit.
#[arg(long)]
pub audit_code: bool,
/// Skip the default bullshit detector code audit.
#[arg(long, hide = true)]
pub no_audit_code: bool,
/// Output suggestions in JSON format.
#[arg(long)]
pub json: bool,
/// Exit with non-zero code when a suggestion matches the given severity level(s).
/// Reserved severity gate. Comma-separated: low, medium, high, critical.
#[arg(long, value_delimiter = ',', hide = true)]
pub fail_on: Vec<String>,
/// Analyze all workspace members instead of only the root package.
#[arg(long, hide = true)]
pub workspace: bool,
/// Only analyze the specified package(s) in a workspace. Accepts package names.
#[arg(long, value_delimiter = ',', hide = true)]
pub package: Vec<String>,
/// Include dev-dependencies and build-dependencies in analysis.
#[arg(long, hide = true)]
pub all_targets: bool,
/// Do not fetch online data; use only the local rule cache.
#[arg(long)]
pub offline: bool,
/// Path to a bless.toml policy file for custom rules and overrides.
#[arg(long, value_name = "PATH")]
pub policy: Option<std::path::PathBuf>,
/// Show every bullshit detector finding instead of a concise summary.
#[arg(long)]
pub verbose: bool,
}
#[derive(Args, Debug)]
pub struct CodeAuditOpts {
/// Path to the Cargo.toml whose source tree should be audited.
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<std::path::PathBuf>,
/// Output the bullshit audit report as JSON.
#[arg(long)]
pub json: bool,
/// Audit only lines changed in `git diff HEAD`.
#[arg(long)]
pub diff: bool,
/// Path to a bless.toml policy file for code-audit suppressions.
#[arg(long, value_name = "PATH")]
pub policy: Option<std::path::PathBuf>,
/// Show every finding instead of a concise summary.
#[arg(long)]
pub verbose: bool,
}