Skip to main content

harn_cli/cli/
mod.rs

1//! Top-level clap definition for the `harn` CLI.
2//!
3//! Per-subcommand arg structs live in their own modules under
4//! `crates/harn-cli/src/cli/`. The `Cli` and `Command` enum here only
5//! reference types via `pub(crate) use ...` re-exports so external
6//! consumers can keep using `crate::cli::TypeName` unchanged.
7//!
8//! Some variants of subcommand enums are reached only by destructuring
9//! the parent (`SubCommand::Foo(args) => ...`) and are never referenced
10//! by name from outside this module. Those types stay private to their
11//! per-subcommand module and are accessed through their parent enum.
12
13mod bench;
14mod check;
15mod completions;
16mod config_cmd;
17mod connect;
18mod connector;
19mod contracts;
20mod crystallize;
21mod demo;
22mod dev;
23mod doctor;
24mod dump;
25mod eval;
26mod explain;
27mod fix;
28mod flow;
29mod graph;
30mod init;
31mod lint_fmt;
32mod local;
33mod mcp;
34mod merge_captain;
35mod models;
36mod orchestrator;
37mod pack;
38mod package;
39mod parse_tokens;
40mod persona;
41mod playground;
42mod portal;
43mod precompile;
44mod profile;
45mod provider;
46mod providers;
47mod quickstart;
48mod routes;
49mod run;
50mod runs;
51mod serve;
52mod session;
53mod skill;
54mod skills;
55mod supervisor;
56mod test;
57mod test_bench;
58mod time;
59mod tool;
60mod trace;
61mod trigger;
62mod trust;
63mod try_cmd;
64mod upgrade;
65mod util;
66mod verify;
67mod viz;
68mod watch;
69mod workflow;
70
71pub(crate) use bench::{BenchArgs, BenchCommand, BenchReplayArgs};
72pub(crate) use check::{CheckArgs, CheckOutputFormat};
73pub(crate) use completions::{CompletionShell, CompletionsArgs};
74pub(crate) use config_cmd::{ConfigArgs, ConfigCommand, ConfigInspectArgs, ConfigValidateArgs};
75pub(crate) use connect::{
76    ConnectApiKeyArgs, ConnectArgs, ConnectCommand, ConnectGenericArgs, ConnectGithubArgs,
77    ConnectLinearArgs, ConnectOAuthArgs, ConnectSetupPlanArgs, ConnectStatusArgs,
78};
79pub(crate) use connector::{
80    ConnectorArgs, ConnectorCheckArgs, ConnectorCommand, ConnectorTestArgs,
81};
82pub(crate) use contracts::{
83    ContractsArgs, ContractsBundleArgs, ContractsCommand, ContractsHostCapabilitiesArgs,
84    ContractsOutputArgs,
85};
86pub(crate) use crystallize::{
87    CrystallizeArgs, CrystallizeCommand, CrystallizeIngestArgs, CrystallizeShadowArgs,
88    CrystallizeValidateArgs,
89};
90pub(crate) use demo::DemoArgs;
91pub(crate) use dev::DevArgs;
92pub(crate) use doctor::DoctorArgs;
93pub(crate) use dump::{
94    DumpConnectorMatrixArgs, DumpHighlightKeywordsArgs, DumpProtocolArtifactsArgs,
95    DumpTriggerQuickrefArgs,
96};
97pub use eval::{
98    EvalArgs, EvalCommand, EvalPromptArgs, EvalPromptMode, EvalPromptOutput, EvalToolCallsArgs,
99    EvalToolCallsCommand, EvalToolCallsRegressionArgs,
100};
101pub(crate) use explain::{CatalogFormat, ExplainArgs};
102pub(crate) use fix::FixArgs;
103pub(crate) use flow::{
104    FlowArchivistCommand, FlowArchivistScanArgs, FlowArgs, FlowCommand, FlowReplayAuditArgs,
105    FlowShipCommand, FlowShipWatchArgs,
106};
107pub(crate) use graph::GraphArgs;
108pub(crate) use init::{InitArgs, NewArgs, ProjectTemplate};
109pub(crate) use lint_fmt::{FmtArgs, PathTargetsArgs};
110pub(crate) use local::{
111    LocalArgs, LocalCommand, LocalListArgs, LocalProfileArgs, LocalStatusArgs, LocalStopArgs,
112    LocalSwitchArgs,
113};
114pub(crate) use mcp::{McpArgs, McpCommand, McpLoginArgs, McpServeArgs, McpServerRefArgs};
115pub(crate) use merge_captain::{
116    MergeCaptainArgs, MergeCaptainAuditArgs, MergeCaptainAuditFormat, MergeCaptainBackendKind,
117    MergeCaptainCommand, MergeCaptainIterateArgs, MergeCaptainIterateFormat,
118    MergeCaptainLadderArgs, MergeCaptainLadderFormat, MergeCaptainMockCleanupArgs,
119    MergeCaptainMockCommand, MergeCaptainMockInitArgs, MergeCaptainMockServeArgs,
120    MergeCaptainMockStatusArgs, MergeCaptainMockStepArgs, MergeCaptainRunArgs,
121};
122pub(crate) use models::{
123    ModelRecommendArgs, ModelsArgs, ModelsCommand, ModelsInstallArgs, ModelsListArgs,
124    ModelsTestArgs,
125};
126pub(crate) use orchestrator::{
127    OrchestratorArgs, OrchestratorCommand, OrchestratorDeployArgs, OrchestratorDeployProvider,
128    OrchestratorDlqArgs, OrchestratorFireArgs, OrchestratorInspectArgs, OrchestratorLocalArgs,
129    OrchestratorLogFormat, OrchestratorQueueArgs, OrchestratorQueueCommand,
130    OrchestratorQueueDrainArgs, OrchestratorQueueLsArgs, OrchestratorQueuePurgeArgs,
131    OrchestratorRecoverArgs, OrchestratorReloadArgs, OrchestratorReplayArgs,
132    OrchestratorReplayOracleArgs, OrchestratorResumeArgs, OrchestratorServeArgs,
133    OrchestratorStatsArgs, OrchestratorTenantArgs, OrchestratorTenantCommand,
134    OrchestratorTenantCreateArgs, OrchestratorTenantDeleteArgs, OrchestratorTenantLsArgs,
135    OrchestratorTenantSuspendArgs,
136};
137pub use pack::PackArgs;
138pub(crate) use package::{
139    AddArgs, InstallArgs, PackageArgs, PackageArtifactsCommand, PackageCacheCommand,
140    PackageCommand, PublishArgs, RemoveArgs, UpdateArgs,
141};
142pub(crate) use parse_tokens::{ParseArgs, TokensArgs};
143pub(crate) use persona::{
144    PersonaArgs, PersonaCheckArgs, PersonaCommand, PersonaControlArgs, PersonaDoctorArgs,
145    PersonaInspectArgs, PersonaListArgs, PersonaNewArgs, PersonaSpendArgs, PersonaStatusArgs,
146    PersonaSupervisionCommand, PersonaSupervisionTailArgs, PersonaTemplateKind, PersonaTickArgs,
147    PersonaTriggerArgs,
148};
149pub(crate) use playground::PlaygroundArgs;
150pub(crate) use portal::PortalArgs;
151pub use precompile::PrecompileArgs;
152pub(crate) use profile::ProfileArgs;
153pub(crate) use provider::{
154    ModelInfoArgs, ProviderCatalogArgs, ProviderProbeArgs, ProviderReadyArgs,
155    ProviderToolProbeArgs, ProviderToolProbeModeArg,
156};
157pub(crate) use providers::{
158    ProvidersArgs, ProvidersCommand, ProvidersExportArgs, ProvidersRefreshArgs,
159    ProvidersValidateArgs,
160};
161pub(crate) use quickstart::QuickstartArgs;
162pub(crate) use routes::RoutesArgs;
163pub(crate) use run::RunArgs;
164pub(crate) use runs::{ReplayArgs, RunsArgs, RunsCommand};
165pub(crate) use serve::{
166    A2aServeArgs, ApiServeArgs, McpServeTransport, ServeAcpArgs, ServeArgs, ServeCommand,
167    ServeMcpArgs, ServeTlsMode,
168};
169pub(crate) use session::{
170    SessionArgs, SessionCommand, SessionExportArgs, SessionImportArgs, SessionSchemaArgs,
171    SessionValidateArgs,
172};
173pub(crate) use skill::{
174    SkillArgs, SkillCommand, SkillEndorseArgs, SkillKeyCommand, SkillKeyGenerateArgs,
175    SkillSignArgs, SkillTrustAddArgs, SkillTrustCommand, SkillTrustListArgs, SkillVerifyArgs,
176    SkillWhoSignedArgs,
177};
178pub(crate) use skills::{
179    SkillsArgs, SkillsCommand, SkillsDumpArgs, SkillsGetArgs, SkillsInspectArgs, SkillsInstallArgs,
180    SkillsListArgs, SkillsMatchArgs, SkillsNewArgs, SkillsResolvedArgs,
181};
182pub(crate) use supervisor::{
183    SupervisorArgs, SupervisorCommand, SupervisorDlqCommand, SupervisorDlqListArgs,
184    SupervisorDlqReplayArgs, SupervisorFireArgs, SupervisorInspectArgs, SupervisorListArgs,
185    SupervisorPauseArgs, SupervisorRecoverArgs, SupervisorReplayArgs, SupervisorResumeArgs,
186    SupervisorStartArgs, SupervisorStopArgs,
187};
188pub(crate) use test::TestArgs;
189pub(crate) use test_bench::{
190    TestBenchArgs, TestBenchCommand, TestBenchExportAnnotationsArgs, TestBenchFidelityArgs,
191    TestBenchReplayArgs, TestBenchRunArgs, TestBenchValidateAnnotationsArgs,
192};
193pub(crate) use time::{TimeArgs, TimeCommand, TimeRunArgs};
194pub(crate) use tool::{ToolArgs, ToolCommand, ToolNewArgs};
195pub(crate) use trace::{TraceArgs, TraceCommand, TraceImportArgs};
196pub(crate) use trigger::{TriggerArgs, TriggerCancelArgs, TriggerCommand, TriggerReplayArgs};
197pub(crate) use try_cmd::TryArgs;
198pub(crate) use upgrade::UpgradeArgs;
199// `TrustOutcomeArg` / `TrustTierArg` are referenced from the cli
200// parser tests only; they're matched via destructuring elsewhere.
201#[allow(unused_imports)]
202pub(crate) use trust::{
203    TrustArgs, TrustCommand, TrustExportArgs, TrustOutcomeArg, TrustQueryArgs, TrustTierArg,
204    TrustVerifyChainArgs,
205};
206pub(crate) use verify::VerifyArgs;
207pub(crate) use viz::VizArgs;
208pub(crate) use watch::WatchArgs;
209pub(crate) use workflow::{
210    WorkflowArgs, WorkflowCommand, WorkflowFunctionToolsArgs, WorkflowNestedCeilingArgs,
211    WorkflowPatchApplyArgs, WorkflowPatchCommand, WorkflowPatchPreviewArgs,
212    WorkflowPatchValidateArgs,
213};
214
215use clap::{Parser, Subcommand};
216
217#[derive(Debug, Parser)]
218#[command(
219    name = "harn",
220    about = "The agent harness language",
221    version,
222    disable_help_subcommand = false,
223    arg_required_else_help = true
224)]
225pub(crate) struct Cli {
226    /// Emit the JSON-schema catalog for every `harn` subcommand that
227    /// exposes a structured `--json` envelope. Pair with
228    /// `--command <name>` to print just one entry.
229    #[arg(long = "json-schemas", global = false)]
230    pub json_schemas: bool,
231
232    /// When combined with `--json-schemas`, restrict the catalog to a
233    /// single command name (e.g. `--command run`).
234    #[arg(
235        long = "command",
236        requires = "json_schemas",
237        value_name = "COMMAND",
238        global = false
239    )]
240    pub schema_command: Option<String>,
241
242    #[command(subcommand)]
243    pub command: Option<Command>,
244}
245
246#[derive(Debug, Subcommand)]
247pub(crate) enum Command {
248    /// Execute a .harn file or an inline expression.
249    #[command(long_about = "\
250Execute a .harn file or an inline expression.
251
252USAGE
253    harn run script.harn
254    harn run -e 'println(\"hello\")'
255    harn run script.harn -- arg1 arg2   (script reads `argv` as list<string>)
256
257CONCURRENCY
258    Harn supports first-class concurrency primitives:
259      - spawn { ... }         — launch a task, return a handle
260      - parallel each LIST    — concurrent map
261      - parallel settle LIST  — concurrent map, collect Ok/Err
262      - parallel N            — N-way fan-out
263      - with { max_concurrent: N }  — cap in-flight workers
264      - channels, retry, select
265    https://harnlang.com/concurrency.html
266
267LLM THROTTLING
268    Providers can be rate-limited via `rpm:` in harn.toml / providers.toml
269    or via `HARN_RATE_LIMIT_<PROVIDER>=N`. Rate limits control throughput
270    (RPM); `max_concurrent` on `parallel` caps simultaneous in-flight jobs.
271
272SCRIPTING
273    LLM-readable one-pager: https://harnlang.com/docs/llm/harn-quickref.html
274    Human cheatsheet:       https://harnlang.com/scripting-cheatsheet.html
275    Full docs:              https://harnlang.com/
276")]
277    Run(RunArgs),
278    /// Type-check .harn files or directories without executing them.
279    Check(CheckArgs),
280    /// Parse a .harn file and print its AST.
281    Parse(ParseArgs),
282    /// Tokenize a .harn file and print lexer tokens.
283    Tokens(TokensArgs),
284    /// Inspect, validate, and emit schemas for layered Harn runtime config.
285    Config(ConfigArgs),
286    /// Explain a diagnostic. Pass a stable `HARN-<CAT>-<NNN>` code
287    /// (optionally with `--json` for the structured envelope), or the
288    /// legacy `--invariant <NAME> <FUNCTION> <FILE>` form to walk the
289    /// control-flow path behind a Harn invariant violation.
290    Explain(ExplainArgs),
291    /// Plan or apply repair-bearing diagnostics under an explicit safety ceiling.
292    Fix(FixArgs),
293    /// Export machine-readable Harn contracts and bundle manifests.
294    Contracts(ContractsArgs),
295    /// Lint .harn files or directories for common issues.
296    Lint(PathTargetsArgs),
297    /// Format .harn files or directories.
298    Fmt(FmtArgs),
299    /// Run user tests or the conformance suite.
300    Test(TestArgs),
301    /// Run a .harn script under a hermetic testbench (paused clock,
302    /// optional LLM/process tapes, fs overlay, deny-by-default network).
303    #[command(name = "test-bench")]
304    TestBench(TestBenchArgs),
305    /// Instrument a wrapped subcommand with phase-level wall-clock
306    /// timing (parse, typecheck, bytecode compile + cache hit/miss,
307    /// run setup, run main) plus per-LLM-call and per-tool-call
308    /// latency. Pair with `--json` for an agent-readable envelope.
309    Time(TimeArgs),
310    /// Scaffold a new project with harn.toml.
311    Init(InitArgs),
312    /// Scaffold a new project, package, or connector from a starter template.
313    New(NewArgs),
314    /// Diagnose the local Harn environment: toolchain version, configured
315    /// LLM providers and credentials, MCP server reachability, file
316    /// permissions on `~/.harn`, and project manifest health. Reports
317    /// each check as ok/warn/fail with a suggested fix.
318    Doctor(DoctorArgs),
319    /// Configure a starter Harn project and LLM provider settings.
320    Quickstart(QuickstartArgs),
321    /// Run a bundled offline demo scenario to see Harn in action without
322    /// API keys. `harn demo` lists scenarios; `harn demo <id>` runs one.
323    Demo(DemoArgs),
324    /// Register outbound connector resources with a provider.
325    Connect(Box<ConnectArgs>),
326    /// Validate pure-Harn connector packages against the connector contract.
327    Connector(ConnectorArgs),
328    /// Serve a Harn workflow over a transport adapter.
329    Serve(ServeArgs),
330    /// Manage remote MCP OAuth credentials and status.
331    Mcp(McpArgs),
332    /// Watch a .harn file and re-run it on changes.
333    Watch(WatchArgs),
334    /// Watch a Harn project and re-typecheck only the modules whose
335    /// public interface fingerprint actually changed.
336    ///
337    /// USAGE
338    ///     harn dev --watch [<root>]
339    ///     harn dev --watch --json
340    ///     harn dev --watch --with-tests
341    ///
342    /// On each file change, the changed module's interface fingerprint
343    /// (BLAKE3 of types + signatures + `pub import` re-exports) is
344    /// recomputed. If it matches the previous fingerprint, only that
345    /// module is re-checked. If it changed, every transitive importer
346    /// is invalidated and re-checked. `--with-tests` extends the loop
347    /// to also re-run `test_*` / `@test`-attributed pipelines in
348    /// every invalidated module.
349    Dev(DevArgs),
350    /// Launch the local Harn observability portal.
351    Portal(PortalArgs),
352    /// Replay and inspect historical trigger dispatches from the event log.
353    Trigger(TriggerArgs),
354    /// Statically enumerate declared trigger routes and their requirements.
355    Routes(RoutesArgs),
356    /// Statically enumerate modules, symbols, imports, capabilities, effects, and host calls.
357    Graph(GraphArgs),
358    /// Inspect Harn Flow atom, slice, and predicate audit state.
359    Flow(FlowArgs),
360    /// Validate, preview, and run portable workflow bundles.
361    Workflow(WorkflowArgs),
362    /// Control local durable workflow automations for trusted hosts.
363    Supervisor(SupervisorArgs),
364    /// Import third-party eval traces into replayable Harn fixtures.
365    Trace(TraceArgs),
366    /// Mine repeated traces into a reviewable deterministic Harn workflow candidate.
367    Crystallize(CrystallizeArgs),
368    /// Query and manage trust-graph autonomy state.
369    Trust(TrustArgs),
370    /// Alias for `harn trust`. Query and verify trust-graph autonomy state.
371    #[command(name = "trust-graph")]
372    TrustGraph(TrustArgs),
373    /// Verify a signed Harn provenance receipt.
374    Verify(VerifyArgs),
375    /// Print shell completion script to stdout.
376    Completions(CompletionsArgs),
377    /// Start the orchestrator process that hosts triggers and connector dispatch.
378    Orchestrator(OrchestratorArgs),
379    /// Run a pipeline against a Harn-native host module for fast iteration.
380    Playground(PlaygroundArgs),
381    /// Inspect persisted workflow run records.
382    Runs(RunsArgs),
383    /// Export, import, and validate portable Harn session bundles.
384    Session(SessionArgs),
385    /// Replay a persisted workflow run record.
386    Replay(ReplayArgs),
387    /// Evaluate a run record, run directory, or eval manifest.
388    Eval(EvalArgs),
389    /// Start the interactive REPL.
390    Repl,
391    /// Benchmark a .harn pipeline over repeated runs.
392    Bench(BenchArgs),
393    /// Pre-compile `.harn` sources into the content-addressed bytecode
394    /// cache so cold-start `harn run` for the same source skips parse
395    /// and compile and goes straight to bytecode load.
396    ///
397    /// `harn precompile path/` walks the directory and compiles every
398    /// `.harn` file; `harn precompile script.harn` compiles a single
399    /// file. Artifacts are written adjacent to each source as
400    /// `<name>.harnbc` by default; pass `--out DIR` to redirect them
401    /// into a sibling tree.
402    Precompile(PrecompileArgs),
403    /// Build a signed-ready `.harnpack` run bundle from a Harn entrypoint.
404    ///
405    /// `harn pack <entrypoint>` walks the entrypoint's transitive imports,
406    /// precompiles every module, snapshots the provider catalog and
407    /// stdlib pin, generates a minimal SBOM, and emits a deterministic
408    /// tar.zst container under `<entrypoint>.harnpack` (or `--out`).
409    ///
410    /// `--upgrade <old.harnpack>` reads an existing bundle (v1 or v2) and
411    /// re-emits it under the v2 manifest, preserving the prior bundle's
412    /// workflow graph, triggers, and prompt capsules.
413    ///
414    /// Signing (E6.3) and richer SBOM enumeration (E6.4) land in
415    /// follow-ups; today the bundle ships unsigned with a stdlib-pin SBOM.
416    Pack(PackArgs),
417    /// Render a .harn file as a Mermaid workflow graph.
418    Viz(VizArgs),
419    /// Install dependencies declared in harn.toml.
420    Install(InstallArgs),
421    /// Add a dependency to harn.toml.
422    Add(AddArgs),
423    /// Refresh one or more dependency lock entries.
424    Update(UpdateArgs),
425    /// Remove a dependency from harn.toml and harn.lock.
426    Remove(RemoveArgs),
427    /// Resolve dependencies and write harn.lock without materializing packages.
428    Lock,
429    /// Manage Harn package caches and integrity verification.
430    Package(PackageArgs),
431    /// Prepare a package manifest and bundle for publication. Validates
432    /// `harn.toml` and produces a publishable archive locally; remote
433    /// registry submission is not yet implemented (the resulting
434    /// archive can be installed via `harn add <repo-or-path>` in the
435    /// meantime).
436    Publish(PublishArgs),
437    /// List and inspect durable agent persona manifests.
438    Persona(PersonaArgs),
439    /// Merge Captain transcript oracle and audit (#1013).
440    #[command(name = "merge-captain")]
441    MergeCaptain(MergeCaptainArgs),
442    /// Print resolved metadata for a model alias or model id as JSON.
443    ModelInfo(ModelInfoArgs),
444    /// List, install, recommend, and test configured LLM models.
445    Models(ModelsArgs),
446    /// Manage local LLM runtime lifecycle: enumerate, switch, and stop
447    /// Ollama, llama.cpp, MLX, and other OpenAI-compatible local servers.
448    Local(LocalArgs),
449    /// Validate and generate provider/model catalog artifacts.
450    Providers(ProvidersArgs),
451    /// Print the provider/model catalog Harn loaded as JSON.
452    ProviderCatalog(ProviderCatalogArgs),
453    /// Probe a provider's /models endpoint and optionally verify a served model.
454    ProviderReady(ProviderReadyArgs),
455    /// Snapshot a provider: readiness, served models, loaded models with
456    /// memory/context details. Designed for eval pipelines that need a
457    /// stable telemetry envelope per provider.
458    ProviderProbe(ProviderProbeArgs),
459    /// Run one-tool provider conformance and classify native/text fallback.
460    ProviderToolProbe(ProviderToolProbeArgs),
461    /// One-shot agent_loop with a prompt. Routes through the configured
462    /// provider (or `HARN_LLM_PROVIDER=mock` for offline use).
463    #[command(name = "try")]
464    Try(TryArgs),
465    /// Manage and inspect Harn skills (list/get/dump for the embedded
466    /// corpus; resolved/inspect/match/install/new for FS-resolved skills).
467    Skills(SkillsArgs),
468    /// Manage skill provenance: keys, signatures, verification, and trust policy.
469    Skill(SkillArgs),
470    /// Scaffold and inspect Harn-native custom tools.
471    Tool(ToolArgs),
472    /// Print the decorated version banner.
473    Version,
474    /// Download and atomically replace the running `harn` binary with
475    /// the latest published GitHub release (or a specific tag via
476    /// `--version`). Verifies the archive against the release's
477    /// `SHA256SUMS` manifest before installing.
478    Upgrade(UpgradeArgs),
479    /// Regenerate docs/theme/harn-keywords.js from the live lexer + stdlib sets.
480    ///
481    /// Dev-only. Hidden from `--help` — invoke via
482    /// `cargo run -p harn-cli -- dump-highlight-keywords` or the
483    /// `make gen-highlight` target.
484    #[command(hide = true, name = "dump-highlight-keywords")]
485    DumpHighlightKeywords(DumpHighlightKeywordsArgs),
486    /// Regenerate docs/llm/harn-triggers-quickref.md from the live trigger provider catalog.
487    ///
488    /// Dev-only. Hidden from `--help` — invoke via
489    /// `cargo run -p harn-cli -- dump-trigger-quickref` or the
490    /// `make gen-trigger-quickref` target.
491    #[command(hide = true, name = "dump-trigger-quickref")]
492    DumpTriggerQuickref(DumpTriggerQuickrefArgs),
493    /// Regenerate docs/src/connectors/parity-matrix.md from connector package manifests.
494    ///
495    /// Dev-only. Hidden from `--help` — invoke via
496    /// `cargo run -p harn-cli -- dump-connector-matrix` or the
497    /// `make gen-connector-matrix` target.
498    #[command(hide = true, name = "dump-connector-matrix")]
499    DumpConnectorMatrix(DumpConnectorMatrixArgs),
500    /// Regenerate Harn protocol schemas and TypeScript/Swift bindings.
501    ///
502    /// Dev-only. Hidden from `--help` — invoke via
503    /// `cargo run -p harn-cli -- dump-protocol-artifacts` or the
504    /// `make gen-protocol-artifacts` target.
505    #[command(hide = true, name = "dump-protocol-artifacts")]
506    DumpProtocolArtifacts(DumpProtocolArtifactsArgs),
507}
508
509#[cfg(test)]
510mod tests;