cli/serviceability: move per-resource subcommand wrappers into module crate#3759
Open
juan-malbeclabs wants to merge 1 commit into
Open
cli/serviceability: move per-resource subcommand wrappers into module crate#3759juan-malbeclabs wants to merge 1 commit into
juan-malbeclabs wants to merge 1 commit into
Conversation
d539f1c to
4196e46
Compare
aeaa287 to
f274db8
Compare
This was referenced May 22, 2026
4196e46 to
a65bc24
Compare
f274db8 to
17d3095
Compare
juan-malbeclabs
added a commit
that referenced
this pull request
May 26, 2026
…3753) ## RFC-20 implementation stack This PR is part of a 9-PR chain delivering [RFC-20: CLI standardization](https://github.com/malbeclabs/doublezero/blob/main/rfcs/rfc20-cli-standardization.md). Each PR's diff is **only its own contribution**; reviewers should consume them in order. | # | PR | Scope | |---|----|-------| | **1** | [#3753](#3753) | `doublezero-cli-core` foundation crate + `solana_l1_rpc_url` | | 2 | [#3754](#3754) | `--solana-url` + `--log-verbose` global flags + tracing init | | 3 | [#3755](#3755) | `CliContext` built in `main` + centralized error rendering | | 4 | [#3756](#3756) | rename `doublezero_cli` → `doublezero-serviceability-cli` | | 5 | [#3757](#3757) | rewrite `location get` as the async + `CliContext` reference verb | | 6 | [#3758](#3758) | `docs/cli-standard.md` + `CLAUDE.md` pointer | | 7 | [#3759](#3759) | move per-resource subcommand wrappers into the module crate | | 8 | [#3760](#3760) | add `ServiceabilityCommand` enum + async dispatcher | | 9 | [#3761](#3761) | `#[command(flatten)]` + collapse binary dispatch | **This PR: #3753** — position **1** of 9. Previous: (none — base is `main`) · Next: [#3754](#3754) --- ## Summary of Changes - Adds `doublezero-cli-core` (`crates/doublezero-cli-core/`), the shared library crate every `doublezero-<module>-cli` will reuse per [RFC-20](../rfcs/rfc20-cli-standardization.md). Ships `CliContext` + `CliContextBuilder`, `RequirementCheck` bitflags (bit values aligned with the legacy `CHECK_ID_JSON | CHECK_BALANCE | CHECK_FOUNDATION_ALLOWLIST` constants), the shared validators (`validate_pubkey`, `validate_pubkey_or_code`, `validate_code`, `validate_parse_bandwidth`, `validate_parse_delay_ms`, `validate_parse_jitter_ms`, `validate_parse_delay_override_ms`), the `DisplayVec` formatter, a `tracing` + `tracing-subscriber` `init_logging(verbosity)` helper that writes to stderr, and `testing` helpers (`cli_context_for_tests`, `cli_context_default_for_tests`). - Adds `solana_l1_rpc_url` to `doublezero-config::NetworkConfig` with the per-environment defaults from RFC-20 §Environments (mainnet-beta -> Solana mainnet-beta; testnet and devnet -> Solana testnet; local -> `http://localhost:8899`) plus a `DZ_SOLANA_RPC_URL` env-var override mirroring the existing `DZ_LEDGER_RPC_URL` / `DZ_LEDGER_WS_RPC_URL` overrides. - Migrates the shared `validators.rs` and `formatters.rs` out of `smartcontract/cli/` into the new core crate. Existing import paths continue to compile via thin `pub use` re-export shims in `smartcontract/cli/src/{validators,formatters}.rs`, so the rest of the workspace is unaffected. ## Diff Breakdown | Category | Files | Lines (+/-) | Net | |--------------|-------|-------------|------| | Core logic | 7 | +618 / -0 | +618 | | Tests | 1 | +64 / -0 | +64 | | Scaffolding | 4 | +50 / -167 | -117 | | Config/build | 3 | +33 / -0 | +33 | | Generated | 1 | +20 / -0 | +20 | | Docs | 1 | +2 / -1 | +1 | | **Total** | 17 | +787 / -168 | +619 | Introduces ~620 lines of shared CLI utility code in the new core crate while shrinking `smartcontract/cli` by replacing its validator and formatter implementations with thin re-export shims; no behavior change. <details> <summary>Key files (click to expand)</summary> - `crates/doublezero-cli-core/src/context.rs` - `CliContext`, `OutputFormat`, and the `CliContextBuilder` that resolves `--env` defaults from `doublezero-config` and applies per-field overrides. - `crates/doublezero-cli-core/src/validators.rs` - shared `clap` value-parsers (pubkey, code, pubkey-or-code, bandwidth, delay, jitter, delay-override) with their unit tests; moved verbatim from `smartcontract/cli/src/validators.rs`. - `crates/doublezero-cli-core/src/requirements.rs` - `RequirementCheck` bitflags type (KEYPAIR / BALANCE / FOUNDATION_ALLOWLIST) with bit values preserved for ABI continuity with the legacy `u8` constants. - `crates/doublezero-cli-core/src/testing.rs` - `cli_context_for_tests()` / `cli_context_default_for_tests()` helpers for module-crate verb tests. - `crates/doublezero-cli-core/src/formatters.rs` - `DisplayVec` + `stringify_vec` moved from `smartcontract/cli`. - `crates/doublezero-cli-core/src/error.rs` - `Result` alias, `CliError`, `render_eyre` helper for chain-of-causes rendering. - `crates/doublezero-cli-core/src/logging.rs` - `init_logging(verbosity)` via `tracing-subscriber` with stderr writer; honors `RUST_LOG` when set. - `config/src/env.rs` - adds `solana_l1_rpc_url` to `NetworkConfig`, wires it through per environment, and adds `DZ_SOLANA_RPC_URL` override plus tests. </details> ## Testing Verification - `cargo test -p doublezero-cli-core` passes (16 tests across validators, requirements bitflags, context builder, testing helpers, formatters). - `cargo test -p doublezero-config` passes (9 tests including two new ones covering the Solana L1 URL resolution per environment and the `DZ_SOLANA_RPC_URL` override). - `make rust-test` green, including the program-accounts-compat run. - `make rust-lint` clean. - Verified existing `smartcontract/cli` consumers continue to compile against the shim files (`use doublezero_cli::validators::*` and friends resolve through the re-export).
58770b1 to
d4e3b94
Compare
17d3095 to
414327e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RFC-20 implementation stack
This PR is part of a 9-PR chain delivering RFC-20: CLI standardization. Each PR's diff is only its own contribution; reviewers should consume them in order.
doublezero-cli-corefoundation crate +solana_l1_rpc_url--solana-url+--log-verboseglobal flags + tracing initCliContextbuilt inmain+ centralized error renderingdoublezero_cli→doublezero-serviceability-clilocation getas the async +CliContextreference verbdocs/cli-standard.md+CLAUDE.mdpointerServiceabilityCommandenum + async dispatcher#[command(flatten)]+ collapse binary dispatchThis PR: #3759 — position 7 of 9. Previous: #3758 · Next: #3760
Summary of Changes
accesspass,config,contributor,device,exchange,globalconfig,link,location,multicastgroup,permission,resource,tenant,user) fromclient/doublezero/src/cli/into thedoublezero-serviceability-climodule crate atsmartcontract/cli/src/cli/, per RFC-20 §Module contract item 2 ("the module crate exports the subcommand enum").smartcontract/cli/src/cli/mod.rsandpub mod cli;in the library'slib.rsso the new module is reachable.doublezero_serviceability_cli::<resource>::*->crate::<resource>::*) and in the binary (client/doublezero/src/{cli/command.rs,main.rs}switch todoublezero_serviceability_cli::cli::<resource>::*for the moved types).cli/multicast.rsstays in the binary: itsSubscribe,Unsubscribe,Publish, andUnpublishvariants are async and theirexecuteimpls live inclient/doublezero/src/command/multicast.rs(binary-local), depending onServiceControllerImplandcrate::command::helpers::resolve_client_ip. The binary'scli/multicast.rsnow importsMulticastGroupCliCommandfrom the library.Commandenum reshape, nomain.rsdispatch change. Pure file relocation. The next PR adds the top-levelServiceabilityCommandenum; the PR after that wires it into the binary via#[command(flatten)]and collapses the dispatch.Diff Breakdown
Pure file moves (tracked as renames in git, ~95% similarity each) plus import-path rewrites in the binary and the new library
cli/mod.rs. Behavior unchanged.Key files (click to expand)
smartcontract/cli/src/cli/mod.rs(new) - declares the 13 moved modules.smartcontract/cli/src/lib.rs- addspub mod cli;.client/doublezero/src/cli/mod.rs- keeps onlycommand,geolocation, andmulticast(the binary-local ones).client/doublezero/src/cli/command.rs- importsMulticastCliCommandfromcrate::cliand the 13 moved types fromdoublezero_serviceability_cli::cli::*.client/doublezero/src/cli/multicast.rs- importsMulticastGroupCliCommandfrom the library.client/doublezero/src/main.rs- imports the moved subcommand enums (DeviceCommands,LinkCommands, ...) fromdoublezero_serviceability_cli::cli::*; the per-resource match arms switch fromcli::<resource>::*Commands::*todoublezero_serviceability_cli::cli::<resource>::*Commands::*.Testing Verification
cargo check --workspaceclean.make rust-testgreen workspace-wide (including thecargo test -p doublezero-serviceability-cli location::getreference verb).make rust-lintclean.cargo run -p doublezero -- --helpandcargo run -p doublezero -- device list --helpproduce the same command tree as before; the relocation is invisible to users.jo/6-docs-cli-standard; the diff shown is only this PR's contribution. Follow-ups #PR8 (addServiceabilityCommandenum) and #PR9 (flatten in binary + collapse dispatch) complete the RFC-20 §Module contract item 2 work.