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