Skip to main content

hematite/
lib.rs

1pub mod agent;
2
3/// Serializes tests that call `std::env::set_current_dir` to prevent race conditions
4/// in parallel test runs. Any test that mutates the process-wide cwd must hold this
5/// lock for the duration of the directory change.
6#[cfg(test)]
7pub(crate) static TEST_CWD_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
8
9pub mod memory;
10pub mod runtime;
11pub mod telemetry;
12pub mod tools;
13pub mod ui;
14
15pub const HEMATITE_VERSION: &str = env!("CARGO_PKG_VERSION");
16pub const HEMATITE_AUTHOR: &str = "Ocean Bennett";
17pub const HEMATITE_REPOSITORY_URL: &str = "https://github.com/undergroundrap/hematite-cli";
18pub const HEMATITE_SHORT_DESCRIPTION: &str =
19    "Local-first AI coding harness — Senior SysAdmin, Network Admin, Data Analyst, and Software Engineer in your terminal.";
20const HEMATITE_GIT_COMMIT_SHORT_RAW: &str = env!("HEMATITE_GIT_COMMIT_SHORT");
21const HEMATITE_GIT_EXACT_TAG_RAW: &str = env!("HEMATITE_GIT_EXACT_TAG");
22const HEMATITE_GIT_DIRTY_RAW: &str = env!("HEMATITE_GIT_DIRTY");
23
24pub fn hematite_git_commit_short() -> Option<&'static str> {
25    #[allow(clippy::const_is_empty)]
26    (!HEMATITE_GIT_COMMIT_SHORT_RAW.is_empty()).then_some(HEMATITE_GIT_COMMIT_SHORT_RAW)
27}
28
29pub fn hematite_git_exact_tag() -> Option<&'static str> {
30    #[allow(clippy::const_is_empty)]
31    (!HEMATITE_GIT_EXACT_TAG_RAW.is_empty()).then_some(HEMATITE_GIT_EXACT_TAG_RAW)
32}
33
34pub fn hematite_git_dirty() -> bool {
35    HEMATITE_GIT_DIRTY_RAW.eq_ignore_ascii_case("true")
36}
37
38pub fn hematite_build_descriptor() -> String {
39    let release_tag = format!("v{}", HEMATITE_VERSION);
40    let exact_release = matches!(hematite_git_exact_tag(), Some(tag) if tag == release_tag);
41
42    if exact_release && !hematite_git_dirty() {
43        "release".to_string()
44    } else {
45        match (hematite_git_commit_short(), hematite_git_dirty()) {
46            (Some(commit), true) => format!("dev+{}-dirty", commit),
47            (Some(commit), false) => format!("dev+{}", commit),
48            (None, true) => "dev-dirty".to_string(),
49            (None, false) => "dev".to_string(),
50        }
51    }
52}
53
54pub fn hematite_version() -> String {
55    format!("v{}", HEMATITE_VERSION)
56}
57
58pub fn hematite_version_display() -> String {
59    format!("v{} [{}]", HEMATITE_VERSION, hematite_build_descriptor())
60}
61
62pub fn hematite_version_report() -> String {
63    let mut lines = vec![
64        format!("Hematite v{}", HEMATITE_VERSION),
65        format!("Build: {}", hematite_build_descriptor()),
66    ];
67    if let Some(commit) = hematite_git_commit_short() {
68        lines.push(format!("Commit: {}", commit));
69    }
70    lines.push(format!(
71        "Built from a dirty worktree: {}",
72        if hematite_git_dirty() { "yes" } else { "no" }
73    ));
74    lines.push(format!(
75        "Exact release tag at build time: {}",
76        hematite_git_exact_tag().unwrap_or("none")
77    ));
78    lines.join("\n")
79}
80
81pub fn hematite_about_report() -> String {
82    [
83        format!("Hematite v{}", HEMATITE_VERSION),
84        format!("Build: {}", hematite_build_descriptor()),
85        format!("Created and maintained by {}", HEMATITE_AUTHOR),
86        HEMATITE_SHORT_DESCRIPTION.to_string(),
87        format!("Repo: {}", HEMATITE_REPOSITORY_URL),
88    ]
89    .join("\n")
90}
91
92pub fn hematite_identity_answer() -> String {
93    format!(
94        "Hematite was created and is maintained by {}.\n\n{}\n\nThe running assistant uses a local model runtime, but Hematite itself is the local harness: the TUI, tool use, file editing, workflow control, host inspection, data analysis sandbox, voice integration, and workstation-assistant architecture.\n\nRepo: {}",
95        HEMATITE_AUTHOR, HEMATITE_SHORT_DESCRIPTION, HEMATITE_REPOSITORY_URL
96    )
97}
98
99// Standard imports for library users
100pub use agent::config::HematiteConfig;
101pub use agent::conversation::ConversationManager;
102pub use agent::inference::InferenceEngine;
103
104use clap::Parser;
105
106#[derive(Parser, Debug, Clone)]
107#[command(
108    author,
109    version,
110    about = "Hematite CLI - SysAdmin, Network Admin, Data Analyst, and Software Engineer in your terminal",
111    long_about = None
112)]
113pub struct CliCockpit {
114    #[arg(long, help = "Bypasses the high-risk modal (Danger mode)")]
115    pub yolo: bool,
116
117    #[arg(
118        long,
119        default_value_t = 3,
120        help = "Sets max parallel workers (default 3)"
121    )]
122    pub swarm_size: usize,
123
124    #[arg(
125        long,
126        help = "Forces the Vigil Brief Mode for concise, high-speed output"
127    )]
128    pub brief: bool,
129
130    #[arg(
131        long,
132        help = "Pass a custom salt to reroll the deterministic species hash"
133    )]
134    pub reroll: Option<String>,
135
136    #[arg(
137        long,
138        help = "Rusty Mode: Enables the Rusty personality system, snark, and companion features"
139    )]
140    pub rusty: bool,
141
142    #[arg(long, help = "Show Rusty stats and exit")]
143    pub stats: bool,
144
145    #[arg(
146        long,
147        help = "Skip the blocking splash screen and enter the TUI immediately"
148    )]
149    pub no_splash: bool,
150
151    #[arg(
152        long,
153        help = "Optional model ID for simple tasks (overrides auto-detect)"
154    )]
155    pub fast_model: Option<String>,
156
157    #[arg(
158        long,
159        help = "Optional model ID for complex tasks (overrides auto-detect)"
160    )]
161    pub think_model: Option<String>,
162
163    #[arg(
164        long,
165        default_value = "http://localhost:1234/v1",
166        help = "The base URL for the OpenAI-compatible API"
167    )]
168    pub url: String,
169
170    // ── MCP Server ────────────────────────────────────────────────────────────
171    #[arg(
172        long,
173        help_heading = "MCP Server",
174        help = "Run as an MCP stdio server — exposes inspect_host to Claude Desktop, OpenClaw, Cursor, and any MCP-capable agent"
175    )]
176    pub mcp_server: bool,
177
178    #[arg(
179        long,
180        help_heading = "MCP Server",
181        help = "Enable edge redaction in MCP server mode — strips usernames, MACs, serial numbers, hostnames, and credentials before responses leave the machine"
182    )]
183    pub edge_redact: bool,
184
185    #[arg(
186        long,
187        help_heading = "MCP Server",
188        help = "Enable semantic edge redaction — routes inspect_host output through the local model for privacy-safe summarization before any data leaves the machine. Implies --edge-redact."
189    )]
190    pub semantic_redact: bool,
191
192    #[arg(
193        long,
194        help_heading = "MCP Server",
195        help = "Endpoint for --semantic-redact (default: same as --url). Point at a dedicated compact model on a different port."
196    )]
197    pub semantic_url: Option<String>,
198
199    #[arg(
200        long,
201        help_heading = "MCP Server",
202        help = "Model ID for --semantic-redact (e.g. bonsai-8b). Required when multiple models are loaded."
203    )]
204    pub semantic_model: Option<String>,
205
206    // ── Headless Reports ──────────────────────────────────────────────────────
207    #[arg(
208        long,
209        help_heading = "Headless Reports",
210        help = "Run a headless diagnostic report and print to stdout — no TUI launched. Pipe to a file: hematite --report > health.md"
211    )]
212    pub report: bool,
213
214    #[arg(
215        long,
216        help_heading = "Headless Reports",
217        default_value = "md",
218        help = "Output format: md (default), json, or html (self-contained, double-clickable)"
219    )]
220    pub report_format: String,
221
222    #[arg(
223        long,
224        help_heading = "Headless Reports",
225        help = "Staged triage — health_report then targeted follow-up inspections. Saves to .hematite/reports/. Add --open to launch."
226    )]
227    pub diagnose: bool,
228
229    #[arg(
230        long,
231        help_heading = "Headless Reports",
232        default_missing_value = "default",
233        num_args = 0..=1,
234        value_name = "PRESET",
235        help = "IT-first-look triage. Optional preset: network, security, performance, storage, apps. Plain --triage runs health+security+connectivity+identity+updates."
236    )]
237    pub triage: Option<String>,
238
239    #[arg(
240        long,
241        help_heading = "Headless Reports",
242        value_name = "ISSUE",
243        help = "Targeted fix plan — keyword-matches your issue to the right inspect_host topics and saves a step-by-step plan. Example: hematite --fix \"PC running slow\""
244    )]
245    pub fix: Option<String>,
246
247    #[arg(
248        long,
249        help_heading = "Headless Reports",
250        help = "Open the saved report file immediately after writing (browser for HTML, editor for Markdown)"
251    )]
252    pub open: bool,
253
254    #[arg(
255        long,
256        help_heading = "Headless Reports",
257        help = "With --fix: preview which topics would be inspected without running any checks"
258    )]
259    pub dry_run: bool,
260
261    #[arg(
262        long,
263        help_heading = "Headless Reports",
264        help = "With --fix: offer to run safe auto-fixes after generating the plan (DNS flush, service restarts, clock sync, etc.)"
265    )]
266    pub execute: bool,
267
268    #[arg(
269        long,
270        help_heading = "Headless Reports",
271        help = "With --fix --execute: skip the Y/n prompt and apply auto-fixes immediately. Use in scripts and scheduled tasks."
272    )]
273    pub yes: bool,
274
275    #[arg(
276        long,
277        help_heading = "Headless Reports",
278        help = "Suppress output when the result is healthy (exit 0). Only prints when issues are found (exit 1). Use in scheduled tasks and scripts."
279    )]
280    pub quiet: bool,
281
282    #[arg(
283        long,
284        help_heading = "Headless Reports",
285        help = "Maintenance sweep — checks every safe auto-fix topic, skips what is healthy, runs what needs fixing, and verifies each fix resolved. No model required."
286    )]
287    pub fix_all: bool,
288
289    #[arg(
290        long,
291        help_heading = "Headless Reports",
292        value_name = "LABEL",
293        help = "With --fix-all: run only the named fix from the sweep. Example: hematite --fix-all --only \"Flush DNS Cache\". Use --fix-all --list to see all fix labels."
294    )]
295    pub only: Option<String>,
296
297    #[arg(
298        long,
299        help_heading = "Headless Reports",
300        help = "Copy output to clipboard after the command completes. Works with --triage, --diagnose, --fix, --fix-all, --inspect, and --query."
301    )]
302    pub clipboard: bool,
303
304    #[arg(
305        long,
306        help_heading = "Headless Reports",
307        help = "Show a native desktop notification when the command finishes. On alert pattern match with --watch, fires a notification instead of only ringing the bell. Windows 10/11 only."
308    )]
309    pub notify: bool,
310
311    #[arg(
312        long,
313        help_heading = "Headless Reports",
314        value_name = "PATH",
315        help = "Save report output to an explicit file path instead of the auto-dated .hematite/reports/ directory. Works with --triage, --diagnose, --fix, --fix-all, and --inspect."
316    )]
317    pub output: Option<String>,
318
319    #[arg(
320        long,
321        help_heading = "Headless Reports",
322        default_missing_value = "weekly",
323        num_args = 0..=1,
324        value_name = "CADENCE",
325        help = "Register a Windows scheduled task for --triage. CADENCE: weekly (default), daily, remove, status. Combine with --fix-all to schedule the maintenance sweep instead."
326    )]
327    pub schedule: Option<String>,
328
329    // ── Modelless Inspection ──────────────────────────────────────────────────
330    #[arg(
331        long,
332        help_heading = "Modelless Inspection",
333        help = "List all 128 available inspect_host topics by category. No model or TUI required."
334    )]
335    pub inventory: bool,
336
337    #[arg(
338        long,
339        help_heading = "Modelless Inspection",
340        value_name = "TOPIC[,TOPIC2,...]",
341        help = "Run any inspect_host topic directly to stdout. Comma-separate for multiple topics. Example: hematite --inspect wifi,latency,dns_cache"
342    )]
343    pub inspect: Option<String>,
344
345    #[arg(
346        long,
347        help_heading = "Modelless Inspection",
348        value_name = "QUERY",
349        help = "Natural-language query routed to the right inspect_host topics. Example: hematite --query \"why is my PC slow\""
350    )]
351    pub query: Option<String>,
352
353    #[arg(
354        long,
355        help_heading = "Modelless Inspection",
356        value_name = "TOPIC[,TOPIC2,...]",
357        help = "Continuously poll topic(s) every N seconds (see --watch-interval). Press Ctrl+C to stop. Example: hematite --watch resource_load,thermal"
358    )]
359    pub watch: Option<String>,
360
361    #[arg(
362        long,
363        help_heading = "Modelless Inspection",
364        value_name = "SECONDS",
365        default_value = "5",
366        help = "Polling interval in seconds for --watch (default: 5)"
367    )]
368    pub watch_interval: u64,
369
370    #[arg(
371        long,
372        help_heading = "Modelless Inspection",
373        value_name = "N",
374        help = "With --watch: stop after N poll cycles instead of running until Ctrl+C. Example: hematite --watch resource_load --count 5"
375    )]
376    pub count: Option<u64>,
377
378    #[arg(
379        long,
380        help_heading = "Modelless Inspection",
381        value_name = "TOPIC[,TOPIC2,...]",
382        help = "Take two snapshots separated by --diff-after seconds and show a colored diff. Example: hematite --diff processes --diff-after 60"
383    )]
384    pub diff: Option<String>,
385
386    #[arg(
387        long,
388        help_heading = "Modelless Inspection",
389        value_name = "SECONDS",
390        default_value = "30",
391        help = "Seconds between snapshots for --diff (default: 30)"
392    )]
393    pub diff_after: u64,
394
395    #[arg(
396        long,
397        help_heading = "Modelless Inspection",
398        value_name = "PATTERN",
399        help = "With --watch: silent heartbeat when pattern is absent, bell + full output on match. Example: hematite --watch thermal --alert throttl"
400    )]
401    pub alert: Option<String>,
402
403    #[arg(
404        long,
405        help_heading = "Modelless Inspection",
406        value_name = "PATTERN",
407        help = "With --watch or --inspect: filter output to only lines containing PATTERN. Case-insensitive. Example: hematite --watch resource_load --field cpu"
408    )]
409    pub field: Option<String>,
410
411    #[arg(
412        long,
413        help_heading = "Modelless Inspection",
414        value_name = "NAME",
415        help = "With --inspect: save output to .hematite/snapshots/<name>.txt instead of printing. Example: hematite --inspect thermal --snapshot before-update"
416    )]
417    pub snapshot: Option<String>,
418
419    #[arg(
420        long,
421        help_heading = "Modelless Inspection",
422        value_name = "NAME",
423        help = "With --diff: load snapshot A from .hematite/snapshots/<name>.txt instead of running a live capture. Example: hematite --diff thermal --from before-update"
424    )]
425    pub from: Option<String>,
426
427    #[arg(
428        long,
429        help_heading = "Modelless Inspection",
430        help = "List saved snapshots in .hematite/snapshots/ with timestamps and sizes"
431    )]
432    pub snapshots: bool,
433
434    #[arg(
435        long,
436        help_heading = "Modelless Inspection",
437        value_name = "NAME1,NAME2",
438        help = "Diff two saved snapshots against each other without a live run. Example: hematite --compare before-update,after-update"
439    )]
440    pub compare: Option<String>,
441
442    #[arg(
443        long,
444        help_heading = "Modelless Inspection",
445        value_name = "NAME",
446        help = "Start a change audit session — takes a baseline snapshot of key system topics. Example: hematite --audit-start pre-patch"
447    )]
448    pub audit_start: Option<String>,
449
450    #[arg(
451        long,
452        help_heading = "Modelless Inspection",
453        value_name = "NAME",
454        help = "End a change audit session — re-runs the baseline topics and generates a diff report. Example: hematite --audit-end pre-patch"
455    )]
456    pub audit_end: Option<String>,
457
458    #[arg(
459        long,
460        help_heading = "Modelless Inspection",
461        value_name = "TOPIC[,TOPIC2,...]",
462        help = "Topics to capture for --audit-start (default: services,startup_items,ports,scheduled_tasks,shares,firewall_rules,processes,connections)"
463    )]
464    pub audit_topics: Option<String>,
465
466    #[arg(
467        long,
468        help_heading = "Modelless Inspection",
469        value_name = "TOPIC:PATTERN",
470        help = "Add a persistent alert rule. Format: TOPIC:PATTERN (e.g. thermal:throttl). Add --alert-rule-label to name it. Add --alert-rule-negate to fire when pattern is absent."
471    )]
472    pub alert_rule_add: Option<String>,
473
474    #[arg(
475        long,
476        help_heading = "Modelless Inspection",
477        value_name = "NAME",
478        help = "Label for the alert rule being added with --alert-rule-add."
479    )]
480    pub alert_rule_label: Option<String>,
481
482    #[arg(
483        long,
484        help_heading = "Modelless Inspection",
485        help = "With --alert-rule-add: fire when pattern is ABSENT (e.g. alert if antivirus is not running)."
486    )]
487    pub alert_rule_negate: bool,
488
489    #[arg(
490        long,
491        help_heading = "Modelless Inspection",
492        help = "List all saved alert rules."
493    )]
494    pub alert_rules: bool,
495
496    #[arg(
497        long,
498        help_heading = "Modelless Inspection",
499        value_name = "ID",
500        help = "Remove alert rule by ID (see --alert-rules for IDs)."
501    )]
502    pub alert_rule_remove: Option<u64>,
503
504    #[arg(
505        long,
506        help_heading = "Modelless Inspection",
507        help = "Evaluate all saved alert rules against live machine data and fire toast notifications for matches. Add --schedule hourly|daily to automate."
508    )]
509    pub alert_rule_run: bool,
510
511    #[arg(
512        long,
513        help_heading = "Modelless Inspection",
514        help = "Take today's timeline snapshot (health_report, startup_items, ports, services). Skips if already captured today. Add --schedule daily to register a Task Scheduler task."
515    )]
516    pub timeline_capture: bool,
517
518    #[arg(
519        long,
520        help_heading = "Modelless Inspection",
521        help = "Show the machine state timeline — all captured daily entries with date, health grade, and summary."
522    )]
523    pub timeline: bool,
524
525    #[arg(
526        long,
527        help_heading = "Modelless Inspection",
528        value_name = "DATE or DATE1,DATE2",
529        help = "Diff timeline entries. Single date diffs against the previous entry; two dates diff each other. Example: hematite --timeline-diff 2025-05-10"
530    )]
531    pub timeline_diff: Option<String>,
532
533    #[arg(
534        long,
535        help_heading = "Modelless Inspection",
536        help = "Show an ASCII health grade trend chart from all captured timeline entries. Renders a bar chart, sparkline, and trajectory summary."
537    )]
538    pub timeline_trend: bool,
539
540    #[arg(
541        long,
542        help_heading = "Modelless Inspection",
543        value_name = "SYMPTOM",
544        help = "Symptom-driven root-cause diagnosis — describe the problem in plain English. Runs all relevant topics and returns ranked probable causes with evidence. No model required. Example: hematite --diagnose-why \"PC is slow and freezing\""
545    )]
546    pub diagnose_why: Option<String>,
547
548    #[arg(
549        long,
550        help_heading = "Headless Reports",
551        value_name = "FILE",
552        help = "Statistical profiler — loads CSV/TSV/JSON/SQLite and prints a real computed column profile. No model required. Example: hematite --analyze data.csv"
553    )]
554    pub analyze: Option<String>,
555
556    #[arg(
557        long,
558        help_heading = "Headless Reports",
559        value_name = "EXPR",
560        help = "Evaluate a math or science expression locally — no model, no cloud. Supports arithmetic, trig, stats, physical constants, and percentages. Examples: hematite --compute \"sqrt(2)*pi\", hematite --compute \"15% of 89.99\", hematite --compute \"N_A * k_B\""
561    )]
562    pub compute: Option<String>,
563
564    #[arg(
565        long,
566        help_heading = "Headless Reports",
567        value_name = "EXPR",
568        help = "Unit conversion — instant, no model, no cloud. 15 categories: length, mass, time, area, volume, speed, force, pressure, energy, power, data, angle, frequency, illuminance, fuel economy, temperature. Examples: hematite --convert '5 km to miles'  '100 f to c'  '1 atm to Pa'  '60 mph to km/h'  '1 GiB to MB'  '1 kcal to J'  'list' (show all units)"
569    )]
570    pub convert: Option<String>,
571
572    #[arg(
573        long,
574        help_heading = "Headless Reports",
575        value_name = "FILE",
576        help = "Run a SQL query against a local data file (CSV, TSV, JSON, SQLite). The file is loaded as a table named 'data'. Pair with --sql to provide the query. Example: hematite --query-data employees.csv --sql \"SELECT department, COUNT(*) FROM data GROUP BY department\""
577    )]
578    pub query_data: Option<String>,
579
580    #[arg(
581        long,
582        help_heading = "Headless Reports",
583        value_name = "QUERY",
584        help = "SQL query to run against the file specified by --query-data. The table is always named 'data'. Example: --sql \"SELECT AVG(salary) FROM data WHERE department='Engineering'\""
585    )]
586    pub sql: Option<String>,
587
588    #[arg(
589        long,
590        help_heading = "Headless Reports",
591        value_name = "FILE",
592        help = "Generate a chart from a data file — no model, no cloud. Supports CSV, TSV, JSON, and SQLite. Uses matplotlib when available; falls back to a pure-Python SVG generator. Example: hematite --plot data.csv --plot-type histogram --plot-x age"
593    )]
594    pub plot: Option<String>,
595
596    #[arg(
597        long,
598        help_heading = "Headless Reports",
599        value_name = "TYPE",
600        default_value = "histogram",
601        help = "Chart type for --plot: histogram, scatter, line, or bar. Default: histogram."
602    )]
603    pub plot_type: Option<String>,
604
605    #[arg(
606        long,
607        help_heading = "Headless Reports",
608        value_name = "COLUMN",
609        help = "X-axis column name for --plot. Auto-detected from numeric columns if omitted."
610    )]
611    pub plot_x: Option<String>,
612
613    #[arg(
614        long,
615        help_heading = "Headless Reports",
616        value_name = "COLUMN",
617        help = "Y-axis column name for --plot (scatter/line charts). Auto-detected if omitted."
618    )]
619    pub plot_y: Option<String>,
620
621    #[arg(
622        long,
623        help_heading = "Headless Reports",
624        value_name = "TEXT",
625        help = "Chart title for --plot (auto-generated if omitted)."
626    )]
627    pub plot_title: Option<String>,
628
629    #[arg(
630        long,
631        help_heading = "Headless Reports",
632        value_name = "FILE",
633        help = "Output SVG file path for --plot (default: <input>_plot.svg)."
634    )]
635    pub plot_output: Option<String>,
636
637    #[arg(
638        long,
639        help_heading = "Headless Reports",
640        value_name = "QUERY",
641        help = "Monte Carlo simulation — instant, no model. Modes: 'pi N' (estimate π), 'birthday N', 'dice 2d6 1000', 'ruin P START GOAL N', 'walk WALKS STEPS'. Example: hematite --simulate 'pi 1000000'  'dice 2d6+3 5000'  'birthday 30'"
642    )]
643    pub simulate: Option<String>,
644
645    #[arg(
646        long,
647        help_heading = "Data Analysis",
648        value_name = "FILE",
649        help = "Discrete Fourier Transform on a numeric column — finds dominant frequencies. Use --fourier-col COL, --fourier-top N, --fourier-rate Hz. Example: hematite --fourier signal.csv --fourier-col value --fourier-top 10 --fourier-rate 44100"
650    )]
651    pub fourier: Option<String>,
652
653    #[arg(
654        long,
655        help_heading = "Data Analysis",
656        value_name = "COL",
657        help = "Column to analyze with --fourier (auto-detected if omitted)."
658    )]
659    pub fourier_col: Option<String>,
660
661    #[arg(
662        long,
663        help_heading = "Data Analysis",
664        value_name = "N",
665        help = "Number of top frequency components to report for --fourier (default 10)."
666    )]
667    pub fourier_top: Option<usize>,
668
669    #[arg(
670        long,
671        help_heading = "Data Analysis",
672        value_name = "HZ",
673        help = "Sample rate in Hz for --fourier (default 1.0 — reports normalized frequencies)."
674    )]
675    pub fourier_rate: Option<f64>,
676
677    #[arg(
678        long,
679        help_heading = "Data Analysis",
680        value_name = "FILE",
681        help = "k-Means clustering on numeric columns. Use --cluster-k N (default 3), --cluster-cols COL1,COL2,..., --cluster-output FILE. Example: hematite --cluster data.csv --cluster-k 4 --cluster-cols height,weight --cluster-output labeled.csv"
682    )]
683    pub cluster: Option<String>,
684
685    #[arg(
686        long,
687        help_heading = "Data Analysis",
688        value_name = "N",
689        help = "Number of clusters for --cluster (default 3)."
690    )]
691    pub cluster_k: Option<usize>,
692
693    #[arg(
694        long,
695        help_heading = "Data Analysis",
696        value_name = "COL1,COL2,...",
697        help = "Feature columns for --cluster, comma-separated (default: all numeric)."
698    )]
699    pub cluster_cols: Option<String>,
700
701    #[arg(
702        long,
703        help_heading = "Data Analysis",
704        value_name = "FILE",
705        help = "Output CSV with cluster labels appended for --cluster."
706    )]
707    pub cluster_output: Option<String>,
708
709    #[arg(
710        long,
711        help_heading = "Data Analysis",
712        value_name = "FILE",
713        help = "Normalize/standardize numeric columns. Use --normalize-method minmax|zscore|robust, --normalize-cols COL1,COL2,..., --normalize-output FILE. Example: hematite --normalize data.csv --normalize-method zscore --normalize-output scaled.csv"
714    )]
715    pub normalize: Option<String>,
716
717    #[arg(
718        long,
719        help_heading = "Data Analysis",
720        value_name = "METHOD",
721        help = "Normalization method: minmax (default), zscore, robust."
722    )]
723    pub normalize_method: Option<String>,
724
725    #[arg(
726        long,
727        help_heading = "Data Analysis",
728        value_name = "COL1,COL2,...",
729        help = "Columns to normalize for --normalize, comma-separated (default: all numeric)."
730    )]
731    pub normalize_cols: Option<String>,
732
733    #[arg(
734        long,
735        help_heading = "Data Analysis",
736        value_name = "FILE",
737        help = "Output CSV with normalized values for --normalize."
738    )]
739    pub normalize_output: Option<String>,
740
741    #[arg(
742        long,
743        help_heading = "Data Analysis",
744        value_name = "FILE",
745        help = "Run PCA on a CSV/TSV file. Reports eigenvalues, variance explained per component, and top loadings. Example: hematite --pca data.csv --pca-components 3"
746    )]
747    pub pca: Option<String>,
748
749    #[arg(
750        long,
751        help_heading = "Data Analysis",
752        value_name = "N",
753        help = "Number of principal components to compute for --pca (default: 3)."
754    )]
755    pub pca_components: Option<usize>,
756
757    #[arg(
758        long,
759        help_heading = "Data Analysis",
760        value_name = "COL1,COL2,...",
761        help = "Columns to include in --pca, comma-separated (default: all numeric)."
762    )]
763    pub pca_cols: Option<String>,
764
765    #[arg(
766        long,
767        help_heading = "Data Analysis",
768        value_name = "FILE",
769        help = "Output CSV with projected coordinates for --pca."
770    )]
771    pub pca_output: Option<String>,
772
773    #[arg(
774        long,
775        help_heading = "Math & Science",
776        value_name = "QUERY",
777        help = "Graph theory — parse an edge list and run BFS/DFS/Dijkstra/components/topo-sort. Example: hematite --graph 'shortest A D\\nA B 2\\nB D 3'"
778    )]
779    pub graph: Option<String>,
780
781    #[arg(
782        long,
783        help_heading = "Math & Science",
784        value_name = "QUERY",
785        help = "Symbolic calculus — differentiate, integrate, simplify, or evaluate. Example: hematite --symbolic 'diff x^3 + sin(x)'  or  'integrate 3*x^2'  or  'x^2+1 at x=5'"
786    )]
787    pub symbolic: Option<String>,
788
789    #[arg(
790        long,
791        help_heading = "Math & Science",
792        value_name = "QUERY",
793        help = "Financial math — NPV, IRR, loan amortization, compound interest, bond pricing, Black-Scholes. Example: hematite --finance 'loan 200000 6.5% 30'  or  'bs 100 100 5% 20% 1 call'"
794    )]
795    pub finance: Option<String>,
796
797    #[arg(
798        long,
799        help_heading = "Math & Science",
800        value_name = "QUERY",
801        help = "Propositional logic — truth table, SAT, tautology, CNF/DNF, equivalence, simplify. Example: hematite --logic 'A and (B or not C)'  or  'equiv A->B ; not A or B'"
802    )]
803    pub logic: Option<String>,
804
805    #[arg(
806        long,
807        help_heading = "Math & Science",
808        value_name = "QUERY",
809        help = "Signal processing (DSP) — DFT, convolution, cross-correlation, moving average, FIR filter design, waveform generation. No model, no cloud. Example: hematite --signal 'dft 1,0,-1,0'  or  'lowpass 0.1 31 hamming'  or  'gen sine 2 64'"
810    )]
811    pub signal: Option<String>,
812
813    #[arg(
814        long,
815        help_heading = "Math & Science",
816        value_name = "QUERY",
817        help = "Interpolation & curve fitting — linear, cubic spline, Lagrange polynomial, nearest-neighbor, with ASCII curve preview. Example: hematite --interpolate 'spline 0,0 1,1 2,4 3,9 at 1.5'  or  'linear 0,0 10,100 at 3,7'"
818    )]
819    pub interpolate: Option<String>,
820
821    #[arg(
822        long,
823        help_heading = "Math & Science",
824        value_name = "QUERY",
825        help = "Unit conversion — 14 categories, 130+ units. Length, mass, temperature, energy, digital storage, pressure, angle, and more. Example: hematite --units '100 km to miles'  or  '98.6 f to c'  or  '5 kg'  or  'list length'"
826    )]
827    pub units: Option<String>,
828
829    #[arg(
830        long,
831        help_heading = "Math & Science",
832        value_name = "QUERY",
833        help = "ODE solver — solves ordinary differential equations using Euler, RK4, or adaptive RK45. Preset models: logistic, exponential, Lotka-Volterra, SIR. Example: hematite --ode 'dy/dt = -y  y0=1  t=5'  or  'logistic r=1 K=100 y0=5 t=10'"
834    )]
835    pub ode: Option<String>,
836
837    #[arg(
838        long,
839        help_heading = "Math & Science",
840        value_name = "QUERY",
841        help = "Numerical optimization — minimize/maximize 1D/2D functions, gradient descent, root finding. No model. Example: hematite --optimize 'min x^2-4*x+3 a=0 b=5'  or  'max sin(x) a=0 b=6.28'  or  'root x^3-2 a=0 b=2'"
842    )]
843    pub optimize: Option<String>,
844
845    #[arg(
846        long,
847        help_heading = "Data Analysis",
848        value_name = "DATA",
849        help = "Statistical hypothesis test — t-tests, chi-square, ANOVA, Mann-Whitney, Pearson, proportion z-test, confidence intervals. Provide comma-separated numbers or 'successes,n' for proportions. Example: hematite --hypothesis '2.1,2.8,3.2,2.5' --hypothesis-test one-t --hypothesis-mu 2.0"
850    )]
851    pub hypothesis: Option<String>,
852
853    #[arg(
854        long,
855        help_heading = "Data Analysis",
856        value_name = "TYPE",
857        help = "Test type for --hypothesis. Options: one-t two-t paired chi2 anova mannwhitney pearson proportion prop2 ci. Default: one-t."
858    )]
859    pub hypothesis_test: Option<String>,
860
861    #[arg(
862        long,
863        help_heading = "Data Analysis",
864        value_name = "DATA",
865        help = "Second group data for --hypothesis (two-t, paired, mannwhitney, pearson, prop2). Comma-separated numbers or 'successes,n'."
866    )]
867    pub hypothesis_group2: Option<String>,
868
869    #[arg(
870        long,
871        help_heading = "Data Analysis",
872        value_name = "ALPHA",
873        help = "Significance level for --hypothesis (default: 0.05)."
874    )]
875    pub hypothesis_alpha: Option<f64>,
876
877    #[arg(
878        long,
879        help_heading = "Data Analysis",
880        value_name = "MU",
881        help = "Null hypothesis mean or proportion for --hypothesis one-t or proportion tests (default: 0.0)."
882    )]
883    pub hypothesis_mu: Option<f64>,
884
885    #[arg(
886        long,
887        help_heading = "Data Analysis",
888        value_name = "FILE",
889        help = "Classification (k-NN or Naive Bayes) — train on labeled CSV, LOO cross-validate, predict new samples. Example: hematite --classify data.csv --classify-label species --classify-k 3"
890    )]
891    pub classify: Option<String>,
892    #[arg(
893        long,
894        value_name = "COL",
895        help = "Label column for --classify (default: last column)."
896    )]
897    pub classify_label: Option<String>,
898    #[arg(
899        long,
900        value_name = "COL1,COL2,...",
901        help = "Feature columns for --classify (default: all except label)."
902    )]
903    pub classify_cols: Option<String>,
904    #[arg(
905        long,
906        value_name = "V1,V2,...",
907        help = "Predict class for this comma-separated feature vector."
908    )]
909    pub classify_predict: Option<String>,
910    #[arg(
911        long,
912        value_name = "N",
913        help = "k neighbors for --classify k-NN (default: 3)."
914    )]
915    pub classify_k: Option<usize>,
916    #[arg(
917        long,
918        value_name = "METHOD",
919        help = "Algorithm for --classify: knn (default) or nb (Naive Bayes)."
920    )]
921    pub classify_method: Option<String>,
922
923    #[arg(
924        long,
925        help_heading = "Data Analysis",
926        value_name = "FILE",
927        help = "Polynomial curve fit — fit a degree-N polynomial to two CSV columns, compute R², RMSE, ASCII scatter+curve plot, and residual plot. Example: hematite --polyfit data.csv --polyfit-x age --polyfit-y salary --polyfit-degree 2"
928    )]
929    pub polyfit: Option<String>,
930    #[arg(
931        long,
932        value_name = "COL",
933        help = "X column for --polyfit (default: first column)."
934    )]
935    pub polyfit_x: Option<String>,
936    #[arg(
937        long,
938        value_name = "COL",
939        help = "Y column for --polyfit (default: last column)."
940    )]
941    pub polyfit_y: Option<String>,
942    #[arg(
943        long,
944        value_name = "N",
945        help = "Polynomial degree for --polyfit (default: 1 = linear, max: 10)."
946    )]
947    pub polyfit_degree: Option<usize>,
948    #[arg(
949        long,
950        value_name = "X1,X2,...",
951        help = "Predict y values for these x values with --polyfit."
952    )]
953    pub polyfit_predict: Option<String>,
954
955    #[arg(
956        long,
957        help_heading = "Math & Science",
958        value_name = "QUERY",
959        help = "Probability distribution calculator — instant, no model, no cloud. Distributions: normal, binomial, poisson, t (Student's), chi2, exponential, uniform, geometric. Operations: pdf/pmf, cdf, quantile, table, all. Examples: hematite --probability 'normal mean=0 sd=1 x=1.96' | hematite --probability 'binomial n=10 p=0.3 k=4' | hematite --probability 'poisson lambda=3 all' | hematite --probability 't df=9 x=2.262 cdf'"
960    )]
961    pub probability: Option<String>,
962
963    #[arg(
964        long,
965        help_heading = "Math & Science",
966        value_name = "QUERY",
967        help = "Bitwise calculator — instant, no model, no cloud. Inspect any integer in decimal/hex/binary/octal with full bit breakdown (popcount, parity, leading/trailing zeros, two's complement, byte decomposition). Operations: AND, OR, XOR, NOT, SHL, SHR, ROL, ROR. Also: IEEE 754 float bit-pattern analysis. Examples: hematite --bitwise '0xFF AND 0x3C' | hematite --bitwise 'NOT 0xAB' | hematite --bitwise '1 SHL 7' | hematite --bitwise 'ieee754 3.14159'"
968    )]
969    pub bitwise: Option<String>,
970
971    #[arg(
972        long,
973        help_heading = "Math & Science",
974        value_name = "QUERY",
975        help = "Set theory calculator — instant, no model, no cloud. Operations: union, intersection, difference, symmetric difference, power set, Cartesian product, subset/superset/disjoint checks. Elements can be numbers or strings. Examples: hematite --set '{1,2,3} union {3,4,5}' | hematite --set 'powerset {a,b,c}' | hematite --set 'cartesian {1,2} x {a,b,c}'"
976    )]
977    pub set: Option<String>,
978
979    #[arg(
980        long,
981        help_heading = "Math & Science",
982        value_name = "QUERY",
983        help = "Classical cipher encoder/decoder — instant, no model, no cloud. Ciphers: ROT13, Atbash, Caesar (with full brute-force table), Vigenère (encode/decode), Rail Fence (encode/decode), Columnar Transposition, Morse Code. Examples: hematite --cipher 'rot13 Hello World' | hematite --cipher 'caesar 13 Hello' | hematite --cipher 'vigenere encode KEY plaintext' | hematite --cipher 'morse encode Hello'"
984    )]
985    pub cipher: Option<String>,
986
987    #[arg(
988        long,
989        help_heading = "Math & Science",
990        value_name = "TEXT",
991        help = "Text statistics and readability analyzer — instant, no model, no cloud. Computes: character/word/sentence/paragraph counts, syllable count, average word length, Flesch Reading Ease, Flesch-Kincaid Grade Level, Gunning Fog Index, SMOG Index, Coleman-Liau Index, top-20 word frequency, letter frequency, longest words. Example: hematite --text-stats 'Paste or type any text here...'"
992    )]
993    pub text_stats: Option<String>,
994
995    #[arg(
996        long,
997        help_heading = "Math & Science",
998        value_name = "QUERY",
999        help = "String distance metrics — instant, no model, no cloud. Computes: Levenshtein, Damerau-Levenshtein, Hamming, Jaro, Jaro-Winkler, LCS similarity, longest common substring. Separate the two strings with ' vs ' or ','. Examples: hematite --levenshtein 'kitten vs sitting' | hematite --levenshtein 'hello, helo'"
1000    )]
1001    pub levenshtein: Option<String>,
1002
1003    #[arg(
1004        long,
1005        help_heading = "Math & Science",
1006        value_name = "NUMBER",
1007        help = "Number format converter — instant, no model, no cloud. Shows every representation of a number: thousands-separated decimal, scientific notation, engineering notation, SI prefix, hex/binary/octal (integers), English word form, log₁₀, ln, square root, reciprocal. Examples: hematite --number-format 1234567890 | hematite --number-format 6.022e23 | hematite --number-format 0xFF"
1008    )]
1009    pub number_format: Option<String>,
1010
1011    #[arg(
1012        long,
1013        help_heading = "Math & Science",
1014        value_name = "QUERY",
1015        help = "Sorting algorithm visualizer — instant, no model, no cloud. Shows step-by-step ASCII bar-chart visualization with comparison and swap counts. Algorithms: bubble, insertion, selection, merge, quick, heap. Pass all to compare all 6. Examples: hematite --sort-viz '5,3,8,1,9,2' | hematite --sort-viz 'bubble 5,3,8,1,9,2' | hematite --sort-viz 'merge 9,7,5,3,1'"
1016    )]
1017    pub sort_viz: Option<String>,
1018
1019    #[arg(
1020        long,
1021        help_heading = "Math & Science",
1022        value_name = "TEXT",
1023        help = "Checksum calculator — instant, no model, no cloud. Computes CRC-32, CRC-16 (CCITT), Adler-32, FNV-1a 32/64, DJB2, SDBM, XOR-8/16, and Sum-8/16/32 checksums for any string. Also shows hex dump, min/max/avg byte values. Examples: hematite --checksum 'Hello, World!' | hematite --checksum '123456789'"
1024    )]
1025    pub checksum: Option<String>,
1026
1027    #[arg(
1028        long,
1029        help_heading = "Math & Science",
1030        value_name = "VALUE",
1031        help = "Validation toolkit — instant, no model, no cloud. Validates: Luhn algorithm (credit card numbers + card network detection), ISBN-10, ISBN-13/EAN-13, IBAN (all countries), UUID format and version. Shows check digit corrections for invalid values. Examples: hematite --validate '4532015112830366' | hematite --validate '978-0-306-40615-7' | hematite --validate 'GB82WEST12345698765432'"
1032    )]
1033    pub validate: Option<String>,
1034
1035    #[arg(
1036        long,
1037        help_heading = "Math & Science",
1038        value_name = "NUMBERS",
1039        help = "Descriptive statistics — instant, no model, no cloud. Computes count, sum, min/max/range, mean, median, mode, population and sample variance/SD, CV, percentiles (P5–P99), IQR, skewness, excess kurtosis, Tukey outlier detection, and ASCII histogram. Examples: hematite --dstats '1,2,3,4,5' | hematite --dstats '10 20 30 40 50'"
1040    )]
1041    pub dstats: Option<String>,
1042
1043    #[arg(
1044        long,
1045        help_heading = "Math & Science",
1046        value_name = "QUERY",
1047        help = "Physics calculator — instant, no model, no cloud. Commands: kinematic (SUVAT 1D), projectile (2D range/height/time), force (F=ma), energy (KE+PE), momentum, work/power, wave (f↔λ, T, ω), snell (refraction), lens (thin lens/mirror), gas (ideal gas law PV=nRT), gravity (universal gravitation), pendulum (T=2π√L/g), circular (centripetal). All SI units. Examples: hematite --physics 'kinematic v0=0 a=9.8 t=3' | hematite --physics 'projectile v0=20 angle=45' | hematite --physics 'gas P=101325 n=1 T=273'"
1048    )]
1049    pub physics: Option<String>,
1050
1051    #[arg(
1052        long,
1053        help_heading = "Math & Science",
1054        value_name = "QUERY",
1055        help = "Chemistry calculator — instant, no model, no cloud. Pass a molecular formula for molar mass (H2O, C6H12O6, Ca(OH)2) or use commands: molarity (C=n/V), dilution (C1V1=C2V2), ph ([H⁺]↔pH↔pOH), buffer (Henderson-Hasselbalch), percent (mass percent of element in compound). Parses nested parentheses in formulas. Examples: hematite --chemistry 'H2O' | hematite --chemistry 'Ca(OH)2' | hematite --chemistry 'ph pH=3.5' | hematite --chemistry 'buffer pKa=4.75 A=0.1 HA=0.1'"
1056    )]
1057    pub chemistry: Option<String>,
1058
1059    #[arg(
1060        long,
1061        help_heading = "Math & Science",
1062        value_name = "QUERY",
1063        help = "Combinatorics calculator — instant, no model, no cloud. Commands: C n k (combinations), P n k (permutations), factorial n, derangement n (D(n)), catalan n (Catalan numbers), pascal n (row of Pascal's triangle), bell n (Bell numbers), stirling n k (Stirling 2nd kind), multinomial n k1,k2,... and partition n (integer partitions via Euler pentagonal recurrence). Examples: hematite --combinatorics 'C 10 3' | hematite --combinatorics 'catalan 7' | hematite --combinatorics 'bell 6'"
1064    )]
1065    pub combinatorics: Option<String>,
1066
1067    #[arg(
1068        long,
1069        help_heading = "Math & Science",
1070        value_name = "QUERY",
1071        help = "Geometry calculator — instant, no model, no cloud. Shapes: circle, triangle, rectangle, square, ellipse, polygon, sphere, cylinder, cone, box/cuboid. Also: distance/midpoint/slope, pythagorean, angle conversion (degrees/radians). Examples: hematite --geometry 'circle r=5' | hematite --geometry 'triangle a=3 b=4 c=5' | hematite --geometry 'sphere r=3' | hematite --geometry 'distance x1=0 y1=0 x2=3 y2=4'"
1072    )]
1073    pub geometry: Option<String>,
1074
1075    #[arg(
1076        long,
1077        help_heading = "Math & Science",
1078        value_name = "QUERY",
1079        help = "Electrical engineering calculator — instant, no model, no cloud. Supports SI prefixes (k/M/m/u/n/p). Commands: ohm (Ohm's law, solves for V/I/R/P), rc (time constant, cutoff freq, charge curve), rl (time constant, cutoff), lc (resonance), db (linear→dB), db2linear (dB→linear), freq (frequency↔wavelength), divider (voltage divider), energy (capacitor E=½CV², inductor E=½LI²). Examples: hematite --electrical 'ohm V=12 R=100' | hematite --electrical 'rc R=10k C=100u' | hematite --electrical 'divider Vin=12 R1=10k R2=4.7k'"
1080    )]
1081    pub electrical: Option<String>,
1082
1083    #[arg(
1084        long,
1085        help_heading = "Math & Science",
1086        value_name = "QUERY",
1087        help = "Percentage calculator — instant, no model, no cloud. Commands: 'X% of Y' (what is 15% of 350), 'X is what % of Y' (42 is what % of 280), 'change A to B' (percent change), 'X + Y%' / 'X - Y%' (increase/decrease by percent), 'markup cost pct%' (selling price + gross margin), 'discount price pct%' (final price after discount), 'tip bill pct%' (tip amount + total), 'split bill pct% N' (split N ways). Examples: hematite --percent '15% of 350' | hematite --percent 'change 80 to 95' | hematite --percent '350 + 15%' | hematite --percent 'tip 85 18%'"
1088    )]
1089    pub percent: Option<String>,
1090
1091    #[arg(
1092        long,
1093        help_heading = "Math & Science",
1094        value_name = "QUERY",
1095        help = "Complex number arithmetic — instant, no model, no cloud. Pass a complex number (3+4i) for full info (magnitude, argument, conjugate, polar form), or use operators: '(3+4i) + (1-2i)', '(3+4i) * (1-2i)', '(3+4i) / (1+2i)'. Commands: mag (|z|), arg (phase angle), conj (conjugate), polar re im (rect -> polar), rect r theta_deg (polar -> rect), pow z n (z^n via De Moivre), sqrt (including sqrt of negatives), euler theta (e^(i*theta) Euler's formula). Examples: hematite --complex '3+4i' | hematite --complex '(1+i) * (1-i)' | hematite --complex 'pow 1+i 8' | hematite --complex 'euler 3.14159'"
1096    )]
1097    pub complex: Option<String>,
1098
1099    #[arg(
1100        long,
1101        help_heading = "Math & Science",
1102        value_name = "QUERY",
1103        help = "Trigonometry calculator — instant, no model, no cloud. Pass an angle (bare number = degrees, add 'deg' or 'rad' suffix) for a full table: sin/cos/tan/cot/sec/csc + hyperbolic sinh/cosh/tanh. Inverse trig: 'asin 0.5', 'acos 0.866', 'atan 1', 'atan2 y x'. Hyperbolic: 'sinh 1.5'. Reference table: 'hyp' (all standard angles 0–360°). Examples: hematite --trig '45' | hematite --trig 'asin 0.5' | hematite --trig '0.785rad' | hematite --trig 'hyp'"
1104    )]
1105    pub trig: Option<String>,
1106
1107    #[arg(
1108        long,
1109        help_heading = "Math & Science",
1110        value_name = "QUERY",
1111        help = "Vector math — instant, no model, no cloud. 2D and 3D vectors in [x,y,z] format. Commands: dot (dot product + angle between), cross (cross product, works in 3D and 2D scalar), mag/magnitude (|v|), norm/normalize (unit vector), angle (angle between two vectors in degrees), add, sub (vector addition/subtraction), scale [v] s (scalar multiplication), proj [a] [b] (scalar + vector projection of a onto b). Examples: hematite --vector 'dot [1,2,3] [4,5,6]' | hematite --vector 'cross [1,0,0] [0,1,0]' | hematite --vector 'norm [3,4,0]'"
1112    )]
1113    pub vector: Option<String>,
1114
1115    #[arg(
1116        long,
1117        help_heading = "Math & Science",
1118        value_name = "QUERY",
1119        help = "Fraction arithmetic — instant, no model, no cloud. Operations: '1/2 + 1/3', '3/4 - 1/8', '2/3 * 3/5', '7/8 / 3/4' — results auto-simplified with decimal and mixed-number forms. Commands: simplify 12/18, lcd 1/3 1/4 1/6 (least common denominator), todec 3/7 (fraction → decimal, shows terminating/repeating), tofrac 0.625 (decimal → fraction via continued-fraction approximation), mixed 7/3 (improper → mixed number). Examples: hematite --fraction '1/2 + 1/3' | hematite --fraction 'tofrac 0.333' | hematite --fraction 'lcd 1/2 1/3 1/4'"
1120    )]
1121    pub fraction: Option<String>,
1122
1123    #[arg(
1124        long,
1125        help_heading = "Math & Science",
1126        value_name = "QUERY",
1127        help = "Date / time math — instant, no model, no cloud. Commands: date difference ('2025-01-15 to 2025-06-30' → days/weeks/months/business days), relative dates ('today + 90', '30 days from today', '90 days ago'), Unix timestamp conversion ('unix 1748000000' ↔ human date, 'toUnix 2025-06-30'), day-of-week info, and single-date profile. Examples: hematite --datetime '2025-01-15 to 2025-06-30' | hematite --datetime 'today + 90' | hematite --datetime 'unix 1748000000'"
1128    )]
1129    pub datetime: Option<String>,
1130
1131    #[arg(
1132        long,
1133        help_heading = "Math & Science",
1134        value_name = "QUERY",
1135        help = "Number theory toolkit — instant, no model, no cloud. Commands: prime (primality test), factor (prime factorization + divisor count + Euler phi), gcd a b (GCD + LCM + Bézout coefficients), lcm a b, phi n (Euler's totient), modinv a m (modular inverse via extended GCD), primes N (list all primes up to N via sieve), nextprime N. Also accepts a bare number for a full profile. Examples: hematite --nt 'prime 97' | hematite --nt 'factor 360' | hematite --nt 'modinv 3 11' | hematite --nt 'primes 100'"
1136    )]
1137    pub nt: Option<String>,
1138
1139    #[arg(
1140        long,
1141        help_heading = "Math & Science",
1142        value_name = "QUERY",
1143        help = "Health and body math — instant, no model, no cloud. Commands: bmi (w= kg or lb, h= m, cm, or 5ft10in), bmr (Mifflin-St Jeor formula — male/female, w=, h=, age=), tdee (BMR × activity level: sedentary/light/moderate/active/very — shows maintenance + cut/bulk targets), macros (protein/carb/fat breakdown for calories= and goal=maintain/muscle/cut/keto), ideal (ideal weight range for given height), water (daily water intake from body weight). Examples: hematite --health 'bmi w=70 h=1.75' | hematite --health 'tdee male w=80 h=180 age=30 activity=moderate' | hematite --health 'macros calories=2400 goal=muscle'"
1144    )]
1145    pub health: Option<String>,
1146
1147    #[arg(
1148        long,
1149        help_heading = "Math & Science",
1150        value_name = "QUERY",
1151        help = "JSON toolkit — instant, no model, no cloud. Commands: format <json> (pretty-print), validate <json> (report valid/invalid), minify <json> (single line), keys <json> (list top-level keys), query <path> <json> (dot-path extraction, e.g. user.name or items[0].id), <json_a> --- <json_b> (diff two JSON blobs). Bare JSON is auto-formatted. Examples: hematite --json 'format {\"a\":1}' | hematite --json 'query user.name {\"user\":{\"name\":\"Alice\"}}' | hematite --json '{\"x\":1} --- {\"x\":2}'"
1152    )]
1153    pub json: Option<String>,
1154
1155    #[arg(
1156        long,
1157        help_heading = "Math & Science",
1158        value_name = "QUERY",
1159        help = "Regex toolkit — instant, no model, no cloud. Commands: test <pattern> <text> (find all matches, show capture groups), explain <pattern> (plain-English description of what the regex does), split <pattern> <text> (split text on pattern), replace <pattern> <replacement> <text> (replace all matches). Supports: . * + ? | () [] [^] {n,m} ^ $ \\d \\w \\s and their negations. Examples: hematite --regex 'test \\d+ foo 42 bar 99' | hematite --regex 'explain ^\\w+@\\w+\\.\\w+$' | hematite --regex 'replace \\s+ _ hello world'"
1160    )]
1161    pub regex: Option<String>,
1162
1163    #[arg(
1164        long,
1165        help_heading = "Math & Science",
1166        value_name = "QUERY",
1167        help = "CSV toolkit — instant, no model, no Python. Accepts a file path or inline CSV. Commands: preview <file> (first 10 rows), head N <file> (first N rows), cols <file> (list column names), count <file> (row count), select <col1,col2> <file> (pick columns), filter <col> <op> <val> <file> (filter rows, ops: = != > < >= <=), sum <col> <file>, avg <col> <file>, groupby <col> <file> (group-by count), sort <col> [asc|desc] <file>. Examples: hematite --csv 'preview data.csv' | hematite --csv 'filter age > 30 data.csv' | hematite --csv 'groupby country data.csv'"
1168    )]
1169    pub csv: Option<String>,
1170
1171    #[arg(
1172        long,
1173        help_heading = "Math & Science",
1174        value_name = "QUERY",
1175        help = "JWT decoder — offline, instant, no cloud (replaces jwt.io). Commands: <token> (auto-decode header + claims + expiry), decode <token>, claims <token> (payload only), header <token>. Flags expired tokens, shows iss/sub/aud/iat/exp/nbf as human-readable dates, reports signature algorithm. Never sends your token anywhere. Example: hematite --jwt 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0In0.sig'"
1176    )]
1177    pub jwt: Option<String>,
1178
1179    #[arg(
1180        long = "url-tool",
1181        help_heading = "Math & Science",
1182        value_name = "QUERY",
1183        help = "URL toolkit — parse, encode, decode URLs offline. Commands: parse <url> (decompose scheme/host/port/path/query/fragment), encode <text> (percent-encode), decode <text> (percent-decode), params <url> (show query key=value pairs), build scheme=https host=x.com path=/api key=val (assemble URL). Bare URLs are auto-parsed. Examples: hematite --url-tool 'parse https://api.x.com/v1?foo=bar&page=2' | hematite --url-tool 'encode hello world' | hematite --url-tool 'decode hello%20world'"
1184    )]
1185    pub url_tool: Option<String>,
1186
1187    #[arg(
1188        long,
1189        help_heading = "Math & Science",
1190        value_name = "QUERY",
1191        help = "Cron expression toolkit — explain and compute next run times offline (replaces crontab.guru). Commands: <expr> (explain + next 5 runs), explain <expr> (plain-English description of 5-field cron), next <expr> (next 5 run times from now), next N <expr> (next N run times). Fields: minute hour day-of-month month day-of-week. Supports */step, ranges, lists, combinations. Examples: hematite --cron '* * * * *' | hematite --cron '0 9 * * 1-5' | hematite --cron 'next 10 */15 * * * *'"
1192    )]
1193    pub cron: Option<String>,
1194
1195    #[arg(
1196        long,
1197        help_heading = "Math & Science",
1198        value_name = "QUERY",
1199        help = "IP address and subnet calculator — classify IPs and compute CIDR blocks offline. Commands: <ip> (classify: private/public/loopback/class), <ip>/<prefix> (subnet details: mask, broadcast, usable range, host count), contains <cidr> <ip> (test membership), range <ip1> <ip2> (count IPs, suggest CIDR), mask <prefix|dotted> (convert mask formats). Also handles IPv6 classification. Examples: hematite --ip 192.168.1.0/24 | hematite --ip 'contains 10.0.0.0/8 10.5.6.7' | hematite --ip 'range 192.168.1.1 192.168.1.254'"
1200    )]
1201    pub ip: Option<String>,
1202
1203    #[arg(
1204        long,
1205        help_heading = "Math & Science",
1206        value_name = "QUERY",
1207        help = "UUID generator and inspector — offline replacement for uuid generator sites. Commands: v4 (generate one random UUID v4), v4 <N> (generate N UUIDs), nil (the all-zeros nil UUID), parse <uuid> (decode version, variant, timestamp for v1/v4), validate <uuid> (strict RFC 4122 format check). Examples: hematite --uuid v4 | hematite --uuid 'v4 5' | hematite --uuid 'parse 550e8400-e29b-41d4-a716-446655440000'"
1208    )]
1209    pub uuid: Option<String>,
1210
1211    #[arg(
1212        long = "text-diff",
1213        help_heading = "Math & Science",
1214        value_name = "QUERY",
1215        help = "Text diff — offline replacement for diffchecker.com. Pass two texts separated by ' vs '. Commands: '<text A> vs <text B>' (line diff), 'word: <text A> vs <text B>' (word-level diff), 'stats: <text A> vs <text B>' (summary counts only). Examples: hematite --text-diff 'hello world vs hello there' | hematite --text-diff 'word: foo bar baz vs foo qux baz'"
1216    )]
1217    pub text_diff: Option<String>,
1218
1219    #[arg(
1220        long,
1221        help_heading = "Math & Science",
1222        value_name = "QUERY",
1223        help = "Semantic version toolkit — offline replacement for semver.npmjs.com. Commands: parse <ver> (decode major/minor/patch/pre-release/build), compare <v1> <v2> (ordering), satisfies <version> <range> (npm/cargo range check: ^, ~, >=, <=, =), sort <v1> <v2> ... (order a list), bump <ver> major|minor|patch (next version), validate <ver> (strict semver check). Examples: hematite --semver 'parse 1.2.3-alpha.1' | hematite --semver 'satisfies 1.5.0 ^1.2.3' | hematite --semver 'bump 1.2.3 minor'"
1224    )]
1225    pub semver: Option<String>,
1226
1227    #[arg(
1228        long,
1229        help_heading = "Math & Science",
1230        value_name = "QUERY",
1231        help = "Unix timestamp converter — offline replacement for epoch.now.sh and unixtimestamp.com. Commands: (bare) = current timestamp; <unix-secs> = decode; <unix-ms> = auto-detect milliseconds; now + <N>d/h/m/s = relative future; now - <N>d/h/m/s = relative past; YYYY-MM-DD [HH:MM:SS] = date to Unix. Shows Unix (s/ms), ISO 8601, RFC 2822, human-readable UTC. Examples: hematite --timestamp | hematite --timestamp 1716220800 | hematite --timestamp '2024-05-20' | hematite --timestamp 'now + 7d'"
1232    )]
1233    pub timestamp: Option<String>,
1234
1235    #[arg(
1236        long,
1237        help_heading = "Math & Science",
1238        value_name = "QUERY",
1239        help = "YAML validator, formatter, and key inspector — offline replacement for yamllint.com. Commands: (bare) / validate <yaml|file> (check validity + type + line count), format <yaml|file> (pretty-print), keys <yaml|file> (list top-level keys), get <yaml|file> <key.path> (fetch a value by dotted path). Examples: hematite --yaml 'key: value' | hematite --yaml 'validate config.yml' | hematite --yaml 'keys docker-compose.yml' | hematite --yaml 'get config.yml server.port'"
1240    )]
1241    pub yaml: Option<String>,
1242
1243    #[arg(
1244        long,
1245        help_heading = "Math & Science",
1246        value_name = "QUERY",
1247        help = "ASCII table renderer — offline replacement for tableconvert.com. Auto-detects JSON arrays and CSV. Commands: <csv> (render CSV as ASCII table), <json-array> (render JSON array), markdown <input> (output as Markdown table), csv <json-array> (convert JSON to CSV). Examples: hematite --table 'name,age\\nAlice,30\\nBob,25' | hematite --table '[{\"name\":\"Alice\",\"age\":30}]' | hematite --table 'markdown name,score\\nA,95'"
1248    )]
1249    pub table: Option<String>,
1250
1251    #[arg(
1252        long = "sql-fmt",
1253        help_heading = "Math & Science",
1254        value_name = "QUERY",
1255        help = "SQL formatter and keyword uppercaser — offline replacement for sqlbeautify.com / poorsql.com. Uppercases keywords, inserts newlines before clause starters (SELECT, FROM, WHERE, JOIN, GROUP BY, etc.), and indents continuation lines. Commands: <sql> (format), minify <sql> (collapse to one line), keywords (list all known keywords). Examples: hematite --sql-fmt 'select id,name from users where active=1' | hematite --sql-fmt 'minify SELECT id FROM t WHERE x=1'"
1256    )]
1257    pub sql_fmt: Option<String>,
1258
1259    #[arg(
1260        long,
1261        help_heading = "Math & Science",
1262        value_name = "QUERY",
1263        help = "HTTP status code reference — offline replacement for httpstatuses.com. Commands: <code> (look up a code), <keyword> (search by phrase), list, list 4xx / list 5xx (range filter). Examples: hematite --http 404 | hematite --http 'server error' | hematite --http 'list 2xx'"
1264    )]
1265    pub http: Option<String>,
1266
1267    #[arg(
1268        long,
1269        help_heading = "Math & Science",
1270        value_name = "QUERY",
1271        help = "MIME type reference — offline replacement for mime.io / mimeapplication.com. Bidirectional: extension→type and type→extensions. Commands: <.ext> or <ext>, <type/subtype>, <keyword>, list, list <category>. Examples: hematite --mime .json | hematite --mime 'application/pdf' | hematite --mime image | hematite --mime list"
1272    )]
1273    pub mime: Option<String>,
1274
1275    #[arg(
1276        long,
1277        help_heading = "Math & Science",
1278        value_name = "QUERY",
1279        help = "XML toolkit — offline replacement for xmlvalidation.com / xmlformatter.com. Commands: validate <xml>, format <xml> (pretty-print), minify <xml>, get <tag> <xml> (extract element content). Examples: hematite --xml 'validate <root/>' | hematite --xml 'format <a><b/></a>' | hematite --xml 'get name <person><name>Alice</name></person>'"
1280    )]
1281    pub xml: Option<String>,
1282
1283    #[arg(
1284        long,
1285        help_heading = "Math & Science",
1286        value_name = "QUERY",
1287        help = "TOML validator and toolkit — offline replacement for toml-lint.com. Commands: validate <toml|file>, keys <toml|file> (list key paths), get <key> <toml|file>, fmt <toml|file> (normalize spacing). Examples: hematite --toml 'validate [server]\\nport=8080' | hematite --toml 'keys Cargo.toml'"
1288    )]
1289    pub toml: Option<String>,
1290
1291    #[arg(
1292        long,
1293        help_heading = "Math & Science",
1294        value_name = "QUERY",
1295        help = "Network / CIDR calculator — offline replacement for subnet-calculator.com. Commands: <ip>/<prefix> (CIDR breakdown), <ip> (IP classification), contains <ip> <cidr>, split <cidr> /<prefix>. Examples: hematite --net 192.168.1.0/24 | hematite --net 10.0.0.5 | hematite --net 'split 10.0.0.0/16 /24'"
1296    )]
1297    pub net: Option<String>,
1298
1299    #[arg(
1300        long,
1301        help_heading = "Math & Science",
1302        value_name = "QUERY",
1303        help = "ASCII table reference — offline replacement for asciitable.com. Commands: <decimal>, 0x<hex>, <char>, list, list printable, list control, <keyword>. Examples: hematite --ascii 65 | hematite --ascii 0x1B | hematite --ascii A | hematite --ascii newline"
1304    )]
1305    pub ascii: Option<String>,
1306
1307    #[arg(
1308        long,
1309        help_heading = "Math & Science",
1310        value_name = "QUERY",
1311        help = "Keyboard shortcut cheatsheets — instant offline reference for vim / vscode / tmux / git / bash / windows. Commands: <tool>, <tool> <filter>. Examples: hematite --kbd vim | hematite --kbd vscode | hematite --kbd 'vim search' | hematite --kbd 'git rebase'"
1312    )]
1313    pub kbd: Option<String>,
1314
1315    #[arg(
1316        long,
1317        help_heading = "Math & Science",
1318        value_name = "QUERY",
1319        help = "Date/duration arithmetic — offline replacement for timeanddate.com. Commands: today, age YYYY-MM-DD, YYYY-MM-DD to YYYY-MM-DD, 30 days ago, 90 days from now, N weeks from YYYY-MM-DD, 3600 in seconds, bare Unix timestamp decode. Date formats: YYYY-MM-DD | YYYY/MM/DD | DD/MM/YYYY | MM/DD/YYYY. Examples: hematite --duration today | hematite --duration 'age 1990-06-15' | hematite --duration '2024-01-01 to 2025-01-01' | hematite --duration '30 days ago' | hematite --duration 1715000000"
1320    )]
1321    pub duration: Option<String>,
1322
1323    #[arg(
1324        long,
1325        help_heading = "Math & Science",
1326        value_name = "QUERY",
1327        help = "Unicode sparkline and ASCII bar chart from comma-separated numbers — offline replacement for online chart tools. Commands: <values> = sparkline (▁▂▃▄▅▆▇█); bar <values> = horizontal bar chart; stats <values> = statistics summary + sparkline; normalize <values> = normalize to 0-1 first. Examples: hematite --spark '1,4,2,8,5,7' | hematite --spark 'bar 10,20,30,25,15' | hematite --spark 'stats 3,7,2,9,4,6'"
1328    )]
1329    pub spark: Option<String>,
1330
1331    #[arg(
1332        long,
1333        help_heading = "Math & Science",
1334        value_name = "QUERY",
1335        help = "Template variable substitution with {{key}} placeholders — offline replacement for online template engines. Separator between template and variables is |||. Multiple key=value pairs separated by commas or semicolons. Examples: hematite --template 'Hello {{name}}! ||| name=Alice' | hematite --template 'Dear {{first}} {{last}}, order #{{id}}. ||| first=Jane, last=Doe, id=42'"
1336    )]
1337    pub template: Option<String>,
1338
1339    #[arg(
1340        long,
1341        help_heading = "Math & Science",
1342        value_name = "QUERY",
1343        help = "String escaping — offline replacement for online escape tools. Commands: json <text> = escape for JSON string; shell <text> = POSIX single-quote escaping; regex <text> = escape metacharacters; sql <text> = escape LIKE wildcards; unescape <text> = JSON unescape; bare input = all formats at once. Examples: hematite --escape 'json hello \"world\"' | hematite --escape 'regex (foo|bar).baz' | hematite --escape 'shell it'\"'\"'s fine'"
1344    )]
1345    pub escape: Option<String>,
1346
1347    #[arg(
1348        long,
1349        help_heading = "Math & Science",
1350        value_name = "QUERY",
1351        help = "Well-known port directory — offline replacement for port number Googling. Query by number (443), service name (postgres), or keyword (database). 'list' shows all ~80 entries. Examples: hematite --port 443 | hematite --port postgres | hematite --port redis | hematite --port list"
1352    )]
1353    pub port: Option<String>,
1354
1355    #[arg(
1356        long,
1357        help_heading = "Math & Science",
1358        value_name = "QUERY",
1359        help = "Unicode character inspector — offline replacement for unicode-table.com. Shows codepoint (U+XXXX), UTF-8 bytes, block, category, and HTML entity for every character. Supports U+XXXX direct lookup. Examples: hematite --chars 'Hello' | hematite --chars U+2014 | hematite --chars 'cafe\u{301}'"
1360    )]
1361    pub chars: Option<String>,
1362
1363    #[arg(
1364        long,
1365        help_heading = "Math & Science",
1366        value_name = "QUERY",
1367        help = "Timezone converter — offline replacement for timeanddate.com timezone tool. Commands: 'now in <zone>', '<time> <from> in <to>', single zone lookup, 'list'. Zones: UTC, EST, PST, JST, IST, CET, city names (tokyo, london, nyc, etc.). Examples: hematite --tz 'now in tokyo' | hematite --tz '3pm EST in JST' | hematite --tz '14:30 UTC in sydney' | hematite --tz list"
1368    )]
1369    pub tz: Option<String>,
1370
1371    #[arg(
1372        long,
1373        help_heading = "Math & Science",
1374        value_name = "QUERY",
1375        help = "HTTP header reference — offline replacement for MDN header lookups. Shortcuts: cors (full CORS header set), security (security headers). Query by exact name, keyword, or category. Examples: hematite --headers cache-control | hematite --headers cors | hematite --headers security | hematite --headers etag | hematite --headers list"
1376    )]
1377    pub headers: Option<String>,
1378
1379    #[arg(
1380        long,
1381        help_heading = "Math & Science",
1382        value_name = "QUERY",
1383        help = ".gitignore template generator — offline replacement for gitignore.io. Generates .gitignore content for 20+ stacks. Combine multiple: 'node macos vscode'. Commands: list (all templates), or any stack name/alias. Examples: hematite --gitignore rust | hematite --gitignore 'python macos vscode' | hematite --gitignore node > .gitignore"
1384    )]
1385    pub gitignore: Option<String>,
1386
1387    #[arg(
1388        long,
1389        help_heading = "Math & Science",
1390        value_name = "QUERY",
1391        help = "Software license reference — offline replacement for choosealicense.com. Full text for MIT, BSD-2, BSD-3, ISC, Unlicense, WTFPL; summaries for Apache-2.0, GPL-2.0/3.0, LGPL, AGPL, MPL-2.0, CC0. Commands: list (comparison table) or a license name. Examples: hematite --license mit | hematite --license list | hematite --license apache | hematite --license gpl3"
1392    )]
1393    pub license: Option<String>,
1394
1395    #[arg(
1396        long = "json-path",
1397        help_heading = "Math & Science",
1398        value_name = "QUERY",
1399        help = "JSON field extractor — offline jq replacement for simple lookups. Format: '<path> ||| <json>' or bare JSON to pretty-print. Path syntax: .field .arr[0] .a.b.c .users[0].name; commands: keys, type, length, pretty. Examples: hematite --json-path '.name ||| {\"name\":\"Alice\"}' | hematite --json-path 'keys ||| {\"a\":1,\"b\":2}'"
1400    )]
1401    pub json_path: Option<String>,
1402
1403    #[arg(
1404        long,
1405        help_heading = "Math & Science",
1406        value_name = "QUERY",
1407        help = "Markdown / CommonMark syntax reference — offline replacement for markdownguide.org. Sections: headings, emphasis, lists, links, images, code, tables, blockquotes, escape, footnotes, frontmatter, html, mermaid. Bare query shows all. Examples: hematite --markdown tables | hematite --markdown links | hematite --markdown mermaid"
1408    )]
1409    pub markdown: Option<String>,
1410
1411    #[arg(
1412        long,
1413        help_heading = "Math & Science",
1414        value_name = "QUERY",
1415        help = "Regex pattern library — offline replacement for regex101.com lookups. Named patterns: email, url, uuid, ipv4, ipv6, phone-us, date-iso, date-us, time, zip-us, postal-ca, credit-card, ssn, hex-color, slug, semver, jwt, mac-address, filename, path-unix, path-win, html-tag, whitespace, digits, word, hashtag, mention. Commands: syntax = regex syntax cheatsheet; all = every pattern; <name> = single pattern + grep/rg snippets. Examples: hematite --regex-ref email | hematite --regex-ref uuid | hematite --regex-ref syntax"
1416    )]
1417    pub regex_ref: Option<String>,
1418
1419    #[arg(
1420        long,
1421        help_heading = "Math & Science",
1422        value_name = "QUERY",
1423        help = "Full 7-bit ASCII table — offline replacement for asciitable.com. Lookup by decimal (65), hex (0x41 or 41h), or character (A). Filter sections: control, printable, upper, lower, digits, letters, punct. Show all: hematite --ascii-table all. Examples: hematite --ascii-table 65 | hematite --ascii-table A | hematite --ascii-table control | hematite --ascii-table punct"
1424    )]
1425    pub ascii_table: Option<String>,
1426
1427    #[arg(
1428        long,
1429        help_heading = "Math & Science",
1430        value_name = "TOPIC",
1431        help = "TLS/SSL reference — offline replacement for SSL cheatsheets. Topics: handshake (TLS 1.2/1.3 flow), ciphers (recommended suites, deprecated suites), certificates (PEM/DER/PKCS formats, chain), openssl (command snippets), nginx (HTTPS server config), grades (Mozilla config levels, SSL Labs grading), hsts (security headers), errors (common TLS errors and fixes). Commands: all = print everything. Examples: hematite --ssl handshake | hematite --ssl openssl | hematite --ssl errors | hematite --ssl all"
1432    )]
1433    pub ssl: Option<String>,
1434
1435    #[arg(
1436        long,
1437        help_heading = "Math & Science",
1438        value_name = "TYPE",
1439        help = "Unique ID generator — offline replacement for uuidgenerator.net and similar tools. Types: uuid/uuid4, ulid (sortable), nanoid (URL-safe 21 chars), nanoid <N> (custom length), hex8, hex16, hex32, cuid2, xid (K-sortable). Generate all at once: all. Examples: hematite --id uuid | hematite --id ulid | hematite --id nanoid | hematite --id nanoid 32 | hematite --id all"
1440    )]
1441    pub id: Option<String>,
1442
1443    #[arg(
1444        long,
1445        help_heading = "Math & Science",
1446        value_name = "QUERY",
1447        help = "HTTP status code reference — offline replacement for httpstatuses.com. Lookup by code (404), by name (not-found), or by category (4xx, 5xx, client, server, success, redirect). Commands: all = full list. Examples: hematite --http-status 404 | hematite --http-status 4xx | hematite --http-status service-unavailable"
1448    )]
1449    pub http_status: Option<String>,
1450
1451    #[arg(
1452        long,
1453        help_heading = "Math & Science",
1454        value_name = "TOPIC",
1455        help = "Git command reference — offline replacement for daily git-scm.com lookups. Topics: init, config, stage, commit, branch, checkout, merge, rebase, remote, stash, log, reset, tag, diff, clean, bisect, worktree, aliases. Commands: all = everything. Examples: hematite --git-ref rebase | hematite --git-ref stash | hematite --git-ref reset"
1456    )]
1457    pub git_ref: Option<String>,
1458
1459    #[arg(
1460        long,
1461        help_heading = "Math & Science",
1462        value_name = "QUERY",
1463        help = "CSS named color reference — offline replacement for MDN color lookups. Lookup by name (cornflowerblue), by hex (#6495ED), or by category (red, green, blue, purple, pink, brown, gray, white). Shows hex, rgb(), and hsl() for every result. Examples: hematite --color-names tomato | hematite --color-names \"#FF6347\" | hematite --color-names blue"
1464    )]
1465    pub color_names: Option<String>,
1466
1467    #[arg(
1468        long,
1469        help_heading = "Math & Science",
1470        value_name = "TOPIC",
1471        help = "Docker command reference — offline replacement for Docker docs daily lookups. Topics: build, run, container, exec, volumes, network, compose, registry, prune, dockerfile. Commands: all = everything. Examples: hematite --docker-ref run | hematite --docker-ref compose | hematite --docker-ref dockerfile"
1472    )]
1473    pub docker_ref: Option<String>,
1474
1475    #[arg(
1476        long,
1477        help_heading = "Math & Science",
1478        value_name = "TOPIC",
1479        help = "SQL quick reference — offline ANSI/PostgreSQL/MySQL/SQLite cheatsheet. Topics: select, where, joins, aggregate, window, subquery, dml, ddl, explain, transactions, json. Commands: all = everything. Examples: hematite --sql-ref joins | hematite --sql-ref window | hematite --sql-ref all"
1480    )]
1481    pub sql_ref: Option<String>,
1482
1483    #[arg(
1484        long,
1485        help_heading = "Math & Science",
1486        value_name = "TOPIC",
1487        help = "Vim/Neovim cheatsheet — offline reference for modes, motions, editing, text-objects, search/replace, files/splits, macros, marks, and config. Commands: all = everything. Examples: hematite --vim motion | hematite --vim text-objects | hematite --vim macros"
1488    )]
1489    pub vim: Option<String>,
1490
1491    #[arg(
1492        long,
1493        help_heading = "Math & Science",
1494        value_name = "TOPIC",
1495        help = "curl command reference — offline cheatsheet covering basics, HTTP methods, headers, auth, TLS, file upload, proxy, cookies, and output formatting. Commands: all = everything. Examples: hematite --curl auth | hematite --curl upload | hematite --curl output"
1496    )]
1497    pub curl: Option<String>,
1498
1499    #[arg(
1500        long,
1501        help_heading = "Math & Science",
1502        value_name = "TOPIC",
1503        help = "jq filter reference — offline cheatsheet covering basics/flags, field access, transforms, strings, conditionals, reduce/add, and ready-to-use recipes. Commands: all = everything. Examples: hematite --jq transform | hematite --jq recipes | hematite --jq strings"
1504    )]
1505    pub jq: Option<String>,
1506
1507    #[arg(
1508        long,
1509        help_heading = "Math & Science",
1510        value_name = "TOPIC",
1511        help = "grep/ripgrep cheatsheet — offline reference covering flags, regex patterns, context, file filtering, ripgrep-specific features, and ready-to-use recipes. Topics: basics, patterns, context, files, ripgrep, advanced, one-liners. Commands: all = everything. Examples: hematite --grep patterns | hematite --grep ripgrep | hematite --grep one-liners"
1512    )]
1513    pub grep: Option<String>,
1514
1515    #[arg(
1516        long,
1517        help_heading = "Math & Science",
1518        value_name = "TOPIC",
1519        help = "sed stream editor reference — offline cheatsheet for substitution, addresses, delete, insert, transform, multiline, and advanced scripting. Topics: basics, substitute, address, delete, insert, transform, multiline, advanced. Commands: all = everything. Examples: hematite --sed substitute | hematite --sed multiline | hematite --sed advanced"
1520    )]
1521    pub sed: Option<String>,
1522
1523    #[arg(
1524        long,
1525        help_heading = "Math & Science",
1526        value_name = "TOPIC",
1527        help = "awk reference — offline cheatsheet for patterns, built-in variables, associative arrays, functions, I/O, and one-liners. Topics: basics, patterns, variables, arrays, functions, io, one-liners. Commands: all = everything. Examples: hematite --awk variables | hematite --awk arrays | hematite --awk one-liners"
1528    )]
1529    pub awk: Option<String>,
1530
1531    #[arg(
1532        long = "ssh-ref",
1533        help_heading = "Math & Science",
1534        value_name = "TOPIC",
1535        help = "SSH client and server reference — offline cheatsheet for connecting, key management, ~/.ssh/config, tunnels/forwarding, scp/rsync, agent, options, and hardening. Topics: connect, keys, config, tunnel, scp-rsync, agent, options, hardening. Commands: all = everything. Examples: hematite --ssh-ref tunnel | hematite --ssh-ref hardening | hematite --ssh-ref config"
1536    )]
1537    pub ssh_ref: Option<String>,
1538
1539    #[arg(
1540        long,
1541        help_heading = "Math & Science",
1542        value_name = "TOPIC",
1543        help = "tar command reference — offline cheatsheet for creating, extracting, listing, compression options (gzip/bzip2/xz/zstd), and advanced usage (incremental, pipes, split). Topics: basics, create, extract, compress, advanced. Commands: all = everything. Examples: hematite --tar create | hematite --tar compress | hematite --tar advanced"
1544    )]
1545    pub tar: Option<String>,
1546
1547    #[arg(
1548        long,
1549        help_heading = "Math & Science",
1550        value_name = "TOPIC",
1551        help = "find command reference — offline cheatsheet for name/path/type/time/size/permission filtering, -exec actions, -prune exclusions, and one-liner recipes. Topics: basics, by-type, by-time, by-size, by-perm, actions, prune, one-liners. Commands: all = everything. Examples: hematite --find actions | hematite --find by-time | hematite --find one-liners"
1552    )]
1553    pub find: Option<String>,
1554
1555    #[arg(
1556        long,
1557        help_heading = "Math & Science",
1558        value_name = "TOPIC",
1559        help = "systemd reference — offline cheatsheet for systemctl, journalctl, service management, timers, unit files, boot analysis, and targets. Topics: service, status, logs, analyze, timers, units, targets. Commands: all = everything. Examples: hematite --systemd logs | hematite --systemd timers | hematite --systemd units"
1560    )]
1561    pub systemd: Option<String>,
1562
1563    #[arg(
1564        long,
1565        help_heading = "Math & Science",
1566        value_name = "TOPIC",
1567        help = "GNU Make / Makefile reference — offline cheatsheet for variables, rules, pattern rules, functions, conditionals, and automatic variables. Topics: basics, variables, rules, patterns, functions, conditionals, special. Commands: all = everything. Examples: hematite --make variables | hematite --make patterns | hematite --make special"
1568    )]
1569    pub make: Option<String>,
1570
1571    #[arg(
1572        long,
1573        help_heading = "Math & Science",
1574        value_name = "TOPIC",
1575        help = "chmod / chown / umask reference — offline cheatsheet. Topics: basics, symbolic, special, chown, umask. Commands: all = everything. Examples: hematite --chmod basics | hematite --chmod symbolic | hematite --chmod umask"
1576    )]
1577    pub chmod: Option<String>,
1578
1579    #[arg(
1580        long,
1581        help_heading = "Math & Science",
1582        value_name = "TOPIC",
1583        help = "OpenSSL command reference — offline cheatsheet. Topics: keygen, certs, csr, inspect, convert, encrypt, digest, connect. Commands: all = everything. Examples: hematite --openssl keygen | hematite --openssl certs | hematite --openssl digest"
1584    )]
1585    pub openssl: Option<String>,
1586
1587    #[arg(
1588        long,
1589        help_heading = "Math & Science",
1590        value_name = "TOPIC",
1591        help = "nginx configuration reference — offline cheatsheet. Topics: commands, server-block, location, proxy, ssl-tls, static, rewrites. Commands: all = everything. Examples: hematite --nginx proxy | hematite --nginx ssl-tls | hematite --nginx location"
1592    )]
1593    pub nginx: Option<String>,
1594
1595    #[arg(
1596        long = "bash-ref",
1597        help_heading = "Math & Science",
1598        value_name = "TOPIC",
1599        help = "Bash scripting reference — offline cheatsheet. Topics: variables, arrays, conditionals, loops, functions, io, advanced. Commands: all = everything. Examples: hematite --bash-ref variables | hematite --bash-ref loops | hematite --bash-ref advanced"
1600    )]
1601    pub bash_ref: Option<String>,
1602
1603    #[arg(
1604        long = "python-ref",
1605        help_heading = "Math & Science",
1606        value_name = "TOPIC",
1607        help = "Python 3 reference — offline cheatsheet. Topics: builtins, strings, collections, comprehensions, functions, classes, async. Commands: all = everything. Examples: hematite --python-ref strings | hematite --python-ref async | hematite --python-ref comprehensions"
1608    )]
1609    pub python_ref: Option<String>,
1610
1611    #[arg(
1612        long = "rust-ref",
1613        help_heading = "Math & Science",
1614        value_name = "TOPIC",
1615        help = "Rust language reference — offline cheatsheet. Topics: ownership, types, traits, iterators, error, concurrency. Commands: all = everything. Examples: hematite --rust-ref ownership | hematite --rust-ref traits | hematite --rust-ref error"
1616    )]
1617    pub rust_ref: Option<String>,
1618
1619    #[arg(
1620        long = "go-ref",
1621        help_heading = "Math & Science",
1622        value_name = "TOPIC",
1623        help = "Go language reference — offline cheatsheet. Topics: basics, functions, slices, maps, interfaces, goroutines, errors. Commands: all = everything. Examples: hematite --go-ref goroutines | hematite --go-ref interfaces | hematite --go-ref slices"
1624    )]
1625    pub go_ref: Option<String>,
1626
1627    #[arg(
1628        long = "js-ref",
1629        help_heading = "Math & Science",
1630        value_name = "TOPIC",
1631        help = "JavaScript (ES2022+) reference — offline cheatsheet. Topics: types, functions, arrays, objects, promises, modules, modern. Commands: all = everything. Examples: hematite --js-ref promises | hematite --js-ref modules | hematite --js-ref modern"
1632    )]
1633    pub js_ref: Option<String>,
1634
1635    #[arg(
1636        long,
1637        help_heading = "Math & Science",
1638        value_name = "TOPIC",
1639        help = "kubectl / Kubernetes reference — offline cheatsheet. Topics: basics, pods, deployments, services, config, yaml, advanced. Commands: all = everything. Examples: hematite --kubectl pods | hematite --kubectl deployments | hematite --kubectl yaml"
1640    )]
1641    pub kubectl: Option<String>,
1642
1643    #[arg(
1644        long,
1645        help_heading = "Math & Science",
1646        value_name = "TOPIC",
1647        help = "tmux reference — offline cheatsheet. Topics: sessions, windows, panes, copy-mode, config, scripting. Commands: all = everything. Examples: hematite --tmux panes | hematite --tmux copy-mode | hematite --tmux config"
1648    )]
1649    pub tmux: Option<String>,
1650
1651    #[arg(
1652        long,
1653        help_heading = "Math & Science",
1654        value_name = "TOPIC",
1655        help = "PostgreSQL reference — offline cheatsheet. Topics: psql, tables, queries, admin, json, performance. Commands: all = everything. Examples: hematite --postgres queries | hematite --postgres json | hematite --postgres performance"
1656    )]
1657    pub postgres: Option<String>,
1658
1659    #[arg(
1660        long = "ts-ref",
1661        help_heading = "Math & Science",
1662        value_name = "TOPIC",
1663        help = "TypeScript reference — offline cheatsheet. Topics: types, interfaces, generics, functions, utility, narrowing, config. Commands: all = everything. Examples: hematite --ts-ref generics | hematite --ts-ref utility | hematite --ts-ref narrowing"
1664    )]
1665    pub ts_ref: Option<String>,
1666
1667    #[arg(
1668        long,
1669        help_heading = "Math & Science",
1670        value_name = "TOPIC",
1671        help = "Ansible reference — offline cheatsheet. Topics: inventory, playbooks, modules, vars, roles, vault, cli. Commands: all = everything. Examples: hematite --ansible playbooks | hematite --ansible modules | hematite --ansible vault"
1672    )]
1673    pub ansible: Option<String>,
1674
1675    #[arg(
1676        long,
1677        help_heading = "Math & Science",
1678        value_name = "TOPIC",
1679        help = "Terraform / OpenTofu reference — offline cheatsheet. Topics: workflow, hcl, variables, state, modules, expressions. Commands: all = everything. Examples: hematite --terraform workflow | hematite --terraform state | hematite --terraform expressions"
1680    )]
1681    pub terraform: Option<String>,
1682
1683    #[arg(
1684        long,
1685        help_heading = "Math & Science",
1686        value_name = "TOPIC",
1687        help = "npm / yarn / pnpm reference — offline cheatsheet. Topics: install, scripts, packages, config, workspaces. Commands: all = everything. Examples: hematite --npm install | hematite --npm scripts | hematite --npm workspaces"
1688    )]
1689    pub npm: Option<String>,
1690
1691    #[arg(
1692        long = "git-adv",
1693        help_heading = "Math & Science",
1694        value_name = "TOPIC",
1695        help = "Advanced Git reference — offline cheatsheet. Topics: rebase, stash, bisect, worktree, reflog, hooks. Commands: all = everything. Examples: hematite --git-adv rebase | hematite --git-adv stash | hematite --git-adv reflog"
1696    )]
1697    pub git_adv: Option<String>,
1698
1699    #[arg(
1700        long = "docker-adv",
1701        help_heading = "Math & Science",
1702        value_name = "TOPIC",
1703        help = "Advanced Docker reference — offline cheatsheet. Topics: dockerfile, networks, volumes, compose, buildkit, operations. Commands: all = everything. Examples: hematite --docker-adv dockerfile | hematite --docker-adv compose | hematite --docker-adv buildkit"
1704    )]
1705    pub docker_adv: Option<String>,
1706
1707    #[arg(
1708        long = "systemd-adv",
1709        help_heading = "Math & Science",
1710        value_name = "TOPIC",
1711        help = "Advanced systemd reference — offline cheatsheet. Topics: units, service, journal, timers, dropin, ctl. Commands: all = everything. Examples: hematite --systemd-adv service | hematite --systemd-adv timers | hematite --systemd-adv journal"
1712    )]
1713    pub systemd_adv: Option<String>,
1714
1715    #[arg(
1716        long,
1717        help_heading = "Math & Science",
1718        value_name = "TOPIC",
1719        help = "GNU Make / Makefile reference — offline cheatsheet. Topics: basics, variables, patterns, functions, recipes. Commands: all = everything. Examples: hematite --makefile variables | hematite --makefile patterns | hematite --makefile functions"
1720    )]
1721    pub makefile: Option<String>,
1722
1723    #[arg(
1724        long,
1725        help_heading = "Math & Science",
1726        value_name = "TOPIC",
1727        help = "Jinja2 template reference — offline cheatsheet. Topics: syntax, control, filters, macros, inheritance. Commands: all = everything. Examples: hematite --jinja filters | hematite --jinja control | hematite --jinja inheritance"
1728    )]
1729    pub jinja: Option<String>,
1730
1731    #[arg(
1732        long = "http-adv",
1733        help_heading = "Math & Science",
1734        value_name = "TOPIC",
1735        help = "Advanced HTTP reference — offline cheatsheet. Topics: status, caching, cors, auth, headers, performance. Commands: all = everything. Examples: hematite --http-adv caching | hematite --http-adv cors | hematite --http-adv auth"
1736    )]
1737    pub http_adv: Option<String>,
1738
1739    #[arg(
1740        long = "linux-adv",
1741        help_heading = "Math & Science",
1742        value_name = "TOPIC",
1743        help = "Advanced Linux power-user reference — offline cheatsheet. Topics: processes, tracing, namespaces, sysctl, filesystem, networking. Commands: all = everything. Examples: hematite --linux-adv tracing | hematite --linux-adv sysctl | hematite --linux-adv namespaces"
1744    )]
1745    pub linux_adv: Option<String>,
1746
1747    #[arg(
1748        long = "security-ref",
1749        help_heading = "Math & Science",
1750        value_name = "TOPIC",
1751        help = "Security reference — OWASP, injection, TLS, secrets, JWT, scanning. Topics: owasp, injection, tls, secrets, jwt, scanning. Commands: all = everything. Examples: hematite --security-ref owasp | hematite --security-ref tls | hematite --security-ref jwt"
1752    )]
1753    pub security_ref: Option<String>,
1754
1755    #[arg(
1756        long = "cloud-ref",
1757        help_heading = "Math & Science",
1758        value_name = "TOPIC",
1759        help = "Cloud CLI reference — AWS, GCP, Azure, IAM, managed K8s. Topics: aws, gcp, azure, iam, k8s-cloud. Commands: all = everything. Examples: hematite --cloud-ref aws | hematite --cloud-ref iam | hematite --cloud-ref gcp"
1760    )]
1761    pub cloud_ref: Option<String>,
1762
1763    #[arg(
1764        long = "regex-adv",
1765        help_heading = "Developer Reference",
1766        value_name = "TOPIC",
1767        help = "Advanced regex reference — lookaround, groups, flavors, quantifiers, charclass, common patterns. Topics: lookaround, groups, flavors, quantifiers, charclass, patterns. Commands: all = everything. Examples: hematite --regex-adv lookahead | hematite --regex-adv groups | hematite --regex-adv patterns"
1768    )]
1769    pub regex_adv: Option<String>,
1770
1771    #[arg(
1772        long = "sql-adv",
1773        help_heading = "Developer Reference",
1774        value_name = "TOPIC",
1775        help = "Advanced SQL reference — window functions, CTEs, indexes, EXPLAIN, transactions, JSONB. Topics: window, cte, indexes, explain, transactions, json. Commands: all = everything. Examples: hematite --sql-adv window | hematite --sql-adv cte | hematite --sql-adv indexes"
1776    )]
1777    pub sql_adv: Option<String>,
1778
1779    #[arg(
1780        long = "vim-adv",
1781        help_heading = "Developer Reference",
1782        value_name = "TOPIC",
1783        help = "Advanced Vim / Neovim reference — registers, macros, ex commands, motions, folds, config. Topics: registers, macros, excommands, motions, folds, config. Commands: all = everything. Examples: hematite --vim-adv registers | hematite --vim-adv macros | hematite --vim-adv motions"
1784    )]
1785    pub vim_adv: Option<String>,
1786
1787    #[arg(
1788        long = "python-data",
1789        help_heading = "Developer Reference",
1790        value_name = "TOPIC",
1791        help = "Python data toolkit — pandas, numpy, matplotlib, stdlib, data wrangling. Topics: pandas, numpy, stdlib, plotting, wrangling. Commands: all = everything. Examples: hematite --python-data pandas | hematite --python-data numpy | hematite --python-data wrangling"
1792    )]
1793    pub python_data: Option<String>,
1794
1795    #[arg(
1796        long = "css-ref",
1797        help_heading = "Developer Reference",
1798        value_name = "TOPIC",
1799        help = "CSS reference — selectors, flexbox, grid, animations, custom properties, responsive. Topics: selectors, flexbox, grid, animations, variables, responsive. Commands: all = everything. Examples: hematite --css-ref flexbox | hematite --css-ref grid | hematite --css-ref selectors"
1800    )]
1801    pub css_ref: Option<String>,
1802
1803    #[arg(
1804        long = "rust-adv",
1805        help_heading = "Developer Reference",
1806        value_name = "TOPIC",
1807        help = "Advanced Rust reference — lifetimes, traits/generics, async/await, iterators, macros, error handling. Topics: lifetimes, traits, async, iterators, macros, errors. Commands: all = everything. Examples: hematite --rust-adv lifetimes | hematite --rust-adv async | hematite --rust-adv errors"
1808    )]
1809    pub rust_adv: Option<String>,
1810
1811    #[arg(
1812        long = "algo-ref",
1813        help_heading = "Developer Reference",
1814        value_name = "TOPIC",
1815        help = "Algorithm and data structure reference — Big O cheatsheet, sorting, trees, graphs, DP, problem patterns. Topics: complexity, sorting, trees, graphs, dp, patterns. Commands: all = everything. Examples: hematite --algo-ref complexity | hematite --algo-ref dp | hematite --algo-ref patterns"
1816    )]
1817    pub algo_ref: Option<String>,
1818
1819    #[arg(
1820        long = "oop-ref",
1821        help_heading = "Developer Reference",
1822        value_name = "TOPIC",
1823        help = "OOP design patterns reference — GoF creational/structural/behavioral, SOLID, composition vs inheritance. Topics: creational, structural, behavioral, solid, composition, antipatterns. Commands: all = everything. Examples: hematite --oop-ref solid | hematite --oop-ref creational | hematite --oop-ref behavioral"
1824    )]
1825    pub oop_ref: Option<String>,
1826
1827    #[arg(
1828        long = "typescript-adv",
1829        help_heading = "Developer Reference",
1830        value_name = "TOPIC",
1831        help = "TypeScript advanced reference — generics, utility types, conditional/mapped types, decorators, modules. Topics: generics, utility, conditional, mapped, decorators, modules. Commands: all = everything. Examples: hematite --typescript-adv utility | hematite --typescript-adv conditional | hematite --typescript-adv all"
1832    )]
1833    pub typescript_adv: Option<String>,
1834
1835    #[arg(
1836        long = "bash-adv",
1837        help_heading = "Developer Reference",
1838        value_name = "TOPIC",
1839        help = "Bash advanced reference — arrays, string manipulation, arithmetic, substitution, traps, patterns. Topics: arrays, strings, arithmetic, substitution, traps, patterns. Commands: all = everything. Examples: hematite --bash-adv arrays | hematite --bash-adv strings | hematite --bash-adv traps"
1840    )]
1841    pub bash_adv: Option<String>,
1842
1843    #[arg(
1844        long = "network-ref",
1845        help_heading = "Developer Reference",
1846        value_name = "TOPIC",
1847        help = "Networking reference — OSI model, TCP/IP, subnetting, DNS, TLS, protocols. Topics: osi, tcp-ip, subnetting, dns, tls, protocols. Commands: all = everything. Examples: hematite --network-ref dns | hematite --network-ref tls | hematite --network-ref subnetting"
1848    )]
1849    pub network_ref: Option<String>,
1850
1851    #[arg(
1852        long = "unicode-ref",
1853        help_heading = "Developer Reference",
1854        value_name = "TOPIC",
1855        help = "Unicode reference — encoding, code points, normalization, escape sequences, categories, BOM. Topics: encoding, codepoints, normalization, escapes, categories, bom. Commands: all = everything. Examples: hematite --unicode-ref encoding | hematite --unicode-ref normalization | hematite --unicode-ref bom"
1856    )]
1857    pub unicode_ref: Option<String>,
1858
1859    #[arg(
1860        long = "regex-tester",
1861        help_heading = "Developer Reference",
1862        value_name = "TOPIC",
1863        help = "Regex reference — anchors, groups, quantifiers, character classes, flags, common patterns. Topics: anchors, groups, quantifiers, charclass, flags, patterns. Commands: all = everything. Examples: hematite --regex-tester anchors | hematite --regex-tester patterns | hematite --regex-tester groups"
1864    )]
1865    pub regex_tester: Option<String>,
1866
1867    #[arg(
1868        long = "http-headers",
1869        help_heading = "Developer Reference",
1870        value_name = "TOPIC",
1871        help = "HTTP headers reference — request, response, security, CORS, auth, caching. Topics: request, response, security, cors, auth, cache. Commands: all = everything. Examples: hematite --http-headers security | hematite --http-headers cors | hematite --http-headers cache"
1872    )]
1873    pub http_headers: Option<String>,
1874
1875    #[arg(
1876        long = "crypto-ref",
1877        help_heading = "Developer Reference",
1878        value_name = "TOPIC",
1879        help = "Cryptography reference — symmetric, asymmetric, hashing, PKI, vulnerabilities, protocols. Topics: symmetric, asymmetric, hashing, pki, vulnerabilities, protocols. Commands: all = everything. Examples: hematite --crypto-ref hashing | hematite --crypto-ref asymmetric | hematite --crypto-ref pki"
1880    )]
1881    pub crypto_ref: Option<String>,
1882
1883    #[arg(
1884        long = "devops-ref",
1885        help_heading = "Developer Reference",
1886        value_name = "TOPIC",
1887        help = "DevOps reference — CI/CD, containers/k8s, IaC, monitoring, SRE, DevSecOps. Topics: cicd, containers, iac, monitoring, sre, security. Commands: all = everything. Examples: hematite --devops-ref cicd | hematite --devops-ref monitoring | hematite --devops-ref sre"
1888    )]
1889    pub devops_ref: Option<String>,
1890
1891    #[arg(
1892        long = "linux-sys",
1893        help_heading = "Developer Reference",
1894        value_name = "TOPIC",
1895        help = "Linux SysAdmin reference — systemd/journalctl, processes/signals, kernel/sysctl, filesystem, network, security. Topics: systemctl, processes, kernel, filesystem, network, security. Commands: all = everything. Examples: hematite --linux-sys systemctl | hematite --linux-sys kernel | hematite --linux-sys security"
1896    )]
1897    pub linux_sys: Option<String>,
1898
1899    #[arg(
1900        long = "api-design",
1901        help_heading = "Developer Reference",
1902        value_name = "TOPIC",
1903        help = "API design reference — REST, OpenAPI/Swagger, versioning, error formats, GraphQL, rate limiting. Topics: rest, openapi, versioning, errors, graphql, ratelimit. Commands: all = everything. Examples: hematite --api-design rest | hematite --api-design openapi | hematite --api-design graphql"
1904    )]
1905    pub api_design: Option<String>,
1906
1907    #[arg(
1908        long = "db-design",
1909        help_heading = "Developer Reference",
1910        value_name = "TOPIC",
1911        help = "Database design reference — normalization, indexes, ACID/transactions, distributed/CAP, NoSQL, migrations. Topics: normalization, indexes, transactions, distributed, nosql, migrations. Commands: all = everything. Examples: hematite --db-design normalization | hematite --db-design indexes | hematite --db-design nosql"
1912    )]
1913    pub db_design: Option<String>,
1914
1915    #[arg(
1916        long,
1917        help_heading = "Developer Toolkit",
1918        value_name = "TOPIC",
1919        help = "Performance engineering reference — profiling, memory, benchmarking, web vitals, DB, optimization. Topics: profiling, memory, benchmarking, web, database, optimization. Commands: all = everything. Examples: hematite --perf-ref profiling | hematite --perf-ref memory | hematite --perf-ref benchmarking"
1920    )]
1921    pub perf_ref: Option<String>,
1922
1923    #[arg(
1924        long,
1925        help_heading = "Developer Toolkit",
1926        value_name = "TOPIC",
1927        help = "Docker Compose reference — services, networking, volumes, health checks, production, logging. Topics: basics, networking, health, production, logging, tips. Commands: all = everything. Examples: hematite --docker-compose basics | hematite --docker-compose health | hematite --docker-compose production"
1928    )]
1929    pub docker_compose: Option<String>,
1930
1931    #[arg(
1932        long,
1933        help_heading = "Developer Toolkit",
1934        value_name = "TOPIC",
1935        help = "WebAssembly reference — WAT format, memory model, WASI, wasm-pack, wabt, component model. Topics: format, memory, wasi, wasm-pack, wabt, component. Commands: all = everything. Examples: hematite --wasm-ref format | hematite --wasm-ref wasi | hematite --wasm-ref wasm-pack"
1936    )]
1937    pub wasm_ref: Option<String>,
1938
1939    #[arg(
1940        long,
1941        help_heading = "Developer Toolkit",
1942        value_name = "TOPIC",
1943        help = "Web accessibility (a11y) reference — WCAG 2.1/2.2, ARIA, keyboard nav, contrast, screen readers, testing. Topics: wcag, aria, keyboard, contrast, screen-readers, testing. Commands: all = everything. Examples: hematite --accessibility aria | hematite --accessibility keyboard | hematite --accessibility contrast"
1944    )]
1945    pub accessibility: Option<String>,
1946
1947    #[arg(
1948        long,
1949        help_heading = "Developer Toolkit",
1950        value_name = "TOPIC",
1951        help = "Kubernetes reference — pods, deployments, services, ingress, RBAC, troubleshooting, Helm. Topics: pods, services, config, rbac, troubleshoot, helm. Commands: all = everything. Examples: hematite --k8s-ref pods | hematite --k8s-ref rbac | hematite --k8s-ref troubleshoot"
1952    )]
1953    pub k8s_ref: Option<String>,
1954
1955    #[arg(
1956        long,
1957        help_heading = "Developer Toolkit",
1958        value_name = "TOPIC",
1959        help = "Observability reference — metrics/Prometheus, tracing/OpenTelemetry, logging, SLOs, dashboards, alerting. Topics: metrics, tracing, logging, slo, dashboards, alerting. Commands: all = everything. Examples: hematite --observability metrics | hematite --observability tracing | hematite --observability slo"
1960    )]
1961    pub observability: Option<String>,
1962
1963    #[arg(
1964        long,
1965        help_heading = "Developer Toolkit",
1966        value_name = "TOPIC",
1967        help = "Advanced Terraform reference — modules, state management, workspaces, testing, patterns, CI/CD. Topics: modules, state, workspaces, testing, patterns, cicd. Commands: all = everything. Examples: hematite --terraform-adv modules | hematite --terraform-adv state | hematite --terraform-adv testing"
1968    )]
1969    pub terraform_adv: Option<String>,
1970
1971    #[arg(
1972        long,
1973        help_heading = "Developer Toolkit",
1974        value_name = "TOPIC",
1975        help = "Security scanning reference — SAST, DAST, dependency scanning, container security, secrets detection, compliance. Topics: sast, dast, deps, containers, secrets, compliance. Commands: all = everything. Examples: hematite --security-scan sast | hematite --security-scan secrets | hematite --security-scan compliance"
1976    )]
1977    pub security_scan: Option<String>,
1978
1979    #[arg(
1980        long,
1981        help_heading = "Developer Toolkit",
1982        value_name = "TOPIC",
1983        help = "Machine learning reference — fundamentals, models, feature engineering, training, evaluation, deployment/MLOps. Topics: fundamentals, models, features, training, evaluation, deployment. Commands: all = everything. Examples: hematite --ml-ref models | hematite --ml-ref training | hematite --ml-ref evaluation"
1984    )]
1985    pub ml_ref: Option<String>,
1986
1987    #[arg(
1988        long,
1989        help_heading = "Developer Toolkit",
1990        value_name = "TOPIC",
1991        help = "Rust design patterns — error handling, iterators, traits, async/concurrency, design patterns. Topics: errors, iterators, traits, async, concurrency, design. Commands: all = everything. Examples: hematite --rust-patterns errors | hematite --rust-patterns async | hematite --rust-patterns iterators"
1992    )]
1993    pub rust_patterns: Option<String>,
1994
1995    #[arg(
1996        long,
1997        help_heading = "Developer Toolkit",
1998        value_name = "TOPIC",
1999        help = "Event-driven architecture reference — pub/sub, Kafka, event sourcing, CQRS, messaging, CDC, schema evolution. Topics: patterns, kafka, event-sourcing, messaging, cdc, schema. Commands: all = everything. Examples: hematite --event-driven kafka | hematite --event-driven event-sourcing | hematite --event-driven cdc"
2000    )]
2001    pub event_driven: Option<String>,
2002
2003    #[arg(
2004        long,
2005        help_heading = "Developer Toolkit",
2006        value_name = "TOPIC",
2007        help = "API gateway reference — patterns, products (Kong/Envoy/Istio), auth, service mesh, observability, design. Topics: patterns, products, service-mesh, auth, observability, design. Commands: all = everything. Examples: hematite --api-gateway patterns | hematite --api-gateway service-mesh | hematite --api-gateway auth"
2008    )]
2009    pub api_gateway: Option<String>,
2010
2011    #[arg(
2012        long,
2013        help_heading = "Developer Toolkit",
2014        value_name = "QUERY",
2015        help = "CI/CD reference — offline replacement for GitHub Actions/GitLab CI docs. Topics: concepts, github-actions, gitlab, pipelines, security, jenkins. Aliases: dora, gha, canary, blue-green, sast, jenkinsfile, trivy, and more. Examples: hematite --cicd-ref github-actions | hematite --cicd-ref canary | hematite --cicd-ref sast | hematite --cicd-ref all"
2016    )]
2017    pub cicd_ref: Option<String>,
2018
2019    #[arg(
2020        long,
2021        help_heading = "Developer Toolkit",
2022        value_name = "QUERY",
2023        help = "Design patterns reference — offline replacement for refactoring.guru. Topics: creational, structural, behavioral, concurrency, rust-idioms, architecture. Aliases: singleton, observer, builder-pattern, typestate, hexagonal, cqrs-pattern, and more. Examples: hematite --design-patterns creational | hematite --design-patterns observer | hematite --design-patterns hexagonal | hematite --design-patterns all"
2024    )]
2025    pub design_patterns: Option<String>,
2026
2027    #[arg(
2028        long,
2029        help_heading = "Developer Toolkit",
2030        value_name = "QUERY",
2031        help = "Auth reference — offline replacement for auth0 docs, OIDC spec. Topics: oauth2, oidc, jwt, session, saml, security. Aliases: pkce, id-token, rs256, httponly, bcrypt, totp, webauthn, and more. Examples: hematite --auth-ref oauth2 | hematite --auth-ref pkce | hematite --auth-ref totp | hematite --auth-ref all"
2032    )]
2033    pub auth_ref: Option<String>,
2034
2035    #[arg(
2036        long,
2037        help_heading = "Developer Toolkit",
2038        value_name = "QUERY",
2039        help = "Linux kernel internals reference — offline replacement for kernel.org docs. Topics: syscalls, memory, namespaces, cgroups, ebpf, scheduler. Aliases: strace, mmap, oom-killer, cgroup-v2, bpftrace, cfs, io-uring, and more. Examples: hematite --linux-kernel syscalls | hematite --linux-kernel ebpf | hematite --linux-kernel cgroups | hematite --linux-kernel all"
2040    )]
2041    pub linux_kernel: Option<String>,
2042
2043    #[arg(
2044        long,
2045        help_heading = "Developer Toolkit",
2046        value_name = "QUERY",
2047        help = "Advanced database reference — offline replacement for PostgreSQL/MySQL docs tabs. Topics: indexing, partitioning, replication, query-opt, transactions, maintenance. Aliases: btree, gin, explain, mvcc, pgbouncer, pitr, vacuum, patroni, and more. Examples: hematite --database-adv indexing | hematite --database-adv explain | hematite --database-adv mvcc | hematite --database-adv all"
2048    )]
2049    pub database_adv: Option<String>,
2050
2051    #[arg(
2052        long,
2053        help_heading = "Developer Toolkit",
2054        value_name = "QUERY",
2055        help = "Advanced networking reference — offline replacement for Cisco/networking bookmarks. Topics: subnetting, routing, vlan, qos, nat, tunneling. Aliases: cidr, ospf, bgp, stp, dscp, ipsec, wireguard, vrf, and more. Examples: hematite --networking-adv subnetting | hematite --networking-adv ospf | hematite --networking-adv wireguard | hematite --networking-adv all"
2056    )]
2057    pub networking_adv: Option<String>,
2058
2059    #[arg(
2060        long,
2061        help_heading = "Developer Toolkit",
2062        value_name = "QUERY",
2063        help = "Software testing reference — offline replacement for testing docs and blogs. Topics: strategy, unit, integration, e2e, performance, mocking. Aliases: tdd, bdd, playwright, k6, testcontainers, mockall, pact, snapshot, and more. Examples: hematite --testing-ref strategy | hematite --testing-ref playwright | hematite --testing-ref k6 | hematite --testing-ref all"
2064    )]
2065    pub testing_ref: Option<String>,
2066
2067    #[arg(
2068        long,
2069        help_heading = "Developer Toolkit",
2070        value_name = "QUERY",
2071        help = "Compiler internals reference — offline replacement for compiler books and LLVM docs. Topics: parsing, ast, ir, optimization, codegen, tools. Aliases: lexer, pratt, lalrpop, tree-sitter, mir, ssa, llvm-ir, cranelift, pgo, cargo-asm, and more. Examples: hematite --compiler-ref parsing | hematite --compiler-ref ir | hematite --compiler-ref optimization | hematite --compiler-ref all"
2072    )]
2073    pub compiler_ref: Option<String>,
2074
2075    #[arg(
2076        long,
2077        help_heading = "Developer Toolkit",
2078        value_name = "QUERY",
2079        help = "Monitoring & observability reference — offline replacement for Prometheus/Grafana docs. Topics: slo, prometheus, alerting, grafana, otel, logging. Aliases: sli, promql, alertmanager, loki, opentelemetry, structured-logging, and more. Examples: hematite --monitoring-ref slo | hematite --monitoring-ref prometheus | hematite --monitoring-ref otel | hematite --monitoring-ref all"
2080    )]
2081    pub monitoring_ref: Option<String>,
2082
2083    #[arg(
2084        long,
2085        help_heading = "Developer Toolkit",
2086        value_name = "QUERY",
2087        help = "Search engine reference — offline replacement for Elasticsearch docs. Topics: concepts, elasticsearch, vector, ranking, performance, design. Aliases: inverted-index, bm25, hnsw, faiss, qdrant, ltr, bulk-api, and more. Examples: hematite --search-ref concepts | hematite --search-ref vector | hematite --search-ref elasticsearch | hematite --search-ref all"
2088    )]
2089    pub search_ref: Option<String>,
2090
2091    #[arg(
2092        long,
2093        help_heading = "Developer Toolkit",
2094        value_name = "QUERY",
2095        help = "Network protocols reference — offline replacement for protocol docs. Topics: grpc, websocket, graphql, mqtt, http23, tls. Aliases: protobuf, grpc-gateway, dataloader, federation, qos, quic, mtls, and more. Examples: hematite --protocols-ref grpc | hematite --protocols-ref tls | hematite --protocols-ref graphql | hematite --protocols-ref all"
2096    )]
2097    pub protocols_ref: Option<String>,
2098
2099    #[arg(
2100        long,
2101        help_heading = "Developer Toolkit",
2102        value_name = "QUERY",
2103        help = "Container internals reference — offline replacement for Docker/containerd docs. Topics: namespaces, cgroups, oci, runtimes, build, security. Aliases: pid-namespace, cgroup-v2, overlayfs, runc, containerd, dockerfile, multi-stage, buildkit, seccomp, and more. Examples: hematite --container-ref namespaces | hematite --container-ref cgroups | hematite --container-ref build | hematite --container-ref all"
2104    )]
2105    pub container_ref: Option<String>,
2106
2107    #[arg(
2108        long,
2109        help_heading = "Developer Toolkit",
2110        value_name = "QUERY",
2111        help = "Regex engine reference — offline replacement for regex docs and regex101 for concepts. Topics: theory, syntax, advanced, rust-regex, performance, tools. Aliases: nfa, dfa, backtracking, lookahead, possessive-quantifiers, regex-crate, redos, and more. Examples: hematite --regex-engine theory | hematite --regex-engine syntax | hematite --regex-engine rust-regex | hematite --regex-engine all"
2112    )]
2113    pub regex_engine: Option<String>,
2114
2115    #[arg(
2116        long,
2117        help_heading = "Developer Toolkit",
2118        value_name = "QUERY",
2119        help = "Git internals reference — offline replacement for Git docs and Pro Git book. Topics: objects, pack-files, plumbing, reflog, rewrite, advanced-ops. Aliases: blob, cat-file, git-gc, git-reflog, interactive-rebase, git-bisect, git-submodules, and more. Examples: hematite --git-internals objects | hematite --git-internals reflog | hematite --git-internals rewrite | hematite --git-internals all"
2120    )]
2121    pub git_internals: Option<String>,
2122
2123    #[arg(
2124        long,
2125        help_heading = "Developer Toolkit",
2126        value_name = "QUERY",
2127        help = "Data serialization formats reference — offline replacement for format docs. Topics: binary, columnar, streaming, text, schema, compression. Aliases: msgpack, parquet, avro, json-format, yaml-format, toml-format, zstd, lz4, snappy, and more. Examples: hematite --data-formats binary | hematite --data-formats columnar | hematite --data-formats compression | hematite --data-formats all"
2128    )]
2129    pub data_formats: Option<String>,
2130
2131    #[arg(
2132        long,
2133        help_heading = "Math & Science",
2134        value_name = "QUERY",
2135        help = "Web performance reference — offline replacement for web.dev/performance. Topics: cwv, rendering, caching, cdn, bundling, images. Aliases: core-web-vitals, lcp, inp, cls, ttfb, critical-render-path, cache-control, service-worker-cache, bundle-splitting, tree-shaking, image-optimization, avif, webp, and more. Examples: hematite --web-perf cwv | hematite --web-perf caching | hematite --web-perf all"
2136    )]
2137    pub web_perf: Option<String>,
2138
2139    #[arg(
2140        long,
2141        help_heading = "Math & Science",
2142        value_name = "QUERY",
2143        help = "SQL query tuning reference — offline replacement for use-the-index-luke.com. Topics: explain, indexes, statistics, optimizer, partitioning, advanced-sql. Aliases: execution-plan, btree-index, gin-index, partial-index, pg-stats, work-mem, range-partition, window-functions, cte, recursive-cte, lateral-join, and more. Examples: hematite --sql-tuning explain | hematite --sql-tuning indexes | hematite --sql-tuning all"
2144    )]
2145    pub sql_tuning: Option<String>,
2146
2147    #[arg(
2148        long,
2149        help_heading = "Math & Science",
2150        value_name = "QUERY",
2151        help = "Concurrency patterns reference — offline replacement for concurrency docs. Topics: primitives, atomics, channels, lock-free, async, patterns. Aliases: mutex, rwlock, semaphore, acquire-release, seqcst, cas-loop, channel-mpsc, backpressure, lock-free-queue, hazard-pointers, async-await, tokio-runtime, thread-pool, producer-consumer, rayon, and more. Examples: hematite --concurrency atomics | hematite --concurrency async | hematite --concurrency all"
2152    )]
2153    pub concurrency: Option<String>,
2154
2155    #[arg(
2156        long,
2157        help_heading = "Math & Science",
2158        value_name = "QUERY",
2159        help = "Cloud-native patterns reference — offline replacement for cloud docs. Topics: 12factor, patterns, service-mesh, observability, deployment, events. Aliases: twelve-factor, circuit-breaker, bulkhead, saga-pattern, cqrs-pattern, istio, envoy-proxy, prometheus-stack, distributed-tracing, blue-green, canary-deployment, gitops, event-sourcing, outbox-pattern, and more. Examples: hematite --cloud-native 12factor | hematite --cloud-native patterns | hematite --cloud-native all"
2160    )]
2161    pub cloud_native: Option<String>,
2162
2163    #[arg(
2164        long,
2165        help_heading = "Math & Science",
2166        value_name = "QUERY",
2167        help = "Regex pattern cookbook — offline replacement for regex cheat sheets. Topics: common, text, code, log, security, network. Aliases: validation, email-pattern, url-pattern, uuid-pattern, text-processing, duplicate-words, code-extraction, function-def, log-parsing, syslog-pattern, secrets-detection, aws-key, network-patterns, cidr-pattern, and more. Examples: hematite --regex-patterns common | hematite --regex-patterns log | hematite --regex-patterns all"
2168    )]
2169    pub regex_patterns: Option<String>,
2170
2171    #[arg(
2172        long,
2173        help_heading = "Math & Science",
2174        value_name = "QUERY",
2175        help = "HTTP security reference — offline replacement for security header docs. Topics: csp, cors, hsts, headers, tls, cookies. Aliases: content-security-policy, nonce-csp, cross-origin-resource-sharing, preflight, strict-transport-security, hsts-preload, x-content-type-options, referrer-policy, permissions-policy, tls-config, cipher-suites, cookie-security, samesite, csrf-protection, and more. Examples: hematite --http-security csp | hematite --http-security cors | hematite --http-security all"
2176    )]
2177    pub http_security: Option<String>,
2178
2179    #[arg(
2180        long,
2181        help_heading = "Math & Science",
2182        value_name = "QUERY",
2183        help = "gRPC and Protobuf reference — offline replacement for grpc.io docs. Topics: proto, services, codegen, interceptors, transport, tools. Aliases: protobuf, proto3, message-definition, service-definition, server-streaming, code-generation, protoc, tonic, buf-tool, grpc-middleware, grpc-metadata, grpc-tls, grpc-load-balancing, grpcurl, and more. Examples: hematite --grpc-ref proto | hematite --grpc-ref interceptors | hematite --grpc-ref all"
2184    )]
2185    pub grpc_ref: Option<String>,
2186
2187    #[arg(
2188        long,
2189        help_heading = "Math & Science",
2190        value_name = "QUERY",
2191        help = "WebAssembly runtime reference — offline replacement for webassembly.org docs. Topics: core, wasi, js, rust, components, perf. Aliases: wasm-concepts, binary-format, wasm-system-interface, wasi-preview2, wasi-http, wasm-javascript, instantiatestreaming, wasm-pack, wasm-bindgen, component-model, wit-idl, wasm-simd, wasm-threads, wasm-profiling, and more. Examples: hematite --wasm-runtime wasi | hematite --wasm-runtime rust | hematite --wasm-runtime all"
2192    )]
2193    pub wasm_runtime: Option<String>,
2194
2195    #[arg(
2196        long,
2197        help_heading = "Math & Science",
2198        value_name = "QUERY",
2199        help = "Linux performance tooling reference — offline replacement for perf-wiki. Topics: perf, ebpf, ftrace, flamegraph, memory, syscall. Aliases: perf-tool, perf-stat, bpftrace, bcc-tools, kprobe, opensnoop, kernel-tracer, function-graph, flame-graph, brendan-gregg, off-cpu, valgrind, asan-rust, strace, ltrace, and more. Examples: hematite --linux-perf ebpf | hematite --linux-perf flamegraph | hematite --linux-perf all"
2200    )]
2201    pub linux_perf: Option<String>,
2202
2203    #[arg(
2204        long,
2205        help_heading = "Math & Science",
2206        value_name = "QUERY",
2207        help = "Database migration reference — offline replacement for Flyway/Liquibase/Atlas docs. Topics: concepts, flyway, liquibase, atlas, patterns, rollback. Aliases: schema-migration, flyway-migrate, flyway-cli, liquibase-changeset, atlas-schema, zero-downtime-migration, expand-contract, concurrent-index, migration-rollback, transactional-ddl, and more. Examples: hematite --db-migrations flyway | hematite --db-migrations patterns | hematite --db-migrations all"
2208    )]
2209    pub db_migrations: Option<String>,
2210
2211    #[arg(
2212        long,
2213        help_heading = "Math & Science",
2214        value_name = "QUERY",
2215        help = "OAuth 2.0 and OIDC reference — offline replacement for oauth.net docs. Topics: flows, tokens, oidc, security, providers, jwt. Aliases: authorization-code, pkce, client-credentials, refresh-token-flow, access-token, id-token, jwt-verification, openid-connect, oidc-scopes, discovery-endpoint, auth0, okta, azure-ad, jsonwebtoken, rs256, and more. Examples: hematite --oauth-ref flows | hematite --oauth-ref tokens | hematite --oauth-ref all"
2216    )]
2217    pub oauth_ref: Option<String>,
2218
2219    #[arg(
2220        long,
2221        help_heading = "Math & Science",
2222        value_name = "QUERY",
2223        help = "Kubernetes security reference — offline replacement for k8s security docs. Topics: rbac, netpol, podsec, secrets, supply, audit. Aliases: kubernetes-rbac, rolebinding, serviceaccount-rbac, network-policy, default-deny, pod-security-standards, security-context, runasnonroot, encryption-at-rest, external-secrets, vault-agent, image-signing, cosign, falco, kube-bench, and more. Examples: hematite --k8s-security rbac | hematite --k8s-security podsec | hematite --k8s-security all"
2224    )]
2225    pub k8s_security: Option<String>,
2226
2227    #[arg(
2228        long,
2229        help_heading = "Developer Toolkit",
2230        value_name = "QUERY",
2231        help = "API versioning reference — offline replacement for REST versioning docs. Topics: strategies, semver, routing, graphql, hypermedia, docs. Aliases: url-versioning, header-versioning, breaking-changes, backwards-compatibility, contract-testing, hateoas, hal-format, openapi-changelog, and more. Examples: hematite --api-versioning strategies | hematite --api-versioning semver | hematite --api-versioning all"
2232    )]
2233    pub api_versioning: Option<String>,
2234
2235    #[arg(
2236        long,
2237        help_heading = "Developer Toolkit",
2238        value_name = "QUERY",
2239        help = "Message queue reference — offline replacement for Kafka/RabbitMQ docs. Topics: kafka, rabbitmq, patterns, sqs, reliability, schema. Aliases: apache-kafka, kafka-topics, kafka-producer, kafka-consumer, rabbit-mq, amqp, dlx, outbox-pattern, saga-pattern, aws-sqs, sqs-fifo, avro-kafka, schema-registry, cloudevents, asyncapi, and more. Examples: hematite --message-queue kafka | hematite --message-queue rabbitmq | hematite --message-queue all"
2240    )]
2241    pub message_queue: Option<String>,
2242
2243    #[arg(
2244        long,
2245        help_heading = "Developer Toolkit",
2246        value_name = "QUERY",
2247        help = "Caching reference — offline replacement for caching docs. Topics: strategies, redis, http, app, memcached, patterns. Aliases: cache-aside, write-through, write-behind, thundering-herd, redis-commands, redis-cluster, cache-control-header, etag-caching, cdn-caching, memoization, consistent-hashing-cache, xfetch, negative-caching, and more. Examples: hematite --caching-ref strategies | hematite --caching-ref redis | hematite --caching-ref all"
2248    )]
2249    pub caching_ref: Option<String>,
2250
2251    #[arg(
2252        long,
2253        help_heading = "Developer Toolkit",
2254        value_name = "QUERY",
2255        help = "Load testing reference — offline replacement for k6/Locust docs. Topics: k6, wrk, locust, metrics, scenarios, profiling. Aliases: k6-script, k6-stages, k6-thresholds, wrk-benchmark, vegeta, locustfile, load-test-metrics, percentiles, p99, coordinated-omission, amdahl-law, littles-law, smoke-test, stress-test, spike-test, soak-test, go-pprof, cargo-flamegraph-load, and more. Examples: hematite --load-testing k6 | hematite --load-testing metrics | hematite --load-testing all"
2256    )]
2257    pub load_testing: Option<String>,
2258
2259    #[arg(
2260        long,
2261        help_heading = "Developer Toolkit",
2262        value_name = "QUERY",
2263        help = "Service mesh reference — offline replacement for Istio/Envoy/Linkerd docs. Topics: istio, envoy, linkerd, patterns, consul, dapr. Aliases: virtualservice, destinationrule, istioctl, envoy-proxy, xds-api, linkerd-inject, traffic-split, mesh-patterns, canary-mesh, spiffe, consul-connect, dapr-sidecar, dapr-state, and more. Examples: hematite --service-mesh istio | hematite --service-mesh patterns | hematite --service-mesh all"
2264    )]
2265    pub service_mesh: Option<String>,
2266
2267    #[arg(
2268        long,
2269        help_heading = "Developer Toolkit",
2270        value_name = "QUERY",
2271        help = "Advanced observability reference — offline replacement for OTel/Jaeger/Grafana docs. Topics: otel, tracing, metrics, logging, alerting, dashboards. Aliases: opentelemetry, otlp, distributed-tracing, jaeger-tracing, slo-metrics-adv, error-budget, structured-logging, loki-logging, alertmanager, grafana-dashboards, use-method, red-method, and more. Examples: hematite --observability-adv otel | hematite --observability-adv tracing | hematite --observability-adv all"
2272    )]
2273    pub observability_adv: Option<String>,
2274
2275    #[arg(
2276        long,
2277        help_heading = "Developer Toolkit",
2278        value_name = "QUERY",
2279        help = "Terminal tools reference — offline replacement for fzf/ripgrep/zsh docs. Topics: fzf, ripgrep, shell-tools, zsh, tmux-adv, wezterm. Aliases: fuzzy-finder, rg-search, modern-cli, zsh-config, zsh-plugins, tmux-advanced, tpm-plugins, terminal-emulator, starship-prompt, powerlevel10k, eza-ls, bat-cat, and more. Examples: hematite --terminal-tools fzf | hematite --terminal-tools zsh | hematite --terminal-tools all"
2280    )]
2281    pub terminal_tools: Option<String>,
2282
2283    #[arg(
2284        long,
2285        help_heading = "Developer Toolkit",
2286        value_name = "QUERY",
2287        help = "Data pipeline reference — offline replacement for dbt/Airflow/Spark docs. Topics: dbt, airflow, spark, streaming, etl, lakehouse. Aliases: dbt-models, apache-airflow, pyspark, kafka-streams, apache-flink, etl-patterns, delta-lake, apache-iceberg, duckdb, data-quality, debezium-cdc, and more. Examples: hematite --data-pipeline dbt | hematite --data-pipeline spark | hematite --data-pipeline all"
2288    )]
2289    pub data_pipeline: Option<String>,
2290
2291    #[arg(
2292        long,
2293        help_heading = "Developer Toolkit",
2294        value_name = "QUERY",
2295        help = "Security tools reference — offline replacement for OWASP and tool docs. Topics: nmap, web, sast, network, hardening, cloud-sec. Aliases: nmap-scan, owasp-zap, burp-suite, sqlmap, semgrep, trivy-scan, snyk, wireshark, metasploit, linux-hardening, cis-benchmark, aws-security, kube-bench, falco-security. Examples: hematite --security-tools nmap | hematite --security-tools owasp-zap | hematite --security-tools all"
2296    )]
2297    pub security_tools: Option<String>,
2298
2299    #[arg(
2300        long,
2301        help_heading = "Developer Toolkit",
2302        value_name = "QUERY",
2303        help = "Advanced cryptography reference — offline replacement for crypto docs. Topics: tls, pki, jwt-adv, primitives, mtls. Aliases: tls-deep-dive, tls13, tls-handshake, lets-encrypt, acme-protocol, certbot, cert-manager, jwt-advanced, jwt-vulnerabilities, paseto, aes-gcm, ed25519, argon2, mutual-tls, client-certificates. Examples: hematite --crypto-adv tls | hematite --crypto-adv jwt-adv | hematite --crypto-adv all"
2304    )]
2305    pub crypto_adv: Option<String>,
2306
2307    #[arg(
2308        long,
2309        help_heading = "Developer Toolkit",
2310        value_name = "QUERY",
2311        help = "Browser dev tools reference — offline replacement for MDN and DevTools docs. Topics: devtools, web-apis, pwa, websocket, performance. Aliases: chrome-devtools, core-web-vitals, lighthouse-audit, fetch-api, intersection-observer, service-workers, workbox, websocket-api, webrtc, critical-rendering-path, code-splitting. Examples: hematite --browser-dev devtools | hematite --browser-dev pwa | hematite --browser-dev all"
2312    )]
2313    pub browser_dev: Option<String>,
2314
2315    #[arg(
2316        long,
2317        help_heading = "Developer Toolkit",
2318        value_name = "QUERY",
2319        help = "Rust async reference — offline replacement for Tokio and async-std docs. Topics: tokio, channels, streams, axum, patterns. Aliases: tokio-runtime, tokio-spawn, tokio-select, mpsc-channel, oneshot-channel, broadcast-channel, watch-channel, async-streams, tokio-stream, axum-framework, axum-extractors, async-trait, cancellation-token. Examples: hematite --rust-async tokio | hematite --rust-async channels | hematite --rust-async all"
2320    )]
2321    pub rust_async: Option<String>,
2322
2323    #[arg(
2324        long,
2325        help_heading = "Developer Toolkit",
2326        value_name = "QUERY",
2327        help = "Regex visualizer & pattern library — offline replacement for regex101.com. Topics: syntax, breakdown, lookahead, performance, common. Aliases: regex-syntax, character-classes, quantifiers, pattern-breakdown, email-regex, catastrophic-backtracking, nfa-dfa, rust-regex, common-regex, validation-regex. Examples: hematite --regex-viz syntax | hematite --regex-viz breakdown | hematite --regex-viz all"
2328    )]
2329    pub regex_viz: Option<String>,
2330
2331    #[arg(
2332        long,
2333        help_heading = "Developer Toolkit",
2334        value_name = "QUERY",
2335        help = "SQL window functions reference — offline replacement for PostgreSQL/MySQL window docs. Topics: basics, ranking, offset, frames, practical. Aliases: over-clause, row-number, rank, dense-rank, lag-lead, rows-between, moving-average, gaps-islands, sessionization, window-frames. Examples: hematite --sql-window basics | hematite --sql-window ranking | hematite --sql-window all"
2336    )]
2337    pub sql_window: Option<String>,
2338
2339    #[arg(
2340        long,
2341        help_heading = "Developer Toolkit",
2342        value_name = "QUERY",
2343        help = "CSS Grid & Flexbox reference — offline replacement for css-tricks.com complete guides. Topics: grid, flexbox, layouts, responsive, tricks. Aliases: css-grid, css-flexbox, holy-grail, auto-fit, fr-unit, justify-content, media-queries, clamp, container-queries, subgrid, css-variables. Examples: hematite --css-grid grid | hematite --css-grid flexbox | hematite --css-grid all"
2344    )]
2345    pub css_grid: Option<String>,
2346
2347    #[arg(
2348        long,
2349        help_heading = "Developer Toolkit",
2350        value_name = "QUERY",
2351        help = "Cloud cost optimization reference — offline replacement for AWS/GCP/Azure cost docs. Topics: aws, gcp, azure, finops, tools. Aliases: aws-savings-plans, gcp-cud, azure-reservations, finops, infracost, kubecost, rightsizing, spot-instances, tagging-strategy, unit-economics, cloud-custodian. Examples: hematite --cloud-cost aws | hematite --cloud-cost finops | hematite --cloud-cost all"
2352    )]
2353    pub cloud_cost: Option<String>,
2354
2355    #[arg(
2356        long,
2357        help_heading = "Developer Toolkit",
2358        value_name = "QUERY",
2359        help = "HTTP/2, HTTP/3, gRPC, server push & SSE reference — offline replacement for http2.github.io and RFC docs. Topics: http2, http3, grpc, push, sse. Aliases: h2, h3, quic, hpack, multiplexing, grpc-framing, grpc-status, server-push, 103-early-hints, sse-vs-websocket, websocket-h2. Examples: hematite --http2 h2 | hematite --http2 grpc | hematite --http2 all"
2360    )]
2361    pub http2: Option<String>,
2362
2363    #[arg(
2364        long,
2365        help_heading = "Developer Toolkit",
2366        value_name = "QUERY",
2367        help = "OAuth 2.0 / OIDC flows reference — offline replacement for oauth.net and OpenID docs. Topics: auth-code, client-creds, tokens, oidc, security. Aliases: pkce, code-challenge, authorization-code, client-credentials, machine-to-machine, device-flow, bearer-token, refresh-token, openid-connect, oidc-discovery, oauth2-vulnerabilities. Examples: hematite --oauth2-flow pkce | hematite --oauth2-flow tokens | hematite --oauth2-flow all"
2368    )]
2369    pub oauth2_flow: Option<String>,
2370
2371    #[arg(
2372        long,
2373        help_heading = "Developer Toolkit",
2374        value_name = "QUERY",
2375        help = "Linux networking reference — offline replacement for iproute2 man pages and netfilter docs. Topics: ip, iptables, tc, bonding, tools. Aliases: ip-command, iproute2, iptables-ref, nftables, traffic-control, tc-netem, rate-limiting, vlan-linux, bonding-linux, ethtool, tcpdump-linux, iperf3. Examples: hematite --linux-net ip | hematite --linux-net iptables | hematite --linux-net all"
2376    )]
2377    pub linux_net: Option<String>,
2378
2379    #[arg(
2380        long,
2381        help_heading = "Developer Toolkit",
2382        value_name = "QUERY",
2383        help = "Prometheus / Grafana / alerting reference — offline replacement for prometheus.io and grafana.com docs. Topics: promql, recording, grafana, exporters, alerting. Aliases: prometheus-query, rate-function, histogram-quantile, recording-rules, alert-rules, alertmanager-routing, grafana-ref, loki-ref, node-exporter, burn-rate, slo-alerting. Examples: hematite --prom-ref promql | hematite --prom-ref alerting | hematite --prom-ref all"
2384    )]
2385    pub prom_ref: Option<String>,
2386
2387    #[arg(
2388        long,
2389        help_heading = "Developer Toolkit",
2390        value_name = "QUERY",
2391        help = "Kubernetes advanced patterns — offline replacement for kubernetes.io advanced docs. Topics: scheduling, networking, storage, security, operators. Aliases: node-affinity, pod-affinity, taints-tolerations, k8s-networking, network-policy, pv-pvc, storageclass, pod-security-admission, rbac-k8s, crd-k8s, kubebuilder. Examples: hematite --k8s-adv scheduling | hematite --k8s-adv operators | hematite --k8s-adv all"
2392    )]
2393    pub k8s_adv: Option<String>,
2394
2395    #[arg(
2396        long,
2397        help_heading = "Developer Toolkit",
2398        value_name = "QUERY",
2399        help = "Rust macros reference — offline replacement for Rust Reference macro chapters and proc-macro book. Topics: declarative, procedural, attribute, patterns, advanced. Aliases: macro-rules, proc-macro, derive-macro, syn-crate, quote-crate, attribute-macro, tt-muncher, cargo-expand, trybuild. Examples: hematite --rust-macros declarative | hematite --rust-macros procedural | hematite --rust-macros all"
2400    )]
2401    pub rust_macros: Option<String>,
2402
2403    #[arg(
2404        long,
2405        help_heading = "Developer Toolkit",
2406        value_name = "QUERY",
2407        help = "Database internals reference — offline replacement for CMU lecture notes and use-the-index-luke.com. Topics: storage, indexes, transactions, replication, performance. Aliases: b-tree-internals, lsm-tree, mvcc-internals, index-types, isolation-levels, db-locking, postgres-replication, sharding-strategy, autovacuum-tuning, pg-stat-statements. Examples: hematite --db-internals storage | hematite --db-internals indexes | hematite --db-internals all"
2408    )]
2409    pub db_internals: Option<String>,
2410
2411    #[arg(
2412        long,
2413        help_heading = "Developer Toolkit",
2414        value_name = "QUERY",
2415        help = "OpenAPI / Swagger reference — offline replacement for spec.openapis.org and swagger.io docs. Topics: spec, paths, schemas, security, tooling. Aliases: openapi-structure, openapi-paths, openapi-schemas, openapi-security, swagger-ui, redoc, openapi-generator, spectral-linter, prism-mock, schemathesis. Examples: hematite --openapi-ref schemas | hematite --openapi-ref security | hematite --openapi-ref all"
2416    )]
2417    pub openapi_ref: Option<String>,
2418
2419    #[arg(
2420        long,
2421        help_heading = "Developer Toolkit",
2422        value_name = "QUERY",
2423        help = "GraphQL reference — offline replacement for graphql.org/learn. Topics: queries, schema, subscriptions, resolvers, tooling. Aliases: graphql-queries, graphql-schema, graphql-mutations, graphql-fragments, graphql-subscriptions, graphql-resolvers, dataloader, apollo-server, apollo-client. Examples: hematite --graphql queries | hematite --graphql schema | hematite --graphql all"
2424    )]
2425    pub graphql: Option<String>,
2426
2427    #[arg(
2428        long,
2429        help_heading = "Developer Toolkit",
2430        value_name = "QUERY",
2431        help = "React reference — offline replacement for react.dev docs. Topics: hooks, patterns, state, rendering, nextjs. Aliases: react-hooks, usestate, useeffect, usememo, react-memo, tanstack-query, zustand, suspense-react, next-js, server-actions. Examples: hematite --react-ref hooks | hematite --react-ref state | hematite --react-ref all"
2432    )]
2433    pub react_ref: Option<String>,
2434
2435    #[arg(
2436        long,
2437        help_heading = "Developer Toolkit",
2438        value_name = "QUERY",
2439        help = "Node.js reference — offline replacement for nodejs.org docs. Topics: core, streams, http, workers, runtime. Aliases: node-fs, node-path, node-streams, eventemitter, node-http, node-fetch, worker-threads, node-cluster, node-esm, node-env. Examples: hematite --node-ref core | hematite --node-ref streams | hematite --node-ref all"
2440    )]
2441    pub node_ref: Option<String>,
2442
2443    #[arg(
2444        long,
2445        help_heading = "Developer Toolkit",
2446        value_name = "QUERY",
2447        help = "Java reference — offline replacement for docs.oracle.com. Topics: collections, streams, concurrency, modern, spring. Aliases: java-collections, java-streams, java-optional, virtual-threads, completablefuture, java-records, java-sealed, java21, spring-boot, spring-jpa. Examples: hematite --java-ref collections | hematite --java-ref modern | hematite --java-ref all"
2448    )]
2449    pub java_ref: Option<String>,
2450
2451    #[arg(
2452        long,
2453        value_name = "QUERY",
2454        help = "Python advanced patterns — offline replacement for docs.python.org advanced topics. Topics: decorators, typing, async, dataclasses, patterns. Aliases: python-decorators, python-typing, python-async, python-dataclasses, python-patterns. Examples: hematite --python-adv decorators | hematite --python-adv async | hematite --python-adv all"
2455    )]
2456    pub python_adv: Option<String>,
2457
2458    #[arg(
2459        long,
2460        value_name = "QUERY",
2461        help = "Go advanced patterns — offline replacement for go.dev docs. Topics: concurrency, generics, errors, modules, interfaces. Aliases: go-concurrency, go-generics, go-errors, go-modules, go-interfaces. Examples: hematite --go-adv concurrency | hematite --go-adv generics | hematite --go-adv all"
2462    )]
2463    pub go_adv: Option<String>,
2464
2465    #[arg(
2466        long,
2467        value_name = "QUERY",
2468        help = "Vue 3 reference — offline replacement for vuejs.org docs. Topics: composition, reactivity, components, pinia, router. Aliases: vue-composition-api, vue-reactivity, pinia, vue-router. Examples: hematite --vue-ref composition | hematite --vue-ref pinia | hematite --vue-ref all"
2469    )]
2470    pub vue_ref: Option<String>,
2471
2472    #[arg(
2473        long,
2474        value_name = "QUERY",
2475        help = "AWS reference — offline replacement for docs.aws.amazon.com. Topics: s3, ec2-iam, lambda, networking, rds-dynamo. Aliases: aws-s3, aws-ec2, aws-lambda, aws-vpc, aws-dynamodb. Examples: hematite --aws-ref s3 | hematite --aws-ref lambda | hematite --aws-ref all"
2476    )]
2477    pub aws_ref: Option<String>,
2478
2479    #[arg(
2480        long,
2481        value_name = "QUERY",
2482        help = "Helm chart reference — offline replacement for helm.sh/docs. Topics: chart-structure, templating, values, hooks, releases. Aliases: helm-chart, helm-templating, helm-values, helm-hooks, helm-repo. Examples: hematite --helm-ref chart-structure | hematite --helm-ref templating | hematite --helm-ref all"
2483    )]
2484    pub helm_ref: Option<String>,
2485
2486    #[arg(
2487        long,
2488        value_name = "QUERY",
2489        help = "Redis reference — offline replacement for redis.io/docs. Topics: data-types, commands, pub-sub, patterns, config. Aliases: redis-types, redis-commands, redis-pubsub, redis-streams, redis-patterns. Examples: hematite --redis-ref data-types | hematite --redis-ref patterns | hematite --redis-ref all"
2490    )]
2491    pub redis_ref: Option<String>,
2492
2493    #[arg(
2494        long,
2495        value_name = "QUERY",
2496        help = "Browser Web APIs reference — offline replacement for MDN. Topics: fetch, websockets, service-workers, workers, storage. Aliases: fetch-api, websocket, service-worker, web-worker, indexeddb. Examples: hematite --web-apis fetch | hematite --web-apis websockets | hematite --web-apis all"
2497    )]
2498    pub web_apis: Option<String>,
2499
2500    #[arg(
2501        long,
2502        value_name = "QUERY",
2503        help = "Linux container internals — offline reference for namespaces, cgroups, seccomp, podman, and image builds. Topics: namespaces, cgroups, seccomp, podman, container-build. Aliases: linux-namespaces, cgroups-v2, seccomp, podman, image-layers. Examples: hematite --linux-containers namespaces | hematite --linux-containers cgroups | hematite --linux-containers all"
2504    )]
2505    pub linux_containers: Option<String>,
2506
2507    #[arg(
2508        long,
2509        value_name = "QUERY",
2510        help = "CI/CD advanced patterns — offline replacement for docs.github.com and docs.gitlab.com. Topics: github-actions, gitlab-ci, argocd, pipeline-patterns, tekton. Aliases: gha-matrix, gitlab-ci, argocd, cicd-patterns, tekton. Examples: hematite --ci-cd-adv github-actions | hematite --ci-cd-adv argocd | hematite --ci-cd-adv all"
2511    )]
2512    pub ci_cd_adv: Option<String>,
2513
2514    #[arg(
2515        long,
2516        value_name = "QUERY",
2517        help = "PostgreSQL operations reference — offline replacement for postgresql.org/docs. Topics: explain, indexes, connections, replication, maintenance. Aliases: pg-explain, pg-indexes, pgbouncer, pg-replication, pg-vacuum. Examples: hematite --sql-ops explain | hematite --sql-ops indexes | hematite --sql-ops all"
2518    )]
2519    pub sql_ops: Option<String>,
2520
2521    #[arg(
2522        long,
2523        value_name = "QUERY",
2524        help = "TypeScript advanced type patterns — offline replacement for typescriptlang.org/docs. Topics: mapped, conditional, advanced, decorators, modules. Aliases: ts-mapped-types, ts-conditional-types, ts-branded-types, ts-decorators, ts-module-augmentation. Examples: hematite --ts-patterns mapped | hematite --ts-patterns conditional | hematite --ts-patterns all"
2525    )]
2526    pub ts_patterns: Option<String>,
2527
2528    #[arg(
2529        long,
2530        value_name = "QUERY",
2531        help = "Mobile web & PWA reference — offline replacement for MDN mobile docs. Topics: pwa, responsive, performance, touch, device-apis. Aliases: progressive-web-app, responsive-design, core-web-vitals, touch-events, geolocation. Examples: hematite --mobile-web pwa | hematite --mobile-web performance | hematite --mobile-web all"
2532    )]
2533    pub mobile_web: Option<String>,
2534
2535    #[arg(
2536        long,
2537        help_heading = "Developer Toolkit",
2538        value_name = "QUERY",
2539        help = "Ansible reference — offline replacement for Ansible docs. Topics: playbooks, roles, vault, modules, advanced. Aliases: ansible-playbook, ansible-roles, ansible-vault, ansible-modules, ansible-loops. Examples: hematite --ansible-ref playbooks | hematite --ansible-ref vault | hematite --ansible-ref all"
2540    )]
2541    pub ansible_ref: Option<String>,
2542
2543    #[arg(
2544        long,
2545        help_heading = "Developer Toolkit",
2546        value_name = "QUERY",
2547        help = "Nginx reference — offline replacement for nginx.org docs. Topics: config, upstream, rate-limiting, tls, performance. Aliases: nginx-config, nginx-upstream, nginx-rate-limit, nginx-tls, nginx-performance. Examples: hematite --nginx-ref config | hematite --nginx-ref tls | hematite --nginx-ref all"
2548    )]
2549    pub nginx_ref: Option<String>,
2550
2551    #[arg(
2552        long,
2553        help_heading = "Developer Toolkit",
2554        value_name = "QUERY",
2555        help = "Protocol Buffers & gRPC reference — offline replacement for protobuf.dev. Topics: proto3, grpc, types, tooling, patterns. Aliases: proto3-syntax, grpc-service, proto-types, buf-tool, grpc-patterns. Examples: hematite --protobuf-ref proto3 | hematite --protobuf-ref grpc | hematite --protobuf-ref all"
2556    )]
2557    pub protobuf_ref: Option<String>,
2558
2559    #[arg(
2560        long,
2561        help_heading = "Developer Toolkit",
2562        value_name = "QUERY",
2563        help = "Rust embedded reference — offline replacement for embedded Rust docs. Topics: no-std, embedded-hal, rtic, defmt, debugging. Aliases: no_std, hal-traits, rtic-framework, defmt-logging, embedded-debug. Examples: hematite --rust-embedded no-std | hematite --rust-embedded rtic | hematite --rust-embedded all"
2564    )]
2565    pub rust_embedded: Option<String>,
2566
2567    #[arg(
2568        long,
2569        help_heading = "Developer Toolkit",
2570        value_name = "QUERY",
2571        help = "Svelte & SvelteKit reference — offline replacement for svelte.dev. Topics: components, stores, sveltekit, ssr, advanced. Aliases: svelte-component, svelte-store, sveltekit-routing, sveltekit-ssr, svelte-transition. Examples: hematite --svelte-ref components | hematite --svelte-ref sveltekit | hematite --svelte-ref all"
2572    )]
2573    pub svelte_ref: Option<String>,
2574
2575    #[arg(
2576        long,
2577        help_heading = "Developer Toolkit",
2578        value_name = "QUERY",
2579        help = "Kafka advanced reference — offline replacement for Kafka docs. Topics: consumer-groups, compaction, streams, schema, operations. Aliases: kafka-consumer-group, log-compaction, kafka-streams, schema-registry, kafka-ops. Examples: hematite --kafka-adv consumer-groups | hematite --kafka-adv streams | hematite --kafka-adv all"
2580    )]
2581    pub kafka_adv: Option<String>,
2582
2583    #[arg(
2584        long,
2585        help_heading = "Developer Toolkit",
2586        value_name = "QUERY",
2587        help = "Deno runtime reference — offline replacement for deno.land docs. Topics: runtime, apis, fresh, kv, testing. Aliases: deno-run, deno-permissions, fresh-framework, deno-kv, deno-test. Examples: hematite --deno-ref runtime | hematite --deno-ref kv | hematite --deno-ref all"
2588    )]
2589    pub deno_ref: Option<String>,
2590
2591    #[arg(
2592        long,
2593        help_heading = "Developer Toolkit",
2594        value_name = "QUERY",
2595        help = "OpenTelemetry reference — offline replacement for opentelemetry.io docs. Topics: sdk, traces, metrics, logs, collector. Aliases: otel-sdk, otel-span, otel-counter, otel-logging, otel-collector. Examples: hematite --otel-ref traces | hematite --otel-ref collector | hematite --otel-ref all"
2596    )]
2597    pub otel_ref: Option<String>,
2598
2599    #[arg(
2600        long,
2601        help_heading = "Developer Toolkit",
2602        value_name = "QUERY",
2603        help = "Zig language reference — offline replacement for ziglang.org docs. Topics: basics, memory, structs, errors, comptime, build. Aliases: zig-basics, allocators, zig-structs, zig-errors, zig-comptime, zig-build. Examples: hematite --zig-ref basics | hematite --zig-ref comptime | hematite --zig-ref all"
2604    )]
2605    pub zig_ref: Option<String>,
2606
2607    #[arg(
2608        long,
2609        help_heading = "Developer Toolkit",
2610        value_name = "QUERY",
2611        help = "Redis advanced patterns — offline replacement for redis.io advanced docs. Topics: data-structures, lua, pubsub, cluster, patterns, persistence. Aliases: zset, scripting, pub-sub, redis-cluster, distributed-lock, rdb. Examples: hematite --redis-adv patterns | hematite --redis-adv lua | hematite --redis-adv all"
2612    )]
2613    pub redis_adv: Option<String>,
2614
2615    #[arg(
2616        long,
2617        help_heading = "Developer Toolkit",
2618        value_name = "QUERY",
2619        help = "Nix package manager reference — offline replacement for nixos.org docs. Topics: basics, shells, flakes, nixos, derivations, home-manager. Aliases: nix-env, nix-shell, nix-flakes, nixos-config, mkderivation, home-nix. Examples: hematite --nix-ref flakes | hematite --nix-ref shells | hematite --nix-ref all"
2620    )]
2621    pub nix_ref: Option<String>,
2622
2623    #[arg(
2624        long,
2625        help_heading = "Developer Toolkit",
2626        value_name = "QUERY",
2627        help = "GDB debugger reference — offline replacement for sourceware.org/gdb docs. Topics: basics, breakpoints, stepping, inspect, advanced, tui. Aliases: gdb-break, watch, backtrace, print, examine, remote, core-dump. Examples: hematite --gdb-ref breakpoints | hematite --gdb-ref inspect | hematite --gdb-ref all"
2628    )]
2629    pub gdb_ref: Option<String>,
2630
2631    #[arg(
2632        long,
2633        help_heading = "Developer Toolkit",
2634        value_name = "QUERY",
2635        help = "CMake build system reference — offline replacement for cmake.org docs. Topics: basics, targets, find, variables, testing, modern. Aliases: cmakelists, cc-binary, find-package, fetchcontent, ctest, presets, toolchain. Examples: hematite --cmake-ref targets | hematite --cmake-ref find | hematite --cmake-ref all"
2636    )]
2637    pub cmake_ref: Option<String>,
2638
2639    #[arg(
2640        long,
2641        help_heading = "Developer Toolkit",
2642        value_name = "QUERY",
2643        help = "Bazel build system reference — offline replacement for bazel.build docs. Topics: basics, rules, deps, query, remote, starlark. Aliases: workspace, cc-library, bzlmod, bazel-query, remote-cache, macros, gazelle. Examples: hematite --bazel-ref rules | hematite --bazel-ref starlark | hematite --bazel-ref all"
2644    )]
2645    pub bazel_ref: Option<String>,
2646
2647    #[arg(
2648        long,
2649        help_heading = "Developer Toolkit",
2650        value_name = "QUERY",
2651        help = "Valgrind memory analysis reference — offline replacement for valgrind.org docs. Topics: memcheck, callgrind, massif, helgrind, sgcheck, asan. Aliases: leak-check, call-graph, heap-profiler, race-detection, sanitizers. Examples: hematite --valgrind-ref memcheck | hematite --valgrind-ref asan | hematite --valgrind-ref all"
2652    )]
2653    pub valgrind_ref: Option<String>,
2654
2655    #[arg(
2656        long,
2657        help_heading = "Developer Toolkit",
2658        value_name = "QUERY",
2659        help = "Scrum/Agile reference card — offline replacement for scrumguides.org. Topics: roles, events, artifacts, backlog, metrics, scaling. Aliases: product-owner, sprint, sprint-planning, user-stories, velocity, nexus. Examples: hematite --scrum-ref events | hematite --scrum-ref backlog | hematite --scrum-ref all"
2660    )]
2661    pub scrum_ref: Option<String>,
2662
2663    #[arg(
2664        long,
2665        help_heading = "Developer Toolkit",
2666        value_name = "QUERY",
2667        help = "PowerShell advanced scripting reference. Topics: objects, scripting, remoting, modules, regex, winapi. Aliases: ps-objects, pipeline, advanced-functions, ps-modules, ps-regex, com, cim. Examples: hematite --powershell-adv objects | hematite --powershell-adv remoting | hematite --powershell-adv all"
2668    )]
2669    pub powershell_adv: Option<String>,
2670
2671    #[arg(
2672        long,
2673        help_heading = "Developer Toolkit",
2674        value_name = "QUERY",
2675        help = "JVM internals and tuning reference — offline replacement for oracle.com/jvm docs. Topics: memory, gc, jit, threads, profiling, flags. Aliases: jvm-memory, heap, g1gc, zgc, jfr, async-profiler, virtual-threads. Examples: hematite --jvm-ref gc | hematite --jvm-ref profiling | hematite --jvm-ref all"
2676    )]
2677    pub jvm_ref: Option<String>,
2678
2679    #[arg(
2680        long,
2681        help_heading = "Developer Toolkit",
2682        help = "Print all developer toolkit flags grouped by category — the discovery page for 150+ offline reference tools"
2683    )]
2684    pub toolkit: bool,
2685
2686    #[arg(
2687        long,
2688        help_heading = "Math & Science",
2689        value_name = "QUERY",
2690        help = "Lorem ipsum generator — offline replacement for lipsum.com. Commands: (bare) or <N> = N paragraphs (default 1); words <N> = N words; sentences <N> = N sentences. Examples: hematite --lorem | hematite --lorem 3 | hematite --lorem 'words 50' | hematite --lorem 'sentences 5'"
2691    )]
2692    pub lorem: Option<String>,
2693
2694    #[arg(
2695        long,
2696        help_heading = "Math & Science",
2697        value_name = "QUERY",
2698        help = "Case converter — offline replacement for convertcase.net. Converts between camelCase, PascalCase, snake_case, kebab-case, SCREAMING_SNAKE_CASE, Title Case, dot.case, and more. Commands: camel, pascal, snake, kebab, screaming, title, upper, lower, dot, path, all. Bare input (no command) shows all at once. Examples: hematite --case 'hello world' | hematite --case 'snake getUserById' | hematite --case 'camel user_profile_data'"
2699    )]
2700    pub case: Option<String>,
2701
2702    #[arg(
2703        long,
2704        help_heading = "Headless Reports",
2705        value_name = "ELEMENT",
2706        help = "Look up a periodic table element — instant, no model, no cloud. Accepts symbol (H, Au), full name (Gold, Hydrogen), or atomic number (79). Shows atomic mass, category, period/group, electronegativity, and state at STP. Example: hematite --periodic Au"
2707    )]
2708    pub periodic: Option<String>,
2709
2710    #[arg(
2711        long,
2712        help_heading = "Headless Reports",
2713        value_name = "TARGET",
2714        help = "Compute MD5/SHA1/SHA256/SHA512 checksums of a file or text string. If TARGET is an existing file path, the file is hashed; otherwise the literal text is hashed. Pair with --hash-algo to select a single algorithm. Examples: hematite --hash installer.exe, hematite --hash \"hello world\""
2715    )]
2716    pub hash: Option<String>,
2717
2718    #[arg(
2719        long,
2720        help_heading = "Headless Reports",
2721        value_name = "ALGO",
2722        default_value = "all",
2723        help = "Hash algorithm for --hash: md5, sha1, sha256, sha512, or 'all' (default). Example: hematite --hash file.zip --hash-algo sha256"
2724    )]
2725    pub hash_algo: Option<String>,
2726
2727    #[arg(
2728        long,
2729        help_heading = "Headless Reports",
2730        value_name = "TEXT",
2731        help = "Encode text to a specified format. Pair with --codec (default: base64). Supported codecs: base64, hex, url, rot13, html, binary. Examples: hematite --encode \"hello world\", hematite --encode \"hello\" --codec hex"
2732    )]
2733    pub encode: Option<String>,
2734
2735    #[arg(
2736        long,
2737        help_heading = "Headless Reports",
2738        value_name = "TEXT",
2739        help = "Decode text from a specified format. Pair with --codec (default: base64). Supported codecs: base64, hex, url, rot13, html, binary. Examples: hematite --decode \"aGVsbG8gd29ybGQ=\", hematite --decode \"68656c6c6f\" --codec hex"
2740    )]
2741    pub decode: Option<String>,
2742
2743    #[arg(
2744        long,
2745        help_heading = "Headless Reports",
2746        value_name = "FORMAT",
2747        help = "Encoding format for --encode and --decode: base64 (default), hex, url, rot13, html, binary."
2748    )]
2749    pub codec: Option<String>,
2750
2751    #[arg(
2752        long,
2753        help_heading = "Headless Reports",
2754        value_name = "QUERY",
2755        help = "Search the built-in formula library — no model, no cloud. Pass a name, category, or keyword. Run --formula list to browse all entries. Examples: hematite --formula \"kinetic energy\", hematite --formula ohms, hematite --formula mechanics"
2756    )]
2757    pub formula: Option<String>,
2758
2759    #[arg(
2760        long,
2761        help_heading = "Headless Reports",
2762        value_name = "TYPE",
2763        help = "Generate cryptographically secure random values — no model, no cloud. Types: uuid  password  token  hex  urlsafe  pin  bytes  int  dice. Examples: hematite --random uuid, hematite --random password --length 24, hematite --random dice --random-args 2d6"
2764    )]
2765    pub random: Option<String>,
2766
2767    #[arg(
2768        long,
2769        help_heading = "Headless Reports",
2770        value_name = "N",
2771        help = "Length for --random password/token/pin/bytes generation. Default: 20 for passwords, 32 for tokens, 6 for PINs."
2772    )]
2773    pub length: Option<usize>,
2774
2775    #[arg(
2776        long,
2777        help_heading = "Headless Reports",
2778        value_name = "ARGS",
2779        help = "Extra arguments for --random: dice notation (2d6, d20), int range (1 100), or custom charset for passwords."
2780    )]
2781    pub random_args: Option<String>,
2782
2783    #[arg(
2784        long,
2785        help_heading = "Headless Reports",
2786        value_name = "FILES",
2787        help = "Row-level diff of two data files — no model, no cloud. Pass comma-separated paths: file_a.csv,file_b.csv. Supports CSV, TSV, JSON, and SQLite. Pair with --diff-key to set the key column. Example: hematite --diff-data before.csv,after.csv"
2788    )]
2789    pub diff_data: Option<String>,
2790
2791    #[arg(
2792        long,
2793        help_heading = "Headless Reports",
2794        value_name = "COLUMN",
2795        help = "Key column for --diff-data row matching. Defaults to the first column. Example: --diff-key id"
2796    )]
2797    pub diff_key: Option<String>,
2798
2799    #[arg(
2800        long,
2801        help_heading = "Headless Reports",
2802        value_name = "FILE",
2803        help = "Descriptive statistics for numeric columns in a data file — no model, no cloud. Supports CSV, TSV, JSON, SQLite. Pair with --column to focus on one column. Example: hematite --describe sales.csv --column revenue"
2804    )]
2805    pub describe: Option<String>,
2806
2807    #[arg(
2808        long,
2809        help_heading = "Headless Reports",
2810        value_name = "NAME",
2811        help = "Column name to analyze with --stats. If omitted, all numeric columns are summarized."
2812    )]
2813    pub column: Option<String>,
2814
2815    #[arg(
2816        long,
2817        help_heading = "Headless Reports",
2818        value_name = "OP",
2819        help = "Matrix operation — no model, no cloud. OP: det  inv  transpose  multiply  solve  eigenvalues  rank  trace. Pass matrix as JSON: --matrix det --matrix-a '[[1,2],[3,4]]'. Example: hematite --matrix det --matrix-a '[[1,2],[3,4]]'"
2820    )]
2821    pub matrix: Option<String>,
2822
2823    #[arg(
2824        long,
2825        value_name = "JSON",
2826        help = "Matrix A for --matrix, as a JSON array of rows: '[[1,2],[3,4]]'"
2827    )]
2828    pub matrix_a: Option<String>,
2829
2830    #[arg(
2831        long,
2832        value_name = "JSON",
2833        help = "Matrix B for --matrix multiply or solve: '[[5],[6]]'"
2834    )]
2835    pub matrix_b: Option<String>,
2836
2837    #[arg(
2838        long,
2839        help_heading = "Headless Reports",
2840        value_name = "EQUATION",
2841        help = "Solve an equation numerically — no model, no cloud. Format: 'LHS = RHS' or expression = 0. Variable defaults to x. Supports sin/cos/sqrt/log/exp/pi/e. Example: hematite --solve 'x^2 - 4 = 0'  or  --solve '2*x + 3 = 11'"
2842    )]
2843    pub solve: Option<String>,
2844
2845    #[arg(
2846        long,
2847        value_name = "VAR",
2848        help = "Variable name for --solve. Default: x. Example: --solve 't^2 = 16' --solve-var t"
2849    )]
2850    pub solve_var: Option<String>,
2851
2852    #[arg(
2853        long,
2854        value_name = "LO,HI",
2855        help = "Search range for --solve as 'lo,hi'. Default: -1000,1000. Example: --solve-range '-100,100'"
2856    )]
2857    pub solve_range: Option<String>,
2858
2859    #[arg(
2860        long,
2861        help_heading = "Headless Reports",
2862        value_name = "FILE",
2863        help = "Fit a curve to two columns of data — no model, no cloud. Tries linear, polynomial, exponential, power, and log models and ranks by R². Pair with --fit-x, --fit-y, --fit-model. Example: hematite --curve-fit data.csv --fit-x time --fit-y temperature"
2864    )]
2865    pub curve_fit: Option<String>,
2866
2867    #[arg(
2868        long,
2869        value_name = "COL",
2870        help = "X column for --curve-fit. Defaults to first numeric column."
2871    )]
2872    pub fit_x: Option<String>,
2873
2874    #[arg(
2875        long,
2876        value_name = "COL",
2877        help = "Y column for --curve-fit. Defaults to second numeric column."
2878    )]
2879    pub fit_y: Option<String>,
2880
2881    #[arg(
2882        long,
2883        value_name = "MODEL",
2884        help = "Model for --curve-fit: linear  poly2  poly3  exp  power  log  auto (default: auto, tries all)"
2885    )]
2886    pub fit_model: Option<String>,
2887
2888    #[arg(
2889        long,
2890        help_heading = "Headless Reports",
2891        value_name = "EXPR",
2892        help = "Numerically integrate an expression — no model, no cloud. Uses adaptive Simpson's rule. Pair with --from, --to, --int-var. Example: hematite --integrate 'sin(x)' --from 0 --to pi  or  --integrate 'x^2' --from 0 --to 3"
2893    )]
2894    pub integrate: Option<String>,
2895
2896    #[arg(
2897        long,
2898        value_name = "N",
2899        help = "Lower bound for --integrate. Example: --int-from 0"
2900    )]
2901    pub int_from: Option<String>,
2902
2903    #[arg(
2904        long,
2905        value_name = "N",
2906        help = "Upper bound for --integrate. Example: --int-to pi"
2907    )]
2908    pub int_to: Option<String>,
2909
2910    #[arg(
2911        long,
2912        value_name = "VAR",
2913        help = "Integration variable for --integrate. Default: x."
2914    )]
2915    pub int_var: Option<String>,
2916
2917    #[arg(
2918        long,
2919        value_name = "N",
2920        help = "Number of intervals for --integrate (default: 1000). Adaptive Simpson uses this as fallback."
2921    )]
2922    pub int_n: Option<usize>,
2923
2924    #[arg(
2925        long,
2926        help_heading = "Headless Reports",
2927        value_name = "EXPR",
2928        help = "Numerically differentiate an expression — no model, no cloud. Uses 5-point stencil. Pair with --at and optionally --order. Example: hematite --differentiate 'x^3 + 2*x' --at 2  or  --differentiate 'sin(x)' --at 'pi/2'"
2929    )]
2930    pub differentiate: Option<String>,
2931
2932    #[arg(
2933        long,
2934        value_name = "X",
2935        help = "Point at which to evaluate --differentiate or --solve. Example: --at 3.14"
2936    )]
2937    pub at: Option<String>,
2938
2939    #[arg(
2940        long,
2941        value_name = "N",
2942        help = "Derivative order for --differentiate (1st, 2nd, 3rd, 4th). Default: 1."
2943    )]
2944    pub order: Option<u8>,
2945
2946    #[arg(
2947        long,
2948        help_heading = "Headless Reports",
2949        value_name = "FILE",
2950        help = "AI-free data profile — type detection, missing values, ranges, outliers, and duplicate rows. No model, no cloud. Supports CSV, TSV, JSON, SQLite. Example: hematite --profile customers.csv"
2951    )]
2952    pub profile: Option<String>,
2953
2954    #[arg(
2955        long,
2956        help_heading = "Headless Reports",
2957        value_name = "N",
2958        help = "Prime number info — no model, no cloud. Primality test, factorization, divisors, Euler's φ, σ(n), nearest primes. Example: hematite --prime 97  or  --prime 360"
2959    )]
2960    pub prime: Option<u64>,
2961
2962    #[arg(
2963        long,
2964        help_heading = "Headless Reports",
2965        value_name = "TYPE",
2966        help = "Generate a numeric sequence — no model, no cloud. Types: arithmetic  geometric  fibonacci  prime  square  triangular  cube  power2. Pair with --seq-count, --seq-start, --seq-step. Example: hematite --sequence fibonacci --seq-count 20"
2967    )]
2968    pub sequence: Option<String>,
2969
2970    #[arg(
2971        long,
2972        value_name = "N",
2973        help = "Number of terms for --sequence (default: 10)."
2974    )]
2975    pub seq_count: Option<usize>,
2976
2977    #[arg(
2978        long,
2979        value_name = "N",
2980        help = "Starting value for --sequence (default: 1)."
2981    )]
2982    pub seq_start: Option<f64>,
2983
2984    #[arg(
2985        long,
2986        value_name = "N",
2987        help = "Step or ratio for --sequence (default: 1 for arithmetic, 2 for geometric)."
2988    )]
2989    pub seq_step: Option<f64>,
2990
2991    #[arg(
2992        long,
2993        help_heading = "Headless Reports",
2994        value_name = "N K",
2995        help = "Combinations and permutations — no model, no cloud. Computes C(n,k) and P(n,k). Pass two integers separated by a space or comma. Example: hematite --choose '10 3'  or  --choose '52,5'"
2996    )]
2997    pub choose: Option<String>,
2998
2999    #[arg(
3000        long,
3001        help_heading = "Headless Reports",
3002        value_name = "EXPR",
3003        help = "Boolean truth table — no model, no cloud. Variables are single letters (A, B, C). Operators: AND OR NOT XOR NAND NOR (or ∧ ∨ ¬ ⊕). Example: hematite --truth-table '(A AND B) OR NOT C'"
3004    )]
3005    pub truth_table: Option<String>,
3006
3007    #[arg(
3008        long,
3009        help_heading = "Headless Reports",
3010        value_name = "A,B",
3011        help = "GCD and LCM of two integers — no model, no cloud. Example: hematite --gcd '48,18'  or  --gcd '360 252'"
3012    )]
3013    pub gcd: Option<String>,
3014
3015    #[arg(
3016        long,
3017        help_heading = "Headless Reports",
3018        value_name = "N or ROMAN",
3019        help = "Roman numeral conversion — no model, no cloud. Pass a number to encode or a Roman numeral to decode. Example: hematite --roman 2024  or  --roman MMXXIV"
3020    )]
3021    pub roman: Option<String>,
3022
3023    #[arg(
3024        long,
3025        help_heading = "Headless Reports",
3026        value_name = "N",
3027        help = "Number base conversion — no model, no cloud. Pair with --base-from and --base-to. Default: --base-from 10 --base-to 2. Example: hematite --base-convert 255 --base-to 16  or  --base-convert FF --base-from 16 --base-to 10"
3028    )]
3029    pub base_convert: Option<String>,
3030
3031    #[arg(
3032        long,
3033        value_name = "N",
3034        help = "Source base for --base-convert (2–36). Default: 10."
3035    )]
3036    pub base_from: Option<u32>,
3037
3038    #[arg(
3039        long,
3040        value_name = "N",
3041        help = "Target base for --base-convert (2–36). Default: 2."
3042    )]
3043    pub base_to: Option<u32>,
3044
3045    #[arg(
3046        long,
3047        help_heading = "Headless Reports",
3048        value_name = "EXPR",
3049        help = "Date arithmetic and calendar info — no model, no cloud. Examples: hematite --date '2024-01-01 to 2024-12-31'  --date '2024-03-15 +90'  --date '2024-06-15'  --date 'unix 1700000000'"
3050    )]
3051    pub date: Option<String>,
3052
3053    #[arg(
3054        long,
3055        help_heading = "Headless Reports",
3056        value_name = "CIDR",
3057        help = "IPv4 subnet calculator — no model, no cloud. Pass a CIDR address. Example: hematite --subnet 192.168.1.0/24  or  --subnet 10.0.0.1/8"
3058    )]
3059    pub subnet: Option<String>,
3060
3061    #[arg(
3062        long,
3063        help_heading = "Headless Reports",
3064        value_name = "COLOR",
3065        help = "Color space conversion — no model, no cloud. Converts hex/RGB to HSL, HSV, CMYK, and WCAG luminance. Example: hematite --color '#ff8800'  or  --color 'rgb(255,136,0)'  or  --color '3f8'"
3066    )]
3067    pub color: Option<String>,
3068
3069    #[arg(
3070        long,
3071        help_heading = "Headless Reports",
3072        value_name = "FORMULA",
3073        help = "Molecular weight from a chemical formula — no model, no cloud. Supports nested groups: Ca(NO3)2, (NH4)2SO4. Example: hematite --mw H2O  or  --mw 'C6H12O6'"
3074    )]
3075    pub mw: Option<String>,
3076
3077    #[arg(
3078        long,
3079        help_heading = "Headless Reports",
3080        value_name = "NAME",
3081        help = "Physical constants lookup — no model, no cloud. Use 'list' to see all. Example: hematite --const c  --const planck  --const avogadro  --const list"
3082    )]
3083    pub r#const: Option<String>,
3084
3085    #[arg(
3086        long,
3087        help_heading = "Headless Reports",
3088        value_name = "QUERY",
3089        help = "Standard normal distribution — no model, no cloud. Modes: 'cdf X [mu sigma]'  'pdf X'  'inv P'  'between A B'  'table'. Example: hematite --normal 'cdf 1.96'  --normal 'inv 0.975'  --normal table"
3090    )]
3091    pub normal: Option<String>,
3092
3093    #[arg(
3094        long,
3095        help_heading = "Headless Reports",
3096        value_name = "EXPR",
3097        help = "2D/3D vector math — instant, no model. Ops: dot, cross, +, -, scalar*, mag, norm, angle, proj. Example: hematite --vectors '[1,2,3] dot [4,5,6]'  'mag [3,4]'  '[1,2,3] cross [0,0,1]'"
3098    )]
3099    pub vectors: Option<String>,
3100
3101    #[arg(
3102        long,
3103        help_heading = "Headless Reports",
3104        value_name = "QUERY",
3105        help = "Number theory — instant, no model. Ops: extgcd, crt (Chinese Remainder Theorem), mobius, modinv, modpow, cf (continued fractions), goldbach, totient, jacobi. Example: hematite --number-theory 'modpow 3 10 1000'  'crt 2 3 3 5'  'goldbach 28'  'cf 355/113'  '42'"
3106    )]
3107    pub number_theory: Option<String>,
3108
3109    #[arg(
3110        long,
3111        help_heading = "Data Analysis",
3112        value_name = "FILE",
3113        help = "Percentile/quantile report for all numeric columns (or --percentile-col COL for a specific column). Example: hematite --percentile data.csv --percentile-col salary"
3114    )]
3115    pub percentile: Option<String>,
3116
3117    #[arg(
3118        long,
3119        help_heading = "Data Analysis",
3120        value_name = "COL",
3121        help = "Column to analyze with --percentile (default: all numeric columns)."
3122    )]
3123    pub percentile_col: Option<String>,
3124
3125    #[arg(
3126        long,
3127        help_heading = "Data Analysis",
3128        value_name = "FILE",
3129        help = "Pivot table — group rows by two columns and aggregate a value column. Use --pivot-row, --pivot-col, --pivot-val, --pivot-agg (count/sum/mean/min/max). Example: hematite --pivot sales.csv --pivot-row region --pivot-col quarter --pivot-val revenue --pivot-agg sum"
3130    )]
3131    pub pivot: Option<String>,
3132
3133    #[arg(
3134        long,
3135        help_heading = "Data Analysis",
3136        value_name = "COL",
3137        help = "Row grouping column for --pivot."
3138    )]
3139    pub pivot_row: Option<String>,
3140
3141    #[arg(
3142        long,
3143        help_heading = "Data Analysis",
3144        value_name = "COL",
3145        help = "Column grouping column for --pivot."
3146    )]
3147    pub pivot_col: Option<String>,
3148
3149    #[arg(
3150        long,
3151        help_heading = "Data Analysis",
3152        value_name = "COL",
3153        help = "Value column for --pivot aggregation."
3154    )]
3155    pub pivot_val: Option<String>,
3156
3157    #[arg(
3158        long,
3159        help_heading = "Data Analysis",
3160        value_name = "AGG",
3161        help = "Aggregation for --pivot: count (default), sum, mean, min, max."
3162    )]
3163    pub pivot_agg: Option<String>,
3164
3165    #[arg(
3166        long,
3167        help_heading = "Data Analysis",
3168        value_name = "FILE",
3169        help = "Multivariate OLS linear regression from a CSV/TSV/JSON/SQLite file. Use --regression-target to specify the dependent variable and --regression-predictors for a comma-separated list of independent variables. Example: hematite --regression data.csv --regression-target price --regression-predictors sqft,bedrooms,bathrooms"
3170    )]
3171    pub regression: Option<String>,
3172
3173    #[arg(
3174        long,
3175        help_heading = "Data Analysis",
3176        value_name = "COL",
3177        help = "Target (dependent) column for --regression (auto-detected if omitted)."
3178    )]
3179    pub regression_target: Option<String>,
3180
3181    #[arg(
3182        long,
3183        help_heading = "Data Analysis",
3184        value_name = "COL1,COL2,...",
3185        help = "Predictor (independent) columns for --regression, comma-separated (auto-detected if omitted)."
3186    )]
3187    pub regression_predictors: Option<String>,
3188
3189    #[arg(
3190        long,
3191        help_heading = "Data Analysis",
3192        value_name = "FILE",
3193        help = "Detect outliers using IQR (1.5× fence) and Z-score (|z|>3) in all numeric columns or a specific column. Use --outlier-col COL and --outlier-output FILE to save clean data. Example: hematite --outliers data.csv --outlier-col salary --outlier-output clean.csv"
3194    )]
3195    pub outliers: Option<String>,
3196
3197    #[arg(
3198        long,
3199        help_heading = "Data Analysis",
3200        value_name = "COL",
3201        help = "Column to analyze for --outliers (default: all numeric columns)."
3202    )]
3203    pub outlier_col: Option<String>,
3204
3205    #[arg(
3206        long,
3207        help_heading = "Data Analysis",
3208        value_name = "FILE",
3209        help = "Save clean data (outliers removed) to this CSV path."
3210    )]
3211    pub outlier_output: Option<String>,
3212
3213    #[arg(
3214        long,
3215        help_heading = "Data Analysis",
3216        value_name = "FILE",
3217        help = "Random-sample rows from a CSV/TSV/JSON/SQLite file. Use --sample-n or --sample-frac for size; --split for train/test; --sample-output DIR to save files. Example: hematite --sample data.csv --sample-n 200 --split 0.8 --sample-output out/"
3218    )]
3219    pub sample: Option<String>,
3220
3221    #[arg(
3222        long,
3223        help_heading = "Data Analysis",
3224        value_name = "N",
3225        help = "Number of rows to sample (default 100)."
3226    )]
3227    pub sample_n: Option<usize>,
3228
3229    #[arg(
3230        long,
3231        help_heading = "Data Analysis",
3232        value_name = "FRAC",
3233        help = "Fraction of rows to sample, e.g. 0.1 for 10%."
3234    )]
3235    pub sample_frac: Option<f64>,
3236
3237    #[arg(
3238        long,
3239        help_heading = "Data Analysis",
3240        value_name = "SEED",
3241        help = "Random seed for reproducible sampling (default 42)."
3242    )]
3243    pub sample_seed: Option<u64>,
3244
3245    #[arg(
3246        long,
3247        help_heading = "Data Analysis",
3248        value_name = "FRAC",
3249        help = "Train/test split fraction, e.g. 0.8 saves 80% to train and 20% to test. Requires --sample-output."
3250    )]
3251    pub split: Option<f64>,
3252
3253    #[arg(
3254        long,
3255        help_heading = "Data Analysis",
3256        value_name = "DIR",
3257        help = "Output directory for sampled files. If omitted, prints sample to stdout."
3258    )]
3259    pub sample_output: Option<String>,
3260
3261    #[arg(
3262        long,
3263        help_heading = "Data Analysis",
3264        value_name = "FILE",
3265        help = "Compute correlation matrix for all numeric columns in a file. Use --corr-method pearson|spearman. Example: hematite --correlation data.csv --corr-method spearman"
3266    )]
3267    pub correlation: Option<String>,
3268
3269    #[arg(
3270        long,
3271        help_heading = "Data Analysis",
3272        value_name = "METHOD",
3273        help = "Correlation method: pearson (default) or spearman."
3274    )]
3275    pub corr_method: Option<String>,
3276
3277    #[arg(
3278        long,
3279        help_heading = "Data Analysis",
3280        value_name = "FILE",
3281        help = "Time-series analysis: rolling mean, trend, peaks/valleys, sparkline. Example: hematite --timeseries sales.csv --ts-date date --ts-value revenue --ts-window 7"
3282    )]
3283    pub timeseries: Option<String>,
3284
3285    #[arg(
3286        long,
3287        help_heading = "Data Analysis",
3288        value_name = "COL",
3289        help = "Date column name for --timeseries (auto-detected if omitted)."
3290    )]
3291    pub ts_date: Option<String>,
3292
3293    #[arg(
3294        long,
3295        help_heading = "Data Analysis",
3296        value_name = "COL",
3297        help = "Value column name for --timeseries (auto-detected if omitted)."
3298    )]
3299    pub ts_value: Option<String>,
3300
3301    #[arg(
3302        long,
3303        help_heading = "Data Analysis",
3304        value_name = "N",
3305        help = "Rolling window size for --timeseries (default 7)."
3306    )]
3307    pub ts_window: Option<usize>,
3308
3309    #[arg(long, hide = true)]
3310    pub pdf_extract_helper: Option<String>,
3311
3312    #[arg(long, hide = true)]
3313    pub teleported_from: Option<String>,
3314}
3315
3316#[cfg(test)]
3317mod tests {
3318    #[test]
3319    fn version_report_contains_release_version() {
3320        let report = crate::hematite_version_report();
3321        assert!(report.contains(crate::HEMATITE_VERSION));
3322        assert!(report.contains("Build:"));
3323    }
3324
3325    #[test]
3326    fn about_report_contains_author_and_repo() {
3327        let report = crate::hematite_about_report();
3328        assert!(report.contains(crate::HEMATITE_AUTHOR));
3329        assert!(report.contains(crate::HEMATITE_REPOSITORY_URL));
3330    }
3331}